Code

filterUnits and primitiveUnits are now actually read/set, percentages for primitiveUn...
[inkscape.git] / src / display / nr-arena.cpp
index f125cd0f89c7340975768690f9377727b88dae39..33870a11839648b9e5608930dd7f4d49f3dbc09f 100644 (file)
 
 #include "nr-arena-item.h"
 #include "nr-arena.h"
+#include "nr-filter-gaussian.h"
+#include "nr-filter-types.h"
 #include <libnr/nr-blit.h>
+#include "preferences.h"
+#include "color.h"
 
 static void nr_arena_class_init (NRArenaClass *klass);
 static void nr_arena_init (NRArena *arena);
@@ -52,7 +56,10 @@ static void
 nr_arena_init (NRArena *arena)
 {
     arena->delta = 0; // to be set by desktop from prefs
-    arena->rendermode = RENDERMODE_NORMAL; // default is normal render
+    arena->renderoffscreen = false; // use render values from preferences otherwise render exact
+    arena->rendermode = Inkscape::RENDERMODE_NORMAL; // default is normal render
+    arena->blurquality = BLUR_QUALITY_NORMAL;
+    arena->filterquality = Inkscape::Filters::FILTER_QUALITY_NORMAL;
     arena->outlinecolor = 0xff; // black; to be set by desktop from bg color
     arena->canvasarena = NULL;
 }
@@ -72,6 +79,16 @@ nr_arena_request_update (NRArena *arena, NRArenaItem *item)
     nr_return_if_fail (NR_IS_ARENA (arena));
     nr_return_if_fail (item != NULL);
     nr_return_if_fail (NR_IS_ARENA_ITEM (item));
+    // setup render parameter
+    if (arena->renderoffscreen == false) {
+        Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+        arena->blurquality = prefs->getInt("/options/blurquality/value", 0);
+        arena->filterquality = prefs->getInt("/options/filterquality/value", 0);
+    } else {
+        arena->blurquality =  BLUR_QUALITY_BEST;
+        arena->filterquality = Inkscape::Filters::FILTER_QUALITY_BEST;
+        arena->rendermode = Inkscape::RENDERMODE_NORMAL;
+    }
 
     if (aobject->callbacks) {
         for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
@@ -93,7 +110,17 @@ nr_arena_request_render_rect (NRArena *arena, NRRectL *area)
     nr_return_if_fail (NR_IS_ARENA (arena));
     nr_return_if_fail (area != NULL);
 
-    if (aobject->callbacks && area && !nr_rect_l_test_empty (area)) {
+    // setup render parameter
+    if (arena->renderoffscreen == false) {
+        Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+        arena->blurquality = prefs->getInt("/options/blurquality/value", 0);
+        arena->filterquality = prefs->getInt("/options/filterquality/value", 0);
+    } else {
+        arena->blurquality =  BLUR_QUALITY_BEST;
+        arena->filterquality = Inkscape::Filters::FILTER_QUALITY_BEST;
+        arena->rendermode = Inkscape::RENDERMODE_NORMAL;
+    }
+    if (aobject->callbacks && area && !nr_rect_l_test_empty_ptr(area)) {
         for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
             NRObjectListener *listener = aobject->callbacks->listeners + i;
             NRArenaEventVector *avector = (NRArenaEventVector *) listener->vector;
@@ -139,6 +166,44 @@ nr_arena_render_paintserver_fill (NRPixBlock *pb, NRRectL *area, SPPainter *pain
     nr_pixblock_release (&cb_opa);
 }
 
+/**
+    set arena to offscreen mode
+    rendering will be exact
+    @param arena NRArena object
+*/
+void
+nr_arena_set_renderoffscreen (NRArena *arena)
+{
+    nr_return_if_fail (arena != NULL);
+    nr_return_if_fail (NR_IS_ARENA (arena));
+
+    // the real assignment to the quality indicators is in the update function
+    arena->renderoffscreen = true;
+
+}
+
+#define FLOAT_TO_UINT8(f) (int(f*255))
+#define RGBA_R(v) ((v) >> 24)
+#define RGBA_G(v) (((v) >> 16) & 0xff)
+#define RGBA_B(v) (((v) >> 8) & 0xff)
+#define RGBA_A(v) ((v) & 0xff)
+
+void nr_arena_separate_color_plates(guint32* rgba){
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    bool render_cyan = prefs->getBool("/options/printcolorspreview/cyan", true);
+    bool render_magenta = prefs->getBool("/options/printcolorspreview/magenta", true);
+    bool render_yellow = prefs->getBool("/options/printcolorspreview/yellow", true);
+    bool render_black = prefs->getBool("/options/printcolorspreview/black", true);
+
+    float rgb_v[3];
+    float cmyk_v[4];
+    sp_color_rgb_to_cmyk_floatv (cmyk_v, RGBA_R(*rgba)/256.0, RGBA_G(*rgba)/256.0, RGBA_B(*rgba)/256.0); 
+    sp_color_cmyk_to_rgb_floatv (rgb_v, render_cyan ? cmyk_v[0] : 0,
+                                        render_magenta ? cmyk_v[1] : 0,
+                                        render_yellow ? cmyk_v[2] : 0,
+                                        render_black ? cmyk_v[3] : 0);
+    *rgba = (FLOAT_TO_UINT8(rgb_v[0])<<24) + (FLOAT_TO_UINT8(rgb_v[1])<<16) + (FLOAT_TO_UINT8(rgb_v[2])<<8) + 0xff;
+}
 
 /*
   Local Variables: