diff options
| author | Michael R Sweet <michael.r.sweet@gmail.com> | 2001-11-19 01:06:45 +0000 |
|---|---|---|
| committer | Michael R Sweet <michael.r.sweet@gmail.com> | 2001-11-19 01:06:45 +0000 |
| commit | 1acc39c5d8d5b3db88abfd008699dadb8aade2b9 (patch) | |
| tree | c35a486fc713b48c85286ce42291aa88e6652e7e /src/Fl_Bitmap.cxx | |
| parent | 681ded73c20af217254a8dfb7838b612b17b126c (diff) | |
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Bitmap.cxx')
| -rw-r--r-- | src/Fl_Bitmap.cxx | 73 |
1 files changed, 71 insertions, 2 deletions
diff --git a/src/Fl_Bitmap.cxx b/src/Fl_Bitmap.cxx index c20bfeabf..18d474fb7 100644 --- a/src/Fl_Bitmap.cxx +++ b/src/Fl_Bitmap.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl_Bitmap.cxx,v 1.5.2.4.2.2 2001/11/18 20:52:27 easysw Exp $" +// "$Id: Fl_Bitmap.cxx,v 1.5.2.4.2.3 2001/11/19 01:06:45 easysw Exp $" // // Bitmap drawing routines for the Fast Light Tool Kit (FLTK). // @@ -29,6 +29,7 @@ #include <FL/Fl_Widget.H> #include <FL/Fl_Menu_Item.H> #include <FL/Fl_Bitmap.H> +#include <string.h> #ifdef WIN32 // Windows bitmask functions... Fl_Bitmask fl_create_bitmask(int w, int h, const uchar *data) { @@ -105,6 +106,7 @@ void Fl_Bitmap::draw(int XP, int YP, int WP, int HP, int cx, int cy) { Fl_Bitmap::~Fl_Bitmap() { if (id) fl_delete_bitmask(id); + if (alloc_array) delete[] array; } void Fl_Bitmap::label(Fl_Widget* w) { @@ -114,6 +116,73 @@ void Fl_Bitmap::label(Fl_Widget* w) { void Fl_Bitmap::label(Fl_Menu_Item* m) { } +Fl_Image *Fl_Bitmap::copy(int W, int H) { + // Optimize the simple copy where the width and height are the same... + if (W == w() && H == h()) return new Fl_Bitmap(array, w(), h()); + + // OK, need to resize the image data; allocate memory and + Fl_Bitmap *new_image; // New RGB image + uchar *new_array, // New array for image data + *new_ptr, // Pointer into new array + new_bit, // Bit for new array + old_bit; // Bit for old array + const uchar *old_ptr; // Pointer into old array + int sx, sy, // Source coordinates + dx, dy, // Destination coordinates + xerr, yerr, // X & Y errors + xmod, ymod, // X & Y moduli + xstep, ystep; // X & Y step increments + + + // Figure out Bresenheim step/modulus values... + xmod = w() % W; + xstep = w() / W; + ymod = h() % H; + ystep = h() / H; + + // Allocate memory for the new image... + new_array = new uchar [H * (W + 7) / 8]; + new_image = new Fl_Bitmap(new_array, W, H); + new_image->alloc_array = 1; + + memset(new_array, 0, H * (W + 7) / 8); + + // Scale the image using a nearest-neighbor algorithm... + for (dy = h(), sy = 0, yerr = H / 2, new_ptr = new_array; dy > 0; dy --) { + for (dx = w(), xerr = W / 2, old_ptr = array + sy * (w() + 7) / 8, sx = 0, new_bit = 128; + dx > 0; + dx --) { + old_bit = 128 >> (sx & 7); + if (old_ptr[sx / 8] & old_bit) *new_ptr |= new_bit; + + if (new_bit > 1) new_bit >>= 1; + else { + new_bit = 128; + new_ptr ++; + } + + sx += xstep; + xerr -= xmod; + + if (xerr <= 0) { + xerr += W; + sx ++; + } + } + + if (new_bit < 128) new_ptr ++; + + sy += ystep; + yerr -= ymod; + if (yerr <= 0) { + yerr += H; + sy ++; + } + } + + return new_image; +} + // -// End of "$Id: Fl_Bitmap.cxx,v 1.5.2.4.2.2 2001/11/18 20:52:27 easysw Exp $". +// End of "$Id: Fl_Bitmap.cxx,v 1.5.2.4.2.3 2001/11/19 01:06:45 easysw Exp $". // |
