From d24a6b2633664959d0b0ab5fd1ab3aa140ab877f Mon Sep 17 00:00:00 2001 From: Albrecht Schlosser Date: Tue, 14 Oct 2014 11:53:51 +0000 Subject: [PATCH] Move RGB image scaling algorithm methods in base class Fl_Image. See also discussion in fltk.coredev of Sept 07, 2014 and later with subject "Fixing the nearest-neighbour scaling". git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10377 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- FL/Fl_Image.H | 43 ++++++++++++++++++++---------------------- examples/clipboard.cxx | 2 ++ src/Fl_Image.cxx | 29 ++++++++++++++++------------ src/Fl_cocoa.mm | 8 ++++---- 4 files changed, 43 insertions(+), 39 deletions(-) diff --git a/FL/Fl_Image.H b/FL/Fl_Image.H index b9298d78d..b1037da77 100644 --- a/FL/Fl_Image.H +++ b/FL/Fl_Image.H @@ -3,7 +3,7 @@ // // Image header file for the Fast Light Tool Kit (FLTK). // -// Copyright 1998-2011 by Bill Spitzak and others. +// Copyright 1998-2014 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this @@ -30,22 +30,31 @@ class Fl_Pixmap; struct Fl_Menu_Item; struct Fl_Label; +/** \enum Fl_RGB_Scaling. + The scaling algorithm to use for RGB images. +*/ +enum Fl_RGB_Scaling { + FL_RGB_SCALING_NEAREST = 0, ///< default RGB image scaling algorithm + FL_RGB_SCALING_BILINEAR ///< more accurate, but slower RGB image scaling algorithm +}; + /** Fl_Image is the base class used for caching and drawing all kinds of images in FLTK. This class keeps track of common image data such as the pixels, colormap, width, height, and depth. Virtual methods are used to provide type-specific - image handling.

+ image handling. -

