static const char * oyHash_StaticMessageFunc_ ( oyPointer obj, oyNAME_e type, int flags ) { oyHash_s_ * s = (oyHash_s_*) obj; static char * text = 0; static int text_n = 0; oyAlloc_f alloc = oyAllocateFunc_; /* silently fail */ if(!s) return ""; if(s->oy_ && s->oy_->allocateFunc_) alloc = s->oy_->allocateFunc_; if( text == NULL || text_n == 0 ) { text_n = 512; text = (char*) alloc( text_n ); if(text) memset( text, 0, text_n ); } if( text == NULL || text_n == 0 ) return "Memory problem"; text[0] = '\000'; if(!(flags & 0x01)) sprintf(text, "%s%s", oyStructTypeToText( s->type_ ), type != oyNAME_NICK?" ":""); const char * hash_text = oyObject_GetName(s->oy_, oyNAME_NAME); int l = 0; if(hash_text) l = strlen(hash_text); /* allocate enough space */ if(text_n < l) { oyDeAlloc_f dealloc = oyDeAllocateFunc_; if(s->oy_ && s->oy_->deallocateFunc_) dealloc = s->oy_->deallocateFunc_; if(text && text_n) dealloc( text ); text_n = l; text = alloc(text_n); if(text) text[0] = '\000'; else return "Memory Error"; if(!(flags & 0x01)) sprintf(text, "%s%s", oyStructTypeToText( s->type_ ), type != oyNAME_NICK?" ":""); } if(type == oyNAME_NICK && (flags & 0x01)) { sprintf( &text[strlen(text)], "%d", l ); } else if(type == oyNAME_NAME || (int)type >= oyNAME_DESCRIPTION) sprintf( &text[strlen(text)], "%s", hash_text?hash_text:"----" ); return text; }
/** 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; }
/** Function oyDrawScreenImage * @brief generate a Oyranos image from a given context for display * * The function asks the 'oydi' node to provide parameters to render a * oyImage_s from a prepared oyConversion_s context. * * @param[in] context the Oyranos graph * @param[in,out] ticket rendering context for tracking * rectangles * @param[in] display_rectangle absolute coordinates of visible image * in relation to display * @param[in,out] old_display_rectangle * rembering of display_rectangle + @param[in,out] old_roi_rectangle remembering of ticket's ROI (optional) * @param[in] system_type the system dependent type specification * - "X11" is well supported * - "oy-test" for internal tests * @param[in] data_type_request oyUINT8 or oyUINT16 * @param[in] display the system display with system_type: * - "X11": a Display object * @param[in] window the system window with system_type: * - "X11": a Window ID * @param[in] dirty explicite redraw * @param[out] image the image from graph to display * @return 0 - success, -1 - issue, >= 1 - error * * @version Oyranos: 0.9.6 * @date 2016/09/22 * @since 2010/09/05 (Oyranos: 0.1.11) */ int oyDrawScreenImage ( oyConversion_s * context, oyPixelAccess_s * ticket, oyRectangle_s * display_rectangle, oyRectangle_s * old_display_rectangle, oyRectangle_s * old_roi_rectangle, const char * system_type, oyDATATYPE_e data_type_request, void * display, void * window, int dirty, oyImage_s * image ) { int result = 0; if(context) { double X,Y,W,H; int channels = 0; oyFilterNode_s * node_out = 0; oyRectangle_s * disp_rectangle = 0, * ticket_roi = 0; oyOptions_s * image_tags = 0; oyDATATYPE_e data_type = oyUINT8; oyPixel_t pt = 0; oyRectangle_GetGeo( display_rectangle, &X, &Y, &W, &H ); if(!image) return 1; if( W <= 0 || H <= 0) return -1; image_tags = oyImage_GetTags( image ); if(window && strcmp("X11", system_type) == 0) { #if defined(XCM_HAVE_X11) /* add X11 window and display identifiers to output image */ oyOption_s * o = 0; Display *disp = (Display*) display; Window w = (Window) window; int count = oyOptions_CountType( image_tags, "//" OY_TYPE_STD "/display/window_id", oyOBJECT_BLOB_S ); if(!count && w) { oyBlob_s * win_id = oyBlob_New(0), * display_id = oyBlob_New(0); if(win_id) { oyBlob_SetFromStatic( win_id, (oyPointer)w, 0, 0 ); o = oyOption_FromRegistration( "//" OY_TYPE_STD "/display/window_id", 0 ); oyOption_MoveInStruct( o, (oyStruct_s**)&win_id ); oyOptions_MoveIn( image_tags, &o, -1 ); oyBlob_SetFromStatic( display_id, (oyPointer)disp, 0, 0 ); o = oyOption_FromRegistration( "//" OY_TYPE_STD "/display/display_id", 0 ); oyOption_MoveInStruct( o, (oyStruct_s**)&display_id ); oyOptions_MoveIn( image_tags, &o, -1 ); oyOptions_SetFromText( &image_tags, "//" OY_TYPE_STD "/display/display_name", DisplayString(disp), OY_CREATE_NEW ); } else printf("%s:%d WARNING: no X11 Window obtained or\n" " no oyBlob_s allocateable\n", __FILE__,__LINE__); } #endif } else if(strcmp("oy-test", system_type) == 0) oyOptions_SetFromText( &image_tags, "//" OY_TYPE_STD "/display/display_name", system_type, OY_CREATE_NEW ); /* check if the actual data can be displayed */ pt = oyImage_GetPixelLayout( image, oyLAYOUT ); data_type = oyToDataType_m( pt ); channels = oyToChannels_m( pt ); if(pt != 0 && ((channels != 4 && channels != 3) || data_type != data_type_request)) { printf( "%s:%d WARNING: wrong image data format: %s\n%s\n" "need 4 or 3 channels with %s\n", __FILE__,__LINE__, oyOptions_FindString( image_tags, "filename", 0 ), image ? oyObject_GetName( image->oy_, oyNAME_NICK ) : "", oyDataTypeToText( data_type_request ) ); return 1; } /* Inform about the images display coverage. */ disp_rectangle = (oyRectangle_s*) oyOptions_GetType( image_tags, -1, "display_rectangle", oyOBJECT_RECTANGLE_S ); oyRectangle_SetGeo( disp_rectangle, X,Y,W,H ); node_out = oyConversion_GetNode( context, OY_OUTPUT ); ticket_roi = oyPixelAccess_GetArrayROI( ticket ); /* decide wether to refresh the cached rectangle of our static image */ if( node_out && /* Did the window area move? */ ((!oyRectangle_IsEqual( disp_rectangle, old_display_rectangle ) || /* Something explicite to update? */ (old_roi_rectangle && !oyRectangle_IsEqual( ticket_roi, old_roi_rectangle ))|| /* Did the image move? */ oyPixelAccess_GetStart( ticket,0 ) != oyPixelAccess_GetOldStart( ticket,0 ) || oyPixelAccess_GetStart( ticket,1 ) != oyPixelAccess_GetOldStart( ticket,1 )) || dirty > 0)) { #ifdef DEBUG_ printf( "%s:%d new display rectangle: %s +%d+%d\n", __FILE__,__LINE__, oyRectangle_Show(disp_rectangle), X, Y ), #endif /* convert the image data */ oyConversion_RunPixels( context, ticket ); if(oy_debug && getenv("OY_DEBUG_WRITE")) { oyImage_s * out = oyConversion_GetImage( context, OY_OUTPUT ); oyImage_WritePPM( out, "debug_image_out.ppm", "image_display output image"); oyImage_Release( &out ); } /* remember the old rectangle */ oyRectangle_SetByRectangle( old_display_rectangle, disp_rectangle ); oyRectangle_SetByRectangle( old_roi_rectangle, ticket_roi ); oyPixelAccess_SetOldStart(ticket,0, oyPixelAccess_GetStart(ticket,0)); oyPixelAccess_SetOldStart(ticket,1, oyPixelAccess_GetStart(ticket,1)); } else result = -1; oyFilterNode_Release( &node_out ); oyOptions_Release( &image_tags ); oyRectangle_Release( &disp_rectangle ); oyRectangle_Release( &ticket_roi ); } if(oy_debug >= 4) fprintf( stderr, "%s:%d %s() result: %d\n", strrchr(__FILE__,'/'),__LINE__,__func__, result ); return result; }
/** * @internal * Function oyOption_GetValueText_ * @memberof oyOption_s * @brief get value as a text dump * * @param obj the option * @param allocateFunc user allocator * @return the text * * @version Oyranos: 0.1.9 * @since 2008/12/05 (Oyranos: 0.1.9) * @date 2009/08/17 */ char * oyOption_GetValueText_( oyOption_s_ * obj, oyAlloc_f allocateFunc ) { int error = !obj; char * erg = 0; oyValue_u * v = 0; oyStructList_s * oy_struct_list = 0; char * text = 0; char * save_locale = 0; if(error <= 0) v = obj->value; if(!allocateFunc) allocateFunc = oyAllocateFunc_; error = !v; save_locale = oyStringCopy_( setlocale(LC_NUMERIC, 0 ), oyAllocateFunc_ ); setlocale(LC_NUMERIC, "C"); if(error <= 0) { int n = 1, i = 0; char * tmp = oyAllocateFunc_(1024); const char * ct = 0; switch(obj->value_type) { case oyVAL_INT_LIST: n = v->int32_list[0]; break; case oyVAL_DOUBLE_LIST: n = (int)v->dbl_list[0]; break; case oyVAL_STRING_LIST: n = 0; while( v->string_list[n] ) ++n; break; case oyVAL_INT: case oyVAL_DOUBLE: case oyVAL_STRING: case oyVAL_STRUCT: n = 1; break; case oyVAL_NONE: case oyVAL_MAX: n = 0; break; } if(obj->value_type == oyVAL_STRUCT) { oy_struct_list = (oyStructList_s*) v->oy_struct; if(oy_struct_list) { if(oy_struct_list->type_ == oyOBJECT_STRUCT_LIST_S) n = oyStructList_Count( oy_struct_list ); } else WARNc2_S( "missed \"oy_struct\" member of \"%s\" [%d]", obj->registration, oyObject_GetId(obj->oy_) ); } for(i = 0; i < n; ++i) { if(obj->value_type == oyVAL_INT) oySprintf_(tmp, "%d", v->int32); if(obj->value_type == oyVAL_DOUBLE) oySprintf_(tmp, "%g", v->dbl); if(obj->value_type == oyVAL_INT_LIST) oySprintf_(tmp, "%d", v->int32_list[i+1]); if(obj->value_type == oyVAL_DOUBLE_LIST) oySprintf_(tmp, "%g", v->dbl_list[i+1]); if((obj->value_type == oyVAL_INT_LIST || obj->value_type == oyVAL_DOUBLE_LIST) && i) STRING_ADD( text, "," ); switch(obj->value_type) { case oyVAL_INT: case oyVAL_DOUBLE: case oyVAL_INT_LIST: case oyVAL_DOUBLE_LIST: STRING_ADD( text, tmp ); break; case oyVAL_STRING: STRING_ADD( text, v->string ); break; case oyVAL_STRING_LIST: STRING_ADD( text, v->string_list[i] ); break; case oyVAL_STRUCT: case oyVAL_NONE: case oyVAL_MAX: break; } if(obj->value_type == oyVAL_STRUCT) { oyStruct_s * oy_struct = 0; if(oy_struct_list && oy_struct_list->type_ == oyOBJECT_STRUCT_LIST_S) oy_struct = oyStructList_Get_( ( oyStructList_s_*)oy_struct_list, i ); else if(v->oy_struct) oy_struct = v->oy_struct; if(oy_struct) { ct = 0; /* get explicite name */ if(oy_struct->oy_) ct = oyObject_GetName( oy_struct->oy_, oyNAME_NICK ); if(!ct) /* fall back to oyCMMapi9_s object type lookup */ ct = oyStruct_GetText( oy_struct, oyNAME_NICK, 0 ); if(ct) STRING_ADD( text, ct ); if(!ct) /* fall back to plain struct type name, if known */ STRING_ADD ( text, oyStructTypeToText(oy_struct->type_) ); } } } if(text) erg = oyStringCopy_( text, allocateFunc ); oyFree_m_( tmp ); if(!text) { DBG_NUM2_S( "missed value in \"%s\" [%d]", obj->registration, oyObject_GetId(obj->oy_) ); } else oyFree_m_( text ); } setlocale(LC_NUMERIC, save_locale); oyFree_m_( save_locale ); return erg; }
/** Function: oyNamedColor_GetName * @memberof oyNamedColor_s * @brief get color channels * * @since Oyranos: version 0.1.8 * @date 22 december 2007 (API 0.1.8) */ const char * oyNamedColor_GetName( oyNamedColor_s * color, oyNAME_e type, uint32_t flags ) { const char * text = 0; oyNamedColor_s_ * s = (oyNamedColor_s_*) color; if(!s) return 0; if(!s->oy_) return 0; text = oyObject_GetName( s->oy_, type ); if(!text && flags) { const char * tmp = 0; char * txt = 0; double l[3]; int i; icSignature sig = oyProfile_GetSignature( s->profile_, oySIGNATURE_COLOR_SPACE ); oyAllocHelper_m_( txt, char, 1024, 0, return 0 ); oyNamedColor_GetColorStd( color, oyEDITING_LAB, l, oyDOUBLE, 0, 0 ); switch(type) { case oyNAME_DESCRIPTION: tmp = oyObject_GetName( s->oy_, oyNAME_NAME ); if(!tmp) tmp = oyObject_GetName( s->oy_, oyNAME_NICK ); if(tmp) oySprintf_(txt, "%s: CIE*Lab: ", tmp ); else oySprintf_(txt, "CIE*Lab: "); for(i = 0; i < 3; ++i) oySprintf_( &txt[ oyStrlen_(txt) ], "%.02f ", l[i] ); tmp = oyICCColorSpaceGetName( sig ); if(tmp) oySprintf_( &txt[ oyStrlen_(txt) ], "; %s:", tmp ); if( s->channels_ ) for(i = 0; i < oyICCColorSpaceGetChannelCount( sig ); ++i) oySprintf_( &txt[ oyStrlen_(txt) ], "%.02f ", s->channels_[i] ); break; default: break; } oyObject_SetName ( s->oy_, txt, type ); oyFree_m_( txt ); text = oyObject_GetName( s->oy_, type ); } if(!text && type > oyNAME_NICK) text = oyObject_GetName( s->oy_, type - 2 ); if(!text && type > oyNAME_NAME) text = oyObject_GetName( s->oy_, type - 1 ); if(!text && type < oyNAME_NICK ) text = oyObject_GetName( s->oy_, type + 2 ); if(!text && type < oyNAME_DESCRIPTION ) text = oyObject_GetName( s->oy_, type + 1 ); if(!text) text = _("----"); return text; }