diff options
| author | Krzysztof Kosi??ski <tweenk.pl@gmail.com> | 2010-07-24 23:50:24 +0000 |
|---|---|---|
| committer | Krzysztof KosiĆski <tweenk.pl@gmail.com> | 2010-07-24 23:50:24 +0000 |
| commit | 262043cadcd2ef387623ad72ec4bf4268d0fc74d (patch) | |
| tree | 29a9e721e1553addc64b2910960a770de744c114 /src | |
| parent | Turbulence filter (lazy version) (diff) | |
| download | inkscape-262043cadcd2ef387623ad72ec4bf4268d0fc74d.tar.gz inkscape-262043cadcd2ef387623ad72ec4bf4268d0fc74d.zip | |
Minor cleanups
(bzr r9508.1.34)
Diffstat (limited to 'src')
| -rw-r--r-- | src/display/cairo-templates.h | 2 | ||||
| -rw-r--r-- | src/display/nr-filter-image.cpp | 62 | ||||
| -rw-r--r-- | src/display/nr-filter-slot.cpp | 10 | ||||
| -rw-r--r-- | src/display/nr-filter-tile.cpp | 36 | ||||
| -rw-r--r-- | src/display/nr-filter-tile.h | 8 |
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 */ |
