summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2017-08-30 15:49:58 +0000
committerManolo Gouy <Manolo>2017-08-30 15:49:58 +0000
commiteae09e7fa09c6a00988653ed67fe0d82f1861bff (patch)
treefb6294b229eecc8222a6aae71a0790c9941be1ca
parent1b7750913328829c2d3c7f99b36b3a44758e69a2 (diff)
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
-rw-r--r--FL/Fl_Bitmap.H1
-rw-r--r--FL/Fl_Image.H2
-rw-r--r--FL/Fl_Pixmap.H1
-rw-r--r--src/Fl_Bitmap.cxx5
-rw-r--r--src/Fl_Graphics_Driver.cxx6
-rw-r--r--src/Fl_Image.cxx11
-rw-r--r--src/Fl_Pixmap.cxx4
7 files changed, 25 insertions, 5 deletions
diff --git a/FL/Fl_Bitmap.H b/FL/Fl_Bitmap.H
index fe457999b..dd3fe392d 100644
--- a/FL/Fl_Bitmap.H
+++ b/FL/Fl_Bitmap.H
@@ -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:
diff --git a/FL/Fl_Image.H b/FL/Fl_Image.H
index 3f0ab6fa7..ae626772c 100644
--- a/FL/Fl_Image.H
+++ b/FL/Fl_Image.H
@@ -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:
diff --git a/FL/Fl_Pixmap.H b/FL/Fl_Pixmap.H
index df6eddb4c..a80b4d27a 100644
--- a/FL/Fl_Pixmap.H
+++ b/FL/Fl_Pixmap.H
@@ -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:
diff --git a/src/Fl_Bitmap.cxx b/src/Fl_Bitmap.cxx
index 450886d38..9baacf321 100644
--- a/src/Fl_Bitmap.cxx
+++ b/src/Fl_Bitmap.cxx
@@ -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$".
//
diff --git a/src/Fl_Graphics_Driver.cxx b/src/Fl_Graphics_Driver.cxx
index 737bffc09..e802952c9 100644
--- a/src/Fl_Graphics_Driver.cxx
+++ b/src/Fl_Graphics_Driver.cxx
@@ -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;
diff --git a/src/Fl_Image.cxx b/src/Fl_Image.cxx
index 4b074be4a..a622f7d9e 100644
--- a/src/Fl_Image.cxx
+++ b/src/Fl_Image.cxx
@@ -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$".
//
diff --git a/src/Fl_Pixmap.cxx b/src/Fl_Pixmap.cxx
index 67b7e67e4..55658249a 100644
--- a/src/Fl_Pixmap.cxx
+++ b/src/Fl_Pixmap.cxx
@@ -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$".
//