Browse Source

Use cairo for high quality scaling in Image::copy().

tags/v1.3.1000
Jonathan Moore Liles 13 years ago
parent
commit
192a424afd
1 changed files with 48 additions and 0 deletions
  1. +48
    -0
      src/Fl_Image.cxx

+ 48
- 0
src/Fl_Image.cxx View File

@@ -24,6 +24,7 @@
// //
// http://www.fltk.org/str.php // http://www.fltk.org/str.php
// //
#include "config.h"


#include <FL/Fl.H> #include <FL/Fl.H>
#include <FL/fl_draw.H> #include <FL/fl_draw.H>
@@ -32,6 +33,7 @@
#include <FL/Fl_Menu_Item.H> #include <FL/Fl_Menu_Item.H>
#include <FL/Fl_Image.H> #include <FL/Fl_Image.H>
#include "flstring.h" #include "flstring.h"
#include <FL/Fl_Cairo.H>


#ifdef WIN32 #ifdef WIN32
void fl_release_dc(HWND, HDC); // from Fl_win32.cxx void fl_release_dc(HWND, HDC); // from Fl_win32.cxx
@@ -228,6 +230,51 @@ Fl_Image *Fl_RGB_Image::copy(int W, int H) {
} }
if (W <= 0 || H <= 0) return 0; if (W <= 0 || H <= 0) return 0;


#if FLTK_USE_CAIRO


new_array = new uchar [W * H * d()];
new_image = new Fl_RGB_Image(new_array, W, H, d());
new_image->alloc_array = 1;

cairo_format_t fmt;
switch (d() )
{
case 4:
fmt = CAIRO_FORMAT_ARGB32;
break;
case 3:
fmt = CAIRO_FORMAT_RGB24;
break;
case 1:
fmt = CAIRO_FORMAT_A8;
break;
}

cairo_surface_t *si = cairo_image_surface_create_for_data( (unsigned char *)array, fmt, w(), h( ),
cairo_format_stride_for_width( fmt, w() ) );

cairo_surface_t *di = cairo_image_surface_create_for_data( (unsigned char *)new_array, fmt, W, H,
cairo_format_stride_for_width( fmt, W ) );

cairo_t *cr = cairo_create( di );

cairo_scale( cr, (double)W / w(), (double)H / h() );
cairo_set_source_surface( cr, si, 0, 0 );

cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_GOOD);
cairo_set_operator( cr, CAIRO_OPERATOR_SOURCE );

cairo_paint( cr );

cairo_destroy( cr );
cairo_surface_destroy( si );
cairo_surface_destroy( di );
#else

// OK, need to resize the image data; allocate memory and // OK, need to resize the image data; allocate memory and
uchar *new_ptr; // Pointer into new array uchar *new_ptr; // Pointer into new array
const uchar *old_ptr; // Pointer into old array const uchar *old_ptr; // Pointer into old array
@@ -273,6 +320,7 @@ Fl_Image *Fl_RGB_Image::copy(int W, int H) {
sy ++; sy ++;
} }
} }
#endif


return new_image; return new_image;
} }


Loading…
Cancel
Save