summaryrefslogtreecommitdiffstats
path: root/src/color-profile.cpp
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/color-profile.cpp
parentFixed warnings (diff)
downloadinkscape-956bde7b424ecbd8ab839ffb29738ce48caeaec3.tar.gz
inkscape-956bde7b424ecbd8ab839ffb29738ce48caeaec3.zip
Adding support for <color-profile> element
(bzr r401)
Diffstat (limited to 'src/color-profile.cpp')
-rw-r--r--src/color-profile.cpp219
1 files changed, 219 insertions, 0 deletions
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 :