void printfHelp (int argc, char** argv) { char * version = oyVersionString(1,0); char * id = oyVersionString(2,0); char * cfg_date = oyVersionString(3,0); char * devel_time = oyVersionString(4,0); fprintf( stderr, "\n"); fprintf( stderr, "oyranos-policy %s\n", _("is a policy administration tool")); fprintf( stderr, " Oyranos v%s config: %s devel period: %s\n", oyNoEmptyName_m_(version), oyNoEmptyName_m_(cfg_date), oyNoEmptyName_m_(devel_time) ); if(id) fprintf( stderr, " Oyranos git id %s\n", oyNoEmptyName_m_(id) ); fprintf( stderr, "\n"); fprintf( stderr, " %s\n", _("Hint: search paths are influenced by the XDG_CONFIG_HOME shell variable.")); fprintf( stderr, "\n"); fprintf( stderr, "%s\n", _("Usage")); fprintf( stderr, " %s\n", _("Dump out the actual settings:")); fprintf( stderr, " %s -d\n", argv[0]); fprintf( stderr, " %s\n", _("Select active policy:")); fprintf( stderr, " %s -i %s\n", argv[0], _("policy or filename")); fprintf( stderr, " %s\n", _("List available policies:")); fprintf( stderr, " %s -l [-f] [-e]\n", argv[0]); fprintf( stderr, " %s\n", _("Currently active policy:")); fprintf( stderr, " %s -c [-f] [-e]\n", argv[0]); fprintf( stderr, " -f %s\n", _("full path and file name")); fprintf( stderr, " -e %s\n", _("display name")); fprintf( stderr, " %s\n", _("List search paths:")); fprintf( stderr, " %s -p\n", argv[0]); fprintf( stderr, " %s\n", _("Save to a new policy:")); fprintf( stderr, " %s -s %s [--system-wide]\n", argv[0], _("policy name")); fprintf( stderr, " %s\n", _("Print a help text:")); fprintf( stderr, " %s -h\n", argv[0]); fprintf( stderr, "\n"); fprintf( stderr, "\n"); if(version) oyDeAllocateFunc_(version); if(id) oyDeAllocateFunc_(id); if(cfg_date) oyDeAllocateFunc_(cfg_date); if(devel_time) oyDeAllocateFunc_(devel_time); }
/** * @internal * Function oyOption_Match_ * @memberof oyOption_s * @brief two option key name matches * * A registration name match is not required. * * @version Oyranos: 0.1.8 * @since 2008/06/28 (Oyranos: 0.1.8) * @date 2008/06/28 */ int oyOption_Match_ ( oyOption_s_ * option_a, oyOption_s_ * option_b ) { int erg = 0; if( option_a && option_b ) { char * a = oyFilterRegistrationToText( option_a->registration, oyFILTER_REG_TYPE, 0 ); char * b = oyFilterRegistrationToText( option_b->registration, oyFILTER_REG_TYPE, 0 ); if( oyStrcmp_( a, b ) == 0 ) erg = 1; oyDeAllocateFunc_(a); oyDeAllocateFunc_(b); } return erg; }
oyHash_s * oyFilterNode_GetHash_ ( oyFilterNode_s_ * node, int api ) { oyFilterCore_s_ * core_ = node->core; const char * hash_text_ = 0; char * hash_text = 0, * hash_temp = 0; oyHash_s * hash = 0; /* create hash text */ if(core_->api4_->oyCMMFilterNode_GetText) { hash_temp = core_->api4_->oyCMMFilterNode_GetText( (oyFilterNode_s*)node, oyNAME_NICK, oyAllocateFunc_ ); hash_text_ = hash_temp; } else hash_text_ =oyFilterNode_GetText((oyFilterNode_s*)node,oyNAME_NICK); if(api == 7) oyStringAddPrintf_( &hash_text, oyAllocateFunc_, oyDeAllocateFunc_, "%s:%s", node->api7_->context_type, hash_text_ ); if(api == 4) oyStringAddPrintf_( &hash_text, oyAllocateFunc_, oyDeAllocateFunc_, "%s:%s", core_->api4_->context_type, hash_text_ ); /* query in cache for api7 */ hash = oyCMMCacheListGetEntry_( hash_text ); if(oy_debug >= 2) oyMessageFunc_p( oyMSG_DBG, (oyStruct_s*) node, OY_DBG_FORMAT_ "api: %d hash_text: \"%s\"", OY_DBG_ARGS_, api, hash_text ); if(hash_temp) oyDeAllocateFunc_(hash_temp); if(hash_text) oyDeAllocateFunc_(hash_text); return hash; }
oyjl_val oyJsonParse ( const char * json ) { int error = !json; oyjl_val root; char * error_buffer; if(error) return NULL; error_buffer = (char*)oyAllocateFunc_( 256 ); if(!error_buffer) return NULL; error_buffer[0] = '\000'; root = oyjlTreeParse( json, error_buffer, 256 ); if(error_buffer[0] != '\000') oyMessageFunc_p( oyMSG_WARN, NULL, OY_DBG_FORMAT_ "ERROR:\t\"%s\"\n%s", OY_DBG_ARGS_, error_buffer, json ); oyDeAllocateFunc_( error_buffer ); return root; }
/** @internal * @brief initialise internationalisation * * @since Oyranos: version 0.x.x * @date 26 november 2007 (API 0.0.1) */ void oyI18NInit_() { DBG_PROG_START oy_lang_ = oyStringCopy_("C", oyAllocateFunc_); #ifdef USE_GETTEXT if(!oy_country_ || !oy_language_) { char * temp = 0; if(getenv("OY_LOCALEDIR") && oyStrlen_(getenv("OY_LOCALEDIR"))) oy_domain_path = oyStringCopy_(getenv("OY_LOCALEDIR"), oyAllocateFunc_); oyStringAdd_( &temp, "NLSPATH=", oyAllocateFunc_, oyDeAllocateFunc_); oyStringAdd_( &temp, oy_domain_path, oyAllocateFunc_, oyDeAllocateFunc_); putenv(temp); /* Solaris */ #if 0 if(oy_debug_memory) oyFree_m_(temp); /* putenv requires a static string ??? */ #endif if(oy_debug) WARNc2_S("bindtextdomain( %s, %s )", oy_domain, oy_domain_path ); bindtextdomain( oy_domain, oy_domain_path ); DBG_NUM2_S("oy_domain_path %s %s", oy_domain, oy_domain_path) if(oy_domain_codeset) { if(oy_debug) WARNc2_S("bindtextdomain( %s, %s )", oy_domain, oy_domain_codeset ); bind_textdomain_codeset(oy_domain, oy_domain_codeset); } DBG_NUM2_S("oy_domain_codeset %s %s", oy_domain, oyNoEmptyString_m(oy_domain_codeset)) /* we use the posix setlocale interface; * the environmental LANG variable is flacky */ if(setlocale(LC_MESSAGES, 0)) { if(oy_lang_) oyDeAllocateFunc_(oy_lang_); temp = oyStringCopy_(setlocale(LC_MESSAGES, 0), oyAllocateFunc_); oy_lang_ = temp; } if(oy_lang_) { if(oyStrchr_(oy_lang_,'_')) { char * tmp = 0; int len = oyStrlen_(oy_lang_); oyAllocHelper_m_( tmp, char, len + 5, 0, DBG_PROG_ENDE; return ); oySprintf_( tmp, "%s", oyStrchr_(oy_lang_,'_')+1 ); if(oyStrlen_(tmp) > 2) tmp[2] = 0; oy_country_ = tmp; tmp = 0; /*oy_country_ = oyStringCopy_(oyStrchr_(oy_lang_,'_')+1, oyAllocateFunc_); if(!oy_country_) return;*/ tmp = oyStrchr_(oy_country_,'.'); if(tmp) tmp[0] = 0; tmp = 0; oyAllocHelper_m_( tmp, char, len + 5, 0, DBG_PROG_ENDE; return ); oySprintf_( tmp, "%s", oy_lang_ ); oy_language_ = tmp; tmp = 0; /*oy_language_ = oyStringCopy_(oy_lang_, oyAllocateFunc_); if(!oy_language_) return;*/ tmp = oyStrchr_(oy_language_,'_'); if(tmp) tmp[0] = 0; } else
char * oyJsonFromModelAndUi ( const char * data, const char * ui_text, oyAlloc_f allocate_func ) { char * text = NULL; oyjl_val droot = oyJsonParse( data ), uiroot = oyJsonParse( ui_text ); int paths_n = 0, i; char ** paths = oyJsonPathsFromPattern( uiroot, "groups//options//key"); while(paths && paths[paths_n]) ++paths_n; if(!droot) oyMessageFunc_p( oyMSG_WARN, NULL, OY_DBG_FORMAT_ "ERROR: data\n%s\n", OY_DBG_ARGS_, data ); if(!uiroot) oyMessageFunc_p( oyMSG_WARN, NULL, OY_DBG_FORMAT_ "ERROR: ui_text\n%s\n", OY_DBG_ARGS_, ui_text ); for(i = 0; i < paths_n; ++i) { char * path = paths[i]; /* get the key node */ oyjl_val uiv = oyjlTreeGetValue( uiroot, 0, path ), dv = NULL, v = NULL; /* get the key name */ char * key = oyjlValueText( uiv, oyAllocateFunc_ ), * value = NULL; /* get the value node by the key */ if(key) dv = oyjlTreeGetValue( droot, 0, key ); /* get the value */ if(dv) value = oyjlValueText( dv, oyAllocateFunc_ ); /* write the value into the options "default" key */ if(value && key && strchr(key,'/')) { char * t = strrchr(path,'/'); t[0] = 0; v = oyjlTreeGetValueF( uiroot, OYJL_CREATE_NEW, "%s/default", path ); oyjlValueSetString( v, value ); } if(key) oyFree_m_( key ); if(value) oyFree_m_( value ); } i = 0; oyjlTreeToJson( uiroot, &i, &text ); oyjlTreeFree( uiroot ); oyjlTreeFree( droot ); oyjlStringListRelease( &paths, paths_n, free ); if(allocate_func && allocate_func != oyAllocateFunc_) { char * t = oyStringCopy( text, allocate_func ); oyDeAllocateFunc_(text); text = t; t = 0; } return text; }
/** Function oyConfigs_Modify * @memberof oyConfigs_s * @brief Ask a module for device informations or other direct calls * * * @param[in,out] configs The passed configs first member is used * to obtain a registration string and * select a appropriate module. * Regarding the module the * configs need to be homogenous. * All configs are passed at once to the * module. Mixing configs from different * modules is not defined. * @param[in] options options to pass to the module; With zero * the usage instructions are requested. * @return 0 - good, >= 1 - error, issue <= -1 * * @version Oyranos: 0.1.10 * @since 2009/08/21 (Oyranos: 0.1.10) * @date 2009/08/25 */ OYAPI int OYEXPORT oyConfigs_Modify ( oyConfigs_s * configs, oyOptions_s * options ) { int error = !oyConfigs_Count( configs ); oyConfig_s_ * config = 0; oyConfigs_s * s = configs; int i; uint32_t count = 0, * rank_list = 0; char ** texts = 0, * registration_domain = 0; oyCMMapi8_s_ * cmm_api8 = 0; if(error > 0) { WARNc_S( "\n No devices provided. Give up" ); return 0; } oyCheckType__m( oyOBJECT_CONFIGS_S, return 1 ) oyExportStart_(EXPORT_CHECK_NO); if(error <= 0) { /** 1. pick the first device to select a registration */ config = (oyConfig_s_*)oyConfigs_Get( configs, 0 ); /** 1.2 get all device class module names from the firsts oyConfig_s * registration */ error = oyConfigDomainList ( config->registration, &texts, &count, &rank_list, 0 ); oyConfig_Release( (oyConfig_s**)&config ); } /** 2. call each modules oyCMMapi8_s::oyConfigs_Modify */ for( i = 0; i < count; ++i ) { registration_domain = texts[i]; if(error <= 0) { cmm_api8 = (oyCMMapi8_s_*) oyCMMsGetFilterApi_( 0, registration_domain, oyOBJECT_CMM_API8_S ); error = !cmm_api8; } if(error <= 0) error = !cmm_api8->oyConfigs_Modify; if(error <= 0) error = cmm_api8->oyConfigs_Modify( configs, options ); } oyStringListRelease_( &texts, count, oyDeAllocateFunc_ ); if(rank_list) oyDeAllocateFunc_( rank_list ); oyExportEnd_(); return error; }
/** Function oyFilterNode_GetText * @memberof oyFilterNode_s * @brief Serialise filter node to text * * Serialise into: * - oyNAME_NICK: XML ID * - oyNAME_NAME: XML from module * - oyNAME_DESCRIPTION: ?? * * This function provides a complete description of the context. It might be * more adequate to use only a subset for hashing as not all data and options * might have an effect to the context data result. * The oyCMMapi4_s::oyCMMFilterNode_GetText() function provides a way to let a * module decide about what to place into a hash text. * * @param[in,out] node filter node * @param[out] name_type the type * @return the text * * @version Oyranos: 0.3.3 * @date 2011/11/22 * @since 2008/07/17 (Oyranos: 0.1.8) */ const char * oyFilterNode_GetText ( oyFilterNode_s * node, oyNAME_e name_type ) { const char * tmp = 0; char * hash_text = 0; oyFilterNode_s_ * s = (oyFilterNode_s_*)node; oyStructList_s * in_datas = 0, * out_datas = 0; if(!node) return 0; if( s->core && s->core->api4_ && s->core->api4_->oyCMMFilterNode_GetText && name_type == oyNAME_NAME ) { hash_text = s->core->api4_->oyCMMFilterNode_GetText( node, oyNAME_NICK, oyAllocateFunc_ ); if(hash_text) { oyObject_SetName( s->oy_, hash_text, oyNAME_NAME ); oyDeAllocateFunc_( hash_text ); hash_text = 0; hash_text = (oyChar*) oyObject_GetName( s->oy_, oyNAME_NAME ); return hash_text; } } /* 1. create hash text */ hashTextAdd_m( "<oyFilterNode_s>\n " ); /* the filter text */ hashTextAdd_m( oyFilterCore_GetText( (oyFilterCore_s*)s->core, oyNAME_NAME ) ); /* pick all plug (input) data */ in_datas = oyFilterNode_GetData_( s, 1 ); /* pick all sockets (output) data */ out_datas = oyFilterNode_GetData_( s, 0 ); /* make a description */ if(s->core) tmp = oyContextCollectData_( (oyStruct_s*)s, s->core->options_, in_datas, out_datas ); hashTextAdd_m( tmp ); hashTextAdd_m( "</oyFilterNode_s>\n" ); oyObject_SetName( s->oy_, hash_text, oyNAME_NICK ); if(s->oy_->deallocateFunc_) s->oy_->deallocateFunc_( hash_text ); hash_text = 0; hash_text = (oyChar*) oyObject_GetName( s->oy_, oyNAME_NICK ); return hash_text; }
int DeviceAttributes_ ( ppd_file_t * ppd, oyOptions_s * options, oyConfig_s * device, const char * ppd_file_location ) { oyOption_s * o = 0; int error = !device; oyOption_s * value3 = oyOptions_Find( options, "device_context", oyNAME_PATTERN ); const char * device_name = oyConfig_FindString( device, "device_name", 0 ); if(!error) { char * manufacturer= 0, * model=0, * serial=0, * device_settings = 0; const char * system_port = 0, * host = 0; const char * keyword = 0; ppd_attr_t * attrs = 0; int attr_n, i, j; char ** color_key_words = 0, * tmp = 0; int color_key_words_n = 0; if(!device_name && !value3 && !ppd_file_location && !ppd) { message(oyMSG_WARN, (oyStruct_s*)options, _DBG_FORMAT_ "The \"device_name\" and \"device_context\" is\n" " missed to select a appropriate device.", _DBG_ARGS_ ); error = 1; return error; } if(!ppd) { message( oyMSG_DBG, (oyStruct_s*)0, _DBG_FORMAT_ "\n" "No PPD obtained for ", _DBG_ARGS_, device_name ); error = -1; return error; } manufacturer = ppd->manufacturer; model = ppd->modelname; serial = 0; /* Not known at this time. */ system_port = device_name; host = cupsServer(); attrs = ppdFindAttr(ppd, "cupsICCProfile", 0); if(attrs && attrs->text) device_settings = attrs->text; if(error <= 0) { size_t size = 0; char * data = 0; oyConfig_s * d = device; oyRankMap * rank_map = oyRankMapCopy( oyConfig_GetRankMap( device ), oyAllocateFunc_ ); if(!rank_map) rank_map = oyRankMapCopy( _api8.rank_map, oyAllocateFunc_ ); OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), manufacturer ) OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), model ) OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), serial ) OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), system_port ) OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), host ) OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), device_settings ) if (value3) { /* open the PPD data */ if(ppd_file_location) { FILE * fp = fopen( ppd_file_location, "r" ); size_t lsize = 0; /* Find the total size. */ fseek(fp , 0, SEEK_END); lsize = ftell(fp); rewind (fp); /* Create buffer to read contents into a profile. */ data = (char*) malloc (sizeof(char)*lsize + 1); if (data == NULL) fputs ("Unable to open PPD size.",stderr); size = fread( data, 1, lsize, fp); data[size] = 0; } if(!error && data && size) { o = oyOption_FromRegistration( CMM_BASE_REG OY_SLASH "device_context.PPD.text", 0 ); error = !o; if(!error) error = oyOption_SetFromData( o, data, size ); if(!error) oyOptions_MoveIn( *oyConfig_GetOptions(device,"data"), &o, -1 ); } } /* Collect all ColorKeyWords. */ attr_n = ppd->num_attrs; for(i = 0; i < attr_n; i++) { char key[16]; keyword = ppd->attrs[i]->name; /* we support keys beginning with ColorKeyWords, e.g. "ColorKeyWords" "ColorKeyWords" ... */ snprintf( &key[0], 16, "%s", keyword ); key[14] = 0; if (strcmp(key, "ColorKeyWords") == 0) { if( tmp && tmp[oyStrlen_(tmp) - 1] != ';' ) STRING_ADD( tmp, ";" ); STRING_ADD( tmp, ppd->attrs[i]->value ); } } if(tmp) { color_key_words = oyStringSplit( tmp, ';', &color_key_words_n, oyAllocateFunc_); oyDeAllocateFunc_( tmp ); tmp = 0; } /* add the key/value pairs to the devices backend_core options. */ for(j = 0; j < color_key_words_n; ++j) { const char * keyword = color_key_words[j], * value = NULL; ppd_choice_t * c = ppdFindMarkedChoice( ppd, keyword ); ppd_option_t * o = ppdFindOption( ppd, keyword ); char * reg_name = 0; /* take the marked choice */ if(c) value = c->choice; /* fall back to a default */ else if(o) value = o->defchoice; else /* Scan PPD attributes for matching the ColorKeyWords and */ for(i = 0; i < attr_n; i++) if(oyStrcmp_( ppd->attrs[i]->name, keyword ) == 0) value = ppd->attrs[i]->value; STRING_ADD( reg_name, CMM_BASE_REG OY_SLASH ); STRING_ADD( reg_name, keyword ); if(value) { error= oyOptions_SetFromText( oyConfig_GetOptions(d,"backend_core"), reg_name, value, OY_CREATE_NEW ); oyRankMapAppend( &rank_map, reg_name, 2, -2, 0, 0,0 ); } if(reg_name) oyDeAllocateFunc_( reg_name ); reg_name = 0; } if( color_key_words && color_key_words_n) oyStringListRelease_( &color_key_words, color_key_words_n, oyDeAllocateFunc_ ); else { ppd_option_t * o; while((o = ppdNextOption(ppd)) != 0) { const char * value = 0; char * reg_name = 0; keyword = o->keyword; STRING_ADD( reg_name, CMM_BASE_REG OY_SLASH ); STRING_ADD( reg_name, keyword ); /* take the marked choice */ for(i = 0; i < o->num_choices; ++i) if(o->choices[i].marked) { value = o->choices[i].choice; break; } if(!value) value = o->defchoice; if(value) { error = oyOptions_SetFromText( oyConfig_GetOptions(d,"backend_core"), reg_name, value, OY_CREATE_NEW ); oyRankMapAppend( &rank_map, reg_name, 2, -2, 0, 0,0 ); } if(reg_name) oyDeAllocateFunc_( reg_name ); reg_name = 0; } } oyConfig_SetRankMap( device, rank_map ); oyRankMapRelease( &rank_map, oyDeAllocateFunc_ ); }
int main ( int argc , char **argv ) { fprintf(stdout,"\n===== SIMPLE UI TOOLKIT =====\n\n"); const char *wrong_arg = 0; char *output_model_file = 0; char *xforms_text = 0; char *input_xml_file = 0; sXformsNode *head; struct sCbData *CallBackData; xmlDoc *modelDocPtr; GtkBuilder *builder; GtkWidget *window; GError *error = NULL; if(argc) { #define OY_PARSE_STRING_ARG( opt ) \ if( pos + 1 < argc && argv[pos][i+1] == 0 ) \ { opt = argv[pos+1]; \ if( opt == 0 && strcmp(argv[pos+1],"0") ) \ wrong_arg = "-" #opt; \ ++pos; \ i = 1000; \ } else if(argv[pos][i+1] == '=') \ { opt = &argv[pos][i+2]; \ if( opt == 0 && strcmp(&argv[pos][i+2],"0") ) \ wrong_arg = "-" #opt; \ i = 1000; \ } else wrong_arg = "-" #opt; \ if(argc != 1) { int pos = 1, i; while(pos < argc) { switch(argv[pos][0]) { case '-': for(i = 1; i < (int)strlen(argv[pos]); ++i) switch (argv[pos][i]) { case 'o': OY_PARSE_STRING_ARG( output_model_file ); break; case 'i': OY_PARSE_STRING_ARG( input_xml_file ); break; case 'v': break;//oy_debug += 1; break; case 'h': usage(argc, argv); exit (0); break; case 'l': /* only for compatibility with cmd line */ break; #if 0 case '-': if(strcmp(&argv[pos][2],"verbose") == 0) { //oy_debug += 1; i=100; break; } STRING_ADD( t, &argv[pos][2] ); text = oyStrrchr_(t, '='); /* get the key only */ if(text) text[0] = 0; oyStringListAddStaticString_( &other_args,&other_args_n, t, oyAllocateFunc_,oyDeAllocateFunc_ ); if(text) oyStringListAddStaticString_( &other_args,&other_args_n, oyStrrchr_(&argv[pos][2], '=') + 1, oyAllocateFunc_,oyDeAllocateFunc_ ); else { if(argv[pos+1]) { oyStringListAddStaticString_( &other_args, &other_args_n, argv[pos+1], oyAllocateFunc_,oyDeAllocateFunc_ ); ++pos; } else wrong_arg = argv[pos]; } if(t) oyDeAllocateFunc_( t ); t = 0; i=100; break; #endif case '?': default: fprintf(stderr, "%s -%c\n", ("Unknown argument"), argv[pos][i]); usage(argc, argv); exit (0); break; } break; default: wrong_arg = argv[pos]; } if( wrong_arg ) { fprintf(stderr, "%s %s\n", ("wrong argument to option:"), wrong_arg); exit(1); } ++pos; } } } fprintf(stdout,"INPUT FILE = %s\n",input_xml_file); if(!input_xml_file) { #if 0 size_t text_size = 0; text = oyReadStdinToMem_(&text_size, oyAllocateFunc_); if(text_size == 0) { usage(argc, argv); exit (0); } #else usage(argc, argv); exit (0); #endif } if(input_xml_file) { xforms_text = sReadFileToMem(input_xml_file); } head = ParseXformsToTree( xforms_text,&modelDocPtr); //sPrintsXformsTree(head); gtk_init( &argc, &argv ); builder = gtk_builder_new(); //cb_data = sGenerateGladeFile(head); CallBackData = sGenerateGladeFile(head,modelDocPtr,&DummyIfFunction); //print_user_data(CallBackData); if( ! gtk_builder_add_from_file( builder, sGTK_UI_FILE, &error ) ) { g_warning( "%s", error->message ); g_free( error ); return( 1 ); } //Get main window pointer from UI window = GTK_WIDGET( gtk_builder_get_object( builder, sGTK_GLADE_MAIN_WINDOW_NAME) ); // = MakeDummy(); gtk_builder_connect_signals( builder, CallBackData); g_object_unref( G_OBJECT( builder ) ); gtk_widget_show( window ); gtk_main(); if(output_model_file) { FILE *fp = fopen(output_model_file,"w"); if( fp != NULL ) xmlDocDump(fp, modelDocPtr); fclose(fp); } xmlDocDump(stdout, modelDocPtr); fprintf(stdout,"\n"); return( 0 ); }
int oyProfile_CreateEffectVCGT ( oyProfile_s * prof ) { int error = 0; /* 2. get user effect profile and display white point effect */ /* 2.1. get effect profile and decide if it can be embedded into a VGCT tag */ oyOptions_s * module_options = NULL; error = oyAddLinearDisplayEffect( &module_options ); if(error) oyMessageFunc_p( oyMSG_WARN,(oyStruct_s*)prof, OY_DBG_FORMAT_ "No display effect for monitor profile %d", OY_DBG_ARGS_, error ); /* 2.2. get the display white point effect */ error = oyProfileAddWhitePointEffect( prof, &module_options ); if(error) oyMessageFunc_p( oyMSG_WARN,(oyStruct_s*)prof, OY_DBG_FORMAT_ "No white for monitor profile %d", OY_DBG_ARGS_, error ); /* 3. extract a existing VCGT */ int width = 256; uint16_t * vcgt = oyProfile_GetVCGT( prof, &width ); oyImage_s * img; if(vcgt && getenv("OY_DEBUG_WRITE")) { img = oyImage_Create( width, 1, vcgt, OY_TYPE_123_16, prof, 0 ); oyImage_WritePPM( img, "wtpt-vcgt.ppm", "vcgt ramp" ); oyImage_Release( &img ); } /* 4. create conversion, fill ramp and convert */ uint16_t * ramp = oyProfileGetWhitePointRamp( width, prof, module_options ); if(ramp && getenv("OY_DEBUG_WRITE")) { img = oyImage_Create( width, 1, ramp, OY_TYPE_123_16, prof, 0 ); oyImage_WritePPM( img, "wtpt-effect.ppm", "white point ramp" ); oyImage_Release( &img ); } /* 5. mix the two ramps */ uint16_t * mix = NULL; if(vcgt) mix = calloc( sizeof(uint16_t), width*3); int i,j; if(mix) for(i = 0; i < width; ++i) for(j = 0; j < 3; ++j) { uint16_t v = oyLinInterpolateRampU16c( ramp, width, j, 3, (double)i/(double)width ); double vd = v / 65535.0; mix[i*3+j] = OY_ROUNDp( oyLinInterpolateRampU16c( vcgt, width, j,3, vd ) ); } if(mix && getenv("OY_DEBUG_WRITE")) { img = oyImage_Create( width, 1, mix, OY_TYPE_123_16, prof, 0 ); oyImage_WritePPM( img, "wtpt-mix.ppm", "white point + vcgt" ); oyImage_Release( &img ); } /* 6. create a new VCGT tag and exchange the tag */ if((mix || ramp) && oyProfile_SetVCGT( prof, mix?mix:ramp, width )) { oyMessageFunc_p( oyMSG_WARN,(oyStruct_s*)prof, OY_DBG_FORMAT_ "Alter VCGT tag failed", OY_DBG_ARGS_ ); error = 1; } if(mix) oyDeAllocateFunc_(mix); if(ramp) oyDeAllocateFunc_(ramp); if(vcgt) oyDeAllocateFunc_(vcgt); return error; }
uint16_t * oyProfile_GetVCGT ( oyProfile_s * profile, int * width ) { oyProfileTag_s * tag = oyProfile_GetTagById( profile, (icTagSignature) icSigVideoCardGammaTable ); uint8_t * data_ = NULL; size_t size = 0; int error = oyProfileTag_GetBlock( tag, (void**) &data_, &size, oyAllocateFunc_ ); uint16_t * ramp = NULL; oyProfileTag_Release( &tag ); if(error || size < 18) { const char * name = oyProfile_GetText( profile, oyNAME_DESCRIPTION ); if(error) oyMessageFunc_p( oyMSG_WARN,(oyStruct_s*)profile, OY_DBG_FORMAT_ "no vcgt tag %d %s", OY_DBG_ARGS_, error, oyNoEmptyString_m_(name) ); else oyMessageFunc_p( oyMSG_WARN,(oyStruct_s*)profile, OY_DBG_FORMAT_ "vcgt tag size too small %lu %s\n", OY_DBG_ARGS_, size, oyNoEmptyString_m_(name) ); goto clean_oyProfile_GetVCGT; } int parametrisch = oyValueUInt32(*(icUInt32Number*) &data_[8]); icUInt16Number nkurven = oyValueUInt16(*(icUInt16Number*) &data_[12]); icUInt16Number segmente = oyValueUInt16(*(icUInt16Number*) &data_[14]); icUInt16Number byte = oyValueUInt16(*(icUInt16Number*) &data_[16]); if(oy_debug) oyMessageFunc_p( oyMSG_DBG,(oyStruct_s*)profile, OY_DBG_FORMAT_ "vcgt parametric: %d curves: %d segments: %d bytes: %d\n", OY_DBG_ARGS_, parametrisch, nkurven, segmente, byte ); if (parametrisch) { //icU16Fixed16Number const char * name = oyProfile_GetText( profile, oyNAME_DESCRIPTION ); oyMessageFunc_p( oyMSG_WARN,(oyStruct_s*)profile, OY_DBG_FORMAT_ "parametric vcgt is not supported: %s", OY_DBG_ARGS_, oyNoEmptyString_m_(name) ); #if 0 double r_gamma = 1.0/oyValueUInt32(*(icUInt32Number*)&data_[12])*65536.0; double start_r = oyValueUInt32(*(icUInt32Number*)&data_[16])/65536.0; double ende_r = oyValueUInt32(*(icUInt32Number*)&data_[20])/65536.0; double g_gamma = 1.0/oyValueUInt32(*(icUInt32Number*)&data_[24])*65536.0; double start_g = oyValueUInt32(*(icUInt32Number*)&data_[28])/65536.0; double ende_g = oyValueUInt32(*(icUInt32Number*)&data_[32])/65536.0; double b_gamma = 1.0/oyValueUInt32(*(icUInt32Number*)&data_[36])*65536.0; double start_b = oyValueUInt32(*(icUInt32Number*)&data_[40])/65536.0; double ende_b = oyValueUInt32(*(icUInt32Number*)&data_[44])/65536.0; #endif } else { int start = 18, i,j; if((int)size < start + byte * segmente * nkurven) { const char * name = oyProfile_GetText( profile, oyNAME_DESCRIPTION ); oyMessageFunc_p( oyMSG_WARN,(oyStruct_s*)profile, OY_DBG_FORMAT_ "vcgt tag too small: %lu need %d %s", OY_DBG_ARGS_, size, start + byte * segmente * nkurven, oyNoEmptyString_m_(name) ); goto clean_oyProfile_GetVCGT; } if(byte != 2) { const char * name = oyProfile_GetText( profile, oyNAME_DESCRIPTION ); oyMessageFunc_p( oyMSG_WARN,(oyStruct_s*)profile, OY_DBG_FORMAT_ "vcgt bytes not supported: %d need 2 %s", OY_DBG_ARGS_, byte, oyNoEmptyString_m_(name) ); goto clean_oyProfile_GetVCGT; } ramp = calloc( byte, (unsigned long)segmente * (unsigned long)nkurven); for (j = 0; j < nkurven; j++) for (i = segmente * j; i < segmente * (j+1); i++) ramp[(i - segmente*j) * nkurven + j] = oyValueUInt16 (*(icUInt16Number*)&data_[start + byte*i]); *width = segmente; } clean_oyProfile_GetVCGT: if(data_ && size) oyDeAllocateFunc_( data_ ); return ramp; }
int main( int argc , char** argv ) { int error = 0; const char* save_policy = NULL, * import_policy = NULL; oySCOPE_e scope = oySCOPE_USER; size_t size = 0; char * xml = NULL; char * import_policy_fn = NULL; int current_policy = 0, list_policies = 0, list_paths = 0, dump_policy = 0; int long_help = 0, internal_name = 0, file_name = 0; int verbose = 0; #ifdef USE_GETTEXT setlocale(LC_ALL,""); #endif oyExportStart_(EXPORT_CHECK_NO); if(argc >= 2) { int pos = 1, i; char *wrong_arg = 0; DBG_PROG1_S("argc: %d\n", argc); while(pos < argc) { switch(argv[pos][0]) { case '-': for(i = 1; i < strlen(argv[pos]); ++i) switch (argv[pos][i]) { case 'c': current_policy = 1; break; case 'd': dump_policy = 1; break; case 'e': internal_name = 1; break; case 'f': file_name = 1; break; case 'i': OY_PARSE_STRING_ARG(import_policy); break; case 'l': list_policies = 1; break; case 'p': list_paths = 1; break; case 's': OY_PARSE_STRING_ARG(save_policy); break; case 'v': if(verbose) oy_debug += 1; verbose = 1; break; case '-': if(i == 1) { if(OY_IS_ARG("help")) { long_help = 1; i=100; break; } else if(OY_IS_ARG("path")) { list_paths = 1; i=100; break; } else if(OY_IS_ARG("system-wide")) { scope = oySCOPE_SYSTEM; i=100; break; } } case 'h': default: printfHelp(argc, argv); exit (0); break; } break; default: printfHelp(argc, argv); exit (0); break; } if( wrong_arg ) { fprintf(stderr, "%s %s\n", _("wrong argument to option:"), wrong_arg); printfHelp(argc, argv); exit(1); } ++pos; } } else { printfHelp(argc, argv); exit (0); } if(verbose) fprintf( stderr, " Oyranos v%s\n", oyNoEmptyName_m_(oyVersionString(1,0))); /* check the default paths */ /*oyPathAdd( OY_PROFILE_PATH_USER_DEFAULT );*/ /* load the policy file into memory */ import_policy_fn = oyMakeFullFileDirName_(import_policy); if(oyIsFile_(import_policy_fn)) { xml = oyReadFileToMem_( oyMakeFullFileDirName_(import_policy), &size, oyAllocateFunc_ ); oyDeAllocateFunc_( import_policy_fn ); } /* parse and set policy */ if(xml) { oyReadXMLPolicy( oyGROUP_ALL, xml ); oyDeAllocateFunc_( xml ); } else if ( import_policy ) { error = oyPolicySet( import_policy, 0 ); if(error) fprintf( stderr, "%s:%d could not read file: %s\n",__FILE__,__LINE__, import_policy); return 1; } if(save_policy) { error = oyPolicySaveActual( oyGROUP_ALL, scope, save_policy ); if(!error) fprintf( stdout, "%s \"%s\"\n", _("installed new policy"), save_policy); else fprintf( stdout, "\"%s\" %s %d\n", save_policy, _("installation of new policy file failed with error:"), error); } else if(current_policy || list_policies || list_paths) { const char ** names = NULL; int count = 0, i, current = -1; oyOptionChoicesGet( oyWIDGET_POLICY, &count, &names, ¤t ); if(list_policies) for(i = 0; i < count; ++i) { if(file_name) { char * full_name = NULL; error = oyPolicyFileNameGet_( names[i], &full_name, oyAllocateFunc_ ); if(error) fprintf(stderr, "%s error: %d\n", names[i], error); if(internal_name) fprintf(stdout, "%s (%s)\n", names[i], full_name); else fprintf(stdout, "%s\n", full_name); oyFree_m_( full_name ); } else fprintf(stdout, "%s\n", names[i]); } if(current_policy) { fprintf( stderr, "%s\n", _("Currently active policy:")); if(current >= 0 && file_name) { char * full_name = NULL; error = oyPolicyFileNameGet_( names[current], &full_name, oyAllocateFunc_ ); if(internal_name) fprintf(stdout, "%s (%s)\n", names[current], full_name); else fprintf(stdout, "%s\n", full_name); oyFree_m_( full_name ); } else fprintf( stdout, "%s\n", current>=0?names[current]:"---"); } if(list_paths) { char ** path_names = oyDataPathsGet_( &count, "color/settings", oyALL, oySCOPE_USER_SYS, oyAllocateFunc_ ); fprintf(stdout, "%s:\n", _("Policy search paths")); for(i = 0; i < count; ++i) fprintf(stdout, "%s\n", path_names[i]); oyStringListRelease_(&path_names, count, oyDeAllocateFunc_); } } else if(dump_policy) { size = 0; xml = oyPolicyToXML( oyGROUP_ALL, 1, oyAllocateFunc_ ); DBG_PROG2_S("%s:%d new policy:\n\n",__FILE__,__LINE__); fprintf(stdout, "%s\n", xml); if(xml) oyDeAllocateFunc_( xml ); } else if(long_help) { const char * opts[] = {"add_html_header","1", "add_oyranos_title","1", "add_oyranos_copyright","1", NULL}; size = 0; xml = oyDescriptionToHTML( oyGROUP_ALL, opts, oyAllocateFunc_ ); fprintf(stdout, "%s\n", xml); if(xml) oyDeAllocateFunc_( xml ); } oyFinish_( FINISH_IGNORE_I18N | FINISH_IGNORE_CACHES ); return error; }
void printfHelp (int argc OY_UNUSED, char** argv) { char * version = oyVersionString(1,0); char * id = oyVersionString(2,0); char * cfg_date = oyVersionString(3,0); char * devel_time = oyVersionString(4,0); fprintf( stderr, "\n"); fprintf( stderr, "oyranos-profile %s\n", _("is a ICC profile information tool")); fprintf( stderr, " Oyranos v%s config: %s devel period: %s\n", oyNoEmptyName_m_(version), oyNoEmptyName_m_(cfg_date), oyNoEmptyName_m_(devel_time) ); if(id) fprintf( stderr, " Oyranos git id %s\n", oyNoEmptyName_m_(id) ); fprintf( stderr, "\n"); fprintf( stderr, " %s\n", _("Hint: search paths are influenced by the XDG_CONFIG_HOME shell variable.")); fprintf( stderr, "\n"); fprintf( stderr, "%s\n", _("Usage")); fprintf( stderr, " %s\n", _("List included ICC tags:")); fprintf( stderr, " %s -l %s\n", argv[0], _("ICC_FILE_NAME")); fprintf( stderr, " -p %s\t%s\n", _("NUMBER"), _("select tag")); fprintf( stderr, " -n %s\t%s\n", _("NAME"), _("select tag")); fprintf( stderr, "\n"); fprintf( stderr, " %s\n", _("Remove included ICC tag:")); fprintf( stderr, " %s -r %s %s\n", argv[0], _("NUMBER"), _("ICC_FILE_NAME")); fprintf( stderr, "\n"); fprintf( stderr, " %s\n", _("Dump Device Infos to OpenICC device JSON:")); fprintf( stderr, " %s -o %s\n", argv[0], _("ICC_FILE_NAME")); fprintf( stderr, " -c NAME %s scanner, monitor, printer, camera ...\n", _("use device class") ); fprintf( stderr, " -f xml %s\n", _("use IccXML format") ); fprintf( stderr, "\n"); fprintf( stderr, " %s\n", _("Show Profile ID:")); fprintf( stderr, " %s -m %s\n", argv[0], _("ICC_FILE_NAME")); fprintf( stderr, " -w %s\t%s\n", _("ICC_FILE_NAME"), _("write profile with correct ID")); fprintf( stderr, "\n"); fprintf( stderr, " %s\n", _("Show CIE*xy chromaticities:")); fprintf( stderr, " %s --ppmcie %s\n", argv[0], _("ICC_FILE_NAME")); fprintf( stderr, "\n"); fprintf( stderr, " %s\n", _("Write to ICC profile:")); fprintf( stderr, " %s -w %s [-j %s] %s\n", argv[0], _("NAME"), _("FILE_NAME"), _("ICC_FILE_NAME")); fprintf( stderr, " -w %s\t%s\n", _("NAME"), _("use new name")); fprintf( stderr, " -j %s\t%s\n", _("FILE_NAME"), _("embed OpenICC device JSON from file")); fprintf( stderr, " -s %s\t%s\n", _("NAME"), _("add prefix")); fprintf( stderr, "\n"); fprintf( stderr, " %s\n", _("Print a help text:")); fprintf( stderr, " %s -h\n", argv[0]); fprintf( stderr, "\n"); fprintf( stderr, " %s\n", _("General options:")); fprintf( stderr, " %s \t%s\n", _("ICC_FILE_NAME"), _("can be file name, internal description string, ICC profile ID or" \ " wildcard \"rgb\", \"cmyk\", \"gray\", \"lab\", \"xyz\", \"web\", \"rgbi\", \"cmyki\", \"grayi\", \"labi\", \"xyzi\"." \ " Wildcards ending with \"i\" are assumed profiles. \"web\" is a sRGB profile. The other wildcards are editing profiles.")); fprintf( stderr, " -v %s\n", _("verbose")); fprintf( stderr, " -i %s\n", _("read input stream")); fprintf( stderr, " -2 %s\n", _("select a ICC v2 profile")); fprintf( stderr, " -4 %s\n", _("select a ICC v4 profile")); fprintf( stderr, " --short %s\n", _("print only the file name")); fprintf( stderr, " --path %s\n", _("print the full file name")); fprintf( stderr, "\n"); fprintf( stderr, " %s:\n", _("Example")); fprintf( stderr, " oyranos-profile -lv -p=1 sRGB.icc\n"); fprintf( stderr, " oyranos-profile -w test -j test.json sRGB.icc\n"); fprintf( stderr, " oyranos-profile -mv sRGB.icc\n"); fprintf( stderr, " ppmcie `oyranos-profile --ppmcie sRGB.icc` > sRGB-cie-xy.ppm\n"); fprintf( stderr, " %s:\n", _("Count all profiles with Lab PCS")); fprintf( stderr, " LANG=en_GB; n=0; SAVEIFS=$IFS ; IFS=$'\\n\\b'; profiles=(`oyranos-profiles -ldf`); IFS=$SAVEIFS; for file in \"${profiles[@]}\"; do if [ \"`oyranos-profile -l \"$file\" | grep -a \"PCS Color Space: Lab\"`\" != \"\" ]; then n=$((n+1)); fi; done; echo PCS-CIE*Lab: $n\n"); fprintf( stderr, "\n"); printf(_("For more information read the man page:")); printf("\n"); printf(" man oyranos-profile\n"); if(version) oyDeAllocateFunc_(version); if(id) oyDeAllocateFunc_(id); if(cfg_date) oyDeAllocateFunc_(cfg_date); if(devel_time) oyDeAllocateFunc_(devel_time); }