[Bf-blender-cvs] [5ac7e23] master: Blender metadata changes to accommodate non string data

Martijn Berger noreply at git.blender.org
Sat Jan 31 17:20:56 CET 2015


Commit: 5ac7e23e886361f7d74d5d6367e63b688bcda361
Author: Martijn Berger
Date:   Sat Jan 31 17:15:43 2015 +0100
Branches: master
https://developer.blender.org/rB5ac7e23e886361f7d74d5d6367e63b688bcda361

Blender metadata changes to accommodate non string data

Work towards T42418

For now got rid of linked list holding key,value pairs for metadata in favour of ID properties.

Reviewers: campbellbarton, sergey

Reviewed By: sergey

Projects: #bf_blender

Differential Revision: https://developer.blender.org/D872

===================================================================

M	source/blender/imbuf/IMB_imbuf_types.h
M	source/blender/imbuf/intern/IMB_metadata.h
M	source/blender/imbuf/intern/jpeg.c
M	source/blender/imbuf/intern/metadata.c
M	source/blender/imbuf/intern/openexr/openexr_api.cpp
M	source/blender/imbuf/intern/png.c

===================================================================

diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h
index 44cb7f1..867c4a8 100644
--- a/source/blender/imbuf/IMB_imbuf_types.h
+++ b/source/blender/imbuf/IMB_imbuf_types.h
@@ -47,8 +47,6 @@
  * contains an Amiga-format file).
  */
 
-struct ImMetaData;
-
 #define IB_MIPMAP_LEVELS	20
 #define IB_FILENAME_SIZE	1024
 
