summaryrefslogtreecommitdiff
path: root/src/drivers/Xlib
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/Xlib')
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.H6
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Copy_Surface_Driver.cxx39
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H2
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx12
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx6
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx16
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx26
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.H6
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Image_Surface_Driver.cxx41
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()