Rex Dieter 23b0642
diff -ur fltk-1.3.2.org/FL/Fl_Image.H fltk-1.3.2/FL/Fl_Image.H
Rex Dieter 23b0642
--- fltk-1.3.2.org/FL/Fl_Image.H	2012-11-09 17:02:08.000000000 +0100
Rex Dieter 23b0642
+++ fltk-1.3.2/FL/Fl_Image.H	2013-01-16 14:40:51.543230638 +0100
Rex Dieter 23b0642
@@ -26,6 +26,7 @@
Rex Dieter 23b0642
 #include <stdlib.h>
Adam Tkac 5e945f7
 
Rex Dieter 23b0642
 class Fl_Widget;
Rex Dieter 23b0642
+class Fl_Pixmap;
Rex Dieter 23b0642
 struct Fl_Menu_Item;
Rex Dieter 23b0642
 struct Fl_Label;
Adam Tkac 5e945f7
 
Rex Dieter 23b0642
@@ -203,6 +204,7 @@
Rex Dieter 23b0642
   */
Rex Dieter 23b0642
   Fl_RGB_Image(const uchar *bits, int W, int H, int D=3, int LD=0) :
Rex Dieter 23b0642
     Fl_Image(W,H,D), array(bits), alloc_array(0), id_(0), mask_(0) {data((const char **)&array, 1); ld(LD);}
Rex Dieter 23b0642
+  Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg=FL_GRAY);
Rex Dieter 23b0642
   virtual ~Fl_RGB_Image();
Rex Dieter 23b0642
   virtual Fl_Image *copy(int W, int H);
Rex Dieter 23b0642
   Fl_Image *copy() { return copy(w(), h()); }
Rex Dieter 23b0642
diff -ur fltk-1.3.2.org/src/fl_draw_pixmap.cxx fltk-1.3.2/src/fl_draw_pixmap.cxx
Rex Dieter 23b0642
--- fltk-1.3.2.org/src/fl_draw_pixmap.cxx	2012-04-22 05:09:31.000000000 +0200
Rex Dieter 23b0642
+++ fltk-1.3.2/src/fl_draw_pixmap.cxx	2013-01-16 14:40:51.542230588 +0100
Adam Tkac 5e945f7
@@ -58,99 +58,6 @@
Adam Tkac 5e945f7
   return 1;
Adam Tkac 5e945f7
 }
Adam Tkac 5e945f7
 
