summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/PostScript/Fl_PostScript.cxx9
-rw-r--r--src/drivers/PostScript/Fl_PostScript_Graphics_Driver.H8
-rw-r--r--src/drivers/PostScript/Fl_PostScript_image.cxx118
3 files changed, 128 insertions, 7 deletions
diff --git a/src/drivers/PostScript/Fl_PostScript.cxx b/src/drivers/PostScript/Fl_PostScript.cxx
index 4ce3f67b9..f5d8f8f11 100644
--- a/src/drivers/PostScript/Fl_PostScript.cxx
+++ b/src/drivers/PostScript/Fl_PostScript.cxx
@@ -145,12 +145,11 @@ Fl_PostScript_Graphics_Driver::Fl_PostScript_Graphics_Driver(void)
//lang_level_ = 3;
lang_level_ = 2;
mask = 0;
-#endif
- ps_filename_ = NULL;
- scale_x = scale_y = 1.;
bg_r = bg_g = bg_b = 255;
clip_ = NULL;
- what = NONE;
+ scale_x = scale_y = 1.;
+#endif
+ ps_filename_ = NULL;
}
/** \brief The destructor. */
@@ -1750,9 +1749,9 @@ Fl_EPS_File_Surface::Fl_EPS_File_Surface(int width, int height, FILE *eps, Fl_Co
if (s != 1) {
ps->clocale_printf("GR GR GS %f %f SC GS\n", s, s);
}
+ Fl::get_color(background, ps->bg_r, ps->bg_g, ps->bg_b);
#endif
ps->scale_x = ps->scale_y = s;
- Fl::get_color(background, ps->bg_r, ps->bg_g, ps->bg_b);
}
}
diff --git a/src/drivers/PostScript/Fl_PostScript_Graphics_Driver.H b/src/drivers/PostScript/Fl_PostScript_Graphics_Driver.H
index 0c0ec1aaf..904644f42 100644
--- a/src/drivers/PostScript/Fl_PostScript_Graphics_Driver.H
+++ b/src/drivers/PostScript/Fl_PostScript_Graphics_Driver.H
@@ -49,7 +49,6 @@ public:
char *ps_filename_;
int nPages;
double pw_, ph_;
- uchar bg_r, bg_g, bg_b;
Fl_PostScript_Graphics_Driver();
~Fl_PostScript_Graphics_Driver();
@@ -80,6 +79,13 @@ public:
int not_clipped(int x, int y, int w, int h) FL_OVERRIDE;
int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H) FL_OVERRIDE;
virtual int has_feature(driver_feature feature_mask) FL_OVERRIDE { return feature_mask & PRINTER; }
+#if !FLTK_USE_CAIRO
+ // draw image classes without caching them
+ void draw_rgb_bitmap_(Fl_Image *img,int XP, int YP, int WP, int HP, int cx, int cy);
+ void draw_pixmap(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy) FL_OVERRIDE;
+ void draw_bitmap(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy) FL_OVERRIDE;
+ void draw_rgb(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy) FL_OVERRIDE;
+#endif // !FLTK_USE_CAIRO
};
#else // ! USE_PANGO
diff --git a/src/drivers/PostScript/Fl_PostScript_image.cxx b/src/drivers/PostScript/Fl_PostScript_image.cxx
index 0ae56609a..c78627727 100644
--- a/src/drivers/PostScript/Fl_PostScript_image.cxx
+++ b/src/drivers/PostScript/Fl_PostScript_image.cxx
@@ -68,7 +68,123 @@ void Fl_PostScript_Graphics_Driver::draw_image(const uchar *data, int ix, int iy
draw_image(draw_image_cb, &cb_data, ix, iy, iw, ih, abs(D));
}
-#if ! USE_PANGO
+#if USE_PANGO
+
+#if !FLTK_USE_CAIRO
+
+static void destroy_BGRA(void *data) {
+ delete[] (uchar*)data;
+}
+
+
+void Fl_PostScript_Graphics_Driver::draw_pixmap(Fl_Pixmap *pxm,int XP, int YP, int WP, int HP, int cx, int cy) {
+ Fl_RGB_Image *rgb = new Fl_RGB_Image(pxm);
+ draw_rgb_bitmap_(rgb, XP, YP, WP, HP, cx, cy);
+ delete rgb;
+}
+
+
+void Fl_PostScript_Graphics_Driver::draw_rgb(Fl_RGB_Image *rgb,int XP, int YP, int WP, int HP, int cx, int cy) {
+ draw_rgb_bitmap_(rgb, XP, YP, WP, HP, cx, cy);
+}
+
+
+void Fl_PostScript_Graphics_Driver::draw_bitmap(Fl_Bitmap *bitmap,int XP, int YP, int WP, int HP, int cx, int cy) {
+ draw_rgb_bitmap_(bitmap, XP, YP, WP, HP, cx, cy);
+}
+
+
+void Fl_PostScript_Graphics_Driver::draw_rgb_bitmap_(Fl_Image *img,int XP, int YP, int WP, int HP, int cx, int cy)
+{
+ cairo_surface_t *surf;
+ cairo_format_t format = (img->d() >= 1 ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_A1);
+ int stride = cairo_format_stride_for_width(format, img->data_w());
+ uchar *BGRA = new uchar[stride * img->data_h()];
+ memset(BGRA, 0, stride * img->data_h());
+ if (img->d() >= 1) { // process Fl_RGB_Image of all depths
+ Fl_RGB_Image *rgb = (Fl_RGB_Image*)img;
+ int lrgb = rgb->ld() ? rgb->ld() : rgb->data_w() * rgb->d();
+ uchar A = 0xff, R,G,B, *q;
+ const uchar *r;
+ float f = 1;
+ if (rgb->d() >= 3) { // color images
+ for (int j = 0; j < rgb->data_h(); j++) {
+ r = rgb->array + j * lrgb;
+ q = BGRA + j * stride;
+ for (int i = 0; i < rgb->data_w(); i++) {
+ R = *r;
+ G = *(r+1);
+ B = *(r+2);
+ if (rgb->d() == 4) {
+ A = *(r+3);
+ f = float(A)/0xff;
+ }
+ *q = B * f;
+ *(q+1) = G * f;
+ *(q+2) = R * f;
+ *(q+3) = A;
+ r += rgb->d(); q += 4;
+ }
+ }
+ } else if (rgb->d() == 1 || rgb->d() == 2) { // B&W
+ for (int j = 0; j < rgb->data_h(); j++) {
+ r = rgb->array + j * lrgb;
+ q = BGRA + j * stride;
+ for (int i = 0; i < rgb->data_w(); i++) {
+ G = *r;
+ if (rgb->d() == 2) {
+ A = *(r+1);
+ f = float(A)/0xff;
+ }
+ *(q) = G * f;
+ *(q+1) = G * f;
+ *(q+2) = G * f;
+ *(q+3) = A;
+ r += rgb->d(); q += 4;
+ }
+ }
+ }
+ } else {
+ Fl_Bitmap *bm = (Fl_Bitmap*)img;
+ uchar *r, p;
+ unsigned *q;
+ for (int j = 0; j < bm->data_h(); j++) {
+ r = (uchar*)bm->array + j * ((bm->data_w() + 7)/8);
+ q = (unsigned*)(BGRA + j * stride);
+ unsigned k = 0, mask32 = 1;
+ p = *r;
+ for (int i = 0; i < bm->data_w(); i++) {
+ if (p&1) (*q) |= mask32;
+ k++;
+ if (k % 8 != 0) p >>= 1; else p = *(++r);
+ if (k % 32 != 0) mask32 <<= 1; else {q++; mask32 = 1;}
+ }
+ }
+ }
+ surf = cairo_image_surface_create_for_data(BGRA, format, img->data_w(), img->data_h(), stride);
+ if (cairo_surface_status(surf) == CAIRO_STATUS_SUCCESS) {
+ static cairo_user_data_key_t key = {};
+ (void)cairo_surface_set_user_data(surf, &key, BGRA, destroy_BGRA);
+ cairo_pattern_t *pat = cairo_pattern_create_for_surface(surf);
+ cairo_save(cairo_);
+ cairo_rectangle(cairo_, XP-0.5, YP-0.5, WP+1, HP+1);
+ cairo_clip(cairo_);
+ if (img->d() >= 1) cairo_set_source(cairo_, pat);
+ cairo_matrix_t matrix;
+ cairo_matrix_init_scale(&matrix, double(img->data_w())/(img->w()+1), double(img->data_h())/(img->h()+1));
+ cairo_matrix_translate(&matrix, -XP+0.5+cx, -YP+0.5+cy);
+ cairo_pattern_set_matrix(pat, &matrix);
+ cairo_mask(cairo_, pat);
+ cairo_pattern_destroy(pat);
+ cairo_surface_destroy(surf);
+ cairo_restore(cairo_);
+ check_status();
+ }
+}
+
+#endif // !FLTK_USE_CAIRO
+
+#else // ! USE_PANGO
//
// Implementation of the /ASCII85Encode PostScript filter