summaryrefslogtreecommitdiff
path: root/src/drivers/Cairo
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/Cairo')
-rw-r--r--src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H3
-rw-r--r--src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx63
2 files changed, 61 insertions, 5 deletions
diff --git a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H
index b291f63b0..8345fbd47 100644
--- a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H
+++ b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H
@@ -176,6 +176,9 @@ public:
virtual const char *font_name(int num);
virtual void font_name(int num, const char *name); virtual const char* get_font_name(Fl_Font fnum, int* ap);
virtual int get_font_sizes(Fl_Font fnum, int*& sizep);
+ virtual Fl_Region XRectangleRegion(int x, int y, int w, int h);
+ virtual void XDestroyRegion(Fl_Region r);
+ virtual void add_rectangle_to_region(Fl_Region r, int X, int Y, int W, int H);
};
#endif // FL_CAIRO_GRAPHICS_DRIVER_H
diff --git a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
index 036fe5418..a93b128e5 100644
--- a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
+++ b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
@@ -621,11 +621,6 @@ int Fl_Cairo_Graphics_Driver::clip_box(int x, int y, int w, int h, int &X, int &
}
-void Fl_Cairo_Graphics_Driver::restore_clip() {
- if (cairo_) cairo_reset_clip(cairo_);
-}
-
-
void Fl_Cairo_Graphics_Driver::point(int x, int y) {
rectf(x, y, 1, 1);
}
@@ -1178,5 +1173,63 @@ void Fl_Cairo_Graphics_Driver::text_extents(const char* txt, int n, int& dx, int
h = ink_rect.height;
}
+//
+// Region-handling member functions.
+// They are used ONLY if the cairo graphics driver is the display graphics driver.
+// They are not used if the cairo graphics driver is used to draw PostScript.
+//
+
+Fl_Region Fl_Cairo_Graphics_Driver::XRectangleRegion(int x, int y, int w, int h) {
+ struct flCairoRegion *R = (struct flCairoRegion*)malloc(sizeof(*R));
+ R->count = 1;
+ R->rects = (cairo_rectangle_t *)malloc(sizeof(cairo_rectangle_t));
+ R->rects->x=x, R->rects->y=y, R->rects->width=w; R->rects->height=h;
+ return (Fl_Region)R;
+}
+
+
+// r1 ⊂ r2
+static bool CairoRectContainsRect(cairo_rectangle_t *r1, cairo_rectangle_t *r2) {
+ return r1->x >= r2->x && r1->y >= r2->y && r1->x+r1->width <= r2->x+r2->width &&
+ r1->y+r1->height <= r2->y+r2->height;
+}
+
+
+void Fl_Cairo_Graphics_Driver::add_rectangle_to_region(Fl_Region r_, int X, int Y, int W, int H) {
+ struct flCairoRegion *r = (struct flCairoRegion*)r_;
+ cairo_rectangle_t arg = {double(X), double(Y), double(W), double(H)};
+ int j; // don't add a rectangle totally inside the Fl_Region
+ for (j = 0; j < r->count; j++) {
+ if (CairoRectContainsRect(&arg, &(r->rects[j]))) break;
+ }
+ if (j >= r->count) {
+ r->rects = (cairo_rectangle_t*)realloc(r->rects, (++(r->count)) * sizeof(cairo_rectangle_t));
+ r->rects[r->count - 1] = arg;
+ }
+}
+
+
+void Fl_Cairo_Graphics_Driver::XDestroyRegion(Fl_Region r_) {
+ if (r_) {
+ struct flCairoRegion *r = (struct flCairoRegion*)r_;
+ free(r->rects);
+ free(r);
+ }
+}
+
+
+void Fl_Cairo_Graphics_Driver::restore_clip() {
+ if (cairo_) {
+ cairo_reset_clip(cairo_);
+ // apply what's in rstack
+ struct flCairoRegion *r = (struct flCairoRegion*)rstack[rstackptr];
+ if (r) {
+ for (int i = 0; i < r->count; i++) {
+ cairo_rectangle(cairo_, r->rects[i].x, r->rects[i].y, r->rects[i].width, r->rects[i].height);
+ }
+ cairo_clip(cairo_);
+ }
+ }
+}
#endif // USE_PANGO