summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2010-07-24 23:50:24 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2010-07-24 23:50:24 +0000
commit262043cadcd2ef387623ad72ec4bf4268d0fc74d (patch)
tree29a9e721e1553addc64b2910960a770de744c114 /src
parentTurbulence filter (lazy version) (diff)
downloadinkscape-262043cadcd2ef387623ad72ec4bf4268d0fc74d.tar.gz
inkscape-262043cadcd2ef387623ad72ec4bf4268d0fc74d.zip
Minor cleanups
(bzr r9508.1.34)
Diffstat (limited to 'src')
-rw-r--r--src/display/cairo-templates.h2
-rw-r--r--src/display/nr-filter-image.cpp62
-rw-r--r--src/display/nr-filter-slot.cpp10
-rw-r--r--src/display/nr-filter-tile.cpp36
-rw-r--r--src/display/nr-filter-tile.h8
5 files changed, 85 insertions, 33 deletions
diff --git a/src/display/cairo-templates.h b/src/display/cairo-templates.h
index 8855c65fc..e0b1bfd98 100644
--- a/src/display/cairo-templates.h
+++ b/src/display/cairo-templates.h
@@ -16,7 +16,7 @@
#include <omp.h>
#include "preferences.h"
// single-threaded operation if the number of pixels is below this threshold
-#define OPENMP_THRESHOLD 4096
+#define OPENMP_THRESHOLD 2048
#endif
#include <algorithm>
diff --git a/src/display/nr-filter-image.cpp b/src/display/nr-filter-image.cpp
index 4ad6982f3..5dec64dc7 100644
--- a/src/display/nr-filter-image.cpp
+++ b/src/display/nr-filter-image.cpp
@@ -36,9 +36,69 @@ FilterPrimitive * FilterImage::create() {
FilterImage::~FilterImage()
{
- if (feImageHref) g_free(feImageHref);
+ if (feImageHref)
+ g_free(feImageHref);
}
+/*
+void FilterImage::render_cairo(FilterSlot &slot)
+{
+ if (!feImageHref)
+ return;
+
+ cairo_surface_t *input = slot.getcairo(_input);
+
+ if (from_element) {
+ if (!SVGElem) return;
+
+ // prep the document
+ // TODO: do not recreate the rendering tree every time
+ sp_document_ensure_up_to_date(document);
+ NRArena* arena = NRArena::create();
+ unsigned const key = sp_item_display_key_new(1);
+ NRArenaItem* ai = sp_item_invoke_show(SVGElem, arena, key, SP_ITEM_SHOW_DISPLAY);
+ if (!ai) {
+ g_warning("feImage renderer: error creating NRArenaItem for SVG Element");
+ nr_object_unref((NRObject *) arena);
+ return;
+ }
+
+ Geom::OptRect optarea = SVGElem->getBounds(Geom::identity());
+ if (!optarea) return;
+
+ Geom::Rect area = *optarea;
+ Geom::Matrix itrans = slot.get_units().get_matrix_display2pb();
+
+ NRRectL const &slot_area = slot.get_units().get_slot_area();
+ NRRectL rect;
+ rect.x0 = floor(area->left());
+ rect.x1 = ceil(area->right());
+ rect.y0 = floor(area->top());
+ rect.y1 = ceil(area->bottom());
+
+ cairo_surface_t *out = ink_cairo_surface_create_same_size(in, CAIRO_CONTENT_COLOR_ALPHA);
+ cairo_t *ct = cairo_create(out);
+ cairo_translate(ct, -slot_area.x0, -slot_area.y0);
+ ink_cairo_transform(ct, itrans);
+ cairo_translate(ct, rect.x0, rect.y0);
+
+ // Update to renderable state
+ NRGC gc(NULL);
+ Geom::Matrix t = Geom::identity();
+ nr_arena_item_set_transform(ai, &t);
+ gc.transform.setIdentity();
+ nr_arena_item_invoke_update( ai, NULL, &gc,
+ NR_ARENA_ITEM_STATE_ALL,
+ NR_ARENA_ITEM_STATE_NONE );
+
+ nr_arena_item_invoke_render(ct, ai, &rect, NULL, NR_ARENA_ITEM_RENDER_NO_CACHE);
+
+ slot.set(_output, out);
+ cairo_surface_destroy(out);
+ return;
+ }
+}*/
+
int FilterImage::render(FilterSlot &slot, FilterUnits const &units) {
if (!feImageHref) return 0;
diff --git a/src/display/nr-filter-slot.cpp b/src/display/nr-filter-slot.cpp
index 5371499e4..935751871 100644
--- a/src/display/nr-filter-slot.cpp
+++ b/src/display/nr-filter-slot.cpp
@@ -173,6 +173,11 @@ cairo_surface_t *FilterSlot::_get_transformed_source_graphic()
{
Geom::Matrix trans = _units.get_matrix_display2pb();
+ if (trans.isIdentity()) {
+ cairo_surface_reference(_source_graphic);
+ return _source_graphic;
+ }
+
cairo_surface_t *tsg = cairo_surface_create_similar(
_source_graphic, cairo_surface_get_content(_source_graphic),
_slot_area.x1 - _slot_area.x0, _slot_area.y1 - _slot_area.y0);
@@ -213,6 +218,11 @@ cairo_surface_t *FilterSlot::_get_transformed_background()
cairo_surface_t *FilterSlot::get_result(int res)
{
Geom::Matrix trans = _units.get_matrix_pb2display();
+ if (trans.isIdentity()) {
+ cairo_surface_t *result = getcairo(res);
+ cairo_surface_reference(result);
+ return result;
+ }
cairo_surface_t *r = cairo_surface_create_similar(_source_graphic,
cairo_surface_get_content(_source_graphic),
diff --git a/src/display/nr-filter-tile.cpp b/src/display/nr-filter-tile.cpp
index 898db9f53..60f39e3cd 100644
--- a/src/display/nr-filter-tile.cpp
+++ b/src/display/nr-filter-tile.cpp
@@ -10,6 +10,7 @@
*/
#include "display/nr-filter-tile.h"
+#include "display/nr-filter-slot.h"
#include "display/nr-filter-units.h"
namespace Inkscape {
@@ -17,7 +18,6 @@ namespace Filters {
FilterTile::FilterTile()
{
- g_warning("FilterTile::render not implemented.");
}
FilterPrimitive * FilterTile::create() {
@@ -27,40 +27,24 @@ FilterPrimitive * FilterTile::create() {
FilterTile::~FilterTile()
{}
-int FilterTile::render(FilterSlot &slot, FilterUnits const &/*units*/) {
- NRPixBlock *in = slot.get(_input);
- if (!in) {
- g_warning("Missing source image for feTile (in=%d)", _input);
- return 1;
- }
-
- NRPixBlock *out = new NRPixBlock;
-
- nr_pixblock_setup_fast(out, in->mode,
- in->area.x0, in->area.y0, in->area.x1, in->area.y1,
- true);
-
- unsigned char *in_data = NR_PIXBLOCK_PX(in);
- unsigned char *out_data = NR_PIXBLOCK_PX(out);
+void FilterTile::render_cairo(FilterSlot &slot)
+{
+ static bool tile_warning = false;
//IMPLEMENT ME!
- g_warning("Renderer for feTile is not implemented.");
- (void)in_data;
- (void)out_data;
+ if (!tile_warning) {
+ g_warning("Renderer for feTile is not implemented.");
+ tile_warning = true;
+ }
- out->empty = FALSE;
- slot.set(_output, out);
- return 0;
+ cairo_surface_t *in = slot.getcairo(_input);
+ slot.set(_output, in);
}
void FilterTile::area_enlarge(NRRectL &/*area*/, Geom::Matrix const &/*trans*/)
{
}
-FilterTraits FilterTile::get_input_traits() {
- return TRAIT_PARALLER;
-}
-
} /* namespace Filters */
} /* namespace Inkscape */
diff --git a/src/display/nr-filter-tile.h b/src/display/nr-filter-tile.h
index 5a6a5a78c..faf40ec63 100644
--- a/src/display/nr-filter-tile.h
+++ b/src/display/nr-filter-tile.h
@@ -13,22 +13,20 @@
*/
#include "display/nr-filter-primitive.h"
-#include "display/nr-filter-slot.h"
-#include "display/nr-filter-units.h"
-#include "libnr/nr-rect-l.h"
namespace Inkscape {
namespace Filters {
+class FilterSlot;
+
class FilterTile : public FilterPrimitive {
public:
FilterTile();
static FilterPrimitive *create();
virtual ~FilterTile();
- virtual int render(FilterSlot &slot, FilterUnits const &units);
+ virtual void render_cairo(FilterSlot &slot);
virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
- virtual FilterTraits get_input_traits();
};
} /* namespace Filters */