diff -up cinepaint-0.22-1/app/cms.c.oy19 cinepaint-0.22-1/app/cms.c --- cinepaint-0.22-1/app/cms.c.oy19 2007-05-10 22:18:31.000000000 +0200 +++ cinepaint-0.22-1/app/cms.c 2009-03-09 15:39:36.000000000 +0100 @@ -38,9 +38,18 @@ #ifdef HAVE_OY #include +#ifndef OYRANOS_VERSION +#define OYRANOS_VERSION 0 +#endif +#if OYRANOS_VERSION < 108 +#include /* ntohl */ #include +#else +#include +#endif #endif +#include "config.h" #include "../lib/version.h" #include "libgimp/gimpintl.h" #include "depth/float16.h" @@ -49,6 +58,7 @@ #include "general.h" #include "gdisplay.h" #include "gimage_cmds.h" +#include "interface.h" #include "pixelarea.h" #include "pixelrow.h" #include "rc.h" @@ -104,12 +114,14 @@ struct _CMSProfile cmsHPROFILE handle; char *data; /* save original data for profile i/o */ size_t size; + char cspace[8]; }; /* same for transform */ struct _CMSTransform { gchar *cache_key; - Tag tag; + Tag src_tag; + Tag dest_tag; cmsHTRANSFORM handle; icColorSpaceSignature colourspace_in; /*!< source/image colour space */ DWORD lcms_input_format; /*!< put information about alpha ... */ @@ -263,7 +275,7 @@ void cms_init() /* sanity checks of settings, remove failed settings */ /* suppress lcms errors while checking */ - cmsErrorAction(LCMS_ERROR_IGNORE); + cmsErrorAction(LCMS_ERROR_IGNORE); /* 1. image profile */ if (cms_default_image_profile_name != NULL) @@ -334,6 +346,77 @@ void* my_alloc_func( size_t size ) { return calloc(1, size); } +#ifdef HAVE_OY +# if OYRANOS_VERSION > 107 +int iccMessageFunc( int code, const oyStruct_s * context, const char * format, ... ) +{ + char* text = 0, *pos = 0; + va_list list; + const char * type_name = ""; + int id = -1; + + if(code == oyMSG_DBG) + return 0; + + + if(context && oyOBJECT_NONE < context->type_) + { + type_name = oyStruct_TypeToText( context ); + id = oyObject_GetId( context->oy_ ); + } + + text = (char*)calloc(sizeof(char), 4096); + if(!text) + return 1; + text[0] = 0; + + switch(code) + { + case oyMSG_WARN: + sprintf( &text[strlen(text)], _("WARNING: ")); + break; + case oyMSG_ERROR: + sprintf( &text[strlen(text)], _("!!! ERROR: ")); + break; + } + + va_start( list, format); + vsnprintf( &text[strlen(text)], 4096 - strlen(text), format, list); + va_end ( list ); + + + snprintf( &text[strlen(text)], 4096 - strlen(text), "%s[%d] ",type_name,id ); + + pos = &text[strlen(text)]; + *pos = '\n'; + pos++; + *pos = 0; + +#ifndef DEBUG + if(code == oyMSG_WARN) + { + int i = 0; + while(text[i]) + fputc(text[i++], stderr); + fprintf( stderr, "\n" ); + } else +#endif + message_box( text, NULL, NULL ); + + free( text ); + + return 0; +} +/* just a wrapper */ +int lcmsMessageFunc( int code, const char * txt ) +{ + iccMessageFunc( code, 0, txt ); + return 0; +} +# endif +#endif + + void cms_init_oyranos() { #ifdef HAVE_OY @@ -341,6 +424,12 @@ void cms_init_oyranos() size_t test_size = 0; /* profile size */ char *p_name = NULL; /* profile name */ + /* messages */ +# if OYRANOS_VERSION > 107 + oyMessageFuncSet( iccMessageFunc ); + cmsSetErrorHandler( lcmsMessageFunc ); +# endif + /* we dont touch or save the hand made settings */ /* 1. assumed image profile */ @@ -374,6 +463,8 @@ void cms_init_oyranos() const char *display_name = gdk_get_display (); test = oyGetMonitorProfile( display_name, &test_size, my_alloc_func ); + printf("%s:%d %s() monitor profile size: %d\n",__FILE__,__LINE__,__func__, + test_size ); if (test == NULL || !test_size) { @@ -666,6 +757,7 @@ cms_get_long_profile_info(cmsHPROFILE h { static char profile_info[4096]; gchar *text; + const char*tmp = NULL; cmsCIEXYZ WhitePt; int first = FALSE, min_len = 24, /* formatting */ @@ -683,56 +775,71 @@ cms_get_long_profile_info(cmsHPROFILE h #endif profile_info[0] = '\000'; if (cmsIsTag(hProfile, icSigProfileDescriptionTag)) { + tmp = cmsTakeProductDesc(hProfile); + if(tmp && strlen(tmp)) + { sprintf (text,_("Description: ")); - sprintf (profile_info,"%s%s %s",profile_info,text, - cmsTakeProductDesc(hProfile)); + sprintf (&profile_info[strlen(profile_info)],"%s %s", text, tmp); if (!first) { len = min_len - strlen (profile_info); for (i=0; i < len * 2.2; i++) { - sprintf (profile_info,"%s ",profile_info); + sprintf (&profile_info[strlen(profile_info)]," "); } } - sprintf (profile_info,"%s\n",profile_info); + sprintf (&profile_info[strlen(profile_info)],"\n"); + } } if (cmsIsTag(hProfile, icSigDeviceMfgDescTag)) { + tmp = cmsTakeProductName(hProfile); + if(tmp && strlen(tmp)) + { sprintf (text,_("Product: ")); - sprintf (profile_info,"%s%s %s\n",profile_info,text, - cmsTakeProductName(hProfile)); + sprintf (&profile_info[strlen(profile_info)],"%s %s\n", text, tmp); + } } #if LCMS_VERSION >= 112 if (cmsIsTag(hProfile, icSigDeviceMfgDescTag)) { + tmp = cmsTakeManufacturer(hProfile); + if(tmp && strlen(tmp)) + { sprintf (text,_("Manufacturer: ")); - sprintf (profile_info,"%s%s %s\n",profile_info,text, - cmsTakeManufacturer(hProfile)); + sprintf (&profile_info[strlen(profile_info)],"%s %s\n", text, tmp); + } } if (cmsIsTag(hProfile, icSigDeviceModelDescTag)) { + tmp = cmsTakeModel(hProfile); + if(tmp && strlen(tmp)) + { sprintf (text,_("Model: ")); - sprintf (profile_info,"%s%s %s\n",profile_info,text, - cmsTakeModel(hProfile)); + sprintf (&profile_info[strlen(profile_info)],"%s %s\n", text, tmp); + } } #endif #if LCMS_VERSION >= 113 if (cmsIsTag(hProfile, icSigCopyrightTag)) { + tmp = cmsTakeCopyright(hProfile); + if(tmp && strlen(tmp)) + { sprintf (text,_("Copyright: ")); - sprintf (profile_info,"%s%s %s\n",profile_info,text, - cmsTakeCopyright(hProfile)); + sprintf (&profile_info[strlen(profile_info)],"%s %s\n", text, tmp); + } } #endif - sprintf (profile_info,"%s\n",profile_info); + sprintf (&profile_info[strlen(profile_info)],"\n"); cmsTakeMediaWhitePoint (&WhitePt, hProfile); _cmsIdentifyWhitePoint (text, &WhitePt); - sprintf (profile_info, "%s%s\n", profile_info, text); + sprintf (&profile_info[strlen(profile_info)], "%s\n", text); sprintf (text,_("Device Class: ")); - sprintf (profile_info,"%s%s %s\n",profile_info,text, + sprintf (&profile_info[strlen(profile_info)],"%s %s\n", text, cms_get_device_class_name(hProfile)); sprintf (text,_("Color Space: ")); - sprintf (profile_info,"%s%s %s\n",profile_info,text, + sprintf (&profile_info[strlen(profile_info)],"%s %s\n", text, cms_get_color_space_name(hProfile)); sprintf (text,_("PCS Space: ")); - sprintf (profile_info,"%s%s %s",profile_info,text, + sprintf (&profile_info[strlen(profile_info)],"%s %s", text, cms_get_pcs_name(hProfile)); free (text); @@ -814,8 +921,9 @@ cms_read_icc_profile_dir(gchar *path, ic * profile class, class==CMS_ANY_PROFILECLASS gives all profiles, does not recur over dirs * returns a list of char * or NULL in case of error */ +//#define DEBUG 1 GSList * -cms_read_standard_profile_dirs(icProfileClassSignature class) +cms_read_standard_profile_dirs(icColorSpaceSignature space) { /* the temporary list to hold the names */ GSList* return_list = NULL; @@ -831,19 +939,49 @@ cms_read_standard_profile_dirs(icProfile #ifdef HAVE_OY if(cms_oyranos) { +# if OYRANOS_VERSION > 107 + oyPROFILE_e type = oyDEFAULT_PROFILE_START; + int size, i; + oyProfile_s * temp_prof = 0; + oyProfiles_s * iccs = 0; + + iccs = oyProfiles_ForStd( type, 0, 0 ); + + size = oyProfiles_Count( iccs ); + for( i = 0; i < size; ++i) + { + temp_prof = oyProfiles_Get( iccs, i ); +# ifdef DEBUG + printf("%d: \"%s\" %s\n", i, + oyProfile_GetText( temp_prof, oyNAME_DESCRIPTION ), + oyProfile_GetFileName(temp_prof, 0)); +# endif + return_list = g_slist_append(return_list, + (gpointer) strdup(oyProfile_GetFileName(temp_prof, 0))); + oyProfile_Release( &temp_prof ); + } + oyProfiles_Release( &iccs ); +# else int count = 0, i; - char** names = /*(const char**)*/ oyProfileListGet( 0, &count ); + char profile_space[] = {0,0,0,0,0,0,0,0}; + char** names = /*(const char**)*/ 0; + + icColorSpaceSignature space_host = ntohl(space); -# ifdef DEBUG + memcpy( profile_space, &space_host, 4 ); + names = oyProfileListGet( profile_space, &count); + +# ifdef DEBUG printf("profiles: %d\n", count); -# endif +# endif for(i = 0; i < count; ++i) { -# ifdef DEBUG_ - printf("profiles: %d %s %s\n", i, names[i], oyGetPathFromProfileName(names[i], my_alloc_func)); -# endif +# ifdef DEBUG + printf("%s profiles: %d %s %s\n", profile_space, i, names[i], oyGetPathFromProfileName(names[i], my_alloc_func)); +# endif return_list = g_slist_append(return_list, (gpointer) names[i]); } +# endif return return_list; } @@ -865,7 +1003,7 @@ cms_read_standard_profile_dirs(icProfile { path = strdup(token); } - sub_list = cms_read_icc_profile_dir(path, class); + sub_list = cms_read_icc_profile_dir(path, space); return_list = g_slist_concat(return_list, sub_list); g_free(path); @@ -877,6 +1015,7 @@ cms_read_standard_profile_dirs(icProfile return return_list; } +#undef DEBUG /* * gets meta information about the profile @@ -888,31 +1027,48 @@ CMSProfileInfo * cms_get_profile_info(CMSProfile *profile) { const char *dummy[] = {"","","",""}; +#if defined(HAVE_OY) && OYRANOS_VERSION > 107 + char ** texts = 0; + int32_t texts_n = 0; + oyProfileTag_s * tag = 0; + oyProfile_s * p = oyProfile_FromMem( profile->size, profile->data, 0, 0 ); +#endif + profile_info_buffer->manufacturer = dummy[0]; + profile_info_buffer->description = dummy[0]; + profile_info_buffer->pcs = dummy[0]; + profile_info_buffer->color_space_name = dummy[0]; + profile_info_buffer->color_space_channel_names = &dummy[0]; + profile_info_buffer->device_class_name = dummy[0]; + profile_info_buffer->long_info = dummy[0]; + +#if defined(HAVE_OY) && OYRANOS_VERSION > 107 + tag = oyProfile_GetTagById( p, icSigDeviceMfgDescTag ); + texts = oyProfileTag_GetText( tag, &texts_n, "", 0,0,0); + if(texts_n && texts && texts[0]) + profile_info_buffer->manufacturer = texts[0]; + if(texts) free(texts); + oyProfileTag_Release( &tag ); + + profile_info_buffer->description = strdup( oyProfile_GetText( p, + oyNAME_DESCRIPTION )); + oyProfile_Release( &p ); +#else if(profile) profile_info_buffer->manufacturer= cmsTakeManufacturer(profile->handle); - if(!profile_info_buffer->manufacturer) - profile_info_buffer->manufacturer = dummy[0]; if(profile) profile_info_buffer->description = cmsTakeProductDesc(profile->handle); - if(!profile_info_buffer->description) - profile_info_buffer->description = dummy[0]; +#endif if(profile) profile_info_buffer->pcs = cms_get_pcs_name(profile->handle); - if(!profile_info_buffer->pcs) - profile_info_buffer->pcs = dummy[0]; if(profile) profile_info_buffer->color_space_name = cms_get_color_space_name(profile->handle); - if(!profile_info_buffer->color_space_name) - profile_info_buffer->color_space_name = dummy[0]; if(profile) profile_info_buffer->color_space_channel_names = cms_get_color_space_channel_names(profile->handle); - if(!profile_info_buffer->color_space_channel_names) - profile_info_buffer->color_space_channel_names = &dummy[0]; # ifdef DEBUG /*printf("%s:%d ",__FILE__,__LINE__); printf("%s\n",profile_info_buffer->color_space_channel_names[2]);*/ @@ -920,14 +1076,9 @@ cms_get_profile_info(CMSProfile *profile if(profile) profile_info_buffer->device_class_name = cms_get_device_class_name(profile->handle); - if(!profile_info_buffer->device_class_name) - profile_info_buffer->device_class_name = dummy[0]; if(profile) profile_info_buffer->long_info = cms_get_long_profile_info(profile->handle); - if(!profile_info_buffer->long_info) - profile_info_buffer->long_info = dummy[0]; - return profile_info_buffer; } @@ -950,8 +1101,10 @@ cms_get_lcms_format(Tag tag, CMSProfile if (color_channels > num_channels) { - printf (_("Drawable cannot handle all colours.")); - //return 0; + printf ("%s:%d %s(): Drawable cannot handle all colours.\n",__FILE__,__LINE__,__func__); +#ifndef DEBUG_ + return 0; +#endif } /* workaround for Lab float images and lcms <= 1.15 @@ -1036,6 +1189,14 @@ cms_load_profile_to_mem (char* filename, } /* + * obtain a four char string of the ICC colour space, e.g. "Lab" + */ +const char * cms_get_profile_cspace ( CMSProfile * profile ) +{ + return profile->cspace; +} + +/* * get a handle to the profile in file filename * either from the cache or from the file * returns NULL on error @@ -1050,6 +1211,9 @@ cms_get_profile_from_file(char *file_nam char *fullFileName = file_name; cmsHPROFILE profile = NULL; + if( !file_name || strcmp(file_name,_("[none]")) == 0 ) + return NULL; + /* get profile information */ cmsErrorAction(LCMS_ERROR_IGNORE); profile = cmsOpenProfileFromFile (file_name, "r"); @@ -1118,6 +1282,8 @@ cms_get_profile_from_file(char *file_nam return_value = g_new(CMSProfile, 1); return_value->cache_key = strdup(cms_get_profile_keyname(profile,mem)); return_value->handle = profile; + sprintf( return_value->cspace, + cms_get_color_space_name( return_value->handle ) ); /* save an copy of the original icc profile to mem */ return_value->size = 0; @@ -1153,6 +1319,7 @@ cms_get_profile_from_mem(void *mem_point return NULL; } + /* check hash table for profile */ cache_entry = g_hash_table_lookup(profile_cache, (gpointer) cms_get_profile_keyname(profile,mem_pointer)); @@ -1169,6 +1336,8 @@ cms_get_profile_from_mem(void *mem_point return_value = g_new(CMSProfile, 1); return_value->cache_key = strdup(cms_get_profile_keyname(profile,mem_pointer)); return_value->handle = profile; + sprintf( return_value->cspace, + cms_get_color_space_name( return_value->handle ) ); cache_entry = g_new(ProfileCacheEntry, 1); cache_entry->ref_count = 1; @@ -1383,7 +1552,7 @@ cms_return_profile(CMSProfile *profile) * decreate ref_counter + possibly close profile */ if (profile == NULL) - { g_warning("cms_return_profile: profile is NULL"); + { /*g_warning("cms_return_profile: profile is NULL");*/ return FALSE; } @@ -1411,7 +1580,7 @@ CMSTransform * cms_create_transform(cmsHPROFILE *profile_array, int num_profiles, DWORD lcms_input_format, DWORD lcms_output_format, int lcms_intent, DWORD lcms_flags, int proof_intent, - Tag tag, + Tag src_tag, Tag dest_tag, CMSTransform **expensive_transform, int * set_expensive_transform_b) { @@ -1465,7 +1634,7 @@ cms_create_transform(cmsHPROFILE *profil *set_expensive_transform_b = TRUE; } if (!transform) - { g_warning ("%s:%d ICC profile not valid.",__FILE__,__LINE__); + { g_warning ("%s:%d ICC profile not valid?",__FILE__,__LINE__); return NULL; } } else @@ -1495,7 +1664,7 @@ CMSTransform * cms_get_transform(GSList *profiles, DWORD lcms_input_format, DWORD lcms_output_format, int lcms_intent, DWORD lcms_flags, int proof_intent, - Tag tag, + Tag src_tag, Tag dest_tag, CMSTransform **expensive_transform) { /* turn profiles into an array as needed by lcms + check all profiles are registered with the profile cache + @@ -1557,10 +1726,10 @@ cms_get_transform(GSList *profiles, iterator = g_slist_next(iterator); } - g_string_sprintfa(hash_key,"%d%d%d%d%d%d%d", + g_string_sprintfa(hash_key,"%d%d%d%d%d%d%d%d", (int)lcms_input_format, (int)lcms_output_format, lcms_intent, (int)lcms_flags, proof_intent, num_profiles, - tag); + src_tag, dest_tag); /* now check the cache */ cache_entry = g_hash_table_lookup(transform_cache, (gpointer) hash_key->str); @@ -1607,7 +1776,7 @@ cms_get_transform(GSList *profiles, transform = cms_create_transform( profile_array, num_profiles, lcms_input_format, lcms_output_format, lcms_intent, lcms_flags, proof_intent, - tag, expensive_transform, + src_tag, dest_tag, expensive_transform, &set_expensive_transform_b ); { @@ -1618,7 +1787,8 @@ cms_get_transform(GSList *profiles, cache_entry = g_new(TransformCacheEntry, 1); cache_entry->ref_count = 1; cache_entry->transform = g_new(CMSTransform, 1); - cache_entry->transform->tag = tag; + cache_entry->transform->src_tag = src_tag; + cache_entry->transform->dest_tag = dest_tag; cache_entry->transform->cache_key = hash_key->str; cache_entry->transform->handle = transform; cache_entry->device_link_file = NULL; @@ -1668,7 +1838,7 @@ cms_get_transform(GSList *profiles, transform = cms_create_transform( profile_array, num_profiles, lcms_input_format, lcms_output_format, lcms_intent, lcms_flags, proof_intent, - tag, expensive_transform, + src_tag, dest_tag, expensive_transform, &set_expensive_transform_b ); cache_entry->transform->handle = transform; @@ -1705,7 +1875,7 @@ CMSTransform * cms_get_canvas_transform(GSList *profiles, Tag src_tag, Tag dest_tag, int lcms_intent, DWORD lcms_flags, int proof_intent, CMSTransform **expensive_transform) -{ Tag t = src_tag; +{ DWORD lcms_format_in, lcms_format_out; CMSTransform *transform = NULL; @@ -1729,7 +1899,7 @@ cms_get_canvas_transform(GSList *profile transform = cms_get_transform(profiles, lcms_format_in, lcms_format_out, lcms_intent, lcms_flags, proof_intent, - t, expensive_transform); + src_tag, dest_tag, expensive_transform); return transform; } @@ -1826,12 +1996,12 @@ cms_transform_buffer (CMSTransform *tran transform_func = cms_transform_float; break; default: - g_warning ("cms_transform: precision not supported"); + g_warning ("%s:%d %s(): precision not supported", __FILE__,__LINE__,__func__); return; } if(src_data == dest_data && - tag_format(transform->tag) == FORMAT_GRAY) + tag_format(transform->dest_tag) == FORMAT_GRAY) { len = bytes * 4 * num_pixels; dest_data_ = malloc( len ); @@ -1865,7 +2035,9 @@ cms_transform_area(CMSTransform *transfo void *pag; if (tag_precision(src_tag) != tag_precision(dest_tag)) - { g_warning("cms_transform: src and dest area have to have same precision"); + { + int i; i = 0; + /*g_warning("cms_transform: src and dest area have to have same precision");*/ } if (!transform || !transform->handle) @@ -1885,12 +2057,12 @@ cms_transform_area(CMSTransform *transfo transform_func = cms_transform_float; break; default: - g_warning ("cms_transform: precision not supported"); + g_warning ("%s:%d %s(): precision not supported", __FILE__,__LINE__,__func__); return; } - for (pag = pixelarea_register (1, src_area, dest_area); + for (pag = pixelarea_register (2, src_area, dest_area); pag != NULL; pag = pixelarea_process (pag)) { h = pixelarea_height(src_area); @@ -1902,24 +2074,135 @@ cms_transform_area(CMSTransform *transfo src_data = pixelrow_data(&src_row_buffer); dest_data = pixelrow_data(&dest_row_buffer); if (!dest_data || !src_data) - g_warning ("%s:%d %s() buffer failed at hight %d\n", - __FILE__,__LINE__,__func__, h); + g_warning ("%s:%d %s() buffer failed\n", + __FILE__,__LINE__,__func__); (*transform_func) (transform, src_data, dest_data, num_pixels); } } } +#if 0 +void +cms_transform_uint_extra(CMSTransform *transform, void *src_data, void *dest_data, int num_pixels) +{ + int cchan_in = T_CHANNELS( transform->lcms_input_format ); + int cchan_out = T_CHANNELS( transform->lcms_output_format ); + int chan_in = tag_num_channels( transform->src_tag ); + int chan_out = tag_num_channels( transform->dest_tag ); + int extra_in = chan_in - cchan_in; + int extra_out = chan_out - cchan_out; + Precision prec_in = tag_precision( transform->src_tag ); + Precision prec_out = tag_precision( transform->dest_tag ); + int dest_alpha = tag_alpha( transform->dest_tag ) == ALPHA_YES ? 1:0; + int i, j; + ShortsFloat u; + + if(chan_out > cchan_out) + for(i = 0 ; i < num_pixels; ++i) + { + int pos_in = i * chan_in + cchan_in; + int pos_out = i * chan_out + cchan_out; + + switch (prec_out) + { + case PRECISION_U8: + { + guint8 *dest = (guint8 *)dest_data; + float dest_white = 255; + + for(j = 0; j < extra_in && j < extra_out; ++j) + switch( prec_in ) + { + case PRECISION_U8: + { + guint8 *src = (guint8 *)src_data; + dest[pos_out + j] = src[pos_in + j]; + } + break; + case PRECISION_U16: + { + guint16 * src = (guint16*)src_data; + dest[pos_out + j] = src[pos_in + j]/256; + } + break; + case PRECISION_FLOAT16: + { + guint16 * src = (guint16*)src_data; + dest[pos_out + j] = FLT(src[pos_in + j], u) * dest_white; + } + break; + case PRECISION_FLOAT: + { + float * src = (float*)src_data; + dest[pos_out + j] = src[pos_in + j] * dest_white; + } + break; + } + for(j = extra_in; j < extra_out; ++j) + dest[pos_out + j] = dest_white; + } + break; + case PRECISION_U16: + { + guint16 *dest = (guint16 *)dest_data; + float dest_white = 65535; + + for(j = 0; j < extra_in && j < extra_out; ++j) + switch( prec_in ) + { + case PRECISION_U8: + { + guint8 *src = (guint8 *)src_data; + dest[pos_out + j] = src[pos_in + j]*257; + } + break; + case PRECISION_U16: + { + guint16 * src = (guint16*)src_data; + dest[pos_out + j] = src[pos_in + j]; + } + break; + case PRECISION_FLOAT16: + { + guint16 * src = (guint16*)src_data; + dest[pos_out + j] = FLT(src[pos_in + j], u) * dest_white; + } + break; + case PRECISION_FLOAT: + { + float * src = (float*)src_data; + dest[pos_out + j] = src[pos_in + j] * dest_white; + } + break; + } + + for(j = chan_in; j < chan_out; ++j) + if(dest_alpha && j+1 == chan_out) + dest[i*chan_out + j] = dest_white; + else + dest[i*chan_out + j] = dest[i*chan_out + j-1]; + } + break; + } + } +} +#endif void cms_transform_uint(CMSTransform *transform, void *src_data, void *dest_data, int num_pixels) { int cchan_in = T_CHANNELS( transform->lcms_input_format ); int cchan_out = T_CHANNELS( transform->lcms_output_format ); - int chan = tag_num_channels( transform->tag ); - int extra_in = chan - cchan_in; - int extra_out = chan - cchan_out; - int alpha = tag_alpha( transform->tag ) == ALPHA_YES ? 1:0; + int alpha = tag_alpha( transform->dest_tag ) == ALPHA_YES ? 1:0; + int chan_in = tag_num_channels( transform->src_tag ); + int chan_out = tag_num_channels( transform->dest_tag ); + int extra_in = chan_in - cchan_in; + int extra_out = chan_out - cchan_out; + Precision prec_in = tag_precision( transform->src_tag ); + Precision prec_out = tag_precision( transform->dest_tag ); + int dest_alpha = tag_alpha( transform->dest_tag ) == ALPHA_YES ? 1:0; int i, j; + ShortsFloat u; /* easy, no previous conversion, lcms does it all */ if (!transform || !transform->handle) @@ -1932,32 +2215,36 @@ cms_transform_uint(CMSTransform *transfo /* easy, no previous conversion, lcms does it all */ cmsDoTransform(transform->handle,src_data,dest_data,num_pixels); +# if 0 + cms_transform_uint_extra( transform, src_data, dest_data, num_pixels ); +# else for(i = 0 ; i < num_pixels; ++i) { - switch (tag_precision( transform->tag )) + switch (tag_precision( transform->dest_tag )) { case PRECISION_U8: { guint8 *dest = (guint8 *)dest_data; for(j = cchan_out; j < cchan_in; ++j) - if(alpha && j+1 == chan) - dest[i*chan + j] = 255; + if(alpha && j+1 == chan_out) + dest[i*chan_out + j] = 255; else - dest[i*chan + j] = dest[i*chan + j-1]; + dest[i*chan_out + j] = dest[i*chan_out + j-1]; } break; case PRECISION_U16: { guint16 *dest = (guint16 *)dest_data; for(j = cchan_out; j < cchan_in; ++j) - if(alpha && j+1 == chan) - dest[i*chan + j] = 65535; + if(alpha && j+1 == chan_out) + dest[i*chan_out + j] = 65535; else - dest[i*chan + j] = dest[i*chan + j-1]; + dest[i*chan_out + j] = dest[i*chan_out + j-1]; } break; } } +# endif } void @@ -1965,17 +2252,26 @@ cms_transform_float(CMSTransform *transf { /* need to convert data to double for lcms's convenience */ int cchan_in = T_CHANNELS( transform->lcms_input_format ); int cchan_out = T_CHANNELS( transform->lcms_output_format ); - int chan = tag_num_channels( transform->tag ); - int extra_in = chan - cchan_in; - int extra_out = chan - cchan_out; - int alpha = tag_alpha( transform->tag ) == ALPHA_YES ? 1:0; + int chan_in = tag_num_channels( transform->src_tag ); + int chan_out = tag_num_channels( transform->dest_tag ); + int chan = chan_out; + int alpha = tag_alpha( transform->dest_tag ) == ALPHA_YES ? 1:0; + /*int extra_in = chan_in - cchan_in; + int extra_out = chan_out - cchan_out; */ + int src_alpha = tag_alpha( transform->src_tag ) == ALPHA_YES ? 1:0; + int dest_alpha = tag_alpha( transform->dest_tag ) == ALPHA_YES ? 1:0; int i, j, pix; float *src_fbuffer = (float *)src_data; float *dest_fbuffer = (float *)dest_data; guint16 *src_hbuffer = (guint16 *)src_data; guint16 *dest_hbuffer = (guint16 *)dest_data; - double *dbuffer = 0; + double *src_dbuffer = NULL, + *dest_dbuffer = NULL; + void * src_buffer = NULL, + * dest_buffer = NULL; + double* dbuffer = NULL; ShortsFloat u; + Precision dest_p = tag_precision( transform->dest_tag ); if (!transform || !transform->handle) g_warning ("%s:%d %s() transform not allocated\n", @@ -1984,13 +2280,117 @@ cms_transform_float(CMSTransform *transf g_warning ("%s:%d %s() array not allocated\n", __FILE__,__LINE__,__func__); +# if 1 + src_dbuffer = malloc(sizeof(double) * num_pixels * 4); + if( dest_p == PRECISION_FLOAT16 || + dest_p == PRECISION_FLOAT) + { + dest_dbuffer = malloc(sizeof(double) * num_pixels * 4); + dest_buffer = dest_dbuffer; + } else + dest_buffer = dest_data; + src_buffer = src_dbuffer; +# else dbuffer = malloc(sizeof(double) * num_pixels * 4); +# endif # ifdef DEBUG_ printf ("%s:%d %s() colourspace%d extra:%d channels:%d lcms_bytes%d \n", __FILE__,__LINE__,__func__, T_COLORSPACE(transform->lcms_input_format), T_EXTRA(transform->lcms_input_format), T_CHANNELS(transform->lcms_input_format), T_BYTES(transform->lcms_input_format) ); # endif - switch (tag_precision( transform->tag )) +#if 1 + switch (tag_precision( transform->src_tag )) + { + case PRECISION_FLOAT16: + for (i=0; i < num_pixels * chan_in; ++i) + { + if(T_COLORSPACE(transform->lcms_input_format) == PT_CMYK) + src_dbuffer[i] = (double) FLT( src_hbuffer[i], u ) * 100.; + else + src_dbuffer[i] = (double) FLT( src_hbuffer[i], u ); + } + break; + case PRECISION_FLOAT: +# if 0 + // Lab floating point makes no sense + if (transform->colourspace_in == icSigLabData) + { + for (pix=0; pix < num_pixels; ++pix) + { i = pix * chan_in; + /* The 100. multiplicator comes from PT_ANY in cms_get_lcms_format(). + */ + src_dbuffer[i+0] = (double) src_fbuffer[i+0]*100.; + src_dbuffer[i+1] = (double) src_fbuffer[i+1]*100.; + src_dbuffer[i+2] = (double) src_fbuffer[i+2]*100.; + if(src_alpha) + src_dbuffer[i+3] = (double) src_fbuffer[i+3]; + } + } else { +# endif + for (i=0; i < num_pixels * chan_in; ++i) +# if 0 + if(transform->colourspace_in == icSigCmykData) + src_dbuffer[i]=(double)src_fbuffer[i] * 100.; + else +# endif + src_dbuffer[i]=(double)src_fbuffer[i]; +/* } */ + break; + default: + dest_buffer = dest_data; + return; + } + + cmsDoTransform( transform->handle, src_buffer, dest_buffer, num_pixels ); + + /* and convert back */ + switch (tag_precision( transform->dest_tag )) + { + case PRECISION_FLOAT16: + for (i=0; i < num_pixels; ++i) + { + for(j = 0; j < cchan_out; ++j) + /* copy colour channels */ + if(T_COLORSPACE(transform->lcms_output_format) == PT_CMYK) + dest_hbuffer[i*chan_out + j] = (double) FLT16( dest_dbuffer[i*chan_out + j] / 100., u ); + else + dest_hbuffer[i*chan_out + j] = (double) FLT16( dest_dbuffer[i*chan_out + j], u ); + for(j = chan_in; j < chan_out; ++j) + if(dest_alpha && j+1 == chan_out) + /* set CinePaints alpha channel to opace */ + dest_hbuffer[i*chan_out + j] = ONE_FLOAT16; + else + /* refill with previous values */ + dest_hbuffer[i*chan_out + j] = dest_hbuffer[i*chan_out + j-1]; + /* ignore other untouched channels */ + } + break; + case PRECISION_FLOAT: + for (i=0; i < num_pixels; ++i) + { + for(j = 0; j < cchan_out; ++j) +# if 0 + if(T_COLORSPACE(transform->lcms_output_format) == PT_CMYK) + dest_fbuffer[i*chan_out + j] = dest_dbuffer[i*chan_out + j]/100.0; + else +# endif + dest_fbuffer[i*chan_out + j] = dest_dbuffer[i*chan_out + j]; + for(j = chan_in; j < chan_out; ++j) + if(dest_alpha && j+1 == chan_out) + dest_fbuffer[i*chan_out + j] = 1.0; + else + dest_fbuffer[i*chan_out + j] = dest_fbuffer[i*chan_out + j-1]; + } + break; + default: + break; + } + + if(dest_dbuffer) g_free(dest_dbuffer); + if(src_dbuffer) g_free(src_dbuffer); +# else + + switch (tag_precision( transform->dest_tag )) { case PRECISION_FLOAT16: for (i=0; i < num_pixels * chan; ++i) @@ -2030,7 +2430,7 @@ cms_transform_float(CMSTransform *transf cmsDoTransform(transform->handle,dbuffer,dbuffer,num_pixels); /* and convert back */ - switch (tag_precision( transform->tag )) + switch (tag_precision( transform->dest_tag )) { case PRECISION_FLOAT16: for (i=0; i < num_pixels; ++i) @@ -2069,6 +2469,7 @@ cms_transform_float(CMSTransform *transf } g_free(dbuffer); +# endif } @@ -2286,19 +2687,35 @@ static GtkWidget *cms_profile_menu_new(G GtkWidget *menuitem; GtkWidget *optionmenu; - GSList *profile_file_names = cms_read_standard_profile_dirs(CMS_ANY_PROFILECLASS); - GSList *iterator = profile_file_names; + GSList *profile_file_names = 0; + GSList *iterator = 0; gchar *current_filename; CMSProfile *current_profile; CMSProfileInfo *current_profile_info; int pos = can_select_none ? 1 : 0, select_pos = -1; + gchar * label_text = 0, * temp_label_text = 0; + label_text = temp_label_text = calloc(1024,sizeof(char)); menu = gtk_menu_new (); + profile_file_names = cms_read_standard_profile_dirs(icSigInputClass); + iterator = cms_read_standard_profile_dirs(icSigDisplayClass); + profile_file_names = g_slist_concat( profile_file_names, iterator ); + iterator = cms_read_standard_profile_dirs(icSigOutputClass); + profile_file_names = g_slist_concat( profile_file_names, iterator ); + iterator = cms_read_standard_profile_dirs(icSigLinkClass); + profile_file_names = g_slist_concat( profile_file_names, iterator ); + iterator = cms_read_standard_profile_dirs(icSigAbstractClass); + profile_file_names = g_slist_concat( profile_file_names, iterator ); + iterator = cms_read_standard_profile_dirs(icSigColorSpaceClass); + profile_file_names = g_slist_concat( profile_file_names, iterator ); + + iterator = profile_file_names; + if (can_select_none) { menuitem = gtk_menu_item_new_with_label(_("[none]")); - gtk_menu_append (GTK_MENU (menu), menuitem); - gtk_object_set_data(GTK_OBJECT(menuitem), "value", NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_object_set_data(GTK_OBJECT(menuitem), "value", NULL); } while (iterator != NULL) @@ -2309,8 +2726,8 @@ static GtkWidget *cms_profile_menu_new(G if(prefered_name && strlen(prefered_name) && strcmp( current_filename, prefered_name ) == 0 ) select_pos = pos; - - menuitem = gtk_menu_item_new_with_label (current_profile_info->description); + sprintf(label_text, "%s (%s)", current_profile_info->description, current_filename); + menuitem = gtk_menu_item_new_with_label (label_text); gtk_menu_append (GTK_MENU (menu), menuitem); gtk_object_set_data_full(GTK_OBJECT(menuitem), "value", (gpointer)current_filename, g_free); @@ -2322,6 +2739,7 @@ static GtkWidget *cms_profile_menu_new(G if (profile_file_names != NULL) { g_slist_free(profile_file_names); } + if(temp_label_text) free(temp_label_text); if(select_pos >= 0) gtk_menu_set_active (GTK_MENU (menu), select_pos); @@ -2381,27 +2799,27 @@ cms_ok_cancel_buttons_new(GtkBox *action GtkSignalFunc cancel_callback, gpointer data) { GtkWidget *buttonbox = NULL; - GtkWidget *button = NULL; + GtkWidget *button = NULL; buttonbox = gtk_hbutton_box_new(); gtk_button_box_set_spacing(GTK_BUTTON_BOX(buttonbox), 4); gtk_box_set_homogeneous(action_area, FALSE); - gtk_box_pack_end (action_area, buttonbox, FALSE, FALSE, 0); + gtk_box_pack_end (action_area, buttonbox, FALSE, FALSE, 0); button = gtk_button_new_with_label(_("OK")); - gtk_signal_connect(GTK_OBJECT(button), "clicked", + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(ok_callback), data); - gtk_box_pack_start (GTK_BOX (buttonbox), button, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (buttonbox), button, FALSE, FALSE, 0); button = gtk_button_new_with_label(_("Cancel")); - gtk_signal_connect(GTK_OBJECT(button), "clicked", + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(cancel_callback), data); - gtk_box_pack_start (GTK_BOX (buttonbox), button, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (buttonbox), button, FALSE, FALSE, 0); } /* - * CONVERT DIALOG - * menu: Image>Convert using ICC Profile... + * CONVERT DIALOG + * menu: Image>Convert using ICC Profile... */ /* private types */ diff -up cinepaint-0.22-1/app/cms.h.oy19 cinepaint-0.22-1/app/cms.h --- cinepaint-0.22-1/app/cms.h.oy19 2007-04-20 13:23:52.000000000 +0200 +++ cinepaint-0.22-1/app/cms.h 2009-03-09 15:39:36.000000000 +0100 @@ -79,7 +79,7 @@ GSList *cms_read_icc_profile_dir(gchar * * profile class, class==CMS_ANY_PROFILECLASS gives all profiles, does not recur over dirs * returns a list of char * or NULL in case of error */ -GSList *cms_read_standard_profile_dirs(icProfileClassSignature class); +GSList *cms_read_standard_profile_dirs(icColorSpaceSignature class); /* * get a handle to the profile in file filename @@ -133,6 +133,8 @@ gboolean cms_return_profile(CMSProfile * */ CMSProfileInfo *cms_get_profile_info(CMSProfile *profile); +const char * cms_get_profile_cspace ( CMSProfile * profile ); + /* returns the lcms format corresponding to this tag and profile */ DWORD cms_get_lcms_format(Tag tag, CMSProfile *profile); @@ -154,7 +156,7 @@ CMSTransform *cms_get_transform(GSList * DWORD lcms_output_format, int lcms_intent, DWORD lcms_flags, int proof_intent, - Tag input, + Tag input, Tag output, CMSTransform **expensive_transform); /* diff -up cinepaint-0.22-1/app/color_correction.c.oy19 cinepaint-0.22-1/app/color_correction.c --- cinepaint-0.22-1/app/color_correction.c.oy19 2009-03-09 16:05:50.000000000 +0100 +++ cinepaint-0.22-1/app/color_correction.c 2009-03-09 16:06:05.000000000 +0100 @@ -115,11 +115,11 @@ color_correction_init_lab_transforms (GI profiles = g_slist_append(profiles, image_profile); profiles = g_slist_append(profiles, lab_profile); lcms_format = cms_get_lcms_format(t, image_profile); - color_correction_to_lab_transform = cms_get_transform(profiles, lcms_format, TYPE_Lab_16, INTENT_PERCEPTUAL, 0, 0, t, NULL); + color_correction_to_lab_transform = cms_get_transform(profiles, lcms_format, TYPE_Lab_16, INTENT_PERCEPTUAL, 0, 0, t, t, NULL); profiles = g_slist_remove(profiles, image_profile); profiles = g_slist_append(profiles, image_profile); - color_correction_from_lab_transform = cms_get_transform(profiles, TYPE_Lab_16, lcms_format, INTENT_PERCEPTUAL, 0, 0, t, NULL); + color_correction_from_lab_transform = cms_get_transform(profiles, TYPE_Lab_16, lcms_format, INTENT_PERCEPTUAL, 0, 0, t, t, NULL); g_slist_free(profiles); } diff -up cinepaint-0.22-1/app/convert.c.oy19 cinepaint-0.22-1/app/convert.c --- cinepaint-0.22-1/app/convert.c.oy19 2009-03-09 16:07:14.000000000 +0100 +++ cinepaint-0.22-1/app/convert.c 2009-03-09 16:11:04.000000000 +0100 @@ -351,7 +351,7 @@ convert_image_colorspace (void *gimage_p transform = cms_get_transform(profiles, lcms_format_in, lcms_format_out, lcms_intent, cms_flags, - 0, tag, NULL); + 0, tag, tag, NULL); g_slist_free(profiles); if(!transform) { g_warning("%s:%d %s(): transform failed", __FILE__,__LINE__,__func__); diff -up cinepaint-0.22-1/app/look_profile.c.oy19 cinepaint-0.22-1/app/look_profile.c --- cinepaint-0.22-1/app/look_profile.c.oy19 2009-03-09 16:14:14.000000000 +0100 +++ cinepaint-0.22-1/app/look_profile.c 2009-03-09 16:14:23.000000000 +0100 @@ -297,7 +297,8 @@ look_profile_create(GImage *image, gint transform = cms_get_transform( profiles, TYPE_Lab_16, lcms_format_out, INTENT_PERCEPTUAL, - cms_default_flags, 0,tag, NULL); + cms_default_flags, 0, + tag, tag, NULL); g_slist_free(profiles); /* iterate over Lab space, converting to rgb, filling into picture */ @@ -481,7 +482,8 @@ look_profile_save (LookProfile *profile, profiles = g_slist_append(profiles, lab_profile); sample_info->transform = cms_get_transform(profiles, cms_get_lcms_format(t, input_profile), - TYPE_Lab_16, intent, flags, 0, t, NULL); + TYPE_Lab_16, intent, flags, 0, + t, t, NULL); pixelarea_init(&sample_info->sample_area, profile->canvas, @@ -884,7 +886,7 @@ _look_profile_gui_apply(_LookProfileGui gdisplay_get_cms_intent(data->display), gdisplay_get_cms_flags(data->display), gdisplay_get_cms_proof_intent(data->display), - tag, NULL); + tag, tag, NULL); g_slist_free(profiles); gimage_transform_colors(data->display->gimage, transform, TRUE); cms_return_transform(transform); @@ -929,7 +931,7 @@ _look_profile_gui_apply_flipbook (_LookP gdisplay_get_cms_intent(data->display), gdisplay_get_cms_flags(data->display), gdisplay_get_cms_proof_intent(data->display), - tag, NULL); + tag, tag, NULL); g_slist_free(profiles); /* create progress dialog */ diff -up cinepaint-0.22-1/app/main.c.oy19 cinepaint-0.22-1/app/main.c --- cinepaint-0.22-1/app/main.c.oy19 2009-03-09 16:19:06.000000000 +0100 +++ cinepaint-0.22-1/app/main.c 2009-03-09 16:20:54.000000000 +0100 @@ -32,6 +32,10 @@ #include #include #include +/* check for directories */ +#include +#include + #ifdef WIN32 extern int _fmode; @@ -146,6 +150,7 @@ int WINAPI WinMain( { #else + int main (int argc, char **argv) { #endif @@ -195,11 +200,14 @@ int main (int argc, char **argv) { #ifdef HAVE_OY /* set a profile temporary path */ + /* this is obsolete with the XDG paths being supported since v0.1.8 */ +#if (OYRANOS_VERSION < 108) if(strcmp(text, GetDirPrefix()) != 0) { int n = oyPathsCount(), i, has_path = 0; + oyranos_temp_path = myAlloc (strlen(GetDirPrefix()) + - sizeof(OY_ICCDIRNAME) + 64); + sizeof(OY_ICCDIRNAME) + strlen(text) + 64); sprintf(oyranos_temp_path, "%s%sshare%scolor%s%s", text, DIR_SEPARATOR, DIR_SEPARATOR, DIR_SEPARATOR, OY_ICCDIRNAME); for(i = 0; i < n; ++i) @@ -210,13 +218,23 @@ int main (int argc, char **argv) if(temp) free(temp); } if(!has_path) - oyPathAdd( oyranos_temp_path ); - else { + { + struct stat status; + int r = 0; + + status.st_mode = 0; + r = stat (oyranos_temp_path, &status); + r = !r && + ((status.st_mode & S_IFMT) & S_IFDIR); + if(!r) + oyPathAdd( oyranos_temp_path ); + } else { free( oyranos_temp_path ); oyranos_temp_path = NULL; } } #endif +#endif SetDirPrefix( text ); fclose(fp); } @@ -483,7 +501,9 @@ int main (int argc, char **argv) /* remove a profile temporary path */ if(oyranos_temp_path) { +#if (OYRANOS_VERSION < 108) oyPathRemove( oyranos_temp_path ); +#endif free( oyranos_temp_path ); } #endif @@ -674,13 +694,14 @@ fl_initialise_locale( const char *domain // 1. get the locale info CFLocaleRef userLocaleRef = CFLocaleCopyCurrent(); CFStringRef cfstring = CFLocaleGetIdentifier( userLocaleRef ); - + CFIndex gr = 36; + char text[36]; + Boolean fehler = 0; + CFShow( cfstring ); // copy to a C buffer - CFIndex gr = 36; - char text[36]; - Boolean fehler = CFStringGetCString( cfstring, text, gr, kCFStringEncodingISOLatin1 ); + fehler = CFStringGetCString( cfstring, text, gr, kCFStringEncodingISOLatin1 ); if(fehler) { d_printf( "osX locale obtained: %s", text ); diff -up cinepaint-0.22-1/configure.in.oy19 cinepaint-0.22-1/configure.in --- cinepaint-0.22-1/configure.in.oy19 2009-03-09 15:39:36.000000000 +0100 +++ cinepaint-0.22-1/configure.in 2009-03-09 15:39:36.000000000 +0100 @@ -475,8 +475,8 @@ AC_ARG_ENABLE(print, [ --disable-print dnl Test for Oyranos; beku AC_PATH_PROG(OY_CONFIG, oyranos-config, no) if test "x$OY_CONFIG" != "xno"; then - OYRANOS_LIBS="-DHAVE_OY `$OY_CONFIG --ld_x_flags | sed s/-O.\//`" - OYRANOS_CFLAGS="-DHAVE_OY `$OY_CONFIG --cflags | sed s/-O.\//`" + OYRANOS_LIBS=" `$OY_CONFIG --ldflags` " + OYRANOS_CFLAGS="-DHAVE_OY `$OY_CONFIG --cflags` " OYRANOS="`$OY_CONFIG --version`" else AC_MSG_WARN([