static int TIFFWriteDoubleArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, double* v) { dir->tdir_tag = (uint16) tag; dir->tdir_type = (short) type; dir->tdir_count = n; TIFFCvtNativeToIEEEDouble(tif, n, v); return (TIFFWriteData(tif, dir, (char*) v)); }
static int TIFFWriteDoubleArray(TIFF* tif, TIFFDirEntry* dir, double* v) { TIFFCvtNativeToIEEEDouble(tif, dir->s.tdir_count, v); if (TDIRGetEntryCount(tif,dir) <= TDIREntryOffLen(tif) / sizeof(double)) { _TIFFmemcpy(TDIRAddrEntryOff(tif,dir), v, TDIRGetEntryCount(tif,dir) * sizeof(double)); return (1); } return (TIFFWriteData(tif, dir, (char*) v)); }
static int TIFFWriteDoubleArray(TIFF* tif, TIFFDirEntry* dir, double* v) { TIFFCvtNativeToIEEEDouble(tif, dir->tdir_count, v); return (TIFFWriteData(tif, dir, (char*) v)); }
/* The standard function TIFFWriteNormalTag() could definitely be replaced with a simple call to this function, just adding TIFFGetField() as the last argument. */ static int TIFFWriteNormalSubTag(TIFF* tif, TIFFDirEntry* dir, const TIFFFieldInfo* fip, int (*getFieldFn)(TIFF *tif, ttag_t tag, ...)) { u_short wc = (u_short) fip->field_writecount; dir->tdir_tag = fip->field_tag; dir->tdir_type = (u_short) fip->field_type; dir->tdir_count = wc; #define WRITEF(x,y) x(tif, fip->field_type, fip->field_tag, dir, wc, y) switch (fip->field_type) { case TIFF_SHORT: case TIFF_SSHORT: if (wc > 1) { uint16* wp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &wp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &wp); if (!WRITEF(TIFFWriteShortArray, wp)) return (0); } else { uint16 sv; (*getFieldFn)(tif, fip->field_tag, &sv); dir->tdir_offset = TIFFInsertData(tif, dir->tdir_type, sv); } break; case TIFF_LONG: case TIFF_SLONG: if (wc > 1) { uint32* lp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &lp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &lp); if (!WRITEF(TIFFWriteLongArray, lp)) return (0); } else { /* XXX handle LONG->SHORT conversion */ (*getFieldFn)(tif, fip->field_tag, &dir->tdir_offset); } break; case TIFF_RATIONAL: case TIFF_SRATIONAL: if (wc > 1) { float* fp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &fp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &fp); if (!WRITEF(TIFFWriteRationalArray, fp)) return (0); } else { float fv; (*getFieldFn)(tif, fip->field_tag, &fv); if (!WRITEF(TIFFWriteRationalArray, &fv)) return (0); } break; case TIFF_FLOAT: if (wc > 1) { float* fp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &fp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &fp); if (!WRITEF(TIFFWriteFloatArray, fp)) return (0); } else { float fv; (*getFieldFn)(tif, fip->field_tag, &fv); if (!WRITEF(TIFFWriteFloatArray, &fv)) return (0); } break; case TIFF_DOUBLE: /* Hey - I think this is a bug, or at least a "gross inconsistency", in the TIFF library. Look at the original TIFF library code below within the "#if (0) ... #else". Just from the type of *dp, you can see that this code expects TIFFGetField() to be handed a double ** for any TIFF_DOUBLE tag, even for the constant wc==1 case. This is totally inconsistent with other fields (like TIFF_FLOAT, above) and is also inconsistent with the TIFFSetField() function for TIFF_DOUBLEs, which expects to be passed a single double by value for the wc==1 case. (See the handling of TIFFFetchNormalTag() in tif_dirread.c for an example.) Maybe this function was written before TIFFWriteDoubleArray() was written, not that that's an excuse. Anyway, the new code below is a trivial modification of the TIFF_FLOAT code above. The fact that even single doubles get written out in the data segment and get an offset value stored is irrelevant here - that is all handled by TIFFWriteDoubleArray(). */ #if (0) { double* dp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &dp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &dp); TIFFCvtNativeToIEEEDouble(tif, wc, dp); if (!TIFFWriteData(tif, dir, (char*) dp)) return (0); } #else if (wc > 1) { double* dp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &dp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &dp); if (!WRITEF(TIFFWriteDoubleArray, dp)) return (0); } else { double dv; (*getFieldFn)(tif, fip->field_tag, &dv); if (!WRITEF(TIFFWriteDoubleArray, &dv)) return (0); } #endif break; case TIFF_ASCII: { char* cp; (*getFieldFn)(tif, fip->field_tag, &cp); dir->tdir_count = (uint32) (strlen(cp) + 1); if (!TIFFWriteByteArray(tif, dir, cp)) return (0); } break; case TIFF_UNDEFINED: { char* cp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &cp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &cp); if (!TIFFWriteByteArray(tif, dir, cp)) return (0); } break; } return (1); }