diff options
| author | Jon A. Cruz <jon@joncruz.org> | 2011-07-09 09:18:40 +0000 |
|---|---|---|
| committer | Jon A. Cruz <jon@joncruz.org> | 2011-07-09 09:18:40 +0000 |
| commit | 2994e0b96e7d5d6d198b3d8139e4134f9d454229 (patch) | |
| tree | 9964831887eba83c6554ffc9f9f364a26bf19ed1 /src | |
| parent | String fixes in webslicer (diff) | |
| download | inkscape-2994e0b96e7d5d6d198b3d8139e4134f9d454229.tar.gz inkscape-2994e0b96e7d5d6d198b3d8139e4134f9d454229.zip | |
Next step in refactoring color management. More to come.
(bzr r10429)
Diffstat (limited to 'src')
| -rw-r--r-- | src/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/Makefile_insert | 3 | ||||
| -rw-r--r-- | src/cms-color-types.h | 58 | ||||
| -rw-r--r-- | src/color-profile-cms-fns.h | 51 | ||||
| -rw-r--r-- | src/color-profile-fns.h | 16 | ||||
| -rw-r--r-- | src/color-profile.cpp | 42 | ||||
| -rw-r--r-- | src/color-profile.h | 23 | ||||
| -rw-r--r-- | src/display/sp-canvas.cpp | 2 | ||||
| -rw-r--r-- | src/sp-image.cpp | 1 | ||||
| -rw-r--r-- | src/sp-object-repr.cpp | 2 | ||||
| -rw-r--r-- | src/sp-object.cpp | 2 | ||||
| -rw-r--r-- | src/svg/svg-color.cpp | 10 | ||||
| -rw-r--r-- | src/widgets/sp-color-icc-selector.cpp | 11 | ||||
| -rw-r--r-- | src/widgets/sp-color-notebook.cpp | 9 |
14 files changed, 195 insertions, 37 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 580d65b0c..11a307037 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -306,7 +306,9 @@ set(inkscape_SRC box3d-context.h box3d-side.h box3d.h + cms-color-types.h color-profile-fns.h + color-profile-cms-fns.h color-profile-test.h color-profile.h color-rgba.h diff --git a/src/Makefile_insert b/src/Makefile_insert index 7d48dba93..d4f96fc87 100644 --- a/src/Makefile_insert +++ b/src/Makefile_insert @@ -12,9 +12,10 @@ ink_common_sources += \ box3d.cpp box3d.h \ box3d-side.cpp box3d-side.h \ brokenimage.xpm \ + cms-color-types.h \ color.cpp color.h \ color-profile.cpp color-profile.h \ - color-profile-fns.h \ + color-profile-fns.h color-profile-cms-fns.h \ color-rgba.h \ common-context.cpp common-context.h \ composite-undo-stack-observer.cpp \ diff --git a/src/cms-color-types.h b/src/cms-color-types.h new file mode 100644 index 000000000..74fdac12c --- /dev/null +++ b/src/cms-color-types.h @@ -0,0 +1,58 @@ +#ifndef SEEN_CMS_COLOR_TYPES_H +#define SEEN_CMS_COLOR_TYPES_H + +/** \file + * A simple abstraction to provide opaque compatibility with either lcms or lcms2. + */ + +#include <glib/gtypes.h> + + +typedef void * cmsHPROFILE; +typedef void * cmsHTRANSFORM; + +namespace Inkscape { + +/** + * Opaque holder of a 32-bit signature type. + */ +class FourCCSig { +public: + FourCCSig( FourCCSig const &other ) : value(other.value) {}; + +protected: + FourCCSig( guint32 value ) : value(value) {}; + + guint32 value; +}; + +class ColorSpaceSig : public FourCCSig { +public: + ColorSpaceSig( ColorSpaceSig const &other ) : FourCCSig(other) {}; + +protected: + ColorSpaceSig( guint32 value ) : FourCCSig(value) {}; +}; + +class ColorProfileClassSig : public FourCCSig { +public: + ColorProfileClassSig( ColorProfileClassSig const &other ) : FourCCSig(other) {}; + +protected: + ColorProfileClassSig( guint32 value ) : FourCCSig(value) {}; +}; + +} // namespace Inkscape + +#endif // SEEN_CMS_COLOR_TYPES_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:fileencoding=utf-8:textwidth=99 : diff --git a/src/color-profile-cms-fns.h b/src/color-profile-cms-fns.h new file mode 100644 index 000000000..fe0eed392 --- /dev/null +++ b/src/color-profile-cms-fns.h @@ -0,0 +1,51 @@ +#ifndef SEEN_COLOR_PROFILE_CMS_FNS_H +#define SEEN_COLOR_PROFILE_CMS_FNS_H + +#if ENABLE_LCMS +#include <lcms.h> +#endif // ENABLE_LCMS + +#include "cms-color-types.h" + +namespace Inkscape { + +#if ENABLE_LCMS + +// Note: these can later be adjusted to adapt for lcms2: + +class ColorSpaceSigWrapper : public ColorSpaceSig { +public : + ColorSpaceSigWrapper( icColorSpaceSignature sig ) : ColorSpaceSig( static_cast<guint32>(sig) ) {} + ColorSpaceSigWrapper( ColorSpaceSig const &other ) : ColorSpaceSig( other ) {} + + operator icColorSpaceSignature() const { return static_cast<icColorSpaceSignature>(value); } +}; + +class ColorProfileClassSigWrapper : public ColorProfileClassSig { +public : + ColorProfileClassSigWrapper( icProfileClassSignature sig ) : ColorProfileClassSig( static_cast<guint32>(sig) ) {} + ColorProfileClassSigWrapper( ColorProfileClassSig const &other ) : ColorProfileClassSig( other ) {} + + operator icProfileClassSignature() const { return static_cast<icProfileClassSignature>(value); } +}; + +icColorSpaceSignature asICColorSpaceSig(ColorSpaceSig const & sig); +icProfileClassSignature asICColorProfileClassSig(ColorProfileClassSig const & sig); + +#endif // ENABLE_LCMS + +} // namespace Inkscape + + +#endif // !SEEN_COLOR_PROFILE_CMS_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:fileencoding=utf-8:textwidth=99 : diff --git a/src/color-profile-fns.h b/src/color-profile-fns.h index 3d22417f6..0588ce89e 100644 --- a/src/color-profile-fns.h +++ b/src/color-profile-fns.h @@ -10,8 +10,8 @@ #if ENABLE_LCMS #include <vector> #include <glibmm/ustring.h> -#include <lcms.h> #endif // ENABLE_LCMS +#include "cms-color-types.h" class SPDocument; @@ -23,8 +23,6 @@ class Node; class ColorProfile; -GType colorprofile_get_type(); - #if ENABLE_LCMS cmsHPROFILE colorprofile_get_handle( SPDocument* document, guint* intent, gchar const* name ); @@ -39,15 +37,13 @@ std::vector<Glib::ustring> colorprofile_get_softproof_names(); Glib::ustring get_path_for_profile(Glib::ustring const& name); -#endif +void colorprofile_cmsDoTransform(cmsHTRANSFORM transform, void *inBuf, void *outBuf, unsigned int size); -} // namespace Inkscape +bool colorprofile_isPrintColorSpace(ColorProfile const *profile); -#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 // ENABLE_LCMS + +} // namespace Inkscape #endif // !SEEN_COLOR_PROFILE_FNS_H diff --git a/src/color-profile.cpp b/src/color-profile.cpp index c2267d827..4bc37fdf8 100644 --- a/src/color-profile.cpp +++ b/src/color-profile.cpp @@ -32,6 +32,7 @@ #include "color.h" #include "color-profile.h" #include "color-profile-fns.h" +#include "color-profile-cms-fns.h" #include "attributes.h" #include "inkscape.h" #include "document.h" @@ -100,7 +101,6 @@ extern guint update_in_progress; static SPObjectClass *cprof_parent_class; - class ColorProfileImpl { public: #if ENABLE_LCMS @@ -127,6 +127,22 @@ public: #endif // ENABLE_LCMS }; + + +namespace Inkscape { + +icColorSpaceSignature asICColorSpaceSig(ColorSpaceSig const & sig) +{ + return ColorSpaceSigWrapper(sig); +} + +icProfileClassSignature asICColorProfileClassSig(ColorProfileClassSig const & sig) +{ + return ColorProfileClassSigWrapper(sig); +} + +} // namespace Inkscape + ColorProfileImpl::ColorProfileImpl() #if ENABLE_LCMS : @@ -554,12 +570,12 @@ cmsHPROFILE Inkscape::colorprofile_get_handle( SPDocument* document, guint* inte return prof; } -icColorSpaceSignature ColorProfile::getColorSpace() const { - return impl->_profileSpace; +Inkscape::ColorSpaceSig ColorProfile::getColorSpace() const { + return ColorSpaceSigWrapper(impl->_profileSpace); } -icProfileClassSignature ColorProfile::getProfileClass() const { - return impl->_profileClass; +Inkscape::ColorProfileClassSig ColorProfile::getProfileClass() const { + return ColorProfileClassSigWrapper(impl->_profileClass); } cmsHTRANSFORM ColorProfile::getTransfToSRGB8() @@ -678,6 +694,22 @@ Glib::ustring Inkscape::get_path_for_profile(Glib::ustring const& name) return result; } + +void Inkscape::colorprofile_cmsDoTransform(cmsHTRANSFORM transform, void *inBuf, void *outBuf, unsigned int size) +{ + cmsDoTransform(transform, inBuf, outBuf, size); +} + +bool Inkscape::colorprofile_isPrintColorSpace(ColorProfile const *profile) +{ + bool isPrint = false; + if ( profile ) { + ColorSpaceSigWrapper colorspace = profile->getColorSpace(); + isPrint = (colorspace == icSigCmykData) || (colorspace == icSigCmyData); + } + return isPrint; +} + #endif // ENABLE_LCMS std::vector<Glib::ustring> ColorProfile::getBaseProfileDirs() { diff --git a/src/color-profile.h b/src/color-profile.h index 28096cd20..1b06b6a78 100644 --- a/src/color-profile.h +++ b/src/color-profile.h @@ -5,12 +5,11 @@ * SPColorProfile: SVG <color-profile> implementation */ +#include <vector> #include <glib/gtypes.h> #include <sp-object.h> #include <glibmm/ustring.h> -#if ENABLE_LCMS -#include <lcms.h> -#endif // ENABLE_LCMS +#include "cms-color-types.h" namespace Inkscape { @@ -25,6 +24,7 @@ enum { class ColorProfileImpl; + /// The SPColorProfile vtable. struct ColorProfileClass { SPObjectClass parent_class; @@ -32,9 +32,8 @@ struct ColorProfileClass { /** Color Profile. */ struct ColorProfile : public SPObject { -#if ENABLE_LCMS friend cmsHPROFILE colorprofile_get_handle( SPDocument*, guint*, gchar const* ); -#endif // ENABLE_LCMS + static GType getType(); static void classInit( ColorProfileClass *klass ); @@ -42,8 +41,10 @@ struct ColorProfile : public SPObject { static std::vector<Glib::ustring> getProfileFiles(); static std::vector<std::pair<Glib::ustring, Glib::ustring> > getProfileFilesWithNames(); #if ENABLE_LCMS - icColorSpaceSignature getColorSpace() const; - icProfileClassSignature getProfileClass() const; + //icColorSpaceSignature getColorSpace() const; + ColorSpaceSig getColorSpace() const; + //icProfileClassSignature getProfileClass() const; + ColorProfileClassSig getProfileClass() const; cmsHTRANSFORM getTransfToSRGB8(); cmsHTRANSFORM getTransfFromSRGB8(); cmsHTRANSFORM getTransfGamutCheck(); @@ -68,8 +69,16 @@ private: ColorProfileImpl *impl; }; +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_H /* diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index 3e8a4880c..ea39d3435 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -1683,7 +1683,7 @@ static void sp_canvas_paint_single_buffer(SPCanvas *canvas, int x0, int y0, int int stride = cairo_image_surface_get_stride(imgs); for (int i=0; i<h; ++i) { unsigned char *row = px + i*stride; - cmsDoTransform(transf, row, row, w); + Inkscape::colorprofile_cmsDoTransform(transf, row, row, w); } cairo_surface_mark_dirty(imgs); } diff --git a/src/sp-image.cpp b/src/sp-image.cpp index f98a6c8e3..e9fd7ccde 100644 --- a/src/sp-image.cpp +++ b/src/sp-image.cpp @@ -45,6 +45,7 @@ #include "io/sys.h" #if ENABLE_LCMS #include "color-profile-fns.h" +#include "color-profile-cms-fns.h" #include "color-profile.h" //#define DEBUG_LCMS #ifdef DEBUG_LCMS diff --git a/src/sp-object-repr.cpp b/src/sp-object-repr.cpp index c6d6729cc..b40017e65 100644 --- a/src/sp-object-repr.cpp +++ b/src/sp-object-repr.cpp @@ -55,7 +55,7 @@ #include "sp-style-elem.h" #include "sp-switch.h" -#include "color-profile-fns.h" +#include "color-profile.h" #include "xml/repr.h" #include "sp-filter.h" #include "filters/blend.h" diff --git a/src/sp-object.cpp b/src/sp-object.cpp index e0b3e3201..c12b9344b 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -39,7 +39,7 @@ #include "helper/sp-marshal.h" #include "xml/node-event-vector.h" #include "attributes.h" -#include "color-profile-fns.h" +#include "color-profile.h" #include "document.h" #include "style.h" #include "sp-object-repr.h" diff --git a/src/svg/svg-color.cpp b/src/svg/svg-color.cpp index e50cb2928..3605bde55 100644 --- a/src/svg/svg-color.cpp +++ b/src/svg/svg-color.cpp @@ -43,7 +43,9 @@ #include "document.h" #include "inkscape.h" #include "profile-manager.h" +#include "color-profile-cms-fns.h" #endif // ENABLE_LCMS +#include "color-profile-fns.h" using std::sprintf; @@ -479,10 +481,12 @@ g_message("profile name: %s", icc->colorProfile.c_str()); gchar const** names = 0; gchar const** tips = 0; guint const* scales = 0; - getThings( prof->getColorSpace(), names, tips, scales ); + getThings( asICColorSpaceSig(prof->getColorSpace()), names, tips, scales ); - guint count = _cmsChannelsOf( prof->getColorSpace() ); - if (count>4) count=4; //do we need it? Should we allow an arbitrary number of color values? Or should we limit to a maximum? (max==4?) + guint count = _cmsChannelsOf( asICColorSpaceSig(prof->getColorSpace()) ); + if (count > 4) { + count = 4; //do we need it? Should we allow an arbitrary number of color values? Or should we limit to a maximum? (max==4?) + } for (guint i=0;i<count; i++){ color_in[i] = (guchar) ((((gdouble)icc->colors[i])*256.0) * (gdouble)scales[i]); g_message("input[%d]: %d",i, color_in[i]); diff --git a/src/widgets/sp-color-icc-selector.cpp b/src/widgets/sp-color-icc-selector.cpp index 94f450e50..9e5291cc4 100644 --- a/src/widgets/sp-color-icc-selector.cpp +++ b/src/widgets/sp-color-icc-selector.cpp @@ -16,6 +16,7 @@ #if ENABLE_LCMS #include "color-profile-fns.h" +#include "color-profile-cms-fns.h" #include "color-profile.h" #ifdef DEBUG_LCMS @@ -497,12 +498,12 @@ void ColorICCSelector::_switchToProfile( gchar const* name ) #ifdef DEBUG_LCMS g_message("got on out [%04x] [%04x] [%04x] [%04x]", post[0], post[1], post[2], post[3]); #endif // DEBUG_LCMS - guint count = _cmsChannelsOf( newProf->getColorSpace() ); + guint count = _cmsChannelsOf( asICColorSpaceSig(newProf->getColorSpace()) ); gchar const** names = 0; gchar const** tips = 0; guint const* scales = 0; - getThings( newProf->getColorSpace(), names, tips, scales ); + getThings( asICColorSpaceSig(newProf->getColorSpace()), names, tips, scales ); for ( guint i = 0; i < count; i++ ) { gdouble val = (((gdouble)post[i])/65535.0) * (gdouble)scales[i]; @@ -680,12 +681,12 @@ void ColorICCSelector::_setProfile( SVGICCColor* profile ) if ( profile ) { _prof = SP_ACTIVE_DOCUMENT->profileManager->find(profile->colorProfile.c_str()); - if ( _prof && _prof->getProfileClass() != icSigNamedColorClass ) { - _profChannelCount = _cmsChannelsOf( _prof->getColorSpace() ); + if ( _prof && (asICColorProfileClassSig(_prof->getProfileClass()) != icSigNamedColorClass) ) { + _profChannelCount = _cmsChannelsOf( asICColorSpaceSig(_prof->getColorSpace()) ); gchar const** names = 0; gchar const** tips = 0; - getThings( _prof->getColorSpace(), names, tips, _fooScales ); + getThings( asICColorSpaceSig(_prof->getColorSpace()), names, tips, _fooScales ); if ( profChanged ) { for ( guint i = 0; i < _profChannelCount; i++ ) { diff --git a/src/widgets/sp-color-notebook.cpp b/src/widgets/sp-color-notebook.cpp index d041f85df..546f7838b 100644 --- a/src/widgets/sp-color-notebook.cpp +++ b/src/widgets/sp-color-notebook.cpp @@ -1,5 +1,3 @@ -#define __SP_COLOR_NOTEBOOK_C__ - /* * A notebook with RGB, CMYK, CMS, HSL, and Wheel pages * @@ -38,6 +36,11 @@ #include "../document.h" #include "../profile-manager.h" #include "color-profile.h" +#include "color-profile-fns.h" +#if ENABLE_LCMS +//#include "lcms.h" +//#include "color-profile-cms-fns.h" +#endif // ENABLE_LCMS struct SPColorNotebookTracker { const gchar* name; @@ -537,7 +540,7 @@ void ColorNotebook::_updateRgbaEntry( const SPColor& color, gfloat alpha ) gtk_widget_set_sensitive (_box_toomuchink, false); if (color.icc){ Inkscape::ColorProfile* prof = SP_ACTIVE_DOCUMENT->profileManager->find(color.icc->colorProfile.c_str()); - if ( prof && ( (prof->getColorSpace() == icSigCmykData) || (prof->getColorSpace() == icSigCmyData) ) ) { + if ( prof && colorprofile_isPrintColorSpace(prof) ) { gtk_widget_show(GTK_WIDGET(_box_toomuchink)); double ink_sum = 0; for (unsigned int i=0; i<color.icc->colors.size(); i++){ |
