From: Lutz M. <lu...@us...> - 2005-08-22 22:17:39
|
Update of /cvsroot/libexif/libexif/libexif/canon In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10193/libexif/canon Modified Files: exif-mnote-data-canon.c mnote-canon-entry.c mnote-canon-entry.h mnote-canon-tag.c mnote-canon-tag.h Log Message: 2005-08-23 Lutz Mueller <lu...@us...> Some work on canon maker notes. Entries that contain several different values now expand to different entries. Index: mnote-canon-tag.c =================================================================== RCS file: /cvsroot/libexif/libexif/libexif/canon/mnote-canon-tag.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -p -d -r1.4 -r1.5 --- mnote-canon-tag.c 17 Mar 2005 16:00:25 -0000 1.4 +++ mnote-canon-tag.c 22 Aug 2005 22:17:31 -0000 1.5 @@ -42,6 +42,19 @@ static struct { {0, NULL, NULL, NULL} }; +static struct { + MnoteCanonTag tag; + unsigned int subtag; + const char *name; +} table_sub[] = { + {MNOTE_CANON_TAG_SETTINGS_2, 7, N_("White balance")}, + {MNOTE_CANON_TAG_SETTINGS_2, 9, N_("Sequence number")}, + {MNOTE_CANON_TAG_SETTINGS_2, 14, N_("AF point used")}, + {MNOTE_CANON_TAG_SETTINGS_2, 15, N_("Flash bias")}, + {MNOTE_CANON_TAG_SETTINGS_2, 19, N_("Subject distance")}, + {0, 0, NULL} +}; + const char * mnote_canon_tag_get_name (MnoteCanonTag t) { @@ -53,6 +66,16 @@ mnote_canon_tag_get_name (MnoteCanonTag } const char * +mnote_canon_tag_get_name_sub (MnoteCanonTag t, unsigned int s) +{ + unsigned int i; + for (i = 0; i < sizeof (table_sub) / sizeof (table_sub[0]); i++) + if ((table_sub[i].tag == t) && (table_sub[i].subtag == s)) + return _(table_sub[i].name); + return mnote_canon_tag_get_name (t); +} + +const char * mnote_canon_tag_get_title (MnoteCanonTag t) { unsigned int i; @@ -64,6 +87,16 @@ mnote_canon_tag_get_title (MnoteCanonTag } const char * +mnote_canon_tag_get_title_sub (MnoteCanonTag t, unsigned int s) +{ + unsigned int i; + for (i = 0; i < sizeof (table_sub) / sizeof (table_sub[0]); i++) + if ((table_sub[i].tag == t) && (table_sub[i].subtag == s)) + return _(table_sub[i].name); + return mnote_canon_tag_get_title (t); +} + +const char * mnote_canon_tag_get_description (MnoteCanonTag t) { unsigned int i; Index: mnote-canon-tag.h =================================================================== RCS file: /cvsroot/libexif/libexif/libexif/canon/mnote-canon-tag.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -p -d -r1.1 -r1.2 --- mnote-canon-tag.h 26 Oct 2003 10:06:17 -0000 1.1 +++ mnote-canon-tag.h 22 Aug 2005 22:17:31 -0000 1.2 @@ -41,9 +41,11 @@ enum _MnoteCanonTag { }; typedef enum _MnoteCanonTag MnoteCanonTag; -const char *mnote_canon_tag_get_name (MnoteCanonTag tag); -const char *mnote_canon_tag_get_title (MnoteCanonTag tag); -const char *mnote_canon_tag_get_description (MnoteCanonTag tag); +const char *mnote_canon_tag_get_name (MnoteCanonTag); +const char *mnote_canon_tag_get_name_sub (MnoteCanonTag, unsigned int); +const char *mnote_canon_tag_get_title (MnoteCanonTag); +const char *mnote_canon_tag_get_title_sub (MnoteCanonTag, unsigned int); +const char *mnote_canon_tag_get_description (MnoteCanonTag); #ifdef __cplusplus } Index: mnote-canon-entry.h =================================================================== RCS file: /cvsroot/libexif/libexif/libexif/canon/mnote-canon-entry.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -p -d -r1.2 -r1.3 --- mnote-canon-entry.h 7 Jan 2004 14:53:04 -0000 1.2 +++ mnote-canon-entry.h 22 Aug 2005 22:17:31 -0000 1.3 @@ -38,6 +38,7 @@ struct _MnoteCanonEntry { ExifByteOrder order; }; -char *mnote_canon_entry_get_value (const MnoteCanonEntry *entry, char *val, unsigned int maxlen); +unsigned int mnote_canon_entry_count_values (const MnoteCanonEntry *); +char *mnote_canon_entry_get_value (const MnoteCanonEntry *, unsigned int t, char *val, unsigned int maxlen); #endif /* __MNOTE_CANON_ENTRY_H__ */ Index: mnote-canon-entry.c =================================================================== RCS file: /cvsroot/libexif/libexif/libexif/canon/mnote-canon-entry.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -p -d -r1.8 -r1.9 --- mnote-canon-entry.c 1 Jul 2005 10:14:56 -0000 1.8 +++ mnote-canon-entry.c 22 Aug 2005 22:17:31 -0000 1.9 @@ -67,286 +67,256 @@ } \ } -char * -mnote_canon_entry_get_value (const MnoteCanonEntry *entry, char *val, unsigned int maxlen) -{ - char buf[128]; - ExifLong vl; - ExifShort vs, n; - int i; - unsigned char *data = entry->data; - - #define UNDEFINED 0xFF static struct { - int tag; - int subtag; - char* value; + unsigned int tag; + unsigned int subtag; + char *value; } entries [] = { - {1,1,N_("Macro")}, - {1,2,N_("Normal")}, - {1,UNDEFINED,N_("%i???")}, - {4,0,N_("Flash not fired")}, - {4,1,N_("auto")}, - {4,2,N_("on")}, - {4,3,N_("red eyes reduction")}, - {4,4,N_("slow synchro")}, - {4,5,N_("auto + red yes reduction")}, - {4,6,N_("on + red eyes reduction")}, - {4,16,N_("external")}, - {4,UNDEFINED,N_("%i???")}, - {5,0,N_("single or timer")}, - {5,1,N_("continuous")}, - {5,UNDEFINED,N_("%i???")}, - {7,0,N_("One-Shot")}, - {7,1,N_("AI Servo")}, - {7,2,N_("AI Focus")}, - {7,3,N_("MF")}, - {7,4,N_("Single")}, - {7,5,N_("Continuous")}, - {7,6,N_("MF")}, - {7,UNDEFINED,N_("%i???")}, - {10,0,N_("Large")}, - {10,1,N_("Medium")}, - {10,2,N_("Small")}, - {10,UNDEFINED,N_("%i???")}, - {11,0,N_("Full Auto")}, - {11,1,N_("Manual")}, - {11,2,N_("Landscape")}, - {11,3,N_("Fast Shutter")}, - {11,4,N_("Slow Shutter")}, - {11,5,N_("Night")}, - {11,6,N_("Black & White")}, - {11,7,N_("Sepia")}, - {11,8,N_("Portrait")}, - {11,9,N_("Sports")}, - {11,10,N_("Macro / Close-Up")}, - {11,11,N_("Pan Focus")}, - {11,UNDEFINED,N_("%i???")}, - {13,0xffff,N_("Low")}, - {13,0x0000,N_("Normal")}, - {13,0x0001,N_("High")}, - {13,UNDEFINED,N_("%i???")}, - {14,0xffff,N_("Low")}, - {14,0x0000,N_("Normal")}, - {14,0x0001,N_("High")}, - {14,UNDEFINED,N_("%i???")}, - {15,0xffff,N_("Low")}, - {15,0x0000,N_("Normal")}, - {15,0x0001,N_("High")}, - {15,UNDEFINED,N_("%i???")}, - {16,15,N_("auto")}, - {16,16,N_("50")}, - {16,17,N_("100")}, - {16,18,N_("200")}, - {16,19,N_("400")}, - {16,UNDEFINED,N_("%i???")}, - {17,3,N_("Evaluative")}, - {17,4,N_("Partial")}, - {17,5,N_("Center-weighted")}, - {17,UNDEFINED,N_("%i???")}, - {19,0x3000,N_("none (MF)")}, - {19,0x3001,N_("auto-selected")}, - {19,0x3002,N_("right")}, - {19,0x3003,N_("center")}, - {19,0x3004,N_("left")}, - {19,UNDEFINED,N_("%i???")}, - {20,0,N_("Easy shooting")}, - {20,1,N_("Program")}, - {20,2,N_("Tv-priority")}, - {20,3,N_("Av-priority")}, - {20,4,N_("Manual")}, - {20,5,N_("A-DEP")}, - {20,UNDEFINED,N_("%i???")}, - {32,0,N_("Single")}, - {32,1,N_("Continuous")}, - {32,UNDEFINED,N_("%i???")}, - - {0,0,NULL} + { 1, 1, N_("Macro")}, + { 1, 2, N_("Normal")}, + { 4, 0, N_("Flash not fired")}, + { 4, 1, N_("auto")}, + { 4, 2, N_("on")}, + { 4, 3, N_("red eyes reduction")}, + { 4, 4, N_("slow synchro")}, + { 4, 5, N_("auto + red yes reduction")}, + { 4, 6, N_("on + red eyes reduction")}, + { 4, 16, N_("external")}, + { 5, 0, N_("single or timer")}, + { 5, 1, N_("continuous")}, + { 7, 0, N_("One-Shot")}, + { 7, 1, N_("AI Servo")}, + { 7, 2, N_("AI Focus")}, + { 7, 3, N_("MF")}, + { 7, 4, N_("Single")}, + { 7, 5, N_("Continuous")}, + { 7, 6, N_("MF")}, + {10, 0, N_("Large")}, + {10, 1, N_("Medium")}, + {10, 2, N_("Small")}, + {11, 0, N_("Full Auto")}, + {11, 1, N_("Manual")}, + {11, 2, N_("Landscape")}, + {11, 3, N_("Fast Shutter")}, + {11, 4, N_("Slow Shutter")}, + {11, 5, N_("Night")}, + {11, 6, N_("Black & White")}, + {11, 7, N_("Sepia")}, + {11, 8, N_("Portrait")}, + {11, 9, N_("Sports")}, + {11, 10, N_("Macro / Close-Up")}, + {11, 11, N_("Pan Focus")}, + {13, 0xffff, N_("Low")}, + {13, 0x0000, N_("Normal")}, + {13, 0x0001, N_("High")}, + {14, 0xffff, N_("Low")}, + {14, 0x0000, N_("Normal")}, + {14, 0x0001, N_("High")}, + {15, 0xffff, N_("Low")}, + {15, 0x0000, N_("Normal")}, + {15, 0x0001, N_("High")}, + {16, 15, N_("auto")}, + {16, 16, N_("50")}, + {16, 17, N_("100")}, + {16, 18, N_("200")}, + {16, 19, N_("400")}, + {17, 3, N_("Evaluative")}, + {17, 4, N_("Partial")}, + {17, 5, N_("Center-weighted")}, + {19, 0x3000, N_("none (MF)")}, + {19, 0x3001, N_("auto-selected")}, + {19, 0x3002, N_("right")}, + {19, 0x3003, N_("center")}, + {19, 0x3004, N_("left")}, + {20, 0, N_("Easy shooting")}, + {20, 1, N_("Program")}, + {20, 2, N_("Tv-priority")}, + {20, 3, N_("Av-priority")}, + {20, 4, N_("Manual")}, + {20, 5, N_("A-DEP")}, + {32, 0, N_("Single")}, + {32, 1, N_("Continuous")}, + { 0, 0, NULL} }; static struct { - int index; - char* value; + unsigned int tag; + char *value; } headings[] = { - {1,N_("Macro mode")}, - {4,N_(" / Flash mode : ")}, - {5,N_(" / Continuous drive mode : ")}, - {7,N_(" / Focus mode : ")}, - {10,N_(" / Image size : ")}, - {11,N_(" / Easy shooting mode : ")}, - {13,N_(" / Contrast : ")}, - {14,N_(" / Saturation : ")}, - {15,N_(" / Sharpness : ")}, - {16,N_(" / ISO : ")}, - {17,N_(" / Metering mode : ")}, - {19,N_(" / AF point selected : ")}, - {20,N_(" / Exposure mode : ")}, - {32,N_(" / Focus mode2 : ")}, + { 1, N_("Macro mode")}, + { 4, N_(" / Flash mode : ")}, + { 5, N_(" / Continuous drive mode : ")}, + { 7, N_(" / Focus mode : ")}, + {10, N_(" / Image size : ")}, + {11, N_(" / Easy shooting mode : ")}, + {13, N_(" / Contrast : ")}, + {14, N_(" / Saturation : ")}, + {15, N_(" / Sharpness : ")}, + {16, N_(" / ISO : ")}, + {17, N_(" / Metering mode : ")}, + {19, N_(" / AF point selected : ")}, + {20, N_(" / Exposure mode : ")}, + {32, N_(" / Focus mode2 : ")}, + { 0, NULL} +}; - {0,NULL} +unsigned int +mnote_canon_entry_count_values (const MnoteCanonEntry *entry) +{ + if (!entry) return 0; -}; + switch (entry->tag) { + case MNOTE_CANON_TAG_SETTINGS_1: + case MNOTE_CANON_TAG_SETTINGS_2: + case MNOTE_CANON_TAG_CUSTOM_FUNCS: + if (entry->format != EXIF_FORMAT_SHORT) return 0; + return exif_get_short (entry->data, entry->order) / 2; + default: + return 1; + } +} +char * +mnote_canon_entry_get_value (const MnoteCanonEntry *entry, unsigned int t, char *val, unsigned int maxlen) +{ + char buf[128]; + ExifLong vl; + ExifShort vs, n; + unsigned int i, j, k; + unsigned char *data = entry->data; - if (!entry) return NULL; + if (!entry) return NULL; - memset (val, 0, maxlen); - maxlen--; + memset (val, 0, maxlen); + maxlen--; - switch (entry->tag) { + switch (entry->tag) { case MNOTE_CANON_TAG_SETTINGS_1: CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen); n = exif_get_short (data, entry->order) / 2; - data += 2; + if (t >= n) return NULL; CC (entry->components, n, val, maxlen); - for (i = 1; i < n; i++) { - vs = exif_get_short (data, entry->order); - data += 2; - switch (i) { - case 2: - if (vs) { - snprintf (buf, sizeof (buf), - _(" / Self Timer : %i (ms)"), vs*100); - strncat (val, buf, maxlen - strlen(val)); - } - break; - case 23: - snprintf (buf, sizeof (buf), _(" / long focal length of lens (in focal units) : %u"), vs); - strncat (val, buf, maxlen - strlen(val)); - break; - case 24: - snprintf (buf, sizeof (buf), _(" / short focal length of lens (in focal units) : %u"), vs); - strncat (val, buf, maxlen - strlen(val)); - break; - case 25: - snprintf (buf, sizeof (buf), _(" / focal units per mm : %u"), vs); - strncat (val, buf, maxlen - strlen(val)); - break; - case 29: - strncat (val, _(" / Flash details : "), maxlen - strlen(val)); - if ((vs>>14)&1) - strncat (val, _("External E-TTL"), maxlen - strlen(val)); - if ((vs>>13)&1) - strncat (val, _("Internal flash"), maxlen - strlen(val)); - if ((vs>>11)&1) - strncat (val, _("FP sync used"), maxlen - strlen(val)); - if ((vs>>4)&1) - strncat (val, _("FP sync enabled"), maxlen - strlen(val)); -#ifdef DEBUG - printf ("Value29=0x%08x\n", vs); -#endif - break; - default: - { - int index; - int found = 0; - for (index=0; entries[index].tag <= i && entries[index].value && vs && !found; i++) { - if (entries[index].tag == i) { - int a=0; - for (a=0; headings[a].index != i; a++); - strncat (val, headings[a].value, maxlen - strlen(val)); + vs = exif_get_short (entry->data + 2 + t * 2, entry->order); + switch (t) { + case 0: + break; + case 2: + if (vs) { + snprintf (buf, sizeof (buf), _(" / Self Timer : %i (ms)"), vs*100); + strncat (val, buf, maxlen - strlen(val)); + } + break; + case 23: + snprintf (buf, sizeof (buf), _(" / long focal length of lens (in focal units) : %u"), vs); + strncat (val, buf, maxlen - strlen(val)); + break; + case 24: + snprintf (buf, sizeof (buf), _(" / short focal length of lens (in focal units) : %u"), vs); + strncat (val, buf, maxlen - strlen(val)); + break; + case 25: + snprintf (buf, sizeof (buf), _(" / focal units per mm : %u"), vs); + strncat (val, buf, maxlen - strlen(val)); + break; + case 29: + strncat (val, _(" / Flash details : "), maxlen - strlen(val)); + if ((vs>>14)&1) + strncat (val, _("External E-TTL"), maxlen - strlen(val)); + if ((vs>>13)&1) + strncat (val, _("Internal flash"), maxlen - strlen(val)); + if ((vs>>11)&1) + strncat (val, _("FP sync used"), maxlen - strlen(val)); + if ((vs>>4)&1) + strncat (val, _("FP sync enabled"), maxlen - strlen(val)); + break; + default: - if (entries[index].subtag == vs) { - strncat(val,entries[index].value, maxlen - strlen(val)); - found = 1; - } - if (entries[index].subtag == UNDEFINED) { - snprintf (buf, sizeof (buf), entries[index].value, vs); - strncat (val, buf, maxlen - strlen(val)); - found = 1; + /* Title of tag */ + for (k = 0; (headings[k].tag != t) && headings[k].tag; k++); + strncat (val, + headings[k].value ? headings[k].value : _(" / Unknown : "), + maxlen - strlen (val)); - } - } - } - if (!found) - printf ("Value%d=%d\n", i, vs); - } - } - } // for + /* Value of tag */ + for (j = 0; entries[j].tag && ((entries[j].tag < t) || + ((entries[j].tag == i) && entries[j].subtag <= vs)); j++) + if ((entries[j].tag == i) && (entries[j].subtag == vs)) break; + if ((entries[j].tag != i) || (entries[j].subtag != vs)) break; - break; + if (entries[j].subtag == vs) + strncat (val, entries[j]. value, maxlen - strlen (val)); + else { + snprintf (buf, sizeof (buf), entries[j].value, vs); + strncat (val, buf, maxlen - strlen (val)); + } + } + break; case MNOTE_CANON_TAG_SETTINGS_2: CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen); - n = exif_get_short (data, entry->order)/2; - data += 2; + n = exif_get_short (data, entry->order) / 2; + if (t >= n) return NULL; CC (entry->components, n, val, maxlen); -#ifdef DEBUG - printf ("Setting2 size %d %d\n",n,entry->size); -#endif - for (i=1;i<n;i++) - { - vs = exif_get_short (data, entry->order); - data+=2; - switch(i) { - case 7: - strncpy (val, _("White balance : "), maxlen - strlen(val)); - switch (vs) { - case 0: - strncat (val, _("Auto"), maxlen - strlen(val)); - break; - case 1: - strncat (val, _("Sunny"), maxlen - strlen(val)); - break; - case 2: - strncat (val, _("Cloudy"), maxlen - strlen(val)); - break; - case 3: - strncat (val, _("Tungsten"), maxlen - strlen(val)); - break; - case 4: - strncat (val, _("Flourescent"), maxlen - strlen(val)); - break; - case 5: - strncat (val, _("Flash"), maxlen - strlen(val)); - break; - case 6: - strncat (val, _("Custom"), maxlen - strlen(val)); - break; - default: - snprintf (buf, sizeof (buf), _("%i???"), vs); - strncat (val, buf, maxlen - strlen(val)); - } + vs = exif_get_short (entry->data + 2 + t * 2, entry->order); + switch (t) { + case 7: + switch (vs) { + case 0: + strncpy (val, _("Auto"), maxlen - strlen (val)); break; - case 9: - snprintf (buf, sizeof (buf), _(" / Sequence number : %u"), vs); - strncat (val, buf, maxlen - strlen(val)); + case 1: + strncpy (val, _("Sunny"), maxlen - strlen (val)); break; - case 14: - if (vs>>12) - { - strncat (val, _(" / AF point used : "), maxlen - strlen(val)); - if (vs&1) - strncat (val, _("Right"), maxlen - strlen(val)); - if ((vs>>1)&1) - strncat (val, _("Center"), maxlen - strlen(val)); - if ((vs>>2)&1) - strncat (val, _("Left"), maxlen - strlen(val)); - snprintf (buf, sizeof (buf), _(" (%u available focus point)"), vs>>12); - strncat (val, buf, maxlen - strlen(val)); - } -#ifdef DEBUG - printf ("0x%08x\n", vs); -#endif + case 2: + strncpy (val, _("Cloudy"), maxlen - strlen (val)); break; - case 15: - snprintf (buf, sizeof (buf), _(" / Flash bias : %.2f EV"), vs/32.0); - strncat (val, buf, maxlen - strlen(val)); - + case 3: + strncpy (val, _("Tungsten"), maxlen - strlen (val)); break; - case 19: - snprintf (buf, sizeof (buf), _(" / Subject Distance (mm) : %u"), vs); - strncat (val, buf, maxlen - strlen(val)); + case 4: + strncpy (val, _("Flourescent"), maxlen - strlen (val)); + break; + case 5: + strncpy (val, _("Flash"), maxlen - strlen (val)); + break; + case 6: + strncpy (val, _("Custom"), maxlen - strlen (val)); break; -#ifdef DEBUG default: - printf ("Value%d=%d\n", i, vs); -#endif + snprintf (buf, sizeof (buf), "%i", vs); + strncpy (val, buf, maxlen - strlen (val)); + } + break; + case 9: + snprintf (buf, sizeof (buf), "%u", vs); + strncpy (val, buf, maxlen - strlen (val)); + break; + case 14: + if (vs >> 12) { + if (vs & 1) + strncpy (val, _("Right"), maxlen - strlen (val)); + if ((vs >> 1) & 1) + strncpy (val, _("Center"), maxlen - strlen (val)); + if ((vs >> 2) & 1) + strncpy (val, _("Left"), maxlen - strlen (val)); + if (vs >> 12 == 1) + snprintf (buf, sizeof (buf), _(" (1 available focus point)")); + else + snprintf (buf, sizeof (buf), _(" (%u available focus point)"), vs >> 12); + strncat (val, buf, maxlen - strlen (val)); } + break; + case 15: + snprintf (buf, sizeof (buf), _("%.2f EV"), vs / 32.); + strncpy (val, buf, maxlen - strlen (val)); + break; + case 19: + snprintf (buf, sizeof (buf), _("%u mm"), vs); + strncpy (val, buf, maxlen - strlen (val)); + break; } - break; case MNOTE_CANON_TAG_IMAGE_TYPE: @@ -380,19 +350,12 @@ static struct { case MNOTE_CANON_TAG_CUSTOM_FUNCS: CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen); - n = exif_get_short (data, entry->order)/2; - data+=2; + n = exif_get_short (data, entry->order) / 2; + if (t >= n) return NULL; CC (entry->components, n, val, maxlen); -#ifdef DEBUG - printf ("Custom Function size %d %d\n",n,entry->size); -#endif - for (i=1;i<n;i++) - { - vs = exif_get_short (data, entry->order); - data += 2; - snprintf (buf, sizeof(buf), _("C.F%d : %u"), i, vs); - strncat (val, buf, maxlen - strlen(val)); - } + vs = exif_get_short (data + 2 + 2 * t, entry->order); + snprintf (buf, sizeof (buf), "%u", vs); + strncat (val, buf, maxlen - strlen (val)); break; default: @@ -413,6 +376,6 @@ static struct { strncpy (val, data, MIN (entry->size, maxlen)); #endif break; - } - return val; + } + return val; } Index: exif-mnote-data-canon.c =================================================================== RCS file: /cvsroot/libexif/libexif/libexif/canon/exif-mnote-data-canon.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -p -d -r1.12 -r1.13 --- exif-mnote-data-canon.c 22 Mar 2005 01:27:10 -0000 1.12 +++ exif-mnote-data-canon.c 22 Aug 2005 22:17:31 -0000 1.13 @@ -60,14 +60,33 @@ exif_mnote_data_canon_free (ExifMnoteDat exif_mnote_data_canon_clear ((ExifMnoteDataCanon *) n); } +static void +exif_mnote_data_canon_get_tags (ExifMnoteDataCanon *dc, unsigned int n, + unsigned int *m, unsigned int *s) +{ + unsigned int from = 0, to; + + if (!dc || !m) return; + for (*m = 1; *m < dc->count; (*m)++) { + to = from + mnote_canon_entry_count_values (&dc->entries[*m]); + if (to > n) { + if (s) *s = n - from; + break; + } + from = to; + } +} + static char * exif_mnote_data_canon_get_value (ExifMnoteData *note, unsigned int n, char *val, unsigned int maxlen) { - ExifMnoteDataCanon *cnote = (ExifMnoteDataCanon *) note; + ExifMnoteDataCanon *dc = (ExifMnoteDataCanon *) note; + unsigned int m, s; - if (!note) return NULL; - if (cnote->count <= n) return NULL; - return mnote_canon_entry_get_value (&cnote->entries[n], val, maxlen); + if (!dc) return NULL; + exif_mnote_data_canon_get_tags (dc, n, &m, &s); + if (m >= dc->count) return NULL; + return mnote_canon_entry_get_value (&dc->entries[m], s, val, maxlen); } static void @@ -176,80 +195,93 @@ exif_mnote_data_canon_load (ExifMnoteDat /* Parse the entries */ for (i = 0; i < c; i++) { - o = 6 + 2 + n->offset + 12 * i; - if (o + 8 > buf_size) return; + o = 6 + 2 + n->offset + 12 * i; + if (o + 8 > buf_size) return; - n->count = i + 1; - n->entries = exif_mem_realloc (ne->mem, n->entries, - sizeof (MnoteCanonEntry) * (i+1)); - memset (&n->entries[i], 0, sizeof (MnoteCanonEntry)); - n->entries[i].tag = exif_get_short (buf + o, n->order); - n->entries[i].format = exif_get_short (buf + o + 2, n->order); - n->entries[i].components = exif_get_long (buf + o + 4, n->order); - n->entries[i].order = n->order; + n->count = i + 1; + n->entries = exif_mem_realloc (ne->mem, n->entries, + sizeof (MnoteCanonEntry) * (i+1)); + memset (&n->entries[i], 0, sizeof (MnoteCanonEntry)); + n->entries[i].tag = exif_get_short (buf + o, n->order); + n->entries[i].format = exif_get_short (buf + o + 2, n->order); + n->entries[i].components = exif_get_long (buf + o + 4, n->order); + n->entries[i].order = n->order; - /* - * Size? If bigger than 4 bytes, the actual data is not - * in the entry but somewhere else (offset). - */ - s = exif_format_get_size (n->entries[i].format) * - n->entries[i].components; - if (!s) return; - o += 8; - if (s > 4) o = exif_get_long (buf + o, n->order) + 6; - if (o + s > buf_size) return; - - /* Sanity check */ - n->entries[i].data = exif_mem_alloc (ne->mem, sizeof (char) * s); - if (!n->entries[i].data) return; - n->entries[i].size = s; - memcpy (n->entries[i].data, buf + o, s); + /* + * Size? If bigger than 4 bytes, the actual data is not + * in the entry but somewhere else (offset). + */ + s = exif_format_get_size (n->entries[i].format) * n->entries[i].components; + if (!s) return; + o += 8; + if (s > 4) o = exif_get_long (buf + o, n->order) + 6; + if (o + s > buf_size) return; + + /* Sanity check */ + n->entries[i].data = exif_mem_alloc (ne->mem, sizeof (char) * s); + if (!n->entries[i].data) return; + n->entries[i].size = s; + memcpy (n->entries[i].data, buf + o, s); } } static unsigned int exif_mnote_data_canon_count (ExifMnoteData *n) { - return n ? ((ExifMnoteDataCanon *) n)->count : 0; + ExifMnoteDataCanon *dc = (ExifMnoteDataCanon *) n; + unsigned int i, c; + + for (i = c = 0; dc && (i < dc->count); i++) + c += mnote_canon_entry_count_values (&dc->entries[i]); + return c; } static unsigned int -exif_mnote_data_canon_get_id (ExifMnoteData *d, unsigned int n) +exif_mnote_data_canon_get_id (ExifMnoteData *d, unsigned int i) { - ExifMnoteDataCanon *note = (ExifMnoteDataCanon *) d; + ExifMnoteDataCanon *dc = (ExifMnoteDataCanon *) d; + unsigned int m; - if (!note) return 0; - if (note->count <= n) return 0; - return note->entries[n].tag; + if (!dc) return 0; + exif_mnote_data_canon_get_tags (dc, i, &m, NULL); + if (m >= dc->count) return 0; + return dc->entries[m].tag; } static const char * exif_mnote_data_canon_get_name (ExifMnoteData *note, unsigned int i) { - ExifMnoteDataCanon *cnote = (ExifMnoteDataCanon *) note; + ExifMnoteDataCanon *dc = (ExifMnoteDataCanon *) note; + unsigned int m, s; - if (!note) return NULL; - if (i >= cnote->count) return NULL; - return mnote_canon_tag_get_name (cnote->entries[i].tag); + if (!dc) return NULL; + exif_mnote_data_canon_get_tags (dc, i, &m, &s); + if (m >= dc->count) return NULL; + return mnote_canon_tag_get_name_sub (dc->entries[m].tag, s); } static const char * exif_mnote_data_canon_get_title (ExifMnoteData *note, unsigned int i) { - ExifMnoteDataCanon *cnote = (ExifMnoteDataCanon *) note; + ExifMnoteDataCanon *dc = (ExifMnoteDataCanon *) note; + unsigned int m, s; - if (!note) return NULL; - if (i >= cnote->count) return NULL; - return mnote_canon_tag_get_title (cnote->entries[i].tag); + if (!dc) return NULL; + exif_mnote_data_canon_get_tags (dc, i, &m, &s); + if (m >= dc->count) return NULL; + return mnote_canon_tag_get_title_sub (dc->entries[m].tag, s); } static const char * exif_mnote_data_canon_get_description (ExifMnoteData *note, unsigned int i) { - ExifMnoteDataCanon *cnote = (ExifMnoteDataCanon *) note; - if (!note) return NULL; - if (i >= cnote->count) return NULL; - return mnote_canon_tag_get_description (cnote->entries[i].tag); + ExifMnoteDataCanon *dc = (ExifMnoteDataCanon *) note; + unsigned int m; + + if (!dc) return NULL; + exif_mnote_data_canon_get_tags (dc, i, &m, NULL); + if (m >= dc->count) return NULL; + return mnote_canon_tag_get_description (dc->entries[m].tag); } ExifMnoteData * |