/** Function oyCMMinfo_Release__Members * @memberof oyCMMinfo_s * @brief Custom CMMinfo destructor * @internal * * This function will free up all memmory allocated by the * input object. First all object members witch have their * own release method are deallocated. Then the deallocateFunc_ * of the oy_ object is used to release the rest of the members * that were allocated with oy_->allocateFunc_. * * @param[in] cmminfo the CMMinfo object * * @version Oyranos: 0.9.7 * @date 2017/10/09 * @since YYYY/MM/DD (Oyranos: x.x.x) */ void oyCMMinfo_Release__Members( oyCMMinfo_s_ * cmminfo ) { /* Deallocate members here * E.g: oyXXX_Release( &cmminfo->member ); */ oyCMMapi_s * api = NULL, * old_api = cmminfo->api; while(old_api && (api = oyCMMapi_GetNext(old_api)) != NULL) { if(old_api->release) old_api->release( (oyStruct_s**)&old_api ); old_api = api; } if(cmminfo->oy_->deallocateFunc_) { oyDeAlloc_f deallocateFunc = cmminfo->oy_->deallocateFunc_; /* Deallocate members of basic type here * E.g.: deallocateFunc( cmminfo->member ); */ if(cmminfo->backend_version) deallocateFunc( cmminfo->backend_version ); } }
/** Function oyNamedColor_Release__Members * @memberof oyNamedColor_s * @brief Custom NamedColor destructor * @internal * * This function will free up all memmory allocated by the * input object. First all object members witch have their * own release method are deallocated. Then the deallocateFunc_ * of the oy_ object is used to release the rest of the members * that were allocated with oy_->allocateFunc_. * * @param[in] namedcolor the NamedColor object * * @version Oyranos: x.x.x * @since YYYY/MM/DD (Oyranos: x.x.x) * @date YYYY/MM/DD */ void oyNamedColor_Release__Members( oyNamedColor_s_ * namedcolor ) { /* Deallocate members here * E.g: oyXXX_Release( &namedcolor->member ); */ oyNamedColor_s_ * s = namedcolor; oyProfile_Release( &s->profile_ ); if(s->oy_->deallocateFunc_) { oyDeAlloc_f deallocateFunc = s->oy_->deallocateFunc_; if(s->channels_) deallocateFunc( s->channels_ ); s->channels_ = 0; if(s->blob_) /* s->blob_len */ deallocateFunc( s->blob_ ); s->blob_ = 0; s->blob_len_ = 0; } }
/** Function oyStructList_Release__Members * @memberof oyStructList_s * @brief Custom StructList destructor * @internal * * This function will free up all memmory allocated by the * input object. First all object members witch have their * own release method are deallocated. Then the deallocateFunc_ * of the oy_ object is used to release the rest of the members * that were allocated with oy_->allocateFunc_. * * @param[in] structlist the StructList object * * @version Oyranos: x.x.x * @since YYYY/MM/DD (Oyranos: x.x.x) * @date YYYY/MM/DD */ void oyStructList_Release__Members( oyStructList_s_ * structlist ) { /* Deallocate members here * E.g: oyXXX_Release( &structlist->member ); */ oyStructList_Clear((oyStructList_s*)structlist); if(structlist->oy_->deallocateFunc_) { oyDeAlloc_f deallocateFunc = structlist->oy_->deallocateFunc_; /* Deallocate members of basic type here * E.g.: deallocateFunc( structlist->member ); */ if(structlist->ptr_) deallocateFunc(structlist->ptr_); if(structlist->list_name) deallocateFunc(structlist->list_name); structlist->type_ = 0; } }
/** Function oyConnector_Release__Members * @memberof oyConnector_s * @brief Custom Connector destructor * @internal * * This function will free up all memmory allocated by the * input object. First all object members witch have their * own release method are deallocated. Then the deallocateFunc_ * of the oy_ object is used to release the rest of the members * that were allocated with oy_->allocateFunc_. * * @param[in] connector the Connector object * * @version Oyranos: x.x.x * @since YYYY/MM/DD (Oyranos: x.x.x) * @date YYYY/MM/DD */ void oyConnector_Release__Members( oyConnector_s_ * connector ) { /* Deallocate members here * E.g: oyXXX_Release( &connector->member ); */ if(connector->oy_->deallocateFunc_) { oyDeAlloc_f deallocateFunc = connector->oy_->deallocateFunc_; /* Deallocate members of basic type here * E.g.: deallocateFunc( connector->member ); */ if(connector->connector_type) { deallocateFunc( connector->connector_type ); connector->connector_type = 0; } } }
/** Function oyConnectorImaging_SetReg * @memberof oyConnectorImaging_s * @brief Set this connectors type string * * This is use as a rough check, if connections are possible. * * @param[in,out] obj ConnectorImaging object * @param[in] type_registration the registration string to describe the * type * @return 1 - error; 0 - success; -1 - otherwise * * @version Oyranos: 0.3.0 * @since 2011/01/31 (Oyranos: 0.3.0) * @date 2011/01/31 */ int oyConnectorImaging_SetReg ( oyConnectorImaging_s * obj, const char * type_registration ) { oyConnectorImaging_s_ * s = (oyConnectorImaging_s_*)obj; if(!obj) return 0; oyCheckConnectorImagingType__m( oyOBJECT_CONNECTOR_S, return 1 ) { oyDeAlloc_f deallocateFunc = s->oy_->deallocateFunc_; oyAlloc_f allocateFunc = s->oy_->allocateFunc_; if(s->connector_type) deallocateFunc( s->connector_type ); s->connector_type = 0; s->connector_type = oyStringCopy_( type_registration, allocateFunc ); } return 0; }
/** @internal * Function oyOption_Release_ * @memberof oyOption_s_ * @brief release and possibly deallocate a Option object * * @param[in,out] option Option struct object * * @version Oyranos: * @since 2010/04/26 (Oyranos: 0.1.10) * @date 2010/04/26 */ int oyOption_Release_( oyOption_s_ **option ) { /* ---- start of common object destructor ----- */ oyOption_s_ *s = 0; if(!option || !*option) return 0; s = *option; *option = 0; if(oyObject_UnRef(s->oy_)) return 0; /* ---- end of common object destructor ------- */ /* ---- start of custom Option destructor ----- */ oyOption_Release__Members( s ); /* ---- end of custom Option destructor ------- */ if(s->oy_->deallocateFunc_) { oyDeAlloc_f deallocateFunc = s->oy_->deallocateFunc_; oyObject_Release( &s->oy_ ); deallocateFunc( s ); } return 0; }
/** @internal * Function oyProfileTag_Release_ * @memberof oyProfileTag_s_ * @brief release and possibly deallocate a ProfileTag object * * @param[in,out] profiletag ProfileTag struct object * * @version Oyranos: * @since 2010/04/26 (Oyranos: 0.1.10) * @date 2010/04/26 */ int oyProfileTag_Release_( oyProfileTag_s_ **profiletag ) { /* ---- start of common object destructor ----- */ oyProfileTag_s_ *s = 0; if(!profiletag || !*profiletag) return 0; s = *profiletag; *profiletag = 0; if(oyObject_UnRef(s->oy_)) return 0; /* ---- end of common object destructor ------- */ /* ---- start of custom ProfileTag destructor ----- */ oyProfileTag_Release__Members( s ); /* ---- end of custom ProfileTag destructor ------- */ if(s->oy_->deallocateFunc_) { oyDeAlloc_f deallocateFunc = s->oy_->deallocateFunc_; oyObject_Release( &s->oy_ ); deallocateFunc( s ); } return 0; }
/** @internal * Function oyNamedColor_Release_ * @memberof oyNamedColor_s_ * @brief release and possibly deallocate a NamedColor object * * @param[in,out] namedcolor NamedColor struct object * * @version Oyranos: * @since 2010/04/26 (Oyranos: 0.1.10) * @date 2010/04/26 */ int oyNamedColor_Release_( oyNamedColor_s_ **namedcolor ) { /* ---- start of common object destructor ----- */ oyNamedColor_s_ *s = 0; if(!namedcolor || !*namedcolor) return 0; s = *namedcolor; *namedcolor = 0; if(oyObject_UnRef(s->oy_)) return 0; /* ---- end of common object destructor ------- */ /* ---- start of custom NamedColor destructor ----- */ oyNamedColor_Release__Members( s ); /* ---- end of custom NamedColor destructor ------- */ if(s->oy_->deallocateFunc_) { oyDeAlloc_f deallocateFunc = s->oy_->deallocateFunc_; oyObject_Release( &s->oy_ ); deallocateFunc( s ); } return 0; }
/** Function oyPixelAccess_Release__Members * @memberof oyPixelAccess_s * @brief Custom PixelAccess destructor * @internal * * This function will free up all memmory allocated by the * input object. First all object members witch have their * own release method are deallocated. Then the deallocateFunc_ * of the oy_ object is used to release the rest of the members * that were allocated with oy_->allocateFunc_. * * @param[in] pixelaccess the PixelAccess object * * @version Oyranos: x.x.x * @since YYYY/MM/DD (Oyranos: x.x.x) * @date YYYY/MM/DD */ void oyPixelAccess_Release__Members( oyPixelAccess_s_ * pixelaccess ) { /* Deallocate members here * E.g: oyXXX_Release( &pixelaccess->member ); */ oyArray2d_Release( &pixelaccess->array ); oyRectangle_Release( (oyRectangle_s**)&pixelaccess->output_array_roi ); oyImage_Release( &pixelaccess->output_image ); oyFilterGraph_Release( (oyFilterGraph_s**)&pixelaccess->graph ); if(pixelaccess->oy_->deallocateFunc_) { oyDeAlloc_f deallocateFunc = pixelaccess->oy_->deallocateFunc_; /* Deallocate members of basic type here * E.g.: deallocateFunc( pixelaccess->member ); */ if(pixelaccess->user_data && pixelaccess->user_data->release) pixelaccess->user_data->release( &pixelaccess->user_data ); if(pixelaccess->array_xy) deallocateFunc( pixelaccess->array_xy ); pixelaccess->array_xy = 0; } }
/** @internal * Function oyFilterGraph_Release_ * @memberof oyFilterGraph_s_ * @brief release and possibly deallocate a FilterGraph object * * @param[in,out] filtergraph FilterGraph struct object * * @version Oyranos: 0.9.7 * @date 2018/10/03 * @since 2010/04/26 (Oyranos: 0.1.10) */ int oyFilterGraph_Release_( oyFilterGraph_s_ **filtergraph ) { const char * track_name = NULL; int observer_refs = 0, i; /* ---- start of common object destructor ----- */ oyFilterGraph_s_ *s = 0; if(!filtergraph || !*filtergraph) return 0; s = *filtergraph; /* static object */ if(!s->oy_) return 0; *filtergraph = 0; observer_refs = oyStruct_ObservationCount( (oyStruct_s*)s, 0 ); if(oy_debug_objects >= 0) { const char * t = getenv(OY_DEBUG_OBJECTS); int id_ = -1; if(t) id_ = atoi(t); else id_ = oy_debug_objects; if((id_ >= 0 && s->oy_->id_ == id_) || (t && (strstr(oyStructTypeToText(s->type_), t) != 0)) || id_ == 1) { oyStruct_s ** parents = NULL; int n = oyStruct_GetParents( (oyStruct_s*)s, &parents ); if(n != s->oy_->ref_) { int i; #ifdef HAVE_BACKTRACE int j, nptrs; void *buffer[BT_BUF_SIZE]; char **strings; nptrs = backtrace(buffer, BT_BUF_SIZE); /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO) would produce similar output to the following: */ strings = backtrace_symbols(buffer, nptrs); if( strings == NULL ) { perror("backtrace_symbols"); } else { int start = nptrs-1; do { --start; } while( start >= 0 && (strstr(strings[start], "(main+") == NULL) ); fprintf(stderr, "\n"); for(j = start; j >= 0; j--) { if(oy_debug) fprintf(stderr, "%s\n", strings[j]); else { char * t = NULL, * txt = NULL; const char * line = strings[j], * tmp = strchr( line, '(' ); if(tmp) t = oyStringCopy( &tmp[1], NULL ); else t = oyStringCopy( line, NULL ); txt = strchr( t, '+' ); if(txt) txt[0] = '\000'; if(j > 0 && (strstr(strings[j-1], t) != NULL) ) oyFree_m_(t); if(t) { if(j==0) fprintf(stderr, "%s() ", t); else fprintf(stderr, "%s()->", t); oyFree_m_(t); } } } free(strings); } #endif track_name = oyStructTypeToText(s->type_); fprintf( stderr, "%s[%d] unref with refs: %d observers: %d parents: %d\n", track_name, s->oy_->id_, s->oy_->ref_, observer_refs, n ); for(i = 0; i < n; ++i) { track_name = oyStructTypeToText(parents[i]->type_); fprintf( stderr, "parent[%d]: %s[%d]\n", i, track_name, parents[i]->oy_->id_ ); } } } } if((oyObject_UnRef(s->oy_) - observer_refs) > 0) return 0; /* ---- end of common object destructor ------- */ if(oy_debug_objects >= 0) { const char * t = getenv(OY_DEBUG_OBJECTS); int id_ = -1; if(t) id_ = atoi(t); else id_ = oy_debug_objects; if((id_ >= 0 && s->oy_->id_ == id_) || (t && s && (strstr(oyStructTypeToText(s->type_), t) != 0)) || id_ == 1) { track_name = oyStructTypeToText(s->type_); fprintf( stderr, "%s[%d] destruct\n", track_name, s->oy_->id_); } } /* ---- start of custom FilterGraph destructor ----- */ oyFilterGraph_Release__Members( s ); /* ---- end of custom FilterGraph destructor ------- */ /* model and observer reference each other. So release the object two times. * The models and and observers are released later inside the * oyObject_s::handles. */ for(i = 0; i < observer_refs; ++i) { oyObject_UnRef(s->oy_); oyObject_UnRef(s->oy_); } if(s->oy_->deallocateFunc_) { oyDeAlloc_f deallocateFunc = s->oy_->deallocateFunc_; int id = s->oy_->id_; int refs = s->oy_->ref_; if(refs > 1) fprintf( stderr, "!!!ERROR: node[%d]->object can not be untracked with refs: %d\n", id, refs); oyObject_Release( &s->oy_ ); if(track_name) fprintf( stderr, "%s[%d] destructed\n", track_name, id ); deallocateFunc( s ); } return 0; }
/** Function: oyNamedColor_SetColorStd * @memberof oyNamedColor_s * @brief set color channels * * * @param[in] color Oyranos color struct pointer * @param[in] color_space Oyranos standard color space * @param[in] channels pointer to channel data * @param[in] channels_type data type * @param[in] flags reserved for future use * @param[in] options for filter node creation * @return error * * @since Oyranos: version 0.1.8 * @date 23 december 2007 (API 0.1.8) */ int oyNamedColor_SetColorStd ( oyNamedColor_s * color, oyPROFILE_e color_space, oyPointer channels, oyDATATYPE_e channels_type, uint32_t flags, oyOptions_s * options ) { oyNamedColor_s_ * s = (oyNamedColor_s_*) color; int error = !s || !color_space || !channels; oyProfile_s * p_in = 0; oyProfile_s * p_out = 0; /* abreviate */ if(error <= 0 && channels_type == oyDOUBLE) { if (color_space == oyEDITING_LAB) { oyLab2XYZ( (double*)channels, s->XYZ_ ); return error; } else if(color_space == oyEDITING_XYZ) { oyCopyColor( (double*)channels, s->XYZ_, 1, 0, 0 ); return error; } } if(error <= 0) { p_in = oyProfile_FromStd ( color_space, flags, NULL ); error = !p_in; } /* reset and allocate */ if(error <= 0) { int n = oyProfile_GetChannelsCount( p_in ); oyDeAlloc_f deallocateFunc = s->oy_->deallocateFunc_; if(n > oyProfile_GetChannelsCount( s->profile_ )) { if(s->channels_) deallocateFunc(s->channels_); s->channels_ = 0; s->channels_ = s->oy_->allocateFunc_( n * sizeof(double) ); } error = !memset( s->channels_, 0, sizeof(double) * n ); s->XYZ_[0] = s->XYZ_[1] = s->XYZ_[2] = -1; if(deallocateFunc && s->blob_) deallocateFunc( s->blob_ ); s->blob_ = 0; s->blob_len_ = 0; } /* convert */ if(error <= 0) { p_out = s->profile_; error = oyColorConvert_( p_in, p_out, channels, s->channels_, channels_type , oyDOUBLE, options, 1 ); p_out = 0; } if(error <= 0) { p_out = oyProfile_FromStd( oyEDITING_XYZ, flags, 0 ); error = oyColorConvert_( p_in, p_out, channels, s->XYZ_, channels_type , oyDOUBLE, options, 1 ); oyProfile_Release ( &p_out ); } return error; }