summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJon A. Cruz <jon@joncruz.org>2006-04-02 20:54:27 +0000
committerjoncruz <joncruz@users.sourceforge.net>2006-04-02 20:54:27 +0000
commit956bde7b424ecbd8ab839ffb29738ce48caeaec3 (patch)
treec32c48f01d6c90fe24292b11a9b99d6aaaaaf9aa /src
parentFixed warnings (diff)
downloadinkscape-956bde7b424ecbd8ab839ffb29738ce48caeaec3.tar.gz
inkscape-956bde7b424ecbd8ab839ffb29738ce48caeaec3.zip
Adding support for <color-profile> element
(bzr r401)
Diffstat (limited to 'src')
-rw-r--r--src/Makefile_insert2
-rw-r--r--src/attributes.cpp4
-rw-r--r--src/attributes.h4
-rw-r--r--src/color-profile-fns.h40
-rw-r--r--src/color-profile.cpp219
-rw-r--r--src/color-profile.h46
-rw-r--r--src/sp-object-repr.cpp2
7 files changed, 317 insertions, 0 deletions
diff --git a/src/Makefile_insert b/src/Makefile_insert
index 22c1a2209..c552f3401 100644
--- a/src/Makefile_insert
+++ b/src/Makefile_insert
@@ -43,6 +43,8 @@ libinkpre_a_SOURCES = \
bad-uri-exception.h \
brokenimage.xpm \
color-rgba.h \
+ color-profile.cpp color-profile.h \
+ color-profile-fns.h \
conn-avoid-ref.cpp conn-avoid-ref.h \
connector-context.cpp connector-context.h \
context-fns.cpp context-fns.h \
diff --git a/src/attributes.cpp b/src/attributes.cpp
index 10b33e178..39163c010 100644
--- a/src/attributes.cpp
+++ b/src/attributes.cpp
@@ -103,6 +103,10 @@ static SPStyleProp const props[] = {
{SP_ATTR_INKSCAPE_CURRENT_LAYER, "inkscape:current-layer"},
{SP_ATTR_INKSCAPE_DOCUMENT_UNITS, "inkscape:document-units"},
{SP_ATTR_INKSCAPE_CONNECTOR_SPACING, "inkscape:connector-spacing"},
+ /* SPColorProfile */
+ {SP_ATTR_LOCAL, "local"},
+ {SP_ATTR_NAME, "name"},
+ {SP_ATTR_RENDERING_INTENT, "rendering-intent"},
/* SPGuide */
{SP_ATTR_ORIENTATION, "orientation"},
{SP_ATTR_POSITION, "position"},
diff --git a/src/attributes.h b/src/attributes.h
index b36cf2557..897656845 100644
--- a/src/attributes.h
+++ b/src/attributes.h
@@ -104,6 +104,10 @@ enum SPAttributeEnum {
SP_ATTR_INKSCAPE_CURRENT_LAYER,
SP_ATTR_INKSCAPE_DOCUMENT_UNITS,
SP_ATTR_INKSCAPE_CONNECTOR_SPACING,
+ /* SPColorProfile */
+ SP_ATTR_LOCAL,
+ SP_ATTR_NAME,
+ SP_ATTR_RENDERING_INTENT,
/* SPGuide */
SP_ATTR_ORIENTATION,
SP_ATTR_POSITION,
diff --git a/src/color-profile-fns.h b/src/color-profile-fns.h
new file mode 100644
index 000000000..9c2388ab2
--- /dev/null
+++ b/src/color-profile-fns.h
@@ -0,0 +1,40 @@
+#ifndef SEEN_COLOR_PROFILE_FNS_H
+#define SEEN_COLOR_PROFILE_FNS_H
+
+/** \file
+ * Macros and fn declarations related to linear gradients.
+ */
+
+#include <glib-object.h>
+#include <glib/gtypes.h>
+
+namespace Inkscape {
+namespace XML {
+class Node;
+} // namespace XML
+
+class ColorProfile;
+
+GType colorprofile_get_type();
+
+} // namespace Inkscape
+
+#define COLORPROFILE_TYPE (Inkscape::colorprofile_get_type())
+#define COLORPROFILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), COLORPROFILE_TYPE, Inkscape::ColorProfile))
+#define COLORPROFILE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), COLORPROFILE_TYPE, Inkscape::ColorProfileClass))
+#define IS_COLORPROFILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), COLORPROFILE_TYPE))
+#define IS_COLORPROFILE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), COLORPROFILE_TYPE))
+
+
+#endif // !SEEN_COLOR_PROFILE_FNS_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/color-profile.cpp b/src/color-profile.cpp
new file mode 100644
index 000000000..5f4e8324e
--- /dev/null
+++ b/src/color-profile.cpp
@@ -0,0 +1,219 @@
+
+
+#include "xml/repr.h"
+#include "color-profile.h"
+#include "color-profile-fns.h"
+#include "attributes.h"
+
+using Inkscape::ColorProfile;
+using Inkscape::ColorProfileClass;
+
+static void colorprofile_class_init( ColorProfileClass *klass );
+static void colorprofile_init( ColorProfile *cprof );
+
+static void colorprofile_release( SPObject *object );
+static void colorprofile_build( SPObject *object, SPDocument *document, Inkscape::XML::Node *repr );
+static void colorprofile_set( SPObject *object, unsigned key, gchar const *value );
+static Inkscape::XML::Node *colorprofile_write( SPObject *object, Inkscape::XML::Node *repr, guint flags );
+
+static SPObject *cprof_parent_class;
+
+/**
+ * Register ColorProfile class and return its type.
+ */
+GType Inkscape::colorprofile_get_type()
+{
+ static GType type = 0;
+ if (!type) {
+ GTypeInfo info = {
+ sizeof(ColorProfileClass),
+ NULL, NULL,
+ (GClassInitFunc) colorprofile_class_init,
+ NULL, NULL,
+ sizeof(ColorProfile),
+ 16,
+ (GInstanceInitFunc) colorprofile_init,
+ NULL, /* value_table */
+ };
+ type = g_type_register_static( SP_TYPE_OBJECT, "ColorProfile", &info, static_cast<GTypeFlags>(0) );
+ }
+ return type;
+}
+
+/**
+ * ColorProfile vtable initialization.
+ */
+static void colorprofile_class_init( ColorProfileClass *klass )
+{
+ SPObjectClass *sp_object_class = reinterpret_cast<SPObjectClass *>(klass);
+
+ cprof_parent_class = static_cast<SPObject*>(g_type_class_ref(SP_TYPE_OBJECT));
+
+ sp_object_class->release = colorprofile_release;
+ sp_object_class->build = colorprofile_build;
+ sp_object_class->set = colorprofile_set;
+ sp_object_class->write = colorprofile_write;
+}
+
+/**
+ * Callback for ColorProfile object initialization.
+ */
+static void colorprofile_init( ColorProfile *cprof )
+{
+ cprof->href = 0;
+ cprof->local = 0;
+ cprof->name = 0;
+ cprof->rendering_intent = 0;
+#if ENABLE_LCMS
+ cprof->profHandle = 0;
+#endif // ENABLE_LCMS
+}
+
+/**
+ * Callback: free object
+ */
+static void colorprofile_release( SPObject *object )
+{
+ ColorProfile *cprof = COLORPROFILE(object);
+ if ( cprof->href ) {
+ g_free( cprof->href );
+ cprof->href = 0;
+ }
+
+ if ( cprof->local ) {
+ g_free( cprof->local );
+ cprof->local = 0;
+ }
+
+ if ( cprof->name ) {
+ g_free( cprof->name );
+ cprof->name = 0;
+ }
+
+#if ENABLE_LCMS
+ if ( cprof->profHandle ) {
+ cmsCloseProfile( cprof->profHandle );
+ cprof->profHandle = 0;
+ }
+#endif // ENABLE_LCMS
+}
+
+/**
+ * Callback: set attributes from associated repr.
+ */
+static void colorprofile_build( SPObject *object, SPDocument *document, Inkscape::XML::Node *repr )
+{
+ ColorProfile *cprof = COLORPROFILE(object);
+ g_assert(cprof->href == 0);
+ g_assert(cprof->local == 0);
+ g_assert(cprof->name == 0);
+
+ if (((SPObjectClass *) cprof_parent_class)->build) {
+ (* ((SPObjectClass *) cprof_parent_class)->build)(object, document, repr);
+ }
+ sp_object_read_attr( object, "xlink:href" );
+ sp_object_read_attr( object, "local" );
+ sp_object_read_attr( object, "name" );
+ sp_object_read_attr( object, "rendering-intent" );
+}
+
+/**
+ * Callback: set attribute.
+ */
+static void colorprofile_set( SPObject *object, unsigned key, gchar const *value )
+{
+ ColorProfile *cprof = COLORPROFILE(object);
+
+ switch (key) {
+ case SP_ATTR_XLINK_HREF:
+ if ( value ) {
+ cprof->href = g_strdup( value );
+ object->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if ( *cprof->href ) {
+#if ENABLE_LCMS
+ cmsErrorAction( LCMS_ERROR_SHOW );
+
+ // TODO open filename and URIs properly
+ //FILE* fp = fopen_utf8name( filename, "r" );
+ //LCMSAPI cmsHPROFILE LCMSEXPORT cmsOpenProfileFromMem(LPVOID MemPtr, DWORD dwSize);
+ cprof->profHandle = cmsOpenProfileFromFile( value, "r" );
+#endif // ENABLE_LCMS
+ }
+ }
+ break;
+
+ case SP_ATTR_LOCAL:
+ if ( value ) {
+ cprof->local = g_strdup( value );
+ object->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ }
+ break;
+
+ case SP_ATTR_NAME:
+ if ( value ) {
+ cprof->name = g_strdup( value );
+ object->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ }
+ break;
+
+ case SP_ATTR_RENDERING_INTENT:
+ if ( value ) {
+// auto | perceptual | relative-colorimetric | saturation | absolute-colorimetric
+ //cprof->name = g_strdup( value );
+ //object->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ }
+ break;
+
+ default:
+ if (((SPObjectClass *) cprof_parent_class)->set) {
+ (* ((SPObjectClass *) cprof_parent_class)->set)(object, key, value);
+ }
+ break;
+ }
+}
+
+/**
+ * Callback: write attributes to associated repr.
+ */
+static Inkscape::XML::Node* colorprofile_write( SPObject *object, Inkscape::XML::Node *repr, guint flags )
+{
+ ColorProfile *cprof = COLORPROFILE(object);
+
+ if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
+ repr = sp_repr_new("svg:color-profile");
+ }
+
+ if ( (flags & SP_OBJECT_WRITE_ALL) || cprof->href ) {
+ repr->setAttribute( "xlink:href", cprof->name );
+ }
+
+ if ( (flags & SP_OBJECT_WRITE_ALL) || cprof->href ) {
+ repr->setAttribute( "local", cprof->name );
+ }
+
+ if ( (flags & SP_OBJECT_WRITE_ALL) || cprof->href ) {
+ repr->setAttribute( "name", cprof->name );
+ }
+
+ if ( (flags & SP_OBJECT_WRITE_ALL) || cprof->href ) {
+// repr->setAttribute( "rendering-intent", cprof->name );
+ }
+
+ if (((SPObjectClass *) cprof_parent_class)->write) {
+ (* ((SPObjectClass *) cprof_parent_class)->write)(object, repr, flags);
+ }
+
+ return repr;
+}
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/color-profile.h b/src/color-profile.h
new file mode 100644
index 000000000..ea9755164
--- /dev/null
+++ b/src/color-profile.h
@@ -0,0 +1,46 @@
+#ifndef SEEN_COLOR_PROFILE_H
+#define SEEN_COLOR_PROFILE_H
+
+/** \file
+ * SPColorProfile: SVG <color-profile> implementation
+ */
+
+#include <glib/gtypes.h>
+#include <sp-object.h>
+#include "color-profile-fns.h"
+#if ENABLE_LCMS
+#include <lcms.h>
+#endif // ENABLE_LCMS
+
+namespace Inkscape {
+
+/** Color Profile. */
+struct ColorProfile : public SPObject {
+ gchar* href;
+ gchar* local;
+ gchar* name;
+ guint rendering_intent;
+#if ENABLE_LCMS
+ cmsHPROFILE profHandle;
+#endif // ENABLE_LCMS
+};
+
+/// The SPColorProfile vtable.
+struct ColorProfileClass {
+ SPObjectClass parent_class;
+};
+
+} // namespace Inkscape
+
+#endif // !SEEN_COLOR_PROFILE_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/sp-object-repr.cpp b/src/sp-object-repr.cpp
index 4b631f3d5..3987dbcbb 100644
--- a/src/sp-object-repr.cpp
+++ b/src/sp-object-repr.cpp
@@ -40,6 +40,7 @@
#include "sp-flowregion.h"
#include "sp-flowtext.h"
#include "sp-style-elem.h"
+#include "color-profile-fns.h"
#include "xml/repr.h"
enum NameType { REPR_NAME, SODIPODI_TYPE };
@@ -94,6 +95,7 @@ populate_dtables()
{ "svg:a", SP_TYPE_ANCHOR },
//{ "svg:animate", SP_TYPE_ANIMATE },
{ "svg:circle", SP_TYPE_CIRCLE },
+ { "svg:color-profile", COLORPROFILE_TYPE },
{ "svg:clipPath", SP_TYPE_CLIPPATH },
{ "svg:defs", SP_TYPE_DEFS },
{ "svg:ellipse", SP_TYPE_ELLIPSE },