summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJon A. Cruz <jon@joncruz.org>2011-07-09 09:18:40 +0000
committerJon A. Cruz <jon@joncruz.org>2011-07-09 09:18:40 +0000
commit2994e0b96e7d5d6d198b3d8139e4134f9d454229 (patch)
tree9964831887eba83c6554ffc9f9f364a26bf19ed1 /src
parentString fixes in webslicer (diff)
downloadinkscape-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.txt2
-rw-r--r--src/Makefile_insert3
-rw-r--r--src/cms-color-types.h58
-rw-r--r--src/color-profile-cms-fns.h51
-rw-r--r--src/color-profile-fns.h16
-rw-r--r--src/color-profile.cpp42
-rw-r--r--src/color-profile.h23
-rw-r--r--src/display/sp-canvas.cpp2
-rw-r--r--src/sp-image.cpp1
-rw-r--r--src/sp-object-repr.cpp2
-rw-r--r--src/sp-object.cpp2
-rw-r--r--src/svg/svg-color.cpp10
-rw-r--r--src/widgets/sp-color-icc-selector.cpp11
-rw-r--r--src/widgets/sp-color-notebook.cpp9
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++){