diff options
Diffstat (limited to 'src/drivers/Xlib')
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.H | 6 | ||||
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.cxx | 39 | ||||
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H | 2 | ||||
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx | 12 | ||||
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx | 6 | ||||
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx | 16 | ||||
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx | 26 | ||||
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.H | 6 | ||||
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.cxx | 41 |
9 files changed, 117 insertions, 37 deletions
diff --git a/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.H b/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.H index a0b0db171..e67447b4d 100644 --- a/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.H +++ b/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.H @@ -19,6 +19,9 @@ #include <FL/Fl_Copy_Surface.H> #include <FL/platform.H> +#if FLTK_USE_CAIRO +# include <cairo/cairo.h> +#endif // FLTK_USE_CAIRO class Fl_Xlib_Copy_Surface_Driver : public Fl_Copy_Surface_Driver { friend class Fl_Copy_Surface_Driver; @@ -31,6 +34,9 @@ protected: void set_current(); void translate(int x, int y); void untranslate(); +#if FLTK_USE_CAIRO + cairo_t *cairo_; +#endif }; #endif // FL_XLIB_COPY_SURFACE_DRIVER_H diff --git a/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.cxx b/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.cxx index f87ae55a2..e4bbe29ef 100644 --- a/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.cxx @@ -19,16 +19,35 @@ #include <FL/Fl.H> #include <FL/platform.H> #include <FL/fl_draw.H> -#include "Fl_Xlib_Graphics_Driver.H" #include "../X11/Fl_X11_Screen_Driver.H" +#if FLTK_USE_CAIRO +# include <cairo-xlib.h> +# include "../Cairo/Fl_Display_Cairo_Graphics_Driver.H" +# include <cairo/cairo.h> +#else +# include "Fl_Xlib_Graphics_Driver.H" +#endif // FLTK_USE_CAIRO + Fl_Xlib_Copy_Surface_Driver::Fl_Xlib_Copy_Surface_Driver(int w, int h) : Fl_Copy_Surface_Driver(w, h) { +#if FLTK_USE_CAIRO + driver(new Fl_Display_Cairo_Graphics_Driver()); +#else driver(new Fl_Xlib_Graphics_Driver()); +#endif float s = Fl_Graphics_Driver::default_driver().scale(); - ((Fl_Xlib_Graphics_Driver*)driver())->scale(s); + driver()->scale(s); oldwindow = fl_window; xid = fl_create_offscreen(w,h); +#if FLTK_USE_CAIRO + cairo_surface_t *surf = cairo_xlib_surface_create(fl_display, xid, fl_visual->visual, w * s, h * s); + cairo_ = cairo_create(surf); + cairo_surface_destroy(surf); + cairo_scale(cairo_, 1/s, 1/s); + cairo_save(cairo_); + ((Fl_Display_Cairo_Graphics_Driver*)driver())->set_cairo(cairo_); +#endif driver()->push_no_clip(); fl_window = xid; driver()->color(FL_WHITE); @@ -47,6 +66,9 @@ Fl_Xlib_Copy_Surface_Driver::~Fl_Xlib_Copy_Surface_Driver() { Fl_X11_Screen_Driver::copy_image(rgb->array, rgb->w(), rgb->h(), 1); delete rgb; fl_delete_offscreen(xid); +#if FLTK_USE_CAIRO + cairo_destroy(cairo_); +#endif delete driver(); } @@ -55,6 +77,9 @@ void Fl_Xlib_Copy_Surface_Driver::set_current() { Fl_Surface_Device::set_current(); oldwindow = fl_window; fl_window = xid; +#if FLTK_USE_CAIRO + ((Fl_Display_Cairo_Graphics_Driver*)driver())->set_cairo(cairo_); +#endif } void Fl_Xlib_Copy_Surface_Driver::end_current() { @@ -63,10 +88,20 @@ void Fl_Xlib_Copy_Surface_Driver::end_current() { } void Fl_Xlib_Copy_Surface_Driver::translate(int x, int y) { +#if FLTK_USE_CAIRO + cairo_save(cairo_); + cairo_translate(cairo_, x, y); +#else ((Fl_Xlib_Graphics_Driver*)driver())->translate_all(x, y); +#endif + } void Fl_Xlib_Copy_Surface_Driver::untranslate() { +#if FLTK_USE_CAIRO + cairo_restore(cairo_); +#else ((Fl_Xlib_Graphics_Driver*)driver())->untranslate_all(); +#endif } diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H index 5440b53bd..cf2fcac58 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H @@ -76,7 +76,7 @@ protected: #endif virtual int height_unscaled(); virtual int descent_unscaled(); - virtual Region scale_clip(float f); + virtual Fl_Region scale_clip(float f); #if USE_XFT void drawUCS4(const void *str, int n, int x, int y); #endif diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx index 13a67f428..4c7b64a4c 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx @@ -38,6 +38,8 @@ int Fl_Xlib_Graphics_Driver::fl_overlay = 0; */ GC fl_gc = 0; +GC fl_x11_gc() { return fl_gc; } + Fl_Xlib_Graphics_Driver::Fl_Xlib_Graphics_Driver(void) { mask_bitmap_ = NULL; short_point = NULL; @@ -71,14 +73,14 @@ void Fl_Xlib_Graphics_Driver::scale(float f) { } void Fl_Xlib_Graphics_Driver::copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy) { - XCopyArea(fl_display, pixmap, fl_window, gc_, srcx*scale(), srcy*scale(), w*scale(), h*scale(), (x+offset_x_)*scale(), (y+offset_y_)*scale()); + XCopyArea(fl_display, (Pixmap)pixmap, fl_window, gc_, srcx*scale(), srcy*scale(), w*scale(), h*scale(), (x+offset_x_)*scale(), (y+offset_y_)*scale()); } 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; - XUnionRectWithRegion(&R, r, r); + XUnionRectWithRegion(&R, (Region)r, (Region)r); } void Fl_Xlib_Graphics_Driver::transformed_vertex0(float fx, float fy) { @@ -144,8 +146,8 @@ void Fl_Xlib_Graphics_Driver::font_name(int num, const char *name) { } -Region Fl_Xlib_Graphics_Driver::scale_clip(float f) { - Region r = rstack[rstackptr]; +Fl_Region Fl_Xlib_Graphics_Driver::scale_clip(float f) { + Region r = (Region)rstack[rstackptr]; if (r == 0 || (f == 1 && offset_x_ == 0 && offset_y_ == 0) ) return 0; Region r2 = XCreateRegion(); for (int i = 0; i < r->numRects; i++) { @@ -153,7 +155,7 @@ Region Fl_Xlib_Graphics_Driver::scale_clip(float f) { int y = floor(r->rects[i].y1 + offset_y_, f); int w = floor((r->rects[i].x2 + offset_x_) , f) - x; int h = floor((r->rects[i].y2 + offset_y_) , f) - y; - Region R = XRectangleRegion(x, y, w, h); + Region R = (Region)XRectangleRegion(x, y, w, h); XUnionRegion(R, r2, r2); ::XDestroyRegion(R); } diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx index 17711883e..3a4817b7f 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx @@ -720,7 +720,7 @@ void Fl_Xlib_Graphics_Driver::draw_unscaled(const char *str, int n, int x, int y else //if (draw_window != fl_window) XftDrawChange(draw_, draw_window = fl_window); - Region region = fl_clip_region(); + Region region = (Region)fl_clip_region(); if (!(region && XEmptyRegion(region))) { XftDrawSetClip(draw_, region); @@ -756,7 +756,7 @@ void Fl_Xlib_Graphics_Driver::drawUCS4(const void *str, int n, int x, int y) { else //if (draw_window != fl_window) XftDrawChange(draw_, draw_window = fl_window); - Region region = fl_clip_region(); + Region region = (Region)fl_clip_region(); if (region && XEmptyRegion(region)) return; XftDrawSetClip(draw_, region); @@ -1192,7 +1192,7 @@ static void fl_pango_layout_get_pixel_extents(PangoLayout *layout, int &dx, int void Fl_Xlib_Graphics_Driver::do_draw(int from_right, const char *str, int n, int x, int y) { if (!fl_display || n == 0) return; - Region region = clip_region(); + Region region = (Region)clip_region(); if (region && XEmptyRegion(region)) return; if (!playout_) context(); diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx index d57e5b031..ba098c309 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx @@ -718,8 +718,8 @@ void Fl_Xlib_Graphics_Driver::cache(Fl_RGB_Image *img) { if (depth == 1 || depth == 3) { surface = new Fl_Image_Surface(img->data_w(), img->data_h()); } else if (fl_can_do_alpha_blending()) { - Fl_Offscreen pixmap = XCreatePixmap(fl_display, RootWindow(fl_display, fl_screen), img->data_w(), img->data_h(), 32); - surface = new Fl_Image_Surface(img->data_w(), img->data_h(), 0, pixmap); + Pixmap pixmap = XCreatePixmap(fl_display, RootWindow(fl_display, fl_screen), img->data_w(), img->data_h(), 32); + surface = new Fl_Image_Surface(img->data_w(), img->data_h(), 0, (Fl_Offscreen)pixmap); depth |= FL_IMAGE_WITH_ALPHA; } else { *Fl_Graphics_Driver::id(img) = 0; @@ -806,14 +806,14 @@ int Fl_Xlib_Graphics_Driver::scale_and_render_pixmap(Fl_Offscreen pixmap, int de static XRenderPictFormat *fmt24 = XRenderFindStandardFormat(fl_display, PictStandardRGB24); static XRenderPictFormat *fmt32 = XRenderFindStandardFormat(fl_display, PictStandardARGB32); static XRenderPictFormat *dstfmt = XRenderFindVisualFormat(fl_display, fl_visual->visual); - Picture src = XRenderCreatePicture(fl_display, pixmap, has_alpha ?fmt32:fmt24, 0, &srcattr); + Picture src = XRenderCreatePicture(fl_display, (Pixmap)pixmap, has_alpha ?fmt32:fmt24, 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 0; } Fl_Region r = scale_clip(scale()); - const Fl_Region clipr = clip_region(); + const Region clipr = (Region)clip_region(); if (clipr) XRenderSetPictureClipRegion(fl_display, dst, clipr); unscale_clip(r); @@ -849,7 +849,7 @@ int Fl_Xlib_Graphics_Driver::scale_and_render_pixmap(Fl_Offscreen pixmap, int de void Fl_Xlib_Graphics_Driver::uncache(Fl_RGB_Image*, fl_uintptr_t &id_, fl_uintptr_t &mask_) { if (id_) { - XFreePixmap(fl_display, (Fl_Offscreen)id_); + XFreePixmap(fl_display, (Pixmap)id_); id_ = 0; } } @@ -882,8 +882,8 @@ void Fl_Xlib_Graphics_Driver::draw_fixed(Fl_Pixmap *pxm, int X, int Y, int W, in // be done in a single Xlib call for a multi-rectangle clip region. Thus, we // process each rectangle of the intersection between the clip region and XYWH. // See also STR #3206. - Region r = XRectangleRegion(X,Y,W,H); - XIntersectRegion(r, clip_region(), r); + Region r = (Region)XRectangleRegion(X,Y,W,H); + XIntersectRegion(r, (Region)clip_region(), r); int X1, Y1, W1, H1; for (int i = 0; i < r->numRects; i++) { X1 = r->rects[i].x1; @@ -929,5 +929,5 @@ void Fl_Xlib_Graphics_Driver::cache(Fl_Pixmap *pxm) { } void Fl_Xlib_Graphics_Driver::uncache_pixmap(fl_uintptr_t offscreen) { - XFreePixmap(fl_display, (Fl_Offscreen)offscreen); + XFreePixmap(fl_display, (Pixmap)offscreen); } diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx index a72fe9d8b..ea24eba34 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx @@ -194,7 +194,7 @@ int Fl_Xlib_Graphics_Driver::clip_rect(int &x, int &y, int &w, int &h) { Fl_Region Fl_Xlib_Graphics_Driver::XRectangleRegion(int x, int y, int w, int h) { XRectangle R; - Fl_Region r = XCreateRegion(); // create an empty region + Region r = XCreateRegion(); // create an empty region if (clip_rect(x, y, w, h)) // outside valid coordinate space return r; // empty region R.x = x; R.y = y; R.width = w; R.height = h; @@ -203,7 +203,7 @@ Fl_Region Fl_Xlib_Graphics_Driver::XRectangleRegion(int x, int y, int w, int h) } void Fl_Xlib_Graphics_Driver::XDestroyRegion(Fl_Region r) { - ::XDestroyRegion(r); + ::XDestroyRegion((Region)r); } // --- line and polygon drawing @@ -312,12 +312,12 @@ void Fl_Xlib_Graphics_Driver::draw_clipped_line(int x1, int y1, int x2, int y2) // --- clipping void Fl_Xlib_Graphics_Driver::push_clip(int x, int y, int w, int h) { - Fl_Region r; + Region r; if (w > 0 && h > 0) { - r = XRectangleRegion(x, y, w, h); // does X coordinate clipping - Fl_Region current = rstack[rstackptr]; + r = (Region)XRectangleRegion(x, y, w, h); // does X coordinate clipping + Region current = (Region)rstack[rstackptr]; if (current) { - Fl_Region temp = XCreateRegion(); + Region temp = XCreateRegion(); XIntersectRegion(current, r, temp); XDestroyRegion(r); r = temp; @@ -337,7 +337,7 @@ int Fl_Xlib_Graphics_Driver::clip_box(int x, int y, int w, int h, int& X, int& Y W = H = 0; return 2; } - Fl_Region r = rstack[rstackptr]; + Region r = (Region)rstack[rstackptr]; if (!r) { // no clipping region if (X != x || Y != y || W != w || H != h) // pre-clipped return 1; // partially outside, region differs @@ -352,8 +352,8 @@ int Fl_Xlib_Graphics_Driver::clip_box(int x, int y, int w, int h, int& X, int& Y default: // partial: break; } - Fl_Region rr = XRectangleRegion(X, Y, W, H); - Fl_Region temp = XCreateRegion(); + Region rr = (Region)XRectangleRegion(X, Y, W, H); + Region temp = XCreateRegion(); XIntersectRegion(r, rr, temp); XRectangle rect; XClipBox(temp, &rect); @@ -365,7 +365,7 @@ int Fl_Xlib_Graphics_Driver::clip_box(int x, int y, int w, int h, int& X, int& Y int Fl_Xlib_Graphics_Driver::not_clipped(int x, int y, int w, int h) { if (x+w <= 0 || y+h <= 0) return 0; - Fl_Region r = rstack[rstackptr]; + Region r = (Region)rstack[rstackptr]; if (!r) return 1; // get rid of coordinates outside the 16-bit range the X calls take. if (clip_rect(x,y,w,h)) return 0; // clipped @@ -375,10 +375,10 @@ int Fl_Xlib_Graphics_Driver::not_clipped(int x, int y, int w, int h) { void Fl_Xlib_Graphics_Driver::restore_clip() { fl_clip_state_number++; if (gc_) { - Region r = rstack[rstackptr]; + Region r = (Region)rstack[rstackptr]; if (r) { - Region r2 = scale_clip(scale()); - XSetRegion(fl_display, gc_, rstack[rstackptr]); + Region r2 = (Region)scale_clip(scale()); + XSetRegion(fl_display, gc_, (Region)rstack[rstackptr]); unscale_clip(r2); } else XSetClipMask(fl_display, gc_, 0); diff --git a/src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.H b/src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.H index b7cb48010..3f8ecda7f 100644 --- a/src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.H +++ b/src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.H @@ -18,6 +18,9 @@ #define FL_XLIB_IMAGE_SURFACE_DRIVER_H #include <FL/Fl_Image_Surface.H> +#if FLTK_USE_CAIRO +# include <cairo/cairo.h> +#endif // FLTK_USE_CAIRO class Fl_Xlib_Image_Surface_Driver : public Fl_Image_Surface_Driver { virtual void end_current(); @@ -29,6 +32,9 @@ public: void translate(int x, int y); void untranslate(); Fl_RGB_Image *image(); +#if FLTK_USE_CAIRO + cairo_t *cairo_; +#endif }; #endif // FL_XLIB_IMAGE_SURFACE_DRIVER_H diff --git a/src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.cxx b/src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.cxx index e1a33c746..240ced649 100644 --- a/src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.cxx @@ -14,28 +14,47 @@ // https://www.fltk.org/bugs.php // -#include "Fl_Xlib_Graphics_Driver.H" +#include <FL/platform.H> #include "Fl_Xlib_Image_Surface_Driver.H" #include "../../Fl_Screen_Driver.H" +#if FLTK_USE_CAIRO +# include <cairo-xlib.h> +# include "../Cairo/Fl_Display_Cairo_Graphics_Driver.H" +#else +# include "Fl_Xlib_Graphics_Driver.H" +#endif // FLTK_USE_CAIRO + Fl_Xlib_Image_Surface_Driver::Fl_Xlib_Image_Surface_Driver(int w, int h, int high_res, Fl_Offscreen off) : Fl_Image_Surface_Driver(w, h, high_res, off) { float d = 1; if (!off) { fl_open_display(); - d = fl_graphics_driver->scale(); + d = Fl_Graphics_Driver::default_driver().scale(); if (d != 1 && high_res) { w = int(w*d); h = int(h*d); } - offscreen = XCreatePixmap(fl_display, RootWindow(fl_display, fl_screen), w, h, fl_visual->depth); + offscreen = (Fl_Offscreen)XCreatePixmap(fl_display, RootWindow(fl_display, fl_screen), w, h, fl_visual->depth); } +#if FLTK_USE_CAIRO + driver(new Fl_Display_Cairo_Graphics_Driver()); + cairo_surface_t *s = cairo_xlib_surface_create(fl_display, offscreen, fl_visual->visual, w, h); + cairo_ = cairo_create(s); + cairo_surface_destroy(s); + cairo_save(cairo_); + ((Fl_Display_Cairo_Graphics_Driver*)driver())->set_cairo(cairo_); +#else driver(new Fl_Xlib_Graphics_Driver()); - if (d != 1 && high_res) ((Fl_Xlib_Graphics_Driver*)driver())->scale(d); +#endif + if (d != 1 && high_res) driver()->scale(d); } Fl_Xlib_Image_Surface_Driver::~Fl_Xlib_Image_Surface_Driver() { - if (offscreen && !external_offscreen) XFreePixmap(fl_display, offscreen); +#if FLTK_USE_CAIRO + cairo_destroy(cairo_); +#endif + if (offscreen && !external_offscreen) XFreePixmap(fl_display, (Pixmap)offscreen); delete driver(); } @@ -43,14 +62,26 @@ void Fl_Xlib_Image_Surface_Driver::set_current() { Fl_Surface_Device::set_current(); pre_window = fl_window; fl_window = offscreen; +#if FLTK_USE_CAIRO + ((Fl_Display_Cairo_Graphics_Driver*)driver())->set_cairo(cairo_); +#endif } void Fl_Xlib_Image_Surface_Driver::translate(int x, int y) { +#if FLTK_USE_CAIRO + cairo_save(cairo_); + cairo_translate(cairo_, x, y); +#else ((Fl_Xlib_Graphics_Driver*)driver())->translate_all(x, y); +#endif } void Fl_Xlib_Image_Surface_Driver::untranslate() { +#if FLTK_USE_CAIRO + cairo_restore(cairo_); +#else ((Fl_Xlib_Graphics_Driver*)driver())->untranslate_all(); +#endif } Fl_RGB_Image* Fl_Xlib_Image_Surface_Driver::image() |