Since the Fl_Image class does not support image + Since the Fl_Image class does not support image drawing by itself, calling the draw() method results in a box with an X in it being drawn instead. */ class FL_EXPORT Fl_Image { int w_, h_, d_, ld_, count_; const char * const *data_; + static Fl_RGB_Scaling RGB_scaling_; - // Forbid use of copy contructor and assign operator + // Forbid use of copy constructor and assign operator Fl_Image & operator=(const Fl_Image &); Fl_Image(const Fl_Image &); @@ -152,15 +161,12 @@ class FL_EXPORT Fl_Image { */ void draw(int X, int Y) {draw(X, Y, w(), h(), 0, 0);} // platform dependent virtual void uncache(); -}; -/** \enum Fl_RGB_Scaling - The image-scaling algorithm to use. - */ + // set RGB image scaling method + static void RGB_scaling(Fl_RGB_Scaling); -enum Fl_RGB_Scaling { - FL_SCALING_NEAREST = 0, ///< default RGB image-scaling algorithm - FL_SCALING_BILINEAR ///< alternative, slower and more accurate RGB image-scaling algorithm + // get RGB image scaling method + static Fl_RGB_Scaling RGB_scaling(); }; /** @@ -168,9 +174,9 @@ enum Fl_RGB_Scaling { of full-color images with 1 to 4 channels of color information. Images with an even number of channels are assumed to contain alpha information, which is used to blend the image with the - contents of the screen.

- -

Fl_RGB_Image is defined in + contents of the screen. + + Fl_RGB_Image is defined in <FL/Fl_Image.H>, however for compatibility reasons <FL/Fl_RGB_Image.H> should be included. */ @@ -179,7 +185,6 @@ class FL_EXPORT Fl_RGB_Image : public Fl_Image { friend class Fl_GDI_Graphics_Driver; friend class Fl_Xlib_Graphics_Driver; static size_t max_size_; - static Fl_RGB_Scaling scaling_; public: const uchar *array; @@ -240,14 +245,6 @@ public: \sa void Fl_RGB_Image::max_size(size_t) */ static size_t max_size() {return max_size_;} - - /** Sets the scaling method used for copy(int, int). - Applies to all RGB images, defaults to FL_SCALING_NEAREST. - */ - static void scaling(Fl_RGB_Scaling); - - /** Returns the currently used scaling method. */ - static Fl_RGB_Scaling scaling(); }; #endif // !Fl_Image_H diff --git a/examples/clipboard.cxx b/examples/clipboard.cxx index 6518ff308..f72eaabf5 100644 --- a/examples/clipboard.cxx +++ b/examples/clipboard.cxx @@ -162,6 +162,8 @@ int main(int argc, char **argv) clip_callback(1, tabs); // use clipboard content at start #endif Fl::add_clipboard_notify(clip_callback, tabs); // will update with new clipboard content immediately or at application activation + + Fl_Image::RGB_scaling(FL_RGB_SCALING_BILINEAR); // set bilinear image scaling method return Fl::run(); } diff --git a/src/Fl_Image.cxx b/src/Fl_Image.cxx index 71e117799..73eec41b8 100644 --- a/src/Fl_Image.cxx +++ b/src/Fl_Image.cxx @@ -3,7 +3,7 @@ // // Image drawing code for the Fast Light Tool Kit (FLTK). // -// Copyright 1998-2012 by Bill Spitzak and others. +// Copyright 1998-2014 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this @@ -34,6 +34,8 @@ void fl_restore_clip(); // from fl_rect.cxx // Base image class... // +Fl_RGB_Scaling Fl_Image::RGB_scaling_ = FL_RGB_SCALING_NEAREST; + /** The destructor is a virtual method that frees all memory used by the image. @@ -159,12 +161,23 @@ Fl_Image::measure(const Fl_Label *lo, // I - Label lh = img->h(); } +/** Sets the RGB image scaling method used for copy(int, int). + Applies to all RGB images, defaults to FL_RGB_SCALING_NEAREST. +*/ +void Fl_Image::RGB_scaling(Fl_RGB_Scaling method) { + RGB_scaling_ = method; +} + +/** Returns the currently used RGB image scaling method. */ +Fl_RGB_Scaling Fl_Image::RGB_scaling() { + return RGB_scaling_; +} + // // RGB image class... // size_t Fl_RGB_Image::max_size_ = ~((size_t)0); -Fl_RGB_Scaling Fl_RGB_Image::scaling_ = FL_SCALING_NEAREST; int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg); @@ -261,7 +274,7 @@ Fl_Image *Fl_RGB_Image::copy(int W, int H) { new_image = new Fl_RGB_Image(new_array, W, H, d()); new_image->alloc_array = 1; - if (scaling_ == FL_SCALING_NEAREST) { + if (Fl_Image::RGB_scaling() == FL_RGB_SCALING_NEAREST) { // Scale the image using a nearest-neighbor algorithm... for (dy = H, sy = 0, yerr = H, new_ptr = new_array; dy > 0; dy --) { for (dx = W, xerr = W, old_ptr = array + sy * line_d; dx > 0; dx --) { @@ -284,7 +297,7 @@ Fl_Image *Fl_RGB_Image::copy(int W, int H) { } } } else { - // Bilinear scaling + // Bilinear scaling (FL_RGB_SCALING_BILINEAR) const float xscale = (w() - 1) / (float) W; const float yscale = (h() - 1) / (float) H; for (dy = 0; dy < H; dy++) { @@ -679,14 +692,6 @@ void Fl_RGB_Image::label(Fl_Menu_Item* m) { m->label(_FL_IMAGE_LABEL, (const char*)this); } -void Fl_RGB_Image::scaling(Fl_RGB_Scaling method) { - scaling_ = method; -} - -Fl_RGB_Scaling Fl_RGB_Image::scaling() { - return scaling_; -} - // // End of "$Id$". // diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 3f26f3342..fee2ed45a 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -3,7 +3,7 @@ // // MacOS-Cocoa specific code for the Fast Light Tool Kit (FLTK). // -// Copyright 1998-2013 by Bill Spitzak and others. +// Copyright 1998-2014 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this @@ -3857,10 +3857,10 @@ unsigned char *Fl_X::bitmap_from_window_rect(Fl_Window *win, int x, int y, int w unsigned char *data; if (ww > w) { // with a retina display Fl_RGB_Image *rgb = new Fl_RGB_Image([bitmap bitmapData], ww, hh, 4); - Fl_RGB_Scaling save_scaling =Fl_RGB_Image::scaling(); - Fl_RGB_Image::scaling(FL_SCALING_BILINEAR); + Fl_RGB_Scaling save_scaling = Fl_Image::RGB_scaling(); + Fl_Image::RGB_scaling(FL_RGB_SCALING_BILINEAR); Fl_RGB_Image *rgb2 = (Fl_RGB_Image*)rgb->copy(w, h); - Fl_RGB_Image::scaling(save_scaling); + Fl_Image::RGB_scaling(save_scaling); delete rgb; rgb2->alloc_array = 0; data = (uchar*)rgb2->array;