Implementation of Fl_Shared_Image::scale(width, height) for scaled image drawing - cont'd

Shorter implementation based on Fl_Graphics_Driver::draw_scaled(Fl_Image *,...).

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10616 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy 2015-03-11 06:21:17 +00:00
parent dbde470f8d
commit e69467bbc9
6 changed files with 15 additions and 83 deletions

View File

@ -405,11 +405,7 @@ public:
#if FLTK_ABI_VERSION >= 10304 || defined(FL_DOXYGEN)
virtual
#endif
int draw_scaled(Fl_RGB_Image *img, int X, int Y, int W, int H);
#if FLTK_ABI_VERSION >= 10304 || defined(FL_DOXYGEN)
virtual
#endif
int draw_scaled(Fl_Pixmap *img, int X, int Y, int W, int H);
int draw_scaled(Fl_Image *img, int X, int Y, int W, int H);
/** \brief The destructor */
virtual ~Fl_Graphics_Driver() { if (p) free(p); }
};
@ -436,8 +432,7 @@ public:
void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
int draw_scaled(Fl_RGB_Image *img, int XP, int YP, int WP, int HP);
int draw_scaled(Fl_Pixmap *img, int XP, int YP, int WP, int HP);
int draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP);
void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
@ -498,8 +493,7 @@ public:
const char *class_name() {return class_id;};
void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy);
int draw_scaled(Fl_RGB_Image *img, int X, int Y, int W, int H);
int draw_scaled(Fl_Pixmap *img, int X, int Y, int W, int H);
int draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP);
};
#endif
#if !(defined(__APPLE__) || defined(WIN32))

View File

@ -213,8 +213,7 @@ class Clip {
void draw(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy);
int draw_scaled(Fl_RGB_Image *img, int XP, int YP, int WP, int HP);
int draw_scaled(Fl_Pixmap *img, int XP, int YP, int WP, int HP);
int draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP);
int clocale_printf(const char *format, ...);
~Fl_PostScript_Graphics_Driver();
};

View File

