From: joncruz Date: Sun, 2 Apr 2006 20:54:27 +0000 (+0000) Subject: Adding support for element X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=7ad9592512736143bbe0d88d13905591d1d8e459;p=inkscape.git Adding support for element --- diff --git a/ChangeLog b/ChangeLog index 48aac83a6..78687b960 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-04-02 Jon A. Cruz + + * src/color-profile.h, src/color-profile.cpp, + src/color-profile-fns.h, src/Makefile_insert, src/attributes.cpp, + src/attributes.h, src/sp-object-repr.cpp: + + Adding support for element. + 2005-04-02 Jon A. Cruz * src/knot.h: Fixed warning messages. 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 +#include + +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(0) ); + } + return type; +} + +/** + * ColorProfile vtable initialization. + */ +static void colorprofile_class_init( ColorProfileClass *klass ) +{ + SPObjectClass *sp_object_class = reinterpret_cast(klass); + + cprof_parent_class = static_cast(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 implementation + */ + +#include +#include +#include "color-profile-fns.h" +#if ENABLE_LCMS +#include +#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 },