diff options
| author | Manolo Gouy <Manolo> | 2016-03-04 17:47:29 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2016-03-04 17:47:29 +0000 |
| commit | a9c986752e4864835e01c866b286f7bf2956d7ef (patch) | |
| tree | fcd15bc329d859c10985ece5b886ec7e6bd38f4f /src/Fl_Image_Surface.cxx | |
| parent | 35214afddfdee40e96d7f14ee751f6ef7c741ad8 (diff) | |
Complete driver-based implementation of Fl_Image_Surface.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11283 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Image_Surface.cxx')
| -rw-r--r-- | src/Fl_Image_Surface.cxx | 259 |
1 files changed, 5 insertions, 254 deletions
diff --git a/src/Fl_Image_Surface.cxx b/src/Fl_Image_Surface.cxx index f47975a4d..3548d40a1 100644 --- a/src/Fl_Image_Surface.cxx +++ b/src/Fl_Image_Surface.cxx @@ -17,185 +17,14 @@ // #include <FL/Fl_Image_Surface.H> -#include <FL/fl_draw.H> - #include "config_lib.h" -#if defined(__APPLE__) #ifdef FL_CFG_GFX_QUARTZ -#include "drivers/Quartz/Fl_Quartz_Graphics_Driver.H" -#endif - -#include <ApplicationServices/ApplicationServices.h> - -class Fl_Image_Surface::Helper : public Fl_Widget_Surface { - friend class Fl_Image_Surface; -public: - Fl_Offscreen offscreen; - Fl_Surface_Device *previous; - Window pre_window; - int was_high; - int width; - int height; - Helper(int w, int h, int high_res); - ~Helper(); - void set_current(); - void translate(int x, int y); - void untranslate(); - int printable_rect(int *w, int *h) {*w = width; *h = height; return 0;} - Fl_RGB_Image *image(); - void end_current(); -}; +#include <src/drivers/Quartz/Fl_Quartz_Image_Surface.H> -Fl_Image_Surface::Helper::Helper(int w, int h, int high_res) : Fl_Widget_Surface(NULL), width(w), height(h) { - previous = 0; - int W = high_res ? 2*w : w; - int H = high_res ? 2*h : h; - CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); - offscreen = CGBitmapContextCreate(calloc(W*H,4), W, H, 8, W*4, lut, kCGImageAlphaPremultipliedLast); - CGColorSpaceRelease(lut); - driver(new Fl_Quartz_Graphics_Driver); - CGContextTranslateCTM(offscreen, -0.5, 0.5); // as when drawing to a window - if (high_res) { - CGContextScaleCTM(offscreen, 2, 2); - } - CGContextSetShouldAntialias(offscreen, false); - CGContextSaveGState(offscreen); - CGContextTranslateCTM(offscreen, 0, height); - CGContextScaleCTM(offscreen, 1.0f, -1.0f); - CGContextSetRGBFillColor(offscreen, 1, 1, 1, 0); - CGContextFillRect(offscreen, CGRectMake(0,0,w,h)); -} - -Fl_Image_Surface::Helper::~Helper() { - if (offscreen) { - void *data = CGBitmapContextGetData((CGContextRef)offscreen); - free(data); - CGContextRelease((CGContextRef)offscreen); - } -} - -void Fl_Image_Surface::Helper::set_current() { - pre_window = fl_window; - if (!previous) previous = Fl_Surface_Device::surface(); - driver()->gc(offscreen); - fl_window = 0; - Fl_Surface_Device::set_current(); - was_high = Fl_Display_Device::high_resolution(); - Fl_X::set_high_resolution( CGBitmapContextGetWidth(offscreen) > width ); -} - -void Fl_Image_Surface::Helper::translate(int x, int y) { - CGContextRef gc = (CGContextRef)driver()->gc(); - CGContextRestoreGState(gc); - CGContextSaveGState(gc); - CGContextTranslateCTM(gc, x, -y); - CGContextSaveGState(gc); - CGContextTranslateCTM(gc, 0, height); - CGContextScaleCTM(gc, 1.0f, -1.0f); -} - -void Fl_Image_Surface::Helper::untranslate() { - CGContextRestoreGState((CGContextRef)driver()->gc()); -} - -Fl_RGB_Image* Fl_Image_Surface::Helper::image() -{ - unsigned char *data; - int W = width, H = height; - CGContextFlush(offscreen); - W = CGBitmapContextGetWidth(offscreen); - H = CGBitmapContextGetHeight(offscreen); - data = fl_read_image(NULL, 0, 0, W, H, 0); - Fl_RGB_Image *image = new Fl_RGB_Image(data, W, H); - image->alloc_array = 1; - return image; -} - -void Fl_Image_Surface::Helper::end_current() -{ - Fl_X::set_high_resolution(was_high); - previous->Fl_Surface_Device::set_current(); - fl_window = pre_window; -} - -#elif defined(WIN32) -#ifdef FL_CFG_GFX_GDI -#include "drivers/GDI/Fl_GDI_Graphics_Driver.H" -#endif - -class Fl_Image_Surface::Helper : public Fl_Widget_Surface { - friend class Fl_Image_Surface; -public: - Fl_Offscreen offscreen; - int width; - int height; - Fl_Surface_Device *previous; - Window pre_window; - HDC _sgc; - int _savedc; - Helper(int w, int h, int high_res); - ~Helper(); - void set_current(); - void translate(int x, int y); - void untranslate(); - Fl_RGB_Image *image(); - void end_current(); - int printable_rect(int *w, int *h) {*w = width; *h = height; return 0;} -}; - -Fl_Image_Surface::Helper::Helper(int w, int h, int high_res) : Fl_Widget_Surface(NULL), width(w), height(h) { - previous = 0; - offscreen = CreateCompatibleBitmap( (fl_graphics_driver->gc() ? (HDC)fl_graphics_driver->gc() : fl_GetDC(0) ) , w, h); - driver(new Fl_Translated_GDI_Graphics_Driver); - _sgc = NULL; -} - -Fl_Image_Surface::Helper::~Helper() { - if (offscreen) DeleteObject(offscreen); -} - -void Fl_Image_Surface::Helper::set_current() { - pre_window = fl_window; - if (!previous) previous = Fl_Surface_Device::surface(); - if (!_sgc) _sgc = (HDC)previous->driver()->gc(); - HDC gc = fl_makeDC(offscreen); - Fl_Surface_Device::set_current(); - driver()->gc(gc); - _savedc = SaveDC(gc); - fl_window=(HWND)offscreen; - fl_push_no_clip(); -} - -void Fl_Image_Surface::Helper::translate(int x, int y) { - ((Fl_Translated_GDI_Graphics_Driver*)driver())->translate_all(x, y); -} - -void Fl_Image_Surface::Helper::untranslate() { - ((Fl_Translated_GDI_Graphics_Driver*)driver())->untranslate_all(); -} - -Fl_RGB_Image* Fl_Image_Surface::Helper::image() -{ - unsigned char *data; - data = fl_read_image(NULL, 0, 0, width, height, 0); - end_current(); - previous->driver()->gc(_sgc); - Fl_RGB_Image *image = new Fl_RGB_Image(data, width, height); - image->alloc_array = 1; - return image; -} - -void Fl_Image_Surface::Helper::end_current() -{ - HDC gc = (HDC)driver()->gc(); - RestoreDC(gc, _savedc); - DeleteDC(gc); - fl_pop_clip(); - previous->Fl_Surface_Device::set_current(); - fl_window = pre_window; -} +#elif defined(FL_CFG_GFX_GDI) +#include <src/drivers/GDI/Fl_GDI_Image_Surface.H> #elif defined(USE_SDL) @@ -219,86 +48,8 @@ public: int printable_rect(int *w, int *h) {*w = width; *h = height; return 0;} }; - -#else - -#ifdef FL_CFG_GFX_XLIB -#include "drivers/Xlib/Fl_Translated_Xlib_Graphics_Driver.H" -#endif - -class Fl_Image_Surface::Helper : public Fl_Widget_Surface { -public: - Fl_Offscreen offscreen; - Fl_Surface_Device *previous; - Window pre_window; - int was_high; - int width; - int height; - Helper(int w, int h, int high_res); - Helper(Fl_Offscreen pixmap, int w, int h); - ~Helper(); - void set_current(); - void translate(int x, int y); - void untranslate(); - int printable_rect(int *w, int *h) {*w = width; *h = height; return 0;} - Fl_RGB_Image *image(); - void end_current(); - public: -}; - -Fl_Image_Surface::Helper::Helper(int w, int h, int high_res) : Fl_Widget_Surface(NULL) { - width = w; - height = h; - previous = 0; - offscreen = XCreatePixmap(fl_display, RootWindow(fl_display, fl_screen), w, h, fl_visual->depth); - driver(new Fl_Translated_Xlib_Graphics_Driver()); -} - -Fl_Image_Surface::Helper::Helper(Fl_Offscreen pixmap, int w, int h) : Fl_Widget_Surface(NULL) { - width = w; - height = h; - previous = 0; - offscreen = pixmap; - driver(new Fl_Translated_Xlib_Graphics_Driver()); -} - -Fl_Image_Surface::Helper::~Helper() { - if (offscreen) XFreePixmap(fl_display, offscreen); -} - -void Fl_Image_Surface::Helper::set_current() { - pre_window = fl_window; - if (!previous) previous = Fl_Surface_Device::surface(); - fl_window = offscreen; - Fl_Surface_Device::set_current(); - fl_push_no_clip(); -} - -void Fl_Image_Surface::Helper::translate(int x, int y) { - ((Fl_Translated_Xlib_Graphics_Driver*)driver())->translate_all(x, y); -} - -void Fl_Image_Surface::Helper::untranslate() { - ((Fl_Translated_Xlib_Graphics_Driver*)driver())->untranslate_all(); -} - -Fl_RGB_Image* Fl_Image_Surface::Helper::image() -{ - unsigned char *data; - data = fl_read_image(NULL, 0, 0, width, height, 0); - end_current(); - Fl_RGB_Image *image = new Fl_RGB_Image(data, width, height); - image->alloc_array = 1; - return image; -} - -void Fl_Image_Surface::Helper::end_current() -{ - fl_pop_clip(); - previous->Fl_Surface_Device::set_current(); - fl_window = pre_window; -} - +#elif defined(FL_CFG_GFX_XLIB) +#include <src/drivers/Xlib/Fl_Xlib_Image_Surface.H> #endif |
