void gf_sg_vrml_field_pointer_del(void *field, u32 FieldType) { GF_Node *node; switch (FieldType) { case GF_SG_VRML_SFBOOL: case GF_SG_VRML_SFFLOAT: case GF_SG_VRML_SFDOUBLE: case GF_SG_VRML_SFTIME: case GF_SG_VRML_SFINT32: case GF_SG_VRML_SFVEC3F: case GF_SG_VRML_SFVEC3D: case GF_SG_VRML_SFVEC2F: case GF_SG_VRML_SFVEC2D: case GF_SG_VRML_SFCOLOR: case GF_SG_VRML_SFCOLORRGBA: case GF_SG_VRML_SFROTATION: case GF_SG_VRML_SFATTRREF: break; case GF_SG_VRML_SFSTRING: if ( ((SFString *)field)->buffer) gf_free(((SFString *)field)->buffer); break; case GF_SG_VRML_SFIMAGE: gf_sg_sfimage_del(* ((SFImage *)field)); break; case GF_SG_VRML_SFNODE: node = *(GF_Node **) field; if (node) gf_node_del(node); return; case GF_SG_VRML_SFCOMMANDBUFFER: gf_sg_sfcommand_del(*(SFCommandBuffer *)field); break; case GF_SG_VRML_MFBOOL: gf_sg_mfbool_del( * ((MFBool *) field)); break; case GF_SG_VRML_MFFLOAT: gf_sg_mffloat_del( * ((MFFloat *) field)); break; case GF_SG_VRML_MFDOUBLE: gf_sg_mfdouble_del( * ((MFDouble *) field)); break; case GF_SG_VRML_MFTIME: gf_sg_mftime_del( * ((MFTime *)field)); break; case GF_SG_VRML_MFINT32: gf_sg_mfint32_del( * ((MFInt32 *)field)); break; case GF_SG_VRML_MFSTRING: gf_sg_mfstring_del( *((MFString *)field)); break; case GF_SG_VRML_MFVEC3F: gf_sg_mfvec3f_del( * ((MFVec3f *)field)); break; case GF_SG_VRML_MFVEC2F: gf_sg_mfvec2f_del( * ((MFVec2f *)field)); break; case GF_SG_VRML_MFVEC3D: gf_sg_mfvec3d_del( * ((MFVec3d *)field)); break; case GF_SG_VRML_MFVEC2D: gf_sg_mfvec2d_del( * ((MFVec2d *)field)); break; case GF_SG_VRML_MFCOLOR: gf_sg_mfcolor_del( * ((MFColor *)field)); break; case GF_SG_VRML_MFCOLORRGBA: gf_sg_mfcolor_rgba_del( * ((MFColorRGBA *)field)); break; case GF_SG_VRML_MFROTATION: case GF_SG_VRML_MFVEC4F: gf_sg_mfrotation_del( * ((MFRotation *)field)); break; case GF_SG_VRML_SFURL: gf_sg_sfurl_del( * ((SFURL *) field)); break; case GF_SG_VRML_MFURL: gf_sg_mfurl_del( * ((MFURL *) field)); break; case GF_SG_VRML_MFATTRREF: gf_sg_mfattrref_del( * ((MFAttrRef *) field)); break; //used only in proto since this field is created by default for regular nodes case GF_SG_VRML_MFNODE: assert(0); return; case GF_SG_VRML_MFSCRIPT: gf_sg_mfscript_del( * ((MFScript *) field)); break; default: assert(0); return; } //free pointer gf_free(field); }
GF_EXPORT void gf_sg_vrml_field_copy(void *dest, void *orig, u32 field_type) { u32 size, i, sf_type; void *dst_field, *orig_field; if (!dest || !orig) return; switch (field_type) { case GF_SG_VRML_SFBOOL: memcpy(dest, orig, sizeof(SFBool)); break; case GF_SG_VRML_SFCOLOR: memcpy(dest, orig, sizeof(SFColor)); break; case GF_SG_VRML_SFFLOAT: memcpy(dest, orig, sizeof(SFFloat)); break; case GF_SG_VRML_SFINT32: memcpy(dest, orig, sizeof(SFInt32)); break; case GF_SG_VRML_SFROTATION: memcpy(dest, orig, sizeof(SFRotation)); break; case GF_SG_VRML_SFTIME: memcpy(dest, orig, sizeof(SFTime)); break; case GF_SG_VRML_SFVEC2F: memcpy(dest, orig, sizeof(SFVec2f)); break; case GF_SG_VRML_SFVEC3F: memcpy(dest, orig, sizeof(SFVec3f)); break; case GF_SG_VRML_SFSTRING: if ( ((SFString*)dest)->buffer) free(((SFString*)dest)->buffer); if ( ((SFString*)orig)->buffer ) ((SFString*)dest)->buffer = strdup(((SFString*)orig)->buffer); else ((SFString*)dest)->buffer = NULL; break; case GF_SG_VRML_SFURL: if ( ((SFURL *)dest)->url ) free( ((SFURL *)dest)->url ); ((SFURL *)dest)->OD_ID = ((SFURL *)orig)->OD_ID; if (((SFURL *)orig)->url) ((SFURL *)dest)->url = strdup(((SFURL *)orig)->url); else ((SFURL *)dest)->url = NULL; break; case GF_SG_VRML_SFIMAGE: if (((SFImage *)dest)->pixels) free(((SFImage *)dest)->pixels); ((SFImage *)dest)->width = ((SFImage *)orig)->width; ((SFImage *)dest)->height = ((SFImage *)orig)->height; ((SFImage *)dest)->numComponents = ((SFImage *)orig)->numComponents; size = ((SFImage *)dest)->width * ((SFImage *)dest)->height * ((SFImage *)dest)->numComponents; ((SFImage *)dest)->pixels = (u8*)malloc(sizeof(char)*size); memcpy(((SFImage *)dest)->pixels, ((SFImage *)orig)->pixels, sizeof(char)*size); break; case GF_SG_VRML_SFCOMMANDBUFFER: gf_sg_sfcommand_del( *(SFCommandBuffer *)dest); ((SFCommandBuffer *)dest)->commandList = gf_list_new(); ((SFCommandBuffer *)dest)->bufferSize = ((SFCommandBuffer *)orig)->bufferSize; if (((SFCommandBuffer *)dest)->bufferSize) { ((SFCommandBuffer *)dest)->buffer = (u8*)malloc(sizeof(char)*((SFCommandBuffer *)orig)->bufferSize); memcpy(((SFCommandBuffer *)dest)->buffer, ((SFCommandBuffer *)orig)->buffer, sizeof(char)*((SFCommandBuffer *)orig)->bufferSize); } else { ((SFCommandBuffer *)dest)->buffer = NULL; } break; /*simply copy text string*/ case GF_SG_VRML_SFSCRIPT: if (((SFScript*)dest)->script_text) free(((SFScript*)dest)->script_text); ((SFScript*)dest)->script_text = NULL; if ( ((SFScript*)orig)->script_text) ((SFScript *)dest)->script_text = (u8*)strdup( (char*) ((SFScript*)orig)->script_text ); break; //MFFields case GF_SG_VRML_MFBOOL: case GF_SG_VRML_MFFLOAT: case GF_SG_VRML_MFTIME: case GF_SG_VRML_MFINT32: case GF_SG_VRML_MFSTRING: case GF_SG_VRML_MFVEC3F: case GF_SG_VRML_MFVEC2F: case GF_SG_VRML_MFCOLOR: case GF_SG_VRML_MFROTATION: case GF_SG_VRML_MFIMAGE: case GF_SG_VRML_MFURL: case GF_SG_VRML_MFSCRIPT: size = ((GenMFField *)orig)->count; gf_sg_vrml_mf_reset(dest, field_type); gf_sg_vrml_mf_alloc(dest, field_type, size); sf_type = gf_sg_vrml_get_sf_type(field_type); //duplicate all items for (i=0; i<size; i++) { gf_sg_vrml_mf_get_item(dest, field_type, &dst_field, i); gf_sg_vrml_mf_get_item(orig, field_type, &orig_field, i); gf_sg_vrml_field_copy(dst_field, orig_field, sf_type); } break; } }