Adam Tkac 5e945f7
-#ifdef U64
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
-// The callback from fl_draw_image to get a row of data passes this:
Adam Tkac 5e945f7
-struct pixmap_data {
Adam Tkac 5e945f7
-  int w, h;
Adam Tkac 5e945f7
-  const uchar*const* data;
Adam Tkac 5e945f7
-  union {
Adam Tkac 5e945f7
-    U64 colors[256];
Adam Tkac 5e945f7
-    U64* byte1[256];
Adam Tkac 5e945f7
-  };
Adam Tkac 5e945f7
-};
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
-// callback for 1 byte per pixel:
Adam Tkac 5e945f7
-static void cb1(void*v, int x, int y, int w, uchar* buf) {
Adam Tkac 5e945f7
-  pixmap_data& d = *(pixmap_data*)v;
Adam Tkac 5e945f7
-  const uchar* p = d.data[y]+x;
Adam Tkac 5e945f7
-  U64* q = (U64*)buf;
Adam Tkac 5e945f7
-  for (int X=w; X>0; X-=2, p += 2) {
Adam Tkac 5e945f7
-    if (X>1) {
Adam Tkac 5e945f7
-#  if WORDS_BIGENDIAN
Adam Tkac 5e945f7
-      *q++ = (d.colors[p[0]]<<32) | d.colors[p[1]];
Adam Tkac 5e945f7
-#  else
Adam Tkac 5e945f7
-      *q++ = (d.colors[p[1]]<<32) | d.colors[p[0]];
Adam Tkac 5e945f7
-#  endif
Adam Tkac 5e945f7
-    } else {
Adam Tkac 5e945f7
-#  if WORDS_BIGENDIAN
Adam Tkac 5e945f7
-      *q++ = d.colors[p[0]]<<32;
Adam Tkac 5e945f7
-#  else
Adam Tkac 5e945f7
-      *q++ = d.colors[p[0]];
Adam Tkac 5e945f7
-#  endif
Adam Tkac 5e945f7
-    }
Adam Tkac 5e945f7
-  }
Adam Tkac 5e945f7
-}
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
-// callback for 2 bytes per pixel:
Adam Tkac 5e945f7
-static void cb2(void*v, int x, int y, int w, uchar* buf) {
Adam Tkac 5e945f7
-  pixmap_data& d = *(pixmap_data*)v;
Adam Tkac 5e945f7
-  const uchar* p = d.data[y]+2*x;
Adam Tkac 5e945f7
-  U64* q = (U64*)buf;
Adam Tkac 5e945f7
-  for (int X=w; X>0; X-=2) {
Adam Tkac 5e945f7
-    U64* colors = d.byte1[*p++];
Adam Tkac 5e945f7
-    int index = *p++;
Adam Tkac 5e945f7
-    if (X>1) {
Adam Tkac 5e945f7
-      U64* colors1 = d.byte1[*p++];
Adam Tkac 5e945f7
-      int index1 = *p++;
Adam Tkac 5e945f7
-#  if WORDS_BIGENDIAN
Adam Tkac 5e945f7
-      *q++ = (colors[index]<<32) | colors1[index1];
Adam Tkac 5e945f7
-#  else
Adam Tkac 5e945f7
-      *q++ = (colors1[index1]<<32) | colors[index];
Adam Tkac 5e945f7
-#  endif
Adam Tkac 5e945f7
-    } else {
Adam Tkac 5e945f7
-#  if WORDS_BIGENDIAN
Adam Tkac 5e945f7
-      *q++ = colors[index]<<32;
Adam Tkac 5e945f7
-#  else
Adam Tkac 5e945f7
-      *q++ = colors[index];
Adam Tkac 5e945f7
-#  endif
Adam Tkac 5e945f7
-    }
Adam Tkac 5e945f7
-  }
Adam Tkac 5e945f7
-}
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
-#else // U32
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
-// The callback from fl_draw_image to get a row of data passes this:
Adam Tkac 5e945f7
-struct pixmap_data {
Adam Tkac 5e945f7
-  int w, h;
Adam Tkac 5e945f7
-  const uchar*const* data;
Adam Tkac 5e945f7
-  union {
Adam Tkac 5e945f7
-    U32 colors[256];
Adam Tkac 5e945f7
-    U32* byte1[256];
Adam Tkac 5e945f7
-  };
Adam Tkac 5e945f7
-};
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
-// callback for 1 byte per pixel:
Adam Tkac 5e945f7
-static void cb1(void*v, int x, int y, int w, uchar* buf) {
Adam Tkac 5e945f7
-  pixmap_data& d = *(pixmap_data*)v;
Adam Tkac 5e945f7
-  const uchar* p = d.data[y]+x;
Adam Tkac 5e945f7
-  U32* q = (U32*)buf;
Adam Tkac 5e945f7
-  for (int X=w; X--;) *q++ = d.colors[*p++];
Adam Tkac 5e945f7
-}
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
-// callback for 2 bytes per pixel:
Adam Tkac 5e945f7
-static void cb2(void*v, int x, int y, int w, uchar* buf) {
Adam Tkac 5e945f7
-  pixmap_data& d = *(pixmap_data*)v;
Adam Tkac 5e945f7
-  const uchar* p = d.data[y]+2*x;
Adam Tkac 5e945f7
-  U32* q = (U32*)buf;
Adam Tkac 5e945f7
-  for (int X=w; X--;) {
Adam Tkac 5e945f7
-    U32* colors = d.byte1[*p++];
Adam Tkac 5e945f7
-    *q++ = colors[*p++];
Adam Tkac 5e945f7
-  }
Adam Tkac 5e945f7
-}
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
-#endif // U64 else U32
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
 uchar **fl_mask_bitmap; // if non-zero, create bitmap and store pointer here
Adam Tkac 5e945f7
 
