summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2010-08-04 03:45:58 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2010-08-04 03:45:58 +0000
commit30884b9e814d7baaa2299803e8cb76cf203ca084 (patch)
tree579df4681a79a963913cea8d4891405d74280615 /src/ui
parentFix pattern viewBox (diff)
downloadinkscape-30884b9e814d7baaa2299803e8cb76cf203ca084.tar.gz
inkscape-30884b9e814d7baaa2299803e8cb76cf203ca084.zip
Wholesale cruft removal part 1
(bzr r9508.1.44)
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/cache/svg_preview_cache.cpp1
-rw-r--r--src/ui/dialog/color-item.cpp93
-rw-r--r--src/ui/dialog/color-item.h7
-rw-r--r--src/ui/dialog/swatches.cpp59
4 files changed, 83 insertions, 77 deletions
diff --git a/src/ui/cache/svg_preview_cache.cpp b/src/ui/cache/svg_preview_cache.cpp
index 6e05f6c03..d4c8d0d0c 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 "libnr/nr-pixblock.h"
#include "ui/cache/svg_preview_cache.h"
diff --git a/src/ui/dialog/color-item.cpp b/src/ui/dialog/color-item.cpp
index cb6cfbbbe..a71f0789f 100644
--- a/src/ui/dialog/color-item.cpp
+++ b/src/ui/dialog/color-item.cpp
@@ -13,13 +13,14 @@
#include <glibmm/i18n.h>
#include <gtkmm/label.h>
#include <gtk/gtkdnd.h>
+#include <cairo.h>
#include "color-item.h"
#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"
@@ -211,17 +212,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))
@@ -251,10 +255,8 @@ static void colorItemDragBegin( GtkWidget */*widget*/, GdkDragContext* dc, gpoin
// }
-SwatchPage::SwatchPage() :
- _name(),
- _prefWidth(0),
- _colors()
+SwatchPage::SwatchPage()
+ : _prefWidth(0)
{
}
@@ -264,10 +266,7 @@ SwatchPage::~SwatchPage()
ColorItem::ColorItem(ege::PaintDef::ColorType type) :
- Previewable(),
def(type),
- tips(),
- _previews(),
_isFill(false),
_isStroke(false),
_isLive(false),
@@ -276,18 +275,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),
@@ -296,15 +289,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) :
@@ -360,18 +353,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*/,
@@ -519,16 +510,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 4aac86a30..de4618bc0 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/swatches.cpp b/src/ui/dialog/swatches.cpp
index 6f013f4f3..163b49867 100644
--- a/src/ui/dialog/swatches.cpp
+++ b/src/ui/dialog/swatches.cpp
@@ -46,7 +46,7 @@
#include "ui/previewholder.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"
@@ -714,7 +714,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;
@@ -731,30 +731,28 @@ static void recalcSwatchContents(SPDocument* doc,
for ( std::vector<SPGradient*>::iterator it = newList.begin(); it != newList.end(); ++it )
{
SPGradient* grad = *it;
- sp_gradient_ensure_vector( grad );
- 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 );
+
+ 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);
- 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_destroy(ct);
+ cairo_pattern_destroy(gradient);
+ cairo_pattern_destroy(check);
- sp_gradient_render_vector_block_rgb( grad,
- px, width, height, 3 * width,
- 0, width, TRUE );
+ cairo_pattern_t *prevpat = cairo_pattern_create_for_surface(preview);
+ cairo_surface_destroy(preview);
- previewMappings[item] = px;
+ previewMappings[item] = prevpat;
tmpColors.push_back(item);
gradMappings[item] = grad;
@@ -767,12 +765,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) {
@@ -784,7 +783,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) {
@@ -805,7 +803,7 @@ void SwatchesPanel::handleDefsModified(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);
@@ -823,9 +821,16 @@ 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;
+ }
}
}