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
This commit is contained in:
Albrecht Schlosser 2014-10-14 11:53:51 +00:00
parent f1bf759c64
commit d24a6b2633
4 changed files with 43 additions and 39 deletions

View File

@ -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.</P>
image handling.
<P>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.</P>
<P>Fl_RGB_Image is defined in
contents of the screen.
Fl_RGB_Image is defined in
&lt;FL/Fl_Image.H&gt;, however for compatibility reasons
&lt;FL/Fl_RGB_Image.H&gt; 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

View File

@ -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();
}

View File

@ -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$".
//

View File

@ -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;