diff options
-rw-r--r-- | src/gdk/cdgdk.c | 74 |
1 files changed, 40 insertions, 34 deletions
diff --git a/src/gdk/cdgdk.c b/src/gdk/cdgdk.c index 7557706..76eb3db 100644 --- a/src/gdk/cdgdk.c +++ b/src/gdk/cdgdk.c @@ -153,42 +153,30 @@ static void cdflush(cdCtxCanvas *ctxcanvas) /******************************************************/ -static void gdkClipArea(cdCtxCanvas *ctxcanvas) -{ - GdkRectangle rect; - - rect.x = ctxcanvas->canvas->clip_rect.xmin; - rect.y = ctxcanvas->canvas->clip_rect.ymin; - rect.width = ctxcanvas->canvas->clip_rect.xmax - ctxcanvas->canvas->clip_rect.xmin; - rect.height = ctxcanvas->canvas->clip_rect.ymax - ctxcanvas->canvas->clip_rect.ymin; - - gdk_gc_set_clip_rectangle(ctxcanvas->gc, &rect); - - if (ctxcanvas->clip_rgn) - gdk_region_destroy(ctxcanvas->clip_rgn); - ctxcanvas->clip_rgn = NULL; -} - static int cdclip(cdCtxCanvas *ctxcanvas, int clip_mode) { switch (clip_mode) { case CD_CLIPOFF: - gdk_gc_set_clip_mask(ctxcanvas->gc, NULL); + gdk_gc_set_clip_region(ctxcanvas->gc, NULL); break; case CD_CLIPAREA: - gdkClipArea(ctxcanvas); - break; + { + GdkRectangle rect; + rect.x = ctxcanvas->canvas->clip_rect.xmin; + rect.y = ctxcanvas->canvas->clip_rect.ymin; + rect.width = ctxcanvas->canvas->clip_rect.xmax - ctxcanvas->canvas->clip_rect.xmin; + rect.height = ctxcanvas->canvas->clip_rect.ymax - ctxcanvas->canvas->clip_rect.ymin; + gdk_gc_set_clip_rectangle(ctxcanvas->gc, &rect); + break; + } case CD_CLIPPOLYGON: if (ctxcanvas->clip_rgn) gdk_gc_set_clip_region(ctxcanvas->gc, ctxcanvas->clip_rgn); break; case CD_CLIPREGION: if (ctxcanvas->new_rgn) - { - //ctxcanvas->clip_rgn = gdk_region_copy(ctxcanvas->new_rgn); gdk_gc_set_clip_region(ctxcanvas->gc, ctxcanvas->new_rgn); - } break; } @@ -266,6 +254,8 @@ static void sCombineRegion(cdCtxCanvas *ctxcanvas, GdkRegion* rgn) gdk_region_xor(ctxcanvas->new_rgn, rgn); break; } + + gdk_region_destroy(rgn); } /******************************************************/ @@ -689,7 +679,7 @@ static void cdclear(cdCtxCanvas* ctxcanvas) cdgdkCheckSolidStyle(ctxcanvas, 1); if (ctxcanvas->canvas->clip_mode != CD_CLIPOFF) - gdk_gc_set_clip_mask(ctxcanvas->gc, NULL); + gdk_gc_set_clip_region(ctxcanvas->gc, NULL); clr = cdColorToGdk(ctxcanvas->canvas->background); gdk_gc_set_rgb_fg_color(ctxcanvas->gc, &clr); @@ -781,12 +771,9 @@ static void cdbox(cdCtxCanvas *ctxcanvas, int xmin, int xmax, int ymin, int ymax rgn = gdk_region_rectangle(&rect); sCombineRegion(ctxcanvas, rgn); - gdk_region_destroy(rgn); } else - { gdk_draw_rectangle(ctxcanvas->wnd, ctxcanvas->gc, TRUE, xmin, ymin, xmax-xmin+1, ymax-ymin+1); - } } static void cdtext(cdCtxCanvas *ctxcanvas, int x, int y, const char *s, int len) @@ -894,15 +881,15 @@ static void cdtext(cdCtxCanvas *ctxcanvas, int x, int y, const char *s, int len) gint range; pango_layout_line_get_x_ranges(pango_layout_get_line(ctxcanvas->fontlayout, 0), 0, len, &idx, &range); + + /* TODO: this is only the bounding box of the layout, not the text itself, + must transform the text into a polygon. */ rgn = gdk_pango_layout_get_clip_region(ctxcanvas->fontlayout, x, y, idx, range); - gdk_draw_layout(ctxcanvas->wnd, ctxcanvas->gc, x, y, ctxcanvas->fontlayout); sCombineRegion(ctxcanvas, rgn); } else - { gdk_draw_layout(ctxcanvas->wnd, ctxcanvas->gc, x, y, ctxcanvas->fontlayout); - } pango_context_set_matrix(ctxcanvas->fontcontext, NULL); @@ -1300,9 +1287,14 @@ static void cdputimagerectrgb(cdCtxCanvas *ctxcanvas, int iw, int ih, const unsi if (!pixbuf) return; -// GdkPixbuf *pixbuf_scaled = gdk_pixbuf_scale_simple(pixbuf, ew, eh, GDK_INTERP_NEAREST); - - gdk_draw_pixbuf(ctxcanvas->wnd, ctxcanvas->gc, pixbuf, 0, 0, ex, ey, -1, -1, ctxcanvas->img_dither, 0, 0); + if (bw!=ew || bh!=eh) + { + GdkPixbuf *pixbuf_scaled = gdk_pixbuf_scale_simple(pixbuf, ew, eh, GDK_INTERP_NEAREST); + gdk_draw_pixbuf(ctxcanvas->wnd, ctxcanvas->gc, pixbuf_scaled, 0, 0, ex, ey, -1, -1, ctxcanvas->img_dither, 0, 0); + g_object_unref(pixbuf_scaled); + } + else + gdk_draw_pixbuf(ctxcanvas->wnd, ctxcanvas->gc, pixbuf, 0, 0, ex, ey, -1, -1, ctxcanvas->img_dither, 0, 0); g_object_unref(pixbuf); } @@ -1334,7 +1326,14 @@ static void cdputimagerectrgba(cdCtxCanvas *ctxcanvas, int iw, int ih, const uns if (!pixbuf) return; - gdk_draw_pixbuf(ctxcanvas->wnd, ctxcanvas->gc, pixbuf, 0, 0, ex, ey, ew, eh, ctxcanvas->img_dither, 0, 0); + if (bw!=ew || bh!=eh) + { + GdkPixbuf *pixbuf_scaled = gdk_pixbuf_scale_simple(pixbuf, ew, eh, GDK_INTERP_NEAREST); + gdk_draw_pixbuf(ctxcanvas->wnd, ctxcanvas->gc, pixbuf_scaled, 0, 0, ex, ey, -1, -1, ctxcanvas->img_dither, 0, 0); + g_object_unref(pixbuf_scaled); + } + else + gdk_draw_pixbuf(ctxcanvas->wnd, ctxcanvas->gc, pixbuf, 0, 0, ex, ey, -1, -1, ctxcanvas->img_dither, 0, 0); g_object_unref(pixbuf); } @@ -1366,7 +1365,14 @@ static void cdputimagerectmap(cdCtxCanvas *ctxcanvas, int iw, int ih, const unsi if (!pixbuf) return; - gdk_draw_pixbuf(ctxcanvas->wnd, ctxcanvas->gc, pixbuf, 0, 0, ex, ey, ew, eh, ctxcanvas->img_dither, 0, 0); + if (bw!=ew || bh!=eh) + { + GdkPixbuf *pixbuf_scaled = gdk_pixbuf_scale_simple(pixbuf, ew, eh, GDK_INTERP_NEAREST); + gdk_draw_pixbuf(ctxcanvas->wnd, ctxcanvas->gc, pixbuf_scaled, 0, 0, ex, ey, -1, -1, ctxcanvas->img_dither, 0, 0); + g_object_unref(pixbuf_scaled); + } + else + gdk_draw_pixbuf(ctxcanvas->wnd, ctxcanvas->gc, pixbuf, 0, 0, ex, ey, -1, -1, ctxcanvas->img_dither, 0, 0); g_object_unref(pixbuf); } |