diff options
| author | Manolo Gouy <Manolo> | 2017-03-17 20:16:54 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2017-03-17 20:16:54 +0000 |
| commit | b2afa612bf85ed6dea7f3933198fed71572b94ff (patch) | |
| tree | e4ba2bf0ff76dc5e519576fe5b25cfc73c50a11a /src/drivers/Xlib | |
| parent | 54596de1c33e45fe8bcc217e110a27d755152bdc (diff) | |
Create Fl_Xlib_Graphics_Driver::scale_and_render_pixmap() to draw depth-4 or scaled RGB images using Xrender.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12210 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/drivers/Xlib')
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H | 6 | ||||
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx | 31 | ||||
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx | 51 |
3 files changed, 34 insertions, 54 deletions
diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H index 2735de5fc..e71eab3cf 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H @@ -71,6 +71,9 @@ protected: static PangoContext *context(); static void init_built_in_fonts(); #endif +#if HAVE_XRENDER + int scale_and_render_pixmap(Fl_Offscreen pixmap, int depth, double scale_x, double scale_y, int srcx, int srcy, int XP, int YP, int WP, int HP); +#endif protected: static GC gc_; uchar **mask_bitmap_; @@ -124,9 +127,6 @@ public: int height(); int descent(); void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy); -#if ! defined(FL_DOXYGEN) - void copy_offscreen_with_alpha(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy); -#endif void add_rectangle_to_region(Fl_Region r, int x, int y, int w, int h); Fl_Region XRectangleRegion(int x, int y, int w, int h); void XDestroyRegion(Fl_Region r); diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx index ef2e72c85..b359069e8 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx @@ -82,37 +82,6 @@ void Fl_Xlib_Graphics_Driver::copy_offscreen(int x, int y, int w, int h, Fl_Offs XCopyArea(fl_display, pixmap, fl_window, gc_, srcx, srcy, w, h, x+offset_x_, y+offset_y_); } -#ifndef FL_DOXYGEN -void Fl_Xlib_Graphics_Driver::copy_offscreen_with_alpha(int x, int y, int w, int h, - Fl_Offscreen pixmap, int srcx, int srcy) { -#if HAVE_XRENDER - XRenderPictureAttributes srcattr; - memset(&srcattr, 0, sizeof(XRenderPictureAttributes)); - static XRenderPictFormat *srcfmt = XRenderFindStandardFormat(fl_display, PictStandardARGB32); - static XRenderPictFormat *dstfmt = XRenderFindStandardFormat(fl_display, PictStandardRGB24); - - Picture src = XRenderCreatePicture(fl_display, pixmap, srcfmt, 0, &srcattr); - Picture dst = XRenderCreatePicture(fl_display, fl_window, dstfmt, 0, &srcattr); - - if (!src || !dst) { - fprintf(stderr, "Failed to create Render pictures (%lu %lu)\n", src, dst); - return; - } - - const Fl_Region clipr = fl_clip_region(); - if (clipr) - XRenderSetPictureClipRegion(fl_display, dst, clipr); - - XRenderComposite(fl_display, PictOpOver, src, None, dst, srcx, srcy, 0, 0, - x+offset_x_, y+offset_y_, w, h); - - XRenderFreePicture(fl_display, src); - XRenderFreePicture(fl_display, dst); -#endif -} -#endif - - void Fl_Xlib_Graphics_Driver::add_rectangle_to_region(Fl_Region r, int X, int Y, int W, int H) { XRectangle R; R.x = X; R.y = Y; R.width = W; R.height = H; diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx index 7c0962227..44bd17a42 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx @@ -731,10 +731,13 @@ void Fl_Xlib_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, in *Fl_Graphics_Driver::id(img) = cache_rgb(img); } if (*Fl_Graphics_Driver::id(img)) { - if (img->d() == 4 || img->d() == 2) - copy_offscreen_with_alpha(X - offset_x_, Y - offset_y_, W, H, *Fl_Graphics_Driver::id(img), cx, cy); - else + if (img->d() == 4 || img->d() == 2) { +#if HAVE_XRENDER + scale_and_render_pixmap(*Fl_Graphics_Driver::id(img), 4, 1, 1, cx, cy, X - offset_x_, Y - offset_y_, W, H); +#endif + } else { copy_offscreen(X - offset_x_, Y - offset_y_, W, H, *Fl_Graphics_Driver::id(img), cx, cy); + } } else { // Composite image with alpha manually each time... alpha_blend(img, X, Y, W, H, cx, cy); @@ -810,39 +813,47 @@ fl_uintptr_t Fl_Xlib_Graphics_Driver::cache(Fl_Pixmap *img, int w, int h, const #if HAVE_XRENDER -int Fl_Xlib_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP) { - Fl_RGB_Image *rgb = img->as_rgb_image(); - if (!rgb || !can_do_alpha_blending()) return 0; - if (!*Fl_Graphics_Driver::id(rgb)) { - *Fl_Graphics_Driver::id(rgb) = cache_rgb(rgb); - } +int Fl_Xlib_Graphics_Driver::scale_and_render_pixmap(Fl_Offscreen pixmap, int depth, double scale_x, double scale_y, int srcx, int srcy, int XP, int YP, int WP, int HP) { XRenderPictureAttributes srcattr; memset(&srcattr, 0, sizeof(XRenderPictureAttributes)); static XRenderPictFormat *fmt32 = XRenderFindStandardFormat(fl_display, PictStandardARGB32); static XRenderPictFormat *fmt24 = XRenderFindStandardFormat(fl_display, PictStandardRGB24); - Picture src = XRenderCreatePicture(fl_display, *Fl_Graphics_Driver::id(rgb), - rgb->d()%2 == 0 ?fmt32:fmt24, 0, &srcattr); + Picture src = XRenderCreatePicture(fl_display, pixmap, + depth%2 == 0 ?fmt32:fmt24, 0, &srcattr); Picture dst = XRenderCreatePicture(fl_display, fl_window, fmt24, 0, &srcattr); if (!src || !dst) { fprintf(stderr, "Failed to create Render pictures (%lu %lu)\n", src, dst); return 0; } - const Fl_Region clipr = fl_clip_region(); + const Fl_Region clipr = clip_region(); if (clipr) XRenderSetPictureClipRegion(fl_display, dst, clipr); - XTransform mat = {{ - { XDoubleToFixed( rgb->w()/double(WP) ), XDoubleToFixed( 0 ), XDoubleToFixed( 0 ) }, - { XDoubleToFixed( 0 ), XDoubleToFixed( rgb->h()/double(HP) ), XDoubleToFixed( 0 ) }, - { XDoubleToFixed( 0 ), XDoubleToFixed( 0 ), XDoubleToFixed( 1 ) } - }}; - XRenderSetPictureTransform(fl_display, src, &mat); - XRenderComposite(fl_display, rgb->d()%2==0 ? PictOpOver: PictOpSrc, src, None, dst, 0, 0, 0, 0, + if (scale_x != 1 || scale_y != 1) { + XTransform mat = {{ + { XDoubleToFixed( scale_x ), XDoubleToFixed( 0 ), XDoubleToFixed( 0 ) }, + { XDoubleToFixed( 0 ), XDoubleToFixed( scale_y ), XDoubleToFixed( 0 ) }, + { XDoubleToFixed( 0 ), XDoubleToFixed( 0 ), XDoubleToFixed( 1 ) } + }}; + XRenderSetPictureTransform(fl_display, src, &mat); + } + XRenderComposite(fl_display, (depth%2 == 0 ? PictOpOver : PictOpSrc), src, None, dst, srcx, srcy, 0, 0, XP + offset_x_, YP + offset_y_, WP, HP); XRenderFreePicture(fl_display, src); XRenderFreePicture(fl_display, dst); return 1; } -#endif + + +int Fl_Xlib_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP) { + Fl_RGB_Image *rgb = img->as_rgb_image(); + if (!rgb || !can_do_alpha_blending()) return 0; + if (!*Fl_Graphics_Driver::id(rgb)) { + *Fl_Graphics_Driver::id(rgb) = cache_rgb(rgb); + } + return scale_and_render_pixmap(*Fl_Graphics_Driver::id(rgb), rgb->d(), rgb->w()/double(WP), rgb->h()/double(HP), + 0, 0, XP, YP, WP, HP); +} +#endif // HAVE_XRENDER // |
