diff options
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/cache/svg_preview_cache.cpp | 43 | ||||
| -rw-r--r-- | src/ui/dialog/color-item.cpp | 93 | ||||
| -rw-r--r-- | src/ui/dialog/color-item.h | 7 | ||||
| -rw-r--r-- | src/ui/dialog/filedialogimpl-win32.cpp | 21 | ||||
| -rw-r--r-- | src/ui/dialog/filter-effects-dialog.cpp | 2 | ||||
| -rw-r--r-- | src/ui/dialog/icon-preview.cpp | 17 | ||||
| -rw-r--r-- | src/ui/dialog/swatches.cpp | 58 | ||||
| -rw-r--r-- | src/ui/dialog/transformation.cpp | 1 | ||||
| -rw-r--r-- | src/ui/widget/color-preview.cpp | 31 |
9 files changed, 141 insertions, 132 deletions
diff --git a/src/ui/cache/svg_preview_cache.cpp b/src/ui/cache/svg_preview_cache.cpp index a7ad1701d..fd7070bab 100644 --- a/src/ui/cache/svg_preview_cache.cpp +++ b/src/ui/cache/svg_preview_cache.cpp @@ -28,6 +28,7 @@ #include "document-private.h" #include "display/nr-arena.h" #include "display/nr-arena-item.h" +#include "display/cairo-utils.h" #include "ui/cache/svg_preview_cache.h" @@ -44,10 +45,10 @@ GdkPixbuf* render_pixbuf(NRArenaItem* root, double scale_factor, const Geom::Rec /* Item integer bbox in points */ NRRectL ibox; - ibox.x0 = (int) floor(scale_factor * dbox.min()[Geom::X] + 0.5); - ibox.y0 = (int) floor(scale_factor * dbox.min()[Geom::Y] + 0.5); - ibox.x1 = (int) floor(scale_factor * dbox.max()[Geom::X] + 0.5); - ibox.y1 = (int) floor(scale_factor * dbox.max()[Geom::Y] + 0.5); + ibox.x0 = floor(scale_factor * dbox.min()[Geom::X]); + ibox.y0 = floor(scale_factor * dbox.min()[Geom::Y]); + ibox.x1 = ceil(scale_factor * dbox.max()[Geom::X]); + ibox.y1 = ceil(scale_factor * dbox.max()[Geom::Y]); /* Find visible area */ int width = ibox.x1 - ibox.x0; @@ -63,34 +64,24 @@ GdkPixbuf* render_pixbuf(NRArenaItem* root, double scale_factor, const Geom::Rec area.x1 = area.x0 + psize; area.y1 = area.y0 + psize; - /* Actual renderable area */ - NRRectL ua; - ua.x0 = std::max(ibox.x0, area.x0); - ua.y0 = std::max(ibox.y0, area.y0); - ua.x1 = std::min(ibox.x1, area.x1); - ua.y1 = std::min(ibox.y1, area.y1); - - /* Set up pixblock */ - guchar *px = g_new(guchar, 4 * psize * psize); - memset(px, 0x00, 4 * psize * psize); - /* Render */ - NRPixBlock B; - nr_pixblock_setup_extern( &B, NR_PIXBLOCK_MODE_R8G8B8A8N, - ua.x0, ua.y0, ua.x1, ua.y1, - px + 4 * psize * (ua.y0 - area.y0) + - 4 * (ua.x0 - area.x0), - 4 * psize, FALSE, FALSE ); - nr_arena_item_invoke_render(NULL, root, &ua, &B, + cairo_surface_t *s = cairo_image_surface_create( + CAIRO_FORMAT_ARGB32, psize, psize); + cairo_t *ct = cairo_create(s); + cairo_translate(ct, -area.x0, -area.y0); + + nr_arena_item_invoke_render(ct, root, &area, NULL, NR_ARENA_ITEM_RENDER_NO_CACHE ); - nr_pixblock_release(&B); + cairo_surface_flush(s); + cairo_destroy(ct); - GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data(px, + GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data(cairo_image_surface_get_data(s), GDK_COLORSPACE_RGB, TRUE, - 8, psize, psize, psize * 4, - (GdkPixbufDestroyNotify)g_free, + 8, psize, psize, cairo_image_surface_get_stride(s), + (GdkPixbufDestroyNotify)cairo_surface_destroy, NULL); + convert_pixbuf_argb32_to_normal(pixbuf); return pixbuf; } diff --git a/src/ui/dialog/color-item.cpp b/src/ui/dialog/color-item.cpp index da8393fc5..89245575c 100644 --- a/src/ui/dialog/color-item.cpp +++ b/src/ui/dialog/color-item.cpp @@ -13,6 +13,7 @@ #include <errno.h> #include <glibmm/i18n.h> #include <gtkmm/label.h> +#include <cairo.h> #include <gtk/gtk.h> #include "color-item.h" @@ -20,7 +21,7 @@ #include "desktop.h" #include "desktop-handles.h" #include "desktop-style.h" -#include "display/nr-plain-stuff.h" +#include "display/cairo-utils.h" #include "document.h" #include "inkscape.h" // for SP_ACTIVE_DESKTOP #include "io/resource.h" @@ -212,17 +213,20 @@ static void colorItemDragBegin( GtkWidget */*widget*/, GdkDragContext* dc, gpoin } else { GdkPixbuf* pixbuf = 0; if ( item->getGradient() ){ - guchar* px = g_new( guchar, 3 * height * width ); - nr_render_checkerboard_rgb( px, width, height, 3 * width, 0, 0 ); - - sp_gradient_render_vector_block_rgb( item->getGradient(), - px, width, height, 3 * width, - 0, width, TRUE ); - - pixbuf = gdk_pixbuf_new_from_data( px, GDK_COLORSPACE_RGB, FALSE, 8, - width, height, width * 3, - 0, // add delete function - 0 ); + cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); + cairo_pattern_t *gradient = sp_gradient_create_preview_pattern(item->getGradient(), width); + cairo_t *ct = cairo_create(s); + cairo_set_source(ct, gradient); + cairo_paint(ct); + cairo_destroy(ct); + cairo_pattern_destroy(gradient); + cairo_surface_flush(s); + + pixbuf = gdk_pixbuf_new_from_data(cairo_image_surface_get_data(s), + GDK_COLORSPACE_RGB, TRUE, 8, + width, height, cairo_image_surface_get_stride(s), + (GdkPixbufDestroyNotify) cairo_surface_destroy, NULL); + convert_pixbuf_argb32_to_normal(pixbuf); } else { Glib::RefPtr<Gdk::Pixbuf> thumb = Gdk::Pixbuf::create( Gdk::COLORSPACE_RGB, false, 8, width, height ); guint32 fillWith = (0xff000000 & (item->def.getR() << 24)) @@ -252,10 +256,8 @@ static void colorItemDragBegin( GtkWidget */*widget*/, GdkDragContext* dc, gpoin // } -SwatchPage::SwatchPage() : - _name(), - _prefWidth(0), - _colors() +SwatchPage::SwatchPage() + : _prefWidth(0) { } @@ -265,10 +267,7 @@ SwatchPage::~SwatchPage() ColorItem::ColorItem(ege::PaintDef::ColorType type) : - Previewable(), def(type), - tips(), - _previews(), _isFill(false), _isStroke(false), _isLive(false), @@ -277,18 +276,12 @@ ColorItem::ColorItem(ege::PaintDef::ColorType type) : _linkGray(0), _linkSrc(0), _grad(0), - _pixData(0), - _pixWidth(0), - _pixHeight(0), - _listeners() + _pattern(0) { } ColorItem::ColorItem( unsigned int r, unsigned int g, unsigned int b, Glib::ustring& name ) : - Previewable(), def( r, g, b, name ), - tips(), - _previews(), _isFill(false), _isStroke(false), _isLive(false), @@ -297,15 +290,15 @@ ColorItem::ColorItem( unsigned int r, unsigned int g, unsigned int b, Glib::ustr _linkGray(0), _linkSrc(0), _grad(0), - _pixData(0), - _pixWidth(0), - _pixHeight(0), - _listeners() + _pattern(0) { } ColorItem::~ColorItem() { + if (_pattern != NULL) { + cairo_pattern_destroy(_pattern); + } } ColorItem::ColorItem(ColorItem const &other) : @@ -361,18 +354,16 @@ void ColorItem::setGradient(SPGradient *grad) } } -void ColorItem::setPixData(guchar* px, int width, int height) +void ColorItem::setPattern(cairo_pattern_t *pattern) { - if (px != _pixData) { - if (_pixData) { - g_free(_pixData); - } - _pixData = px; - _pixWidth = width; - _pixHeight = height; - - _updatePreviews(); + if (pattern) { + cairo_pattern_reference(pattern); + } + if (_pattern) { + cairo_pattern_destroy(_pattern); } + _pattern = pattern; + _updatePreviews(); } void ColorItem::_dragGetColorData( GtkWidget */*widget*/, @@ -520,16 +511,28 @@ void ColorItem::_regenPreview(EekPreview * preview) eek_preview_set_pixbuf( preview, pixbuf ); } - else if ( !_pixData ){ + else if ( !_pattern ){ eek_preview_set_color( preview, (def.getR() << 8) | def.getR(), (def.getG() << 8) | def.getG(), (def.getB() << 8) | def.getB() ); } else { - GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data( _pixData, GDK_COLORSPACE_RGB, FALSE, 8, - _pixWidth, _pixHeight, _pixWidth * 3, - 0, // add delete function - 0 ); + double w; + cairo_pattern_get_linear_points(_pattern, NULL, NULL, &w, NULL); + int width = ceil(w); + + cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, 1); + cairo_t *ct = cairo_create(s); + cairo_set_source(ct, _pattern); + cairo_paint(ct); + cairo_destroy(ct); + cairo_surface_flush(s); + + GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data( cairo_image_surface_get_data(s), + GDK_COLORSPACE_RGB, TRUE, 8, + width, 1, cairo_image_surface_get_stride(s), + (GdkPixbufDestroyNotify) cairo_surface_destroy, NULL); + convert_pixbuf_argb32_to_normal(pixbuf); eek_preview_set_pixbuf( preview, pixbuf ); } diff --git a/src/ui/dialog/color-item.h b/src/ui/dialog/color-item.h index a6e344ce3..9080498eb 100644 --- a/src/ui/dialog/color-item.h +++ b/src/ui/dialog/color-item.h @@ -58,8 +58,7 @@ public: void setGradient(SPGradient *grad); SPGradient * getGradient() const { return _grad; } - - void setPixData(guchar* px, int width, int height); + void setPattern(cairo_pattern_t *pattern); void setState( bool fill, bool stroke ); bool isFill() { return _isFill; } @@ -104,9 +103,7 @@ private: int _linkGray; ColorItem* _linkSrc; SPGradient* _grad; - guchar *_pixData; - int _pixWidth; - int _pixHeight; + cairo_pattern_t *_pattern; std::vector<ColorItem*> _listeners; }; diff --git a/src/ui/dialog/filedialogimpl-win32.cpp b/src/ui/dialog/filedialogimpl-win32.cpp index 09c3d0a52..e83aeccad 100644 --- a/src/ui/dialog/filedialogimpl-win32.cpp +++ b/src/ui/dialog/filedialogimpl-win32.cpp @@ -29,15 +29,13 @@ //Inkscape includes #include "inkscape.h" -#include <dialogs/dialog-events.h> -#include <extension/input.h> -#include <extension/output.h> -#include <extension/db.h> - -#include <libnr/nr-pixops.h> -#include <libnr/nr-translate-scale-ops.h> -#include <display/nr-arena-item.h> -#include <display/nr-arena.h> +#include "dialogs/dialog-events.h" +#include "extension/input.h" +#include "extension/output.h" +#include "extension/db.h" + +#include "display/nr-arena-item.h" +#include "display/nr-arena.h" #include "sp-item.h" #include "display/canvas-arena.h" @@ -955,6 +953,10 @@ void FileOpenDialogImplWin32::free_preview() bool FileOpenDialogImplWin32::set_svg_preview() { + return false; + // NOTE: it's not worth the effort to fix this to use Cairo. + // Native file dialogs are unmaintainable and should be removed anyway. + #if 0 const int PreviewSize = 512; gchar *utf8string = g_utf16_to_utf8((const gunichar2*)_path_string, @@ -1055,6 +1057,7 @@ bool FileOpenDialogImplWin32::set_svg_preview() _mutex->unlock(); return true; + #endif } void FileOpenDialogImplWin32::destroy_svg_rendering(const guint8 *buffer) diff --git a/src/ui/dialog/filter-effects-dialog.cpp b/src/ui/dialog/filter-effects-dialog.cpp index 2e17daa11..c6d81b070 100644 --- a/src/ui/dialog/filter-effects-dialog.cpp +++ b/src/ui/dialog/filter-effects-dialog.cpp @@ -48,13 +48,13 @@ #include "filters/convolvematrix.h" #include "filters/displacementmap.h" #include "filters/distantlight.h" +#include "filters/gaussian-blur.h" #include "filters/merge.h" #include "filters/mergenode.h" #include "filters/offset.h" #include "filters/pointlight.h" #include "filters/spotlight.h" #include "sp-filter-primitive.h" -#include "sp-gaussian-blur.h" #include "style.h" #include "svg/svg-color.h" diff --git a/src/ui/dialog/icon-preview.cpp b/src/ui/dialog/icon-preview.cpp index bb566fb7f..4d98793bb 100644 --- a/src/ui/dialog/icon-preview.cpp +++ b/src/ui/dialog/icon-preview.cpp @@ -39,7 +39,7 @@ extern "C" { // takes doc, root, icon, and icon name to produce pixels guchar * sp_icon_doc_icon( SPDocument *doc, NRArenaItem *root, - const gchar *name, unsigned int psize ); + const gchar *name, unsigned int psize, unsigned &stride); } #define noICON_VERBOSE 1 @@ -167,10 +167,11 @@ IconPreviewPanel::IconPreviewPanel() : int previous = 0; int avail = 0; for ( int i = numEntries - 1; i >= 0; --i ) { - pixMem[i] = new guchar[4 * sizes[i] * sizes[i]]; - memset( pixMem[i], 0x00, 4 * sizes[i] * sizes[i] ); + int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, sizes[i]); + pixMem[i] = new guchar[sizes[i] * stride]; + memset( pixMem[i], 0x00, sizes[i] * stride ); - GdkPixbuf *pb = gdk_pixbuf_new_from_data( pixMem[i], GDK_COLORSPACE_RGB, TRUE, 8, sizes[i], sizes[i], sizes[i] * 4, /*(GdkPixbufDestroyNotify)g_free*/NULL, NULL ); + GdkPixbuf *pb = gdk_pixbuf_new_from_data( pixMem[i], GDK_COLORSPACE_RGB, TRUE, 8, sizes[i], sizes[i], stride, /*(GdkPixbufDestroyNotify)g_free*/NULL, NULL ); GtkImage* img = GTK_IMAGE( gtk_image_new_from_pixbuf( pb ) ); images[i] = Glib::wrap(img); Glib::ustring label(*labels[i]); @@ -449,14 +450,16 @@ void IconPreviewPanel::renderPreview( SPObject* obj ) root = SP_ITEM( doc->getRoot() )->invoke_show( arena, visionkey, SP_ITEM_SHOW_DISPLAY ); for ( int i = 0; i < numEntries; i++ ) { - guchar * px = sp_icon_doc_icon( doc, root, id, sizes[i] ); + unsigned unused; + int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, sizes[i]); + guchar * px = sp_icon_doc_icon( doc, root, id, sizes[i], unused); // g_message( " size %d %s", sizes[i], (px ? "worked" : "failed") ); if ( px ) { - memcpy( pixMem[i], px, sizes[i] * sizes[i] * 4 ); + memcpy( pixMem[i], px, sizes[i] * stride ); g_free( px ); px = 0; } else { - memset( pixMem[i], 0, sizes[i] * sizes[i] * 4 ); + memset( pixMem[i], 0, sizes[i] * stride ); } images[i]->queue_draw(); } diff --git a/src/ui/dialog/swatches.cpp b/src/ui/dialog/swatches.cpp index cbae7c26f..ad3b79630 100644 --- a/src/ui/dialog/swatches.cpp +++ b/src/ui/dialog/swatches.cpp @@ -46,7 +46,7 @@ #include "widgets/desktop-widget.h" #include "widgets/gradient-vector.h" #include "widgets/eek-preview.h" -#include "display/nr-plain-stuff.h" +#include "display/cairo-utils.h" #include "sp-gradient-reference.h" #include "dialog-manager.h" @@ -886,7 +886,7 @@ void SwatchesPanel::_setDocument( SPDocument *document ) static void recalcSwatchContents(SPDocument* doc, std::vector<ColorItem*> &tmpColors, - std::map<ColorItem*, guchar*> &previewMappings, + std::map<ColorItem*, cairo_pattern_t*> &previewMappings, std::map<ColorItem*, SPGradient*> &gradMappings) { std::vector<SPGradient*> newList; @@ -904,30 +904,29 @@ static void recalcSwatchContents(SPDocument* doc, for ( std::vector<SPGradient*>::iterator it = newList.begin(); it != newList.end(); ++it ) { SPGradient* grad = *it; - grad->ensureVector(); - SPGradientStop first = grad->vector.stops[0]; - SPColor color = first.color; - guint32 together = color.toRGBA32(first.opacity); - SPGradientStop second = (*it)->vector.stops[1]; - SPColor color2 = second.color; + cairo_surface_t *preview = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, + PREVIEW_PIXBUF_WIDTH, VBLOCK); + cairo_t *ct = cairo_create(preview); Glib::ustring name( grad->getId() ); - unsigned int r = SP_RGBA32_R_U(together); - unsigned int g = SP_RGBA32_G_U(together); - unsigned int b = SP_RGBA32_B_U(together); - ColorItem* item = new ColorItem( r, g, b, name ); + ColorItem* item = new ColorItem( 0, 0, 0, name ); - gint width = PREVIEW_PIXBUF_WIDTH; - gint height = VBLOCK; - guchar* px = g_new( guchar, 3 * height * width ); - nr_render_checkerboard_rgb( px, width, height, 3 * width, 0, 0 ); + cairo_pattern_t *check = ink_cairo_pattern_create_checkerboard(); + cairo_pattern_t *gradient = sp_gradient_create_preview_pattern(grad, PREVIEW_PIXBUF_WIDTH); + cairo_set_source(ct, check); + cairo_paint(ct); + cairo_set_source(ct, gradient); + cairo_paint(ct); - sp_gradient_render_vector_block_rgb( grad, - px, width, height, 3 * width, - 0, width, TRUE ); + cairo_destroy(ct); + cairo_pattern_destroy(gradient); + cairo_pattern_destroy(check); - previewMappings[item] = px; + cairo_pattern_t *prevpat = cairo_pattern_create_for_surface(preview); + cairo_surface_destroy(preview); + + previewMappings[item] = prevpat; tmpColors.push_back(item); gradMappings[item] = grad; @@ -940,12 +939,13 @@ void SwatchesPanel::handleGradientsChange(SPDocument *document) SwatchPage *docPalette = (docPalettes.find(document) != docPalettes.end()) ? docPalettes[document] : 0; if (docPalette) { std::vector<ColorItem*> tmpColors; - std::map<ColorItem*, guchar*> tmpPrevs; + std::map<ColorItem*, cairo_pattern_t*> tmpPrevs; std::map<ColorItem*, SPGradient*> tmpGrads; recalcSwatchContents(document, tmpColors, tmpPrevs, tmpGrads); - for (std::map<ColorItem*, guchar*>::iterator it = tmpPrevs.begin(); it != tmpPrevs.end(); ++it) { - it->first->setPixData(it->second, PREVIEW_PIXBUF_WIDTH, VBLOCK); + for (std::map<ColorItem*, cairo_pattern_t*>::iterator it = tmpPrevs.begin(); it != tmpPrevs.end(); ++it) { + it->first->setPattern(it->second); + cairo_pattern_destroy(it->second); } for (std::map<ColorItem*, SPGradient*>::iterator it = tmpGrads.begin(); it != tmpGrads.end(); ++it) { @@ -957,7 +957,6 @@ void SwatchesPanel::handleGradientsChange(SPDocument *document) delete *it; } - // Figure out which SwatchesPanel instances are affected and update them. for (std::map<SwatchesPanel*, SPDocument*>::iterator it = docPerPanel.begin(); it != docPerPanel.end(); ++it) { @@ -978,7 +977,7 @@ void SwatchesPanel::handleDefsModified(SPDocument *document) SwatchPage *docPalette = (docPalettes.find(document) != docPalettes.end()) ? docPalettes[document] : 0; if (docPalette && !DocTrack::queueUpdateIfNeeded(document) ) { std::vector<ColorItem*> tmpColors; - std::map<ColorItem*, guchar*> tmpPrevs; + std::map<ColorItem*, cairo_pattern_t*> tmpPrevs; std::map<ColorItem*, SPGradient*> tmpGrads; recalcSwatchContents(document, tmpColors, tmpPrevs, tmpGrads); @@ -999,10 +998,17 @@ void SwatchesPanel::handleDefsModified(SPDocument *document) oldColor->setGradient(tmpGrads[newColor]); } if ( tmpPrevs.find(newColor) != tmpPrevs.end() ) { - oldColor->setPixData(tmpPrevs[newColor], PREVIEW_PIXBUF_WIDTH, VBLOCK); + oldColor->setPattern(tmpPrevs[newColor]); } } } + + for (std::map<ColorItem*, cairo_pattern_t*>::iterator it = tmpPrevs.begin(); it != tmpPrevs.end(); ++it) { + cairo_pattern_destroy(it->second); + } + for (std::vector<ColorItem*>::iterator it = tmpColors.begin(); it != tmpColors.end(); ++it) { + delete *it; + } } } diff --git a/src/ui/dialog/transformation.cpp b/src/ui/dialog/transformation.cpp index 38664fd3a..901d02240 100644 --- a/src/ui/dialog/transformation.cpp +++ b/src/ui/dialog/transformation.cpp @@ -21,7 +21,6 @@ #include "desktop-handles.h" #include "transformation.h" #include "align-and-distribute.h" -#include "libnr/nr-matrix-ops.h" #include "inkscape.h" #include "selection.h" #include "selection-chemistry.h" diff --git a/src/ui/widget/color-preview.cpp b/src/ui/widget/color-preview.cpp index add596444..a4212c7ba 100644 --- a/src/ui/widget/color-preview.cpp +++ b/src/ui/widget/color-preview.cpp @@ -11,8 +11,8 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ -#include "display/nr-plain-stuff-gdk.h" -#include "color-preview.h" +#include "ui/widget/color-preview.h" +#include "display/cairo-utils.h" #define SPCP_DEFAULT_WIDTH 32 #define SPCP_DEFAULT_HEIGHT 12 @@ -76,6 +76,9 @@ ColorPreview::paint (GdkRectangle *area) if (!gdk_rectangle_intersect (area, &warea, &wpaint)) return; + GtkWidget *widget = GTK_WIDGET(this->gobj()); + cairo_t *ct = gdk_cairo_create(widget->window); + /* Transparent area */ w2 = warea.width / 2; @@ -86,11 +89,15 @@ ColorPreview::paint (GdkRectangle *area) carea.height = warea.height; if (gdk_rectangle_intersect (area, &carea, &cpaint)) { - nr_gdk_draw_rgba32_solid (get_window()->gobj(), - get_style()->get_black_gc()->gobj(), - cpaint.x, cpaint.y, - cpaint.width, cpaint.height, - _rgba); + cairo_pattern_t *checkers = ink_cairo_pattern_create_checkerboard(); + + cairo_rectangle(ct, carea.x, carea.y, carea.width, carea.height); + cairo_set_source(ct, checkers); + cairo_fill_preserve(ct); + ink_cairo_set_source_rgba32(ct, _rgba); + cairo_fill(ct); + + cairo_pattern_destroy(checkers); } /* Solid area */ @@ -101,12 +108,12 @@ ColorPreview::paint (GdkRectangle *area) carea.height = warea.height; if (gdk_rectangle_intersect (area, &carea, &cpaint)) { - nr_gdk_draw_rgba32_solid (get_window()->gobj(), - get_style()->get_black_gc()->gobj(), - cpaint.x, cpaint.y, - cpaint.width, cpaint.height, - _rgba | 0xff); + cairo_rectangle(ct, carea.x, carea.y, carea.width, carea.height); + ink_cairo_set_source_rgba32(ct, _rgba | 0xff); + cairo_fill(ct); } + + cairo_destroy(ct); } }}} |
