mirror of https://github.com/fltk/fltk
Create virtual Fl_Image::draw_scaled_(int X, int Y, int W, int H) and its implementations for image classes.
This allows to use the virtual function mechanism to adapt scaled image drawing both to the image type and the graphics driver type. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12410 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
1b77509133
commit
eae09e7fa0
|
@ -46,6 +46,7 @@ private:
|
|||
/** for internal use */
|
||||
fl_uintptr_t id_;
|
||||
float cache_scale_; // graphics scaling value when id_ was computed
|
||||
virtual int draw_scaled_(int X, int Y, int W, int H);
|
||||
|
||||
public:
|
||||
|
||||
|
|
|
@ -69,6 +69,7 @@ private:
|
|||
// Forbid use of copy constructor and assign operator
|
||||
Fl_Image & operator=(const Fl_Image &);
|
||||
Fl_Image(const Fl_Image &);
|
||||
virtual int draw_scaled_(int X, int Y, int W, int H);
|
||||
|
||||
protected:
|
||||
|
||||
|
@ -224,6 +225,7 @@ private:
|
|||
fl_uintptr_t id_;
|
||||
fl_uintptr_t mask_;
|
||||
float cache_scale_; // graphics scaling value when id_ was computed
|
||||
virtual int draw_scaled_(int X, int Y, int W, int H);
|
||||
|
||||
public:
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ class FL_EXPORT Fl_Pixmap : public Fl_Image {
|
|||
void set_data(const char * const *p);
|
||||
int prepare(int XP, int YP, int WP, int HP, int &cx, int &cy,
|
||||
int &X, int &Y, int &W, int &H);
|
||||
virtual int draw_scaled_(int X, int Y, int W, int H);
|
||||
|
||||
protected:
|
||||
|
||||
|
|
|
@ -232,6 +232,11 @@ Fl_Image *Fl_Bitmap::copy(int W, int H) {
|
|||
}
|
||||
|
||||
|
||||
int Fl_Bitmap::draw_scaled_(int X, int Y, int W, int H) {
|
||||
return (W <= w() && H <= h()) ? fl_graphics_driver->draw_scaled(this, X, Y, W, H) : 0;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
|
|
|
@ -196,11 +196,7 @@ void Fl_Graphics_Driver::draw(Fl_Shared_Image *shared, int X, int Y) {
|
|||
shared->image_->draw(X, Y, shared->w(), shared->h(), 0, 0);
|
||||
return;
|
||||
}
|
||||
// don't call Fl_Graphics_Driver::draw_scaled(Fl_Image*,...) for an enlarged Fl_Bitmap or Fl_Pixmap
|
||||
if (shared->image_->as_rgb_image() || (shared->w() <= shared->image_->w() && shared->h() <= shared->image_->h())) {
|
||||
int done = draw_scaled(shared->image_, X, Y, shared->w(), shared->h());
|
||||
if (done) return;
|
||||
}
|
||||
if ( shared->image_->draw_scaled_(X, Y, shared->w(), shared->h()) ) return;
|
||||
if (shared->scaled_image_ && (shared->scaled_image_->w() != shared->w() || shared->scaled_image_->h() != shared->h())) {
|
||||
delete shared->scaled_image_;
|
||||
shared->scaled_image_ = NULL;
|
||||
|
|
|
@ -578,6 +578,17 @@ void Fl_RGB_Image::label(Fl_Menu_Item* m) {
|
|||
m->label(_FL_IMAGE_LABEL, (const char*)this);
|
||||
}
|
||||
|
||||
int Fl_RGB_Image::draw_scaled_(int X, int Y, int W, int H) {
|
||||
return fl_graphics_driver->draw_scaled(this, X, Y, W, H);
|
||||
}
|
||||
|
||||
// Draws the image scaled to W and H, and returns 1,
|
||||
// or returns 0 if scaled drawing is not implemented for this image.
|
||||
// Image classes can re-implement this function for specific image types.
|
||||
int Fl_Image::draw_scaled_(int X, int Y, int W, int H) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
|
|
|
@ -394,6 +394,10 @@ void Fl_Pixmap::desaturate() {
|
|||
}
|
||||
}
|
||||
|
||||
int Fl_Pixmap::draw_scaled_(int X, int Y, int W, int H) {
|
||||
return (W <= w() && H <= h()) ? fl_graphics_driver->draw_scaled(this, X, Y, W, H) : 0;
|
||||
}
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
|
|
Loading…
Reference in New Issue