Adam Tkac 5e945f7
 /**
Adam Tkac 5e945f7
@@ -200,34 +107,33 @@
Adam Tkac 5e945f7
 }
Adam Tkac 5e945f7
 #endif
Adam Tkac 5e945f7
 
Adam Tkac 5e945f7
-/**
Adam Tkac 5e945f7
-  Draw XPM image data, with the top-left corner at the given position.
Adam Tkac 5e945f7
-  \see fl_draw_pixmap(char* const* data, int x, int y, Fl_Color bg)
Adam Tkac 5e945f7
-  */
Adam Tkac 5e945f7
-int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) {
Adam Tkac 5e945f7
-  pixmap_data d;
Adam Tkac 5e945f7
-  if (!fl_measure_pixmap(cdata, d.w, d.h)) return 0;
Adam Tkac 5e945f7
+int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg) {
Adam Tkac 5e945f7
+  int w, h;
Adam Tkac 5e945f7
   const uchar*const* data = (const uchar*const*)(cdata+1);
Adam Tkac 5e945f7
   int transparent_index = -1;
Adam Tkac 5e945f7
+
Adam Tkac 5e945f7
+  if (!fl_measure_pixmap(cdata, w, h))
Adam Tkac 5e945f7
+    return 0;
Adam Tkac 5e945f7
+
Adam Tkac 5e945f7
+  if ((chars_per_pixel < 1) || (chars_per_pixel > 2))
Adam Tkac 5e945f7
+    return 0;
Adam Tkac 5e945f7
+
Adam Tkac 5e945f7
+  uchar colors[1<<(chars_per_pixel*8)][4];
Adam Tkac 5e945f7
+
Adam Tkac 5e945f7
 #ifdef WIN32
Adam Tkac 5e945f7
   uchar *transparent_c = (uchar *)0; // such that transparent_c[0,1,2] are the RGB of the transparent color
Adam Tkac 5e945f7
   color_count = 0;
Adam Tkac 5e945f7
   used_colors = (uchar *)malloc(abs(ncolors)*3*sizeof(uchar));
Adam Tkac 5e945f7
 #endif
Adam Tkac 5e945f7
 
Adam Tkac 5e945f7
-  if (ncolors < 0) {	// FLTK (non standard) compressed colormap
Adam Tkac 5e945f7
+  if (ncolors < 0) {
Adam Tkac 5e945f7
+    // FLTK (non standard) compressed colormap
Adam Tkac 5e945f7
     ncolors = -ncolors;
Adam Tkac 5e945f7
     const uchar *p = *data++;
Adam Tkac 5e945f7
     // if first color is ' ' it is transparent (put it later to make
Adam Tkac 5e945f7
     // it not be transparent):
Adam Tkac 5e945f7
     if (*p == ' ') {
Adam Tkac 5e945f7
-      uchar* c = (uchar*)&d.colors[(int)' '];
Adam Tkac 5e945f7
-#ifdef U64
Adam Tkac 5e945f7
-      *(U64*)c = 0;
Adam Tkac 5e945f7
-#  if WORDS_BIGENDIAN
Adam Tkac 5e945f7
-      c += 4;
Adam Tkac 5e945f7
-#  endif
Adam Tkac 5e945f7
-#endif
Adam Tkac 5e945f7
+      uchar* c = colors[(int)' '];
Adam Tkac 5e945f7
       transparent_index = ' ';
Adam Tkac 5e945f7
       Fl::get_color(bg, c[0], c[1], c[2]); c[3] = 0;
Adam Tkac 5e945f7
 #ifdef WIN32
Adam Tkac 5e945f7
@@ -238,13 +144,7 @@
Adam Tkac 5e945f7
     }
Adam Tkac 5e945f7
     // read all the rest of the colors:
Adam Tkac 5e945f7
     for (int i=0; i < ncolors; i++) {
Adam Tkac 5e945f7
-      uchar* c = (uchar*)&d.colors[*p++];
Adam Tkac 5e945f7
-#ifdef U64
Adam Tkac 5e945f7
-      *(U64*)c = 0;
Adam Tkac 5e945f7
-#  if WORDS_BIGENDIAN
Adam Tkac 5e945f7
-      c += 4;
Adam Tkac 5e945f7
-#  endif
Adam Tkac 5e945f7
-#endif
Adam Tkac 5e945f7
+      uchar* c = colors[*p++];
Adam Tkac 5e945f7
 #ifdef WIN32
Adam Tkac 5e945f7
       used_colors[3*color_count] = *p;
Adam Tkac 5e945f7
       used_colors[3*color_count+1] = *(p+1);
Adam Tkac 5e945f7
@@ -254,69 +154,44 @@
Adam Tkac 5e945f7
       *c++ = *p++;
Adam Tkac 5e945f7
       *c++ = *p++;
Adam Tkac 5e945f7
       *c++ = *p++;
Adam Tkac 5e945f7
-#ifdef __APPLE_QUARTZ__
Adam Tkac 5e945f7
       *c = 255;
Adam Tkac 5e945f7
-#else
Adam Tkac 5e945f7
-      *c = 0;
Adam Tkac 5e945f7
-#endif
Adam Tkac 5e945f7
     }
Adam Tkac 5e945f7
-  } else {	// normal XPM colormap with names
Adam Tkac 5e945f7
-    if (chars_per_pixel>1) memset(d.byte1, 0, sizeof(d.byte1));
Adam Tkac 5e945f7
+  } else {
Adam Tkac 5e945f7
+    // normal XPM colormap with names
Adam Tkac 5e945f7
     for (int i=0; i
Adam Tkac 5e945f7
       const uchar *p = *data++;
Adam Tkac 5e945f7
       // the first 1 or 2 characters are the color index:
Adam Tkac 5e945f7
       int ind = *p++;
Adam Tkac 5e945f7
       uchar* c;
Adam Tkac 5e945f7
-      if (chars_per_pixel>1) {
Adam Tkac 5e945f7
-#ifdef U64
Adam Tkac 5e945f7
-	U64* colors = d.byte1[ind];
Adam Tkac 5e945f7
-	if (!colors) colors = d.byte1[ind] = new U64[256];
Adam Tkac 5e945f7
-#else
Adam Tkac 5e945f7
-	U32* colors = d.byte1[ind];
Adam Tkac 5e945f7
-	if (!colors) colors = d.byte1[ind] = new U32[256];
Adam Tkac 5e945f7
-#endif
Adam Tkac 5e945f7
-	c = (uchar*)&colors[*p];
Adam Tkac 5e945f7
-	ind = (ind<<8)|*p++;
Adam Tkac 5e945f7
-      } else {
Adam Tkac 5e945f7
-	c = (uchar *)&d.colors[ind];
Adam Tkac 5e945f7
-      }
Adam Tkac 5e945f7
+      if (chars_per_pixel>1)
Adam Tkac 5e945f7
+        ind = (ind<<8)|*p++;
Adam Tkac 5e945f7
+      c = colors[ind];
Adam Tkac 5e945f7
       // look for "c word", or last word if none:
Adam Tkac 5e945f7
       const uchar *previous_word = p;
Adam Tkac 5e945f7
       for (;;) {
Adam Tkac 5e945f7
-	while (*p && isspace(*p)) p++;
Adam Tkac 5e945f7
-	uchar what = *p++;
Adam Tkac 5e945f7
-	while (*p && !isspace(*p)) p++;
Adam Tkac 5e945f7
-	while (*p && isspace(*p)) p++;
Adam Tkac 5e945f7
-	if (!*p) {p = previous_word; break;}
Adam Tkac 5e945f7
-	if (what == 'c') break;
Adam Tkac 5e945f7
-	previous_word = p;
Adam Tkac 5e945f7
-	while (*p && !isspace(*p)) p++;
Adam Tkac 5e945f7
+        while (*p && isspace(*p)) p++;
Adam Tkac 5e945f7
+        uchar what = *p++;
Adam Tkac 5e945f7
+        while (*p && !isspace(*p)) p++;
Adam Tkac 5e945f7
+        while (*p && isspace(*p)) p++;
Adam Tkac 5e945f7
+        if (!*p) {p = previous_word; break;}
Adam Tkac 5e945f7
+        if (what == 'c') break;
Adam Tkac 5e945f7
+        previous_word = p;
Adam Tkac 5e945f7
+        while (*p && !isspace(*p)) p++;
Adam Tkac 5e945f7
       }
Adam Tkac 5e945f7
-#ifdef U64
Adam Tkac 5e945f7
-      *(U64*)c = 0;
Adam Tkac 5e945f7
-#  if WORDS_BIGENDIAN
Adam Tkac 5e945f7
-      c += 4;
Adam Tkac 5e945f7
-#  endif
Adam Tkac 5e945f7
-#endif
Adam Tkac 5e945f7
-#ifdef __APPLE_QUARTZ__
Adam Tkac 5e945f7
-      c[3] = 255;
Adam Tkac 5e945f7
-#endif
Adam Tkac 5e945f7
       int parse = fl_parse_color((const char*)p, c[0], c[1], c[2]);
Adam Tkac 5e945f7
+      c[3] = 255;
Adam Tkac 5e945f7
       if (parse) {
Adam Tkac 5e945f7
 #ifdef WIN32
Adam Tkac 5e945f7
-	used_colors[3*color_count] = c[0];
Adam Tkac 5e945f7
-	used_colors[3*color_count+1] = c[1];
Adam Tkac 5e945f7
-	used_colors[3*color_count+2] = c[2];
Adam Tkac 5e945f7
-	color_count++;
Adam Tkac 5e945f7
+        used_colors[3*color_count] = c[0];
Adam Tkac 5e945f7
+        used_colors[3*color_count+1] = c[1];
Adam Tkac 5e945f7
+        used_colors[3*color_count+2] = c[2];
Adam Tkac 5e945f7
+        color_count++;
Adam Tkac 5e945f7
 #endif
Adam Tkac 5e945f7
-	}
Adam Tkac 5e945f7
-      else {
Adam Tkac 5e945f7
+      } else {
Adam Tkac 5e945f7
         // assume "None" or "#transparent" for any errors
Adam Tkac 5e945f7
-	// "bg" should be transparent...
Adam Tkac 5e945f7
-	Fl::get_color(bg, c[0], c[1], c[2]);
Adam Tkac 5e945f7
-#ifdef __APPLE_QUARTZ__
Adam Tkac 5e945f7
+        // "bg" should be transparent...
Adam Tkac 5e945f7
+        Fl::get_color(bg, c[0], c[1], c[2]);
Adam Tkac 5e945f7
         c[3] = 0;
Adam Tkac 5e945f7
-#endif
Adam Tkac 5e945f7
 	transparent_index = ind;
Adam Tkac 5e945f7
 #ifdef WIN32
Adam Tkac 5e945f7
 	transparent_c = c;
Adam Tkac 5e945f7
@@ -324,7 +199,6 @@
Adam Tkac 5e945f7
       }
Adam Tkac 5e945f7
     }
Adam Tkac 5e945f7
   }
Adam Tkac 5e945f7
-  d.data = data;
Adam Tkac 5e945f7
 #ifdef WIN32
Adam Tkac 5e945f7
   if (transparent_c) {
Adam Tkac 5e945f7
     make_unused_color(transparent_c[0], transparent_c[1], transparent_c[2]);
Adam Tkac 5e945f7
@@ -334,77 +208,76 @@
Adam Tkac 5e945f7
     make_unused_color(r, g, b);
Adam Tkac 5e945f7
   }
Adam Tkac 5e945f7
 #endif
Adam Tkac 5e945f7
+
Adam Tkac 5e945f7
+  U32 *q = (U32*)out;
Adam Tkac 5e945f7
+  for (int Y = 0; Y < h; Y++) {
Adam Tkac 5e945f7
+    const uchar* p = data[Y];
Adam Tkac 5e945f7
+    if (chars_per_pixel <= 1) {
Adam Tkac 5e945f7
+      for (int X = 0; X < w; X++)
Adam Tkac 5e945f7
+        memcpy(q++, colors[*p++], 4);
Adam Tkac 5e945f7
+    } else {
Adam Tkac 5e945f7
+      for (int X = 0; X < w; X++) {
Adam Tkac 5e945f7
+        int ind = (*p++)<<8;
Adam Tkac 5e945f7
+        ind |= *p++;
Adam Tkac 5e945f7
+        memcpy(q++, colors[ind], 4);
Adam Tkac 5e945f7
+      }
Adam Tkac 5e945f7
+    }
Adam Tkac 5e945f7
+  }
Adam Tkac 5e945f7
   
Adam Tkac 5e945f7
+  return 1;
Adam Tkac 5e945f7
+}
Adam Tkac 5e945f7
+
Adam Tkac 5e945f7
+/**
Adam Tkac 5e945f7
+  Draw XPM image data, with the top-left corner at the given position.
Adam Tkac 5e945f7
+  \see fl_draw_pixmap(char* const* data, int x, int y, Fl_Color bg)
Adam Tkac 5e945f7
+  */
Adam Tkac 5e945f7
+int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) {
Adam Tkac 5e945f7
+  int w, h;
Adam Tkac 5e945f7
+
Adam Tkac 5e945f7
+  if (!fl_measure_pixmap(cdata, w, h))
Adam Tkac 5e945f7
+    return 0;
Adam Tkac 5e945f7
+
Adam Tkac 5e945f7
+  uchar buffer[w*h*4];
Adam Tkac 5e945f7
+
Adam Tkac 5e945f7
+  if (!fl_convert_pixmap(cdata, buffer, bg))
Adam Tkac 5e945f7
+    return 0;
Adam Tkac 5e945f7
+
Adam Tkac 5e945f7
+  // FIXME: Hack until fl_draw_image() supports alpha properly
Adam Tkac 5e945f7
 #ifdef  __APPLE_QUARTZ__
Adam Tkac 5e945f7
   if (Fl_Surface_Device::surface() == Fl_Display_Device::display_device()) {
Adam Tkac 5e945f7
-    U32 *array = new U32[d.w * d.h], *q = array;
Adam Tkac 5e945f7
-    for (int Y = 0; Y < d.h; Y++) {
Adam Tkac 5e945f7
-      const uchar* p = data[Y];
Adam Tkac 5e945f7
-      if (chars_per_pixel <= 1) {
Adam Tkac 5e945f7
-	for (int X = 0; X < d.w; X++) {
Adam Tkac 5e945f7
-	  *q++ = d.colors[*p++];
Adam Tkac 5e945f7
-	}
Adam Tkac 5e945f7
-      } else {
Adam Tkac 5e945f7
-	for (int X = 0; X < d.w; X++) {
Adam Tkac 5e945f7
-	  U32* colors = (U32*)d.byte1[*p++];
Adam Tkac 5e945f7
-	  *q++ = colors[*p++];
Adam Tkac 5e945f7
-	}
Adam Tkac 5e945f7
-      }
Adam Tkac 5e945f7
-    }
Adam Tkac 5e945f7
-    Fl_RGB_Image* rgb = new Fl_RGB_Image((uchar*)array, d.w, d.h, 4);
Adam Tkac 5e945f7
+    Fl_RGB_Image* rgb = new Fl_RGB_Image(buffer, w, h, 4);
Adam Tkac 5e945f7
     rgb->draw(x, y);
Adam Tkac 5e945f7
     delete rgb;
Adam Tkac 5e945f7
-    delete[] array;
Adam Tkac 5e945f7
-    }
Adam Tkac 5e945f7
-  else {
Adam Tkac 5e945f7
+  } else {
Adam Tkac 5e945f7
 #endif // __APPLE_QUARTZ__
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
   // build the mask bitmap used by Fl_Pixmap:
Adam Tkac 5e945f7
-  if (fl_mask_bitmap && transparent_index >= 0) {
Adam Tkac 5e945f7
-    int W = (d.w+7)/8;
Adam Tkac 5e945f7
-    uchar* bitmap = new uchar[W * d.h];
Adam Tkac 5e945f7
+  if (fl_mask_bitmap) {
Adam Tkac 5e945f7
+    int W = (w+7)/8;
Adam Tkac 5e945f7
+    uchar* bitmap = new uchar[W * h];
Adam Tkac 5e945f7
     *fl_mask_bitmap = bitmap;
Adam Tkac 5e945f7
-    for (int Y = 0; Y < d.h; Y++) {
Adam Tkac 5e945f7
-      const uchar* p = data[Y];
Adam Tkac 5e945f7
-      if (chars_per_pixel <= 1) {
Adam Tkac 5e945f7
-	int dw = d.w;
Adam Tkac 5e945f7
-	for (int X = 0; X < W; X++) {
Adam Tkac 5e945f7
-	  uchar b = (dw-->0 && *p++ != transparent_index);
Adam Tkac 5e945f7
-	  if (dw-->0 && *p++ != transparent_index) b |= 2;
Adam Tkac 5e945f7
-	  if (dw-->0 && *p++ != transparent_index) b |= 4;
Adam Tkac 5e945f7
-	  if (dw-->0 && *p++ != transparent_index) b |= 8;
Adam Tkac 5e945f7
-	  if (dw-->0 && *p++ != transparent_index) b |= 16;
Adam Tkac 5e945f7
-	  if (dw-->0 && *p++ != transparent_index) b |= 32;
Adam Tkac 5e945f7
-	  if (dw-->0 && *p++ != transparent_index) b |= 64;
Adam Tkac 5e945f7
-	  if (dw-->0 && *p++ != transparent_index) b |= 128;
Adam Tkac 5e945f7
+    const uchar *p = &buffer[3];
Adam Tkac 5e945f7
+    uchar b = 0;
Adam Tkac 5e945f7
+    for (int Y = 0; Y < h; Y++) {
Adam Tkac 5e945f7
+      b = 0;
Adam Tkac 5e945f7
+      for (int X = 0, bit = 1; X < w; X++, p += 4) {
Adam Tkac 5e945f7
+	if (*p > 127) b |= bit;
Adam Tkac 5e945f7
+	bit <<= 1;
Adam Tkac 5e945f7
+	if (bit > 0x80 || X == w-1) {
Adam Tkac 5e945f7
 	  *bitmap++ = b;
Adam Tkac 5e945f7
-	}
Adam Tkac 5e945f7
-      } else {
Adam Tkac 5e945f7
-        uchar b = 0, bit = 1;
Adam Tkac 5e945f7
-	for (int X = 0; X < d.w; X++) {
Adam Tkac 5e945f7
-	  int ind = *p++;
Adam Tkac 5e945f7
-	  ind = (ind<<8) | (*p++);
Adam Tkac 5e945f7
-	  if (ind != transparent_index) b |= bit;
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
-          if (bit < 128) bit <<= 1;
Adam Tkac 5e945f7
-	  else {
Adam Tkac 5e945f7
-	    *bitmap++ = b;
Adam Tkac 5e945f7
-	    b = 0;
Adam Tkac 5e945f7
-	    bit = 1;
Adam Tkac 5e945f7
+	  bit = 1;
Adam Tkac 5e945f7
+	  b = 0;
Adam Tkac 5e945f7
 	  }
Adam Tkac 5e945f7
 	}
Adam Tkac 5e945f7
-
Adam Tkac 5e945f7
-        if (bit > 1) *bitmap++ = b;
Adam Tkac 5e945f7
       }
Adam Tkac 5e945f7
-    }
Adam Tkac 5e945f7
+    
Adam Tkac 5e945f7
   }
Adam Tkac 5e945f7
 
Adam Tkac 5e945f7
-  fl_draw_image(chars_per_pixel==1 ? cb1 : cb2, &d, x, y, d.w, d.h, 4);
Adam Tkac 5e945f7
+  fl_draw_image(buffer, x, y, w, h, 4);
Adam Tkac 5e945f7
+
Adam Tkac 5e945f7
 #ifdef __APPLE_QUARTZ__
Adam Tkac 5e945f7
     }
Adam Tkac 5e945f7
 #endif
Adam Tkac 5e945f7
 
Adam Tkac 5e945f7
-  if (chars_per_pixel > 1) for (int i = 0; i < 256; i++) delete[] d.byte1[i];
Adam Tkac 5e945f7
   return 1;
Adam Tkac 5e945f7
 }
Adam Tkac 5e945f7
 
Rex Dieter 23b0642
diff -ur fltk-1.3.2.org/src/Fl_Image.cxx fltk-1.3.2/src/Fl_Image.cxx
Rex Dieter 23b0642
--- fltk-1.3.2.org/src/Fl_Image.cxx	2012-11-09 17:02:08.000000000 +0100
Rex Dieter 23b0642
+++ fltk-1.3.2/src/Fl_Image.cxx	2013-01-16 14:41:38.404162795 +0100
Rex Dieter 23b0642
@@ -165,7 +165,22 @@
Rex Dieter 23b0642
 //
Rex Dieter 23b0642
 size_t Fl_RGB_Image::max_size_ = ~((size_t)0);
Adam Tkac 5e945f7
 
Rex Dieter 23b0642
-/**  The destructor free all memory and server resources that are used by  the image. */
Rex Dieter 23b0642
+int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg);
Rex Dieter 23b0642
+
Rex Dieter 23b0642
+/** The constructor creates a new RGBA image from the specified Fl_Pixmap. 
Rex Dieter 23b0642
+ 
Rex Dieter 23b0642
+ The RGBA image is built fully opaque except for the transparent area
Rex Dieter 23b0642
+ of the pixmap that is assigned the \par bg color with full transparency */
Rex Dieter 23b0642
+Fl_RGB_Image::Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg):
Rex Dieter 23b0642
+  Fl_Image(pxm->w(), pxm->h(), 4), id_(0), mask_(0)
Rex Dieter 23b0642
+{
Rex Dieter 23b0642
+  array = new uchar[w() * h() * d()];
Rex Dieter 23b0642
+  alloc_array = 1;
Rex Dieter 23b0642
+  fl_convert_pixmap(pxm->data(), (uchar*)array, bg);
Rex Dieter 23b0642
+  data((const char **)&array, 1);
Rex Dieter 23b0642
+}
Rex Dieter 23b0642
+
Rex Dieter 23b0642
+/**  The destructor frees all memory and server resources that are used by the image. */
Rex Dieter 23b0642
 Fl_RGB_Image::~Fl_RGB_Image() {
Rex Dieter 23b0642
   uncache();
Rex Dieter 23b0642
   if (alloc_array) delete[] (uchar *)array;
Rex Dieter 23b0642
diff -ur fltk-1.3.2.org/src/ps_image.cxx fltk-1.3.2/src/ps_image.cxx
Rex Dieter 23b0642
--- fltk-1.3.2.org/src/ps_image.cxx	2011-07-19 06:49:30.000000000 +0200
Rex Dieter 23b0642
+++ fltk-1.3.2/src/ps_image.cxx	2013-01-16 14:40:51.541228080 +0100
Rex Dieter 23b0642
@@ -185,72 +185,38 @@
Rex Dieter 23b0642
 
Rex Dieter 23b0642
 extern uchar **fl_mask_bitmap;
Rex Dieter 23b0642
 
Rex Dieter 23b0642
+struct callback_data {
Rex Dieter 23b0642
+  const uchar *data;
Rex Dieter 23b0642
+  int D, LD;
Rex Dieter 23b0642
+};
Rex Dieter 23b0642
 
Rex Dieter 23b0642
-void Fl_PostScript_Graphics_Driver::draw_image(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD) {
Rex Dieter 23b0642
-  double x = ix, y = iy, w = iw, h = ih;
Rex Dieter 23b0642
 
Rex Dieter 23b0642
-  if (D<3){ //mono
Rex Dieter 23b0642
-    draw_image_mono(data, ix, iy, iw, ih, D, LD);
Rex Dieter 23b0642
-    return;
Rex Dieter 23b0642
-  }
Rex Dieter 23b0642
+static void draw_image_cb(void *data, int x, int y, int w, uchar *buf) {
Rex Dieter 23b0642
+  struct callback_data *cb_data;
Rex Dieter 23b0642
+  const uchar *curdata;
Rex Dieter 23b0642
 
Rex Dieter 23b0642
+  cb_data = (struct callback_data*)data;
Rex Dieter 23b0642
+  curdata = cb_data->data + x*cb_data->D + y*cb_data->LD;
Rex Dieter 23b0642
 
Rex Dieter 23b0642
-  int i,j, k;
Rex Dieter 23b0642
+  memcpy(buf, curdata, w*cb_data->D);
Rex Dieter 23b0642
+}
Rex Dieter 23b0642
 
Rex Dieter 23b0642
-  fprintf(output,"save\n");
Rex Dieter 23b0642
 
Rex Dieter 23b0642
-  const char * interpol;
Rex Dieter 23b0642
-  if (lang_level_>1){
Rex Dieter 23b0642
-    if (interpolate_)
Rex Dieter 23b0642
-      interpol="true";
Rex Dieter 23b0642
-    else
Rex Dieter 23b0642
-      interpol="false";
Rex Dieter 23b0642
-    if (mask && lang_level_>2)
Rex Dieter 23b0642
-      fprintf(output, "%g %g %g %g %i %i %i %i %s CIM\n", x , y+h , w , -h , iw , ih, mx, my, interpol);
Rex Dieter 23b0642
-    else
Rex Dieter 23b0642
-      fprintf(output, "%g %g %g %g %i %i %s CII\n", x , y+h , w , -h , iw , ih, interpol);
Rex Dieter 23b0642
-  } else
Rex Dieter 23b0642
-    fprintf(output , "%g %g %g %g %i %i CI", x , y+h , w , -h , iw , ih);
Rex Dieter 23b0642
+void Fl_PostScript_Graphics_Driver::draw_image(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD) {
Rex Dieter 23b0642
+  if (D<3){ //mono
Rex Dieter 23b0642
+    draw_image_mono(data, ix, iy, iw, ih, D, LD);
Rex Dieter 23b0642
+    return;
Rex Dieter 23b0642
+  }
Rex Dieter 23b0642
 
Rex Dieter 23b0642
+  struct callback_data cb_data;
Rex Dieter 23b0642
 
Rex Dieter 23b0642
   if (!LD) LD = iw*D;
Rex Dieter 23b0642
-  uchar *curmask=mask;
Rex Dieter 23b0642
-
Rex Dieter 23b0642
-  for (j=0; j
Rex Dieter 23b0642
-    if (mask){
Rex Dieter 23b0642
-
Rex Dieter 23b0642
-      for (k=0;k
Rex Dieter 23b0642
-        for (i=0; i<((mx+7)/8);i++){
Rex Dieter 23b0642
-          if (!(i%80)) fprintf(output, "\n");
Rex Dieter 23b0642
-          fprintf(output, "%.2x",swap_byte(*curmask));
Rex Dieter 23b0642
-          curmask++;
Rex Dieter 23b0642
-        }
Rex Dieter 23b0642
-        fprintf(output,"\n");
Rex Dieter 23b0642
-      }
Rex Dieter 23b0642
-    }
Rex Dieter 23b0642
-    const uchar *curdata=data+j*LD;
Rex Dieter 23b0642
-    for (i=0 ; i
Rex Dieter 23b0642
-      uchar r = curdata[0];
Rex Dieter 23b0642
-      uchar g =  curdata[1];
Rex Dieter 23b0642
-      uchar b =  curdata[2];
Rex Dieter 23b0642
-      if (lang_level_<3 && D>3) { //can do  mixing using bg_* colors)
Rex Dieter 23b0642
-        unsigned int a2 = curdata[3]; //must be int
Rex Dieter 23b0642
-        unsigned int a = 255-a2;
Rex Dieter 23b0642
-        r = (a2 * r + bg_r * a)/255;
Rex Dieter 23b0642
-        g = (a2 * g + bg_g * a)/255;
Rex Dieter 23b0642
-        b = (a2 * b + bg_b * a)/255;
Rex Dieter 23b0642
-      }
Rex Dieter 23b0642
-      if (!(i%40)) fprintf(output, "\n");
Rex Dieter 23b0642
-      fprintf(output, "%.2x%.2x%.2x", r, g, b);
Rex Dieter 23b0642
-      curdata +=D;
Rex Dieter 23b0642
-    }
Rex Dieter 23b0642
-    fprintf(output,"\n");
Rex Dieter 23b0642
-
Rex Dieter 23b0642
-  }
Rex Dieter 23b0642
-
Rex Dieter 23b0642
-  fprintf(output," >\nrestore\n" );
Rex Dieter 23b0642
 
Rex Dieter 23b0642
+  cb_data.data = data;
Rex Dieter 23b0642
+  cb_data.D = D;
Rex Dieter 23b0642
+  cb_data.LD = LD;
Rex Dieter 23b0642
 
Rex Dieter 23b0642
+  draw_image(draw_image_cb, &cb_data, ix, iy, iw, ih, D);
Rex Dieter 23b0642
 }
Rex Dieter 23b0642
 
Rex Dieter 23b0642
 void Fl_PostScript_Graphics_Driver::draw_image(Fl_Draw_Image_Cb call, void *data, int ix, int iy, int iw, int ih, int D) {
Rex Dieter 23b0642
@@ -325,6 +291,14 @@
Rex Dieter 23b0642
 	uchar g =  curdata[1];
Rex Dieter 23b0642
 	uchar b =  curdata[2];
Rex Dieter 23b0642
 
Rex Dieter 23b0642
+        if (lang_level_<3 && D>3) { //can do  mixing using bg_* colors)
Rex Dieter 23b0642
+          unsigned int a2 = curdata[3]; //must be int
Rex Dieter 23b0642
+          unsigned int a = 255-a2;
Rex Dieter 23b0642
+          r = (a2 * r + bg_r * a)/255;
Rex Dieter 23b0642
+          g = (a2 * g + bg_g * a)/255;
Rex Dieter 23b0642
+          b = (a2 * b + bg_b * a)/255;
Rex Dieter 23b0642
+        }
Rex Dieter 23b0642
+
Rex Dieter 23b0642
 	if (!(i%40)) 	fputs("\n", output);
Rex Dieter 23b0642
 	fprintf(output, "%.2x%.2x%.2x", r, g, b);
Adam Tkac 5e945f7