@@ -111,7 +109,7 @@ typedef struct ImBuf {
 	/* externally used data */
 	int index;						/* reference index for ImBuf lists */
 	int	userflags;					/* used to set imbuf to dirty and other stuff */
-	struct ImMetaData *metadata;	/* image metadata */
+	struct IDProperty *metadata;	/* image metadata */
 	void *userdata;					/* temporary storage, only used by baking at the moment */
 
 	/* file information */
diff --git a/source/blender/imbuf/intern/IMB_metadata.h b/source/blender/imbuf/intern/IMB_metadata.h
index a717764..5d4a002 100644
--- a/source/blender/imbuf/intern/IMB_metadata.h
+++ b/source/blender/imbuf/intern/IMB_metadata.h
@@ -35,13 +35,6 @@
 
 struct ImBuf;
 
-typedef struct ImMetaData {
-	struct ImMetaData *next, *prev;
-	char *key;
-	char *value;
-	int len;
-} ImMetaData;
-
 /** The metadata is a list of key/value pairs (both char *) that can me
  * saved in the header of several image formats.
  * Apart from some common keys like
diff --git a/source/blender/imbuf/intern/jpeg.c b/source/blender/imbuf/intern/jpeg.c
index 6093a14..310e517 100644
--- a/source/blender/imbuf/intern/jpeg.c
+++ b/source/blender/imbuf/intern/jpeg.c
@@ -41,6 +41,8 @@
 #include "BLI_string.h"
 #include "BLI_fileops.h"
 
+#include "BKE_idprop.h"
+
 #include "imbuf.h"
 #include "IMB_imbuf_types.h"
 #include "IMB_imbuf.h"
@@ -479,7 +481,6 @@ static void write_jpeg(struct jpeg_compress_struct *cinfo, struct ImBuf *ibuf)
 	uchar *rect;
 	int x, y;
 	char neogeo[128];
-	ImMetaData *iptr;
 	char *text;
 
 	jpeg_start_compress(cinfo, true);
@@ -491,28 +492,28 @@ static void write_jpeg(struct jpeg_compress_struct *cinfo, struct ImBuf *ibuf)
 	jpeg_write_marker(cinfo, 0xe1, (JOCTET *) neogeo, 10);
 
 	if (ibuf->metadata) {
+		IDProperty *prop;
 		/* key + max value + "Blender" */
 		text = MEM_mallocN(530, "stamp info read");
-		iptr = ibuf->metadata;
-		while (iptr) {
-			if (STREQ(iptr->key, "None")) {
-				jpeg_write_marker(cinfo, JPEG_COM, (JOCTET *) iptr->value, strlen(iptr->value) + 1);
-				goto next_stamp_info;
-			}
+		for (prop = ibuf->metadata->data.group.first; prop; prop = prop->next) {
+			if (prop->type == IDP_STRING) {
+				int text_len;
+				if (!strcmp(prop->name, "None")) {
+					jpeg_write_marker(cinfo, JPEG_COM, (JOCTET *) IDP_String(prop), prop->len + 1);
+				}
 
-			/*
-			 * The JPEG format don't support a pair "key/value"
-			 * like PNG, so we "encode" the stamp in a
-			 * single string:
-			 *	"Blender:key:value"
-			 *
-			 * The first "Blender" is a simple identify to help
-			 * in the read process.
-			 */
-			sprintf(text, "Blender:%s:%s", iptr->key, iptr->value);
-			jpeg_write_marker(cinfo, JPEG_COM, (JOCTET *) text, strlen(text) + 1);
-next_stamp_info:
-			iptr = iptr->next;
+				/*
+				 * The JPEG format don't support a pair "key/value"
+				 * like PNG, so we "encode" the stamp in a
+				 * single string:
+				 *	"Blender:key:value"
+				 *
+				 * The first "Blender" is a simple identify to help
+				 * in the read process.
+				 */
+				text_len = sprintf(text, "Blender:%s:%s", prop->name, IDP_String(prop));
+				jpeg_write_marker(cinfo, JPEG_COM, (JOCTET *) text, text_len + 1);
+			}
 		}
 		MEM_freeN(text);
 	}
diff --git a/source/blender/imbuf/intern/metadata.c b/source/blender/imbuf/intern/metadata.c
index 35d921b..885823a 100644
--- a/source/blender/imbuf/intern/metadata.c
+++ b/source/blender/imbuf/intern/metadata.c
@@ -36,6 +36,8 @@
 #include "BLI_utildefines.h"
 #include "BLI_string.h"
 
+#include "BKE_idprop.h"
+
 #include "MEM_guardedalloc.h"
 
 #include "IMB_imbuf_types.h"
@@ -47,119 +49,84 @@
 
 void IMB_metadata_free(struct ImBuf *img)
 {
-	ImMetaData *info;
-
 	if (!img)
 		return;
 	if (!img->metadata) {
 		return;
 	}
-	info = img->metadata;
-	while (info) {
-		ImMetaData *next = info->next;
-		MEM_freeN(info->key);
-		MEM_freeN(info->value);
-		MEM_freeN(info);
-		info = next;
-	}
+
+	IDP_FreeProperty(img->metadata);
+	MEM_freeN(img->metadata);
 }
 
 bool IMB_metadata_get_field(struct ImBuf *img, const char *key, char *field, const size_t len)
 {
-	ImMetaData *info;
+	IDProperty *prop;
+
 	bool retval = false;
 
 	if (!img)
 		return false;
-	if (!img->metadata) {
+	if (!img->metadata)
 		return false;
-	}
-	info = img->metadata;
-	while (info) {
-		if (STREQ(key, info->key)) {
-			BLI_strncpy(field, info->value, len);
-			retval = true;
-			break;
-		}
-		info = info->next;
+
+	prop = IDP_GetPropertyFromGroup(img->metadata ,key);
+
+	if(prop && prop->type == IDP_STRING){
+		BLI_strncpy(field, IDP_String(prop), len);
+		retval = true;
 	}
 	return retval;
 }
 
 bool IMB_metadata_add_field(struct ImBuf *img, const char *key, const char *value)
 {
-	ImMetaData *info;
-	ImMetaData *last;
+	IDProperty *prop;
 
 	if (!img)
 		return false;
 
 	if (!img->metadata) {
-		img->metadata = MEM_callocN(sizeof(ImMetaData), "ImMetaData");
-		info = img->metadata;
-	}
-	else {
-		info = img->metadata;
-		last = info;
-		while (info) {
-			last = info;
-			info = info->next;
-		}
-		info = MEM_callocN(sizeof(ImMetaData), "ImMetaData");
-		last->next = info;
+		IDPropertyTemplate val;
+		img->metadata = IDP_New(IDP_GROUP, &val, "metadata");
 	}
-	info->key = BLI_strdup(key);
-	info->value = BLI_strdup(value);
-	return true;
+
+	prop = IDP_NewString(value, key, 512);
+	return IDP_AddToGroup(img->metadata, prop);
 }
 
 bool IMB_metadata_del_field(struct ImBuf *img, const char *key)
 {
-	ImMetaData *p, *p1;
+	IDProperty *prop;
 
 	if ((!img) || (!img->metadata))
 		return false;
 
-	p = img->metadata;
-	p1 = NULL;
-	while (p) {
-		if (STREQ(key, p->key)) {
-			if (p1)
-				p1->next = p->next;
-			else
-				img->metadata = p->next;
-
-			MEM_freeN(p->key);
-			MEM_freeN(p->value);
-			MEM_freeN(p);
-			return true;
-		}
-		p1 = p;
-		p = p->next;
+	prop = IDP_GetPropertyFromGroup(img->metadata, key);
+
+	if (prop) {
+		IDP_FreeFromGroup(img->metadata, prop);
 	}
 	return false;
 }
 
 bool IMB_metadata_change_field(struct ImBuf *img, const char *key, const char *field)
 {
-	ImMetaData *p;
+	IDProperty *prop;
 
 	if (!img)
 		return false;
 
-	if (!img->metadata)
-		return (IMB_metadata_add_field(img, key, field));
+	prop = (img->metadata) ? IDP_GetPropertyFromGroup(img->metadata, key) : NULL;
 
-	p = img->metadata;
-	while (p) {
-		if (STREQ(key, p->key)) {
-			MEM_freeN(p->value);
-			p->value = BLI_strdup(field);
-			return true;
-		}
-		p = p->next;
+	if (!prop) {
+		return (IMB_metadata_add_field(img, key, field));
+	}
+	else if (prop->type == IDP_STRING) {
+		IDP_AssignString(prop, field, 1024);
+		return true;
+	}
+	else {
+		return false;
 	}
-
-	return (IMB_metadata_add_field(img, key, field));
 }
-
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index ad19c54..5de2438 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -60,6 +60,8 @@ _CRTIMP void __cdecl _invalid_parameter_noinfo(void)
 #include "BLI_math_color.h"
 #include "BLI_threads.h"
 
+#include "BKE_idprop.h"
+
 #include "IMB_imbuf_types.h"
 #include "IMB_imbuf.h"
 #include "IMB_allocimbuf.h"
@@ -305,10 +307,15 @@ static void openexr_header_compression(Header *header, int compression)
 
 static void openexr_header_metadata(Header *header, struct ImBuf *ibuf)
 {
-	ImMetaData *info;
+	if (ibuf->metadata) {
+		IDProperty *prop;
 
-	for (info = ibuf->metadata; info; info = info->next)
-		header->insert(info->key, StringAttribute(info->value));
+		for (prop = (IDProperty *)ibuf->metadata->data.group.first; prop; prop = prop->next) {
+			if (prop->type == IDP_STRING) {
+				header->insert(prop->name, StringAttribute(IDP_String(prop)));
+			}
+		}
+	}
 
 	if (ibuf->ppm[0] > 0.0)
 		addXDensity(*header, ibuf->ppm[0] / 39.3700787); /* 1 meter = 39.3700787 inches */
diff --git a/source/blender/imbuf/intern/png.c b/source/blender/imbuf/intern/png.c
index 94914db..6b31b3e 100644
--- a/source/blender/imbuf/intern/png.c
+++ b/source/blender/imbuf/intern/png.c
@@ -38,6 +38,7 @@
 #include "BLI_math.h"
 
 #include "BKE_global.h"
+#include "BKE_idprop.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -397,24 +398,25 @@ int imb_savepng(struct ImBuf *ibuf, const char *name, int flags)
 	/* image text info */
 	if (ibuf->metadata) {
 		png_text *metadata;
-		ImMetaData *iptr;
+		IDProperty *prop;
+
 		int num_text = 0;
-		iptr = ibuf->metadata;
-		while (iptr) {
-			num_text++;
-			iptr = iptr->next;
+
+		for (prop = ibuf->metadata->data.group.first; prop; prop = prop->next) {
+			if (prop->type == IDP_STRING){
+				num_text++;
+			}
 		}
 		
 		metadata = MEM_callocN(num_text * sizeof(png_text), "png_metadata");
-		iptr = ibuf->metadata;
 		num_text = 0;
-		while (iptr) {
-			
-			metadata[num_text].compression = PNG_TEXT_COMPRESSION_NONE;
-			metadata[num_text].key = iptr->key;
-			metadata[num_text].text = iptr->value;
-			num_text++;
-			iptr = iptr->next;
+		for (prop = ibuf->metadata->data.group.first; prop; prop = prop->next) {
+			if (prop->type == IDP_STRING){
+				metadata[num_text].compression = PNG_TEXT_COMPRESSION_NONE;
+				metadata[num_text].key = prop->name;
+				metadata[num_text].text = IDP_String(prop);
+				num_text++;
+			}
 		}
 		
 		png_set_text(png_ptr, info_ptr, metadata, num_text);




More information about the Bf-blender-cvs mailing list