WIN32: Fl_Pixmap printing uses a global variable called win_pixmap_bg_color equal to the color

used for the pixmap background, and treats this color as transparent. FLTK assigns to this variable
a color unused by the processed pixmap. In theory this variable should be specific to each processed
pixmap. In practice, it's very unlikely that several values are needed. A new member variable is
added to the Fl_Pixmap object to hold this value. This member is made static if FLTK_ABI_VERSION
< 10302 for ABI compatibility. The correct thing, though, is for a non-static member.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9308 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy 2012-03-28 13:19:33 +00:00
parent 0b6f546b0f
commit ae4d6338b8
2 changed files with 18 additions and 2 deletions

View File

@ -22,6 +22,9 @@
#ifndef Fl_Pixmap_H
#define Fl_Pixmap_H
# include "Fl_Image.H"
#if defined(WIN32)
# include "x.H"
#endif
class Fl_Widget;
struct Fl_Menu_Item;
@ -56,6 +59,12 @@ class FL_EXPORT Fl_Pixmap : public Fl_Image {
private:
#if defined(WIN32)
#if FLTK_ABI_VERSION < 10302
static // a static member is needed for ABI compatibility
#endif
UINT pixmap_bg_color; // RGB color used for pixmap background
#endif // WIN32
#if defined(__APPLE__) || defined(WIN32)
void *id_; // for internal use
void *mask_; // for internal use (mask bitmap)

View File

@ -113,6 +113,10 @@ int Fl_Pixmap::prepare(int XP, int YP, int WP, int HP, int cx, int cy,
#endif
fl_draw_pixmap(data(), 0, 0, FL_BLACK);
#ifndef __APPLE__
#if defined(WIN32)
extern UINT win_pixmap_bg_color; // computed by fl_draw_pixmap()
this->pixmap_bg_color = win_pixmap_bg_color;
#endif
fl_mask_bitmap = 0;
if (bitmap) {
mask_ = fl_create_bitmask(w(), h(), bitmap);
@ -149,6 +153,10 @@ void Fl_GDI_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP
}
}
#if FLTK_ABI_VERSION < 10302
COLORREF Fl_Pixmap::pixmap_bg_color = 0;
#endif
void Fl_GDI_Printer_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy) {
int X, Y, W, H;
if (pxm->prepare(XP, YP, WP, HP, cx, cy, X, Y, W, H)) return;
@ -164,8 +172,7 @@ void Fl_GDI_Printer_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP
int save = SaveDC(new_gc);
SelectObject(new_gc, (void*)pxm->id_);
// print all of offscreen but its parts in background color
extern UINT win_pixmap_bg_color; // computed by fl_draw_pixmap()
fl_TransparentBlt(fl_gc, X, Y, W, H, new_gc, cx, cy, pxm->w(), pxm->h(), win_pixmap_bg_color );
fl_TransparentBlt(fl_gc, X, Y, W, H, new_gc, cx, cy, pxm->w(), pxm->h(), pxm->pixmap_bg_color );
RestoreDC(new_gc,save);
DeleteDC(new_gc);
}