@ -548,21 +548,13 @@ static int start(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int w, int h
return 0;
}
/** Draws an Fl_RGB_Image scaled to width \p W & height \p H with top-left corner at \em X,Y
/** Draws an Fl_Image scaled to width \p W & height \p H with top-left corner at \em X,Y
\return zero when the graphics driver doesn't implement scaled drawing, non-zero if it does implement it.
*/
int Fl_Graphics_Driver::draw_scaled(Fl_RGB_Image *img, int X, int Y, int W, int H) {
int Fl_Graphics_Driver::draw_scaled(Fl_Image *img, int X, int Y, int W, int H) {
return 0;
}
/** Draws an Fl_Pixmap scaled to width \p W & height \p H with top-left corner at \em X,Y
\return zero when the graphics driver doesn't implement scaled drawing, non-zero if it does implement it.
*/
int Fl_Graphics_Driver::draw_scaled(Fl_Pixmap *img, int X, int Y, int W, int H) {
return 0;
}
#ifdef __APPLE__
static void imgProviderReleaseData (void *info, const void *data, size_t size)
{
@ -627,7 +619,7 @@ void Fl_Quartz_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP,
}
}
int Fl_Quartz_Graphics_Driver::draw_scaled(Fl_RGB_Image *img, int XP, int YP, int WP, int HP) {
int Fl_Quartz_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP) {
int X, Y, W, H;
fl_clip_box(XP,YP,WP,HP,X,Y,W,H); // X,Y,W,H will give the unclipped area of XP,YP,WP,HP
if (W == 0 || H == 0) return 1;
@ -636,7 +628,7 @@ int Fl_Quartz_Graphics_Driver::draw_scaled(Fl_RGB_Image *img, int XP, int YP, in
CGContextClipToRect(fl_gc, CGRectMake(X, Y, W, H)); // this clip path will be rescaled & translated
CGContextTranslateCTM(fl_gc, XP, YP);
CGContextScaleCTM(fl_gc, float(WP)/img->w(), float(HP)/img->h());
draw(img, 0, 0, img->w(), img->h(), 0, 0);
img->draw(0, 0, img->w(), img->h(), 0, 0);
CGContextRestoreGState(fl_gc);
fl_pop_clip(); // restore FLTK's clip
return 1;
@ -688,7 +680,7 @@ void Fl_GDI_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int
}
}
int Fl_GDI_Printer_Graphics_Driver::draw_scaled(Fl_RGB_Image *img, int XP, int YP, int WP, int HP) {
int Fl_GDI_Printer_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP) {
XFORM old_tr, tr;
GetWorldTransform(fl_gc, &old_tr); // storing old transform
tr.eM11 = float(WP)/float(img->w());
@ -697,9 +689,9 @@ int Fl_GDI_Printer_Graphics_Driver::draw_scaled(Fl_RGB_Image *img, int XP, int Y
tr.eDx = XP;
tr.eDy = YP;
ModifyWorldTransform(fl_gc, &tr, MWT_LEFTMULTIPLY);
Fl_GDI_Graphics_Driver::draw(img, 0, 0, img->w(), img->h(), 0, 0);
img->draw(0, 0, img->w(), img->h(), 0, 0);
SetWorldTransform(fl_gc, &old_tr);
return 1;
return 1;
}
#else

View File

@ -135,21 +135,6 @@ void Fl_Quartz_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int
copy_offscreen(X, Y, W, H, (Fl_Offscreen)pxm->id_, cx, cy);
}
int Fl_Quartz_Graphics_Driver::draw_scaled(Fl_Pixmap *img, int XP, int YP, int WP, int HP) {
int X, Y, W, H;
fl_clip_box(XP,YP,WP,HP,X,Y,W,H); // X,Y,W,H will give the unclipped area of XP,YP,WP,HP
if (W == 0 || H == 0) return 1;
fl_push_no_clip(); // remove the FLTK clip that can't be rescaled
CGContextSaveGState(fl_gc);
CGContextClipToRect(fl_gc, CGRectMake(X, Y, W, H)); // this clip path will be rescaled & translated
CGContextTranslateCTM(fl_gc, XP, YP);
CGContextScaleCTM(fl_gc, float(WP)/img->w(), float(HP)/img->h());
draw(img, 0, 0, img->w(), img->h(), 0, 0);
CGContextRestoreGState(fl_gc);
fl_pop_clip(); // restore FLTK's clip
return 1;
}
#elif defined(WIN32)
void Fl_GDI_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy) {
int X, Y, W, H;
@ -196,20 +181,6 @@ void Fl_GDI_Printer_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP
}
}
int Fl_GDI_Printer_Graphics_Driver::draw_scaled(Fl_Pixmap *img, int XP, int YP, int WP, int HP) {
XFORM old_tr, tr;
GetWorldTransform(fl_gc, &old_tr); // storing old transform
tr.eM11 = float(WP)/float(img->w());
tr.eM22 = float(HP)/float(img->h());
tr.eM12 = tr.eM21 = 0;
tr.eDx = XP;
tr.eDy = YP;
ModifyWorldTransform(fl_gc, &tr, MWT_LEFTMULTIPLY);
draw(img, 0, 0, img->w(), img->h(), 0, 0);
SetWorldTransform(fl_gc, &old_tr);
}
#else // Xlib
void Fl_Xlib_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy) {
int X, Y, W, H;

View File

@ -338,19 +338,8 @@ void Fl_Shared_Image::draw(int X, int Y, int W, int H, int cx, int cy) {
return;
}
fl_push_clip(X, Y, W, H);
int use_scaled_image = 0, done;
if (image_->d() == 0) { // handles Fl_Bitmap
use_scaled_image = 1;
}
else if (image_->count() >= 2) { // handles Fl_Pixmap
done = fl_graphics_driver->draw_scaled((Fl_Pixmap*)image_, X-cx, Y-cy, w(), h());
if (done == 0) use_scaled_image = 1;
}
else { // handles Fl_RGB_Image
done = fl_graphics_driver->draw_scaled((Fl_RGB_Image*)image_, X-cx, Y-cy, w(), h());
if (done == 0) use_scaled_image = 1;
}
if (use_scaled_image) {
int done = fl_graphics_driver->draw_scaled(image_, X-cx, Y-cy, w(), h());
if (!done) {
if (scaled_image_ && (scaled_image_->w() != w() || scaled_image_->h() != h())) {
delete scaled_image_;
scaled_image_ = NULL;

View File

@ -602,27 +602,14 @@ void Fl_PostScript_Graphics_Driver::draw(Fl_RGB_Image * rgb,int XP, int YP, int
mask=0;
}
int Fl_PostScript_Graphics_Driver::draw_scaled(Fl_RGB_Image *rgb, int XP, int YP, int WP, int HP){
int X, Y, W, H;
clip_box(XP,YP,WP,HP,X,Y,W,H); // X,Y,W,H will give the unclipped area of XP,YP,WP,HP
if (W == 0 || H == 0) return 1;
push_no_clip(); // remove the FLTK clip that can't be rescaled
clocale_printf("%d %d %i %i CL\n", X, Y, W, H);
clocale_printf("GS %d %d TR %f %f SC GS\n", XP, YP, float(WP)/rgb->w(), float(HP)/rgb->h());
draw(rgb, 0, 0, rgb->w(), rgb->h(), 0, 0);
clocale_printf("GR GR\n");
pop_clip(); // restore FLTK's clip
return 1;
}
int Fl_PostScript_Graphics_Driver::draw_scaled(Fl_Pixmap *img, int XP, int YP, int WP, int HP){
int Fl_PostScript_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP){
int X, Y, W, H;
clip_box(XP,YP,WP,HP,X,Y,W,H); // X,Y,W,H will give the unclipped area of XP,YP,WP,HP
if (W == 0 || H == 0) return 1;
push_no_clip(); // remove the FLTK clip that can't be rescaled
clocale_printf("%d %d %i %i CL\n", X, Y, W, H);
clocale_printf("GS %d %d TR %f %f SC GS\n", XP, YP, float(WP)/img->w(), float(HP)/img->h());
draw(img, 0, 0, img->w(), img->h(), 0, 0);
img->draw(0, 0, img->w(), img->h(), 0, 0);
clocale_printf("GR GR\n");
pop_clip(); // restore FLTK's clip
return 1;