diff --git a/src/color-profile.cpp b/src/color-profile.cpp
index 9ac1f6414d25ad92483c00030a9e9ea8bab18dcf..4b13073165b088e5b208e44e60c9b42ae6566bfb 100644 (file)
--- a/src/color-profile.cpp
+++ b/src/color-profile.cpp
-
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
//#define DEBUG_LCMS
#include <cstring>
#include <string>
+
+#ifdef WIN32
+#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. Required for correctly including icm.h
+#define _WIN32_WINDOWS 0x0410
+#endif
+#include <windows.h>
+#endif
+
#include "xml/repr.h"
#include "color-profile.h"
#include "color-profile-fns.h"
#include "dom/uri.h"
#include "dom/util/digest.h"
+#ifdef WIN32
+#include <Icm.h>
+#endif // WIN32
+
using Inkscape::ColorProfile;
using Inkscape::ColorProfileClass;
//# 1. Get complete URI of document
gchar const *docbase = SP_DOCUMENT_URI( doc );
if (!docbase)
- {
- g_warning("null docbase");
+ {
+ // Normal for files that have not yet been saved.
docbase = "";
- }
+ }
+
+ gchar* escaped = g_uri_escape_string(cprof->href, "!*'();:@=+$,/?#[]", TRUE);
+
//g_message("docbase:%s\n", docbase);
org::w3c::dom::URI docUri(docbase);
//# 2. Get href of icc file. we don't care if it's rel or abs
- org::w3c::dom::URI hrefUri(cprof->href);
+ org::w3c::dom::URI hrefUri(escaped);
//# 3. Resolve the href according the docBase. This follows
// the w3c specs. All absolute and relative issues are considered
org::w3c::dom::URI cprofUri = docUri.resolve(hrefUri);
- gchar* fullname = (gchar *)cprofUri.getNativePath().c_str();
+ gchar* fullname = g_uri_unescape_string(cprofUri.getNativePath().c_str(), "");
cprof->_clearProfile();
cprof->profHandle = cmsOpenProfileFromFile( fullname, "r" );
if ( cprof->profHandle ) {
#ifdef DEBUG_LCMS
DEBUG_MESSAGE( lcmsOne, "cmsOpenProfileFromFile( '%s'...) = %p", fullname, (void*)cprof->profHandle );
#endif // DEBUG_LCMS
-
+ g_free(escaped);
+ escaped = 0;
+ g_free(fullname);
#endif // ENABLE_LCMS
}
}
@@ -473,7 +492,7 @@ cmsHPROFILE Inkscape::colorprofile_get_handle( SPDocument* document, guint* inte
cmsHTRANSFORM ColorProfile::getTransfToSRGB8()
{
- if ( !_transf ) {
+ if ( !_transf && profHandle ) {
int intent = getLcmsIntent(rendering_intent);
_transf = cmsCreateTransform( profHandle, _getInputFormat(_profileSpace), getSRGBProfile(), TYPE_RGBA_8, intent, 0 );
}
cmsHTRANSFORM ColorProfile::getTransfFromSRGB8()
{
- if ( !_revTransf ) {
+ if ( !_revTransf && profHandle ) {
int intent = getLcmsIntent(rendering_intent);
_revTransf = cmsCreateTransform( getSRGBProfile(), TYPE_RGBA_8, profHandle, _getInputFormat(_profileSpace), intent, 0 );
}
return result;
}
+#endif // ENABLE_LCMS
std::list<Glib::ustring> ColorProfile::getProfileDirs() {
std::list<Glib::ustring> sources;
// first try user's local dir
sources.push_back( g_build_filename(g_get_user_data_dir(), "color", "icc", NULL) );
- sources.push_back( g_build_filename(base, ".color", "icc", NULL) ); // OpenICC recommends to deprecate this
+
const gchar* const * dataDirs = g_get_system_data_dirs();
for ( int i = 0; dataDirs[i]; i++ ) {
- sources.push_back(g_build_filename(dataDirs[i], "color", "icc", NULL));
+ gchar* path = g_build_filename(dataDirs[i], "color", "icc", NULL);
+ sources.push_back(path);
+ g_free(path);
+ }
+
+ // On OS X:
+ if ( g_file_test("/Library/ColorSync/Profiles", G_FILE_TEST_EXISTS) && g_file_test("/Library/ColorSync/Profiles", G_FILE_TEST_IS_DIR) ) {
+ sources.push_back("/Library/ColorSync/Profiles");
+
+ gchar* path = g_build_filename(g_get_home_dir(), "Library", "ColorSync", "Profiles", NULL);
+ if ( g_file_test(path, G_FILE_TEST_EXISTS) && g_file_test(path, G_FILE_TEST_IS_DIR) ) {
+ sources.push_back(path);
+ }
+ g_free(path);
}
+
+#ifdef WIN32
+ wchar_t pathBuf[MAX_PATH + 1];
+ pathBuf[0] = 0;
+ DWORD pathSize = sizeof(pathBuf);
+ g_assert(sizeof(wchar_t) == sizeof(gunichar2));
+ if ( GetColorDirectoryW( NULL, pathBuf, &pathSize ) ) {
+ gchar * utf8Path = g_utf16_to_utf8( (gunichar2*)(&pathBuf[0]), -1, NULL, NULL, NULL );
+ if ( !g_utf8_validate(utf8Path, -1, NULL) ) {
+ g_warning( "GetColorDirectoryW() resulted in invalid UTF-8" );
+ } else {
+ sources.push_back(utf8Path);
+ }
+ g_free( utf8Path );
+ }
+#endif // WIN32
+
return sources;
}
+#if ENABLE_LCMS
static void findThings() {
std::list<Glib::ustring> sources = ColorProfile::getProfileDirs();
dwFlags |= cmsFLAGS_PRESERVEBLACK;
}
#endif // defined(cmsFLAGS_PRESERVEBLACK)
- transf = cmsCreateProofingTransform( ColorProfile::getSRGBProfile(), TYPE_RGB_8, hprof, TYPE_RGB_8, proofProf, intent, proofIntent, dwFlags );
+ transf = cmsCreateProofingTransform( ColorProfile::getSRGBProfile(), TYPE_RGBA_8, hprof, TYPE_RGBA_8, proofProf, intent, proofIntent, dwFlags );
} else if ( hprof ) {
- transf = cmsCreateTransform( ColorProfile::getSRGBProfile(), TYPE_RGB_8, hprof, TYPE_RGB_8, intent, 0 );
+ transf = cmsCreateTransform( ColorProfile::getSRGBProfile(), TYPE_RGBA_8, hprof, TYPE_RGBA_8, intent, 0 );
}
}
@@ -1018,9 +1069,9 @@ cmsHTRANSFORM Inkscape::colorprofile_get_display_per( Glib::ustring const& id )
dwFlags |= cmsFLAGS_PRESERVEBLACK;
}
#endif // defined(cmsFLAGS_PRESERVEBLACK)
- item.transf = cmsCreateProofingTransform( ColorProfile::getSRGBProfile(), TYPE_RGB_8, item.hprof, TYPE_RGB_8, proofProf, intent, proofIntent, dwFlags );
+ item.transf = cmsCreateProofingTransform( ColorProfile::getSRGBProfile(), TYPE_RGBA_8, item.hprof, TYPE_RGBA_8, proofProf, intent, proofIntent, dwFlags );
} else if ( item.hprof ) {
- item.transf = cmsCreateTransform( ColorProfile::getSRGBProfile(), TYPE_RGB_8, item.hprof, TYPE_RGB_8, intent, 0 );
+ item.transf = cmsCreateTransform( ColorProfile::getSRGBProfile(), TYPE_RGBA_8, item.hprof, TYPE_RGBA_8, intent, 0 );
}
}