12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912 |
- /* $Id: tif_dirwrite.c,v 1.78 2015-05-31 00:38:46 bfriesen Exp $ */
- /*
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
- /*
- * TIFF Library.
- *
- * Directory Write Support Routines.
- */
- #include "tiffiop.h"
- #ifdef HAVE_IEEEFP
- #define TIFFCvtNativeToIEEEFloat(tif, n, fp)
- #define TIFFCvtNativeToIEEEDouble(tif, n, dp)
- #else
- extern void TIFFCvtNativeToIEEEFloat(TIFF* tif, uint32 n, float* fp);
- extern void TIFFCvtNativeToIEEEDouble(TIFF* tif, uint32 n, double* dp);
- #endif
- static int TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff);
- static int TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
- #if 0
- static int TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
- #endif
- static int TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value);
- static int TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
- #endif
- static int TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
- #if 0
- static int TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
- #endif
- #ifdef notdef
- static int TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
- #endif
- static int TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value);
- #if 0
- static int TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
- #endif
- static int TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
- static int TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value);
- static int TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
- #endif
- static int TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value);
- #if 0
- static int TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
- #endif
- static int TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
- static int TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
- #if 0
- static int TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
- #endif
- #ifdef notdef
- static int TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
- #endif
- static int TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value);
- #if 0
- static int TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
- #endif
- #ifdef notdef
- static int TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value);
- #endif
- static int TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value);
- #endif
- static int TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value);
- static int TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
- static int TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
- static int TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
- #endif
- static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
- #if 0
- static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
- #endif
- #ifdef notdef
- static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
- #endif
- static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
- #if 0
- static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
- #endif
- static int TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
- #endif
- static int TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
- static int TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
- static int TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
- #endif
- static int TIFFWriteDirectoryTagColormap(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
- static int TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
- static int TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
- static int TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value);
- static int TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
- #endif
- static int TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
- #endif
- static int TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value);
- static int TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
- static int TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
- #endif
- static int TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value);
- static int TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
- static int TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
- #endif
- static int TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value);
- #endif
- static int TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value);
- #endif
- static int TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value);
- static int TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
- static int TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
- static int TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
- #endif
- static int TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
- #ifdef notdef
- static int TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
- #endif
- static int TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
- static int TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
- static int TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
- static int TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data);
- static int TIFFLinkDirectory(TIFF*);
- /*
- * Write the contents of the current directory
- * to the specified file. This routine doesn't
- * handle overwriting a directory with auxiliary
- * storage that's been changed.
- */
- int
- TIFFWriteDirectory(TIFF* tif)
- {
- return TIFFWriteDirectorySec(tif,TRUE,TRUE,NULL);
- }
- /*
- * Similar to TIFFWriteDirectory(), writes the directory out
- * but leaves all data structures in memory so that it can be
- * written again. This will make a partially written TIFF file
- * readable before it is successfully completed/closed.
- */
- int
- TIFFCheckpointDirectory(TIFF* tif)
- {
- int rc;
- /* Setup the strips arrays, if they haven't already been. */
- if (tif->tif_dir.td_stripoffset == NULL)
- (void) TIFFSetupStrips(tif);
- rc = TIFFWriteDirectorySec(tif,TRUE,FALSE,NULL);
- (void) TIFFSetWriteOffset(tif, TIFFSeekFile(tif, 0, SEEK_END));
- return rc;
- }
- int
- TIFFWriteCustomDirectory(TIFF* tif, uint64* pdiroff)
- {
- return TIFFWriteDirectorySec(tif,FALSE,FALSE,pdiroff);
- }
- /*
- * Similar to TIFFWriteDirectory(), but if the directory has already
- * been written once, it is relocated to the end of the file, in case it
- * has changed in size. Note that this will result in the loss of the
- * previously used directory space.
- */
- int
- TIFFRewriteDirectory( TIFF *tif )
- {
- static const char module[] = "TIFFRewriteDirectory";
- /* We don't need to do anything special if it hasn't been written. */
- if( tif->tif_diroff == 0 )
- return TIFFWriteDirectory( tif );
- /*
- * Find and zero the pointer to this directory, so that TIFFLinkDirectory
- * will cause it to be added after this directories current pre-link.
- */
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- if (tif->tif_header.classic.tiff_diroff == tif->tif_diroff)
- {
- tif->tif_header.classic.tiff_diroff = 0;
- tif->tif_diroff = 0;
- TIFFSeekFile(tif,4,SEEK_SET);
- if (!WriteOK(tif, &(tif->tif_header.classic.tiff_diroff),4))
- {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Error updating TIFF header");
- return (0);
- }
- }
- else
- {
- uint32 nextdir;
- nextdir = tif->tif_header.classic.tiff_diroff;
- while(1) {
- uint16 dircount;
- uint32 nextnextdir;
- if (!SeekOK(tif, nextdir) ||
- !ReadOK(tif, &dircount, 2)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory count");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabShort(&dircount);
- (void) TIFFSeekFile(tif,
- nextdir+2+dircount*12, SEEK_SET);
- if (!ReadOK(tif, &nextnextdir, 4)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory link");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong(&nextnextdir);
- if (nextnextdir==tif->tif_diroff)
- {
- uint32 m;
- m=0;
- (void) TIFFSeekFile(tif,
- nextdir+2+dircount*12, SEEK_SET);
- if (!WriteOK(tif, &m, 4)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
- return (0);
- }
- tif->tif_diroff=0;
- break;
- }
- nextdir=nextnextdir;
- }
- }
- }
- else
- {
- if (tif->tif_header.big.tiff_diroff == tif->tif_diroff)
- {
- tif->tif_header.big.tiff_diroff = 0;
- tif->tif_diroff = 0;
- TIFFSeekFile(tif,8,SEEK_SET);
- if (!WriteOK(tif, &(tif->tif_header.big.tiff_diroff),8))
- {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Error updating TIFF header");
- return (0);
- }
- }
- else
- {
- uint64 nextdir;
- nextdir = tif->tif_header.big.tiff_diroff;
- while(1) {
- uint64 dircount64;
- uint16 dircount;
- uint64 nextnextdir;
- if (!SeekOK(tif, nextdir) ||
- !ReadOK(tif, &dircount64, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory count");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&dircount64);
- if (dircount64>0xFFFF)
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Sanity check on tag count failed, likely corrupt TIFF");
- return (0);
- }
- dircount=(uint16)dircount64;
- (void) TIFFSeekFile(tif,
- nextdir+8+dircount*20, SEEK_SET);
- if (!ReadOK(tif, &nextnextdir, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory link");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&nextnextdir);
- if (nextnextdir==tif->tif_diroff)
- {
- uint64 m;
- m=0;
- (void) TIFFSeekFile(tif,
- nextdir+8+dircount*20, SEEK_SET);
- if (!WriteOK(tif, &m, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
- return (0);
- }
- tif->tif_diroff=0;
- break;
- }
- nextdir=nextnextdir;
- }
- }
- }
- /*
- * Now use TIFFWriteDirectory() normally.
- */
- return TIFFWriteDirectory( tif );
- }
- static int
- TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff)
- {
- static const char module[] = "TIFFWriteDirectorySec";
- uint32 ndir;
- TIFFDirEntry* dir;
- uint32 dirsize;
- void* dirmem;
- uint32 m;
- if (tif->tif_mode == O_RDONLY)
- return (1);
- _TIFFFillStriles( tif );
-
- /*
- * Clear write state so that subsequent images with
- * different characteristics get the right buffers
- * setup for them.
- */
- if (imagedone)
- {
- if (tif->tif_flags & TIFF_POSTENCODE)
- {
- tif->tif_flags &= ~TIFF_POSTENCODE;
- if (!(*tif->tif_postencode)(tif))
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Error post-encoding before directory write");
- return (0);
- }
- }
- (*tif->tif_close)(tif); /* shutdown encoder */
- /*
- * Flush any data that might have been written
- * by the compression close+cleanup routines. But
- * be careful not to write stuff if we didn't add data
- * in the previous steps as the "rawcc" data may well be
- * a previously read tile/strip in mixed read/write mode.
- */
- if (tif->tif_rawcc > 0
- && (tif->tif_flags & TIFF_BEENWRITING) != 0 )
- {
- if( !TIFFFlushData1(tif) )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error flushing data before directory write");
- return (0);
- }
- }
- if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
- {
- _TIFFfree(tif->tif_rawdata);
- tif->tif_rawdata = NULL;
- tif->tif_rawcc = 0;
- tif->tif_rawdatasize = 0;
- tif->tif_rawdataoff = 0;
- tif->tif_rawdataloaded = 0;
- }
- tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP);
- }
- dir=NULL;
- dirmem=NULL;
- dirsize=0;
- while (1)
- {
- ndir=0;
- if (isimage)
- {
- if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS))
- {
- if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGEWIDTH,tif->tif_dir.td_imagewidth))
- goto bad;
- if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGELENGTH,tif->tif_dir.td_imagelength))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS))
- {
- if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILEWIDTH,tif->tif_dir.td_tilewidth))
- goto bad;
- if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILELENGTH,tif->tif_dir.td_tilelength))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_RESOLUTION))
- {
- if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XRESOLUTION,tif->tif_dir.td_xresolution))
- goto bad;
- if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YRESOLUTION,tif->tif_dir.td_yresolution))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_POSITION))
- {
- if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XPOSITION,tif->tif_dir.td_xposition))
- goto bad;
- if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YPOSITION,tif->tif_dir.td_yposition))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_SUBFILETYPE))
- {
- if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_SUBFILETYPE,tif->tif_dir.td_subfiletype))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
- {
- if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_BITSPERSAMPLE,tif->tif_dir.td_bitspersample))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_COMPRESSION))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_COMPRESSION,tif->tif_dir.td_compression))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PHOTOMETRIC,tif->tif_dir.td_photometric))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_THRESHHOLDING))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_THRESHHOLDING,tif->tif_dir.td_threshholding))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_FILLORDER))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_FILLORDER,tif->tif_dir.td_fillorder))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_ORIENTATION))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_ORIENTATION,tif->tif_dir.td_orientation))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_SAMPLESPERPIXEL,tif->tif_dir.td_samplesperpixel))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP))
- {
- if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_ROWSPERSTRIP,tif->tif_dir.td_rowsperstrip))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE))
- {
- if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MINSAMPLEVALUE,tif->tif_dir.td_minsamplevalue))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE))
- {
- if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MAXSAMPLEVALUE,tif->tif_dir.td_maxsamplevalue))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_PLANARCONFIG))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PLANARCONFIG,tif->tif_dir.td_planarconfig))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_RESOLUTIONUNIT,tif->tif_dir.td_resolutionunit))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_PAGENUMBER))
- {
- if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_PAGENUMBER,2,&tif->tif_dir.td_pagenumber[0]))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_STRIPBYTECOUNTS))
- {
- if (!isTiled(tif))
- {
- if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount))
- goto bad;
- }
- else
- {
- if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount))
- goto bad;
- }
- }
- if (TIFFFieldSet(tif,FIELD_STRIPOFFSETS))
- {
- if (!isTiled(tif))
- {
- if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset))
- goto bad;
- }
- else
- {
- if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset))
- goto bad;
- }
- }
- if (TIFFFieldSet(tif,FIELD_COLORMAP))
- {
- if (!TIFFWriteDirectoryTagColormap(tif,&ndir,dir))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES))
- {
- if (tif->tif_dir.td_extrasamples)
- {
- uint16 na;
- uint16* nb;
- TIFFGetFieldDefaulted(tif,TIFFTAG_EXTRASAMPLES,&na,&nb);
- if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_EXTRASAMPLES,na,nb))
- goto bad;
- }
- }
- if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT))
- {
- if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_SAMPLEFORMAT,tif->tif_dir.td_sampleformat))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE))
- {
- if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMINSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_sminsamplevalue))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE))
- {
- if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMAXSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_smaxsamplevalue))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH))
- {
- if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_IMAGEDEPTH,tif->tif_dir.td_imagedepth))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_TILEDEPTH))
- {
- if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_TILEDEPTH,tif->tif_dir.td_tiledepth))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS))
- {
- if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_HALFTONEHINTS,2,&tif->tif_dir.td_halftonehints[0]))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
- {
- if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_YCBCRSUBSAMPLING,2,&tif->tif_dir.td_ycbcrsubsampling[0]))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_YCBCRPOSITIONING,tif->tif_dir.td_ycbcrpositioning))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE))
- {
- if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,TIFFTAG_REFERENCEBLACKWHITE,6,tif->tif_dir.td_refblackwhite))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION))
- {
- if (!TIFFWriteDirectoryTagTransferfunction(tif,&ndir,dir))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_INKNAMES))
- {
- if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,TIFFTAG_INKNAMES,tif->tif_dir.td_inknameslen,tif->tif_dir.td_inknames))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_SUBIFD))
- {
- if (!TIFFWriteDirectoryTagSubifd(tif,&ndir,dir))
- goto bad;
- }
- {
- uint32 n;
- for (n=0; n<tif->tif_nfields; n++) {
- const TIFFField* o;
- o = tif->tif_fields[n];
- if ((o->field_bit>=FIELD_CODEC)&&(TIFFFieldSet(tif,o->field_bit)))
- {
- switch (o->get_field_type)
- {
- case TIFF_SETGET_ASCII:
- {
- uint32 pa;
- char* pb;
- assert(o->field_type==TIFF_ASCII);
- assert(o->field_readcount==TIFF_VARIABLE);
- assert(o->field_passcount==0);
- TIFFGetField(tif,o->field_tag,&pb);
- pa=(uint32)(strlen(pb));
- if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,o->field_tag,pa,pb))
- goto bad;
- }
- break;
- case TIFF_SETGET_UINT16:
- {
- uint16 p;
- assert(o->field_type==TIFF_SHORT);
- assert(o->field_readcount==1);
- assert(o->field_passcount==0);
- TIFFGetField(tif,o->field_tag,&p);
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,o->field_tag,p))
- goto bad;
- }
- break;
- case TIFF_SETGET_UINT32:
- {
- uint32 p;
- assert(o->field_type==TIFF_LONG);
- assert(o->field_readcount==1);
- assert(o->field_passcount==0);
- TIFFGetField(tif,o->field_tag,&p);
- if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,o->field_tag,p))
- goto bad;
- }
- break;
- case TIFF_SETGET_C32_UINT8:
- {
- uint32 pa;
- void* pb;
- assert(o->field_type==TIFF_UNDEFINED);
- assert(o->field_readcount==TIFF_VARIABLE2);
- assert(o->field_passcount==1);
- TIFFGetField(tif,o->field_tag,&pa,&pb);
- if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,o->field_tag,pa,pb))
- goto bad;
- }
- break;
- default:
- assert(0); /* we should never get here */
- break;
- }
- }
- }
- }
- }
- for (m=0; m<(uint32)(tif->tif_dir.td_customValueCount); m++)
- {
- switch (tif->tif_dir.td_customValues[m].info->field_type)
- {
- case TIFF_ASCII:
- if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_UNDEFINED:
- if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_BYTE:
- if (!TIFFWriteDirectoryTagByteArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SBYTE:
- if (!TIFFWriteDirectoryTagSbyteArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SHORT:
- if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SSHORT:
- if (!TIFFWriteDirectoryTagSshortArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_LONG:
- if (!TIFFWriteDirectoryTagLongArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SLONG:
- if (!TIFFWriteDirectoryTagSlongArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_LONG8:
- if (!TIFFWriteDirectoryTagLong8Array(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SLONG8:
- if (!TIFFWriteDirectoryTagSlong8Array(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_RATIONAL:
- if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SRATIONAL:
- if (!TIFFWriteDirectoryTagSrationalArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_FLOAT:
- if (!TIFFWriteDirectoryTagFloatArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_DOUBLE:
- if (!TIFFWriteDirectoryTagDoubleArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_IFD:
- if (!TIFFWriteDirectoryTagIfdArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_IFD8:
- if (!TIFFWriteDirectoryTagIfdIfd8Array(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- default:
- assert(0); /* we should never get here */
- break;
- }
- }
- if (dir!=NULL)
- break;
- dir=_TIFFmalloc(ndir*sizeof(TIFFDirEntry));
- if (dir==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- goto bad;
- }
- if (isimage)
- {
- if ((tif->tif_diroff==0)&&(!TIFFLinkDirectory(tif)))
- goto bad;
- }
- else
- tif->tif_diroff=(TIFFSeekFile(tif,0,SEEK_END)+1)&(~1);
- if (pdiroff!=NULL)
- *pdiroff=tif->tif_diroff;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- dirsize=2+ndir*12+4;
- else
- dirsize=8+ndir*20+8;
- tif->tif_dataoff=tif->tif_diroff+dirsize;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- tif->tif_dataoff=(uint32)tif->tif_dataoff;
- if ((tif->tif_dataoff<tif->tif_diroff)||(tif->tif_dataoff<(uint64)dirsize))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Maximum TIFF file size exceeded");
- goto bad;
- }
- if (tif->tif_dataoff&1)
- tif->tif_dataoff++;
- if (isimage)
- tif->tif_curdir++;
- }
- if (isimage)
- {
- if (TIFFFieldSet(tif,FIELD_SUBIFD)&&(tif->tif_subifdoff==0))
- {
- uint32 na;
- TIFFDirEntry* nb;
- for (na=0, nb=dir; ; na++, nb++)
- {
- assert(na<ndir);
- if (nb->tdir_tag==TIFFTAG_SUBIFD)
- break;
- }
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- tif->tif_subifdoff=tif->tif_diroff+2+na*12+8;
- else
- tif->tif_subifdoff=tif->tif_diroff+8+na*20+12;
- }
- }
- dirmem=_TIFFmalloc(dirsize);
- if (dirmem==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- goto bad;
- }
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint8* n;
- uint32 nTmp;
- TIFFDirEntry* o;
- n=dirmem;
- *(uint16*)n=ndir;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)n);
- n+=2;
- o=dir;
- for (m=0; m<ndir; m++)
- {
- *(uint16*)n=o->tdir_tag;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)n);
- n+=2;
- *(uint16*)n=o->tdir_type;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)n);
- n+=2;
- nTmp = (uint32)o->tdir_count;
- _TIFFmemcpy(n,&nTmp,4);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)n);
- n+=4;
- /* This is correct. The data has been */
- /* swabbed previously in TIFFWriteDirectoryTagData */
- _TIFFmemcpy(n,&o->tdir_offset,4);
- n+=4;
- o++;
- }
- nTmp = (uint32)tif->tif_nextdiroff;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&nTmp);
- _TIFFmemcpy(n,&nTmp,4);
- }
- else
- {
- uint8* n;
- TIFFDirEntry* o;
- n=dirmem;
- *(uint64*)n=ndir;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)n);
- n+=8;
- o=dir;
- for (m=0; m<ndir; m++)
- {
- *(uint16*)n=o->tdir_tag;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)n);
- n+=2;
- *(uint16*)n=o->tdir_type;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)n);
- n+=2;
- _TIFFmemcpy(n,&o->tdir_count,8);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)n);
- n+=8;
- _TIFFmemcpy(n,&o->tdir_offset,8);
- n+=8;
- o++;
- }
- _TIFFmemcpy(n,&tif->tif_nextdiroff,8);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)n);
- }
- _TIFFfree(dir);
- dir=NULL;
- if (!SeekOK(tif,tif->tif_diroff))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory");
- goto bad;
- }
- if (!WriteOK(tif,dirmem,(tmsize_t)dirsize))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory");
- goto bad;
- }
- _TIFFfree(dirmem);
- if (imagedone)
- {
- TIFFFreeDirectory(tif);
- tif->tif_flags &= ~TIFF_DIRTYDIRECT;
- tif->tif_flags &= ~TIFF_DIRTYSTRIP;
- (*tif->tif_cleanup)(tif);
- /*
- * Reset directory-related state for subsequent
- * directories.
- */
- TIFFCreateDirectory(tif);
- }
- return(1);
- bad:
- if (dir!=NULL)
- _TIFFfree(dir);
- if (dirmem!=NULL)
- _TIFFfree(dirmem);
- return(0);
- }
- static int
- TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
- {
- static const char module[] = "TIFFWriteDirectoryTagSampleformatArray";
- void* conv;
- uint32 i;
- int ok;
- conv = _TIFFmalloc(count*sizeof(double));
- if (conv == NULL)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Out of memory");
- return (0);
- }
- switch (tif->tif_dir.td_sampleformat)
- {
- case SAMPLEFORMAT_IEEEFP:
- if (tif->tif_dir.td_bitspersample<=32)
- {
- for (i = 0; i < count; ++i)
- ((float*)conv)[i] = (float)value[i];
- ok = TIFFWriteDirectoryTagFloatArray(tif,ndir,dir,tag,count,(float*)conv);
- }
- else
- {
- ok = TIFFWriteDirectoryTagDoubleArray(tif,ndir,dir,tag,count,value);
- }
- break;
- case SAMPLEFORMAT_INT:
- if (tif->tif_dir.td_bitspersample<=8)
- {
- for (i = 0; i < count; ++i)
- ((int8*)conv)[i] = (int8)value[i];
- ok = TIFFWriteDirectoryTagSbyteArray(tif,ndir,dir,tag,count,(int8*)conv);
- }
- else if (tif->tif_dir.td_bitspersample<=16)
- {
- for (i = 0; i < count; ++i)
- ((int16*)conv)[i] = (int16)value[i];
- ok = TIFFWriteDirectoryTagSshortArray(tif,ndir,dir,tag,count,(int16*)conv);
- }
- else
- {
- for (i = 0; i < count; ++i)
- ((int32*)conv)[i] = (int32)value[i];
- ok = TIFFWriteDirectoryTagSlongArray(tif,ndir,dir,tag,count,(int32*)conv);
- }
- break;
- case SAMPLEFORMAT_UINT:
- if (tif->tif_dir.td_bitspersample<=8)
- {
- for (i = 0; i < count; ++i)
- ((uint8*)conv)[i] = (uint8)value[i];
- ok = TIFFWriteDirectoryTagByteArray(tif,ndir,dir,tag,count,(uint8*)conv);
- }
- else if (tif->tif_dir.td_bitspersample<=16)
- {
- for (i = 0; i < count; ++i)
- ((uint16*)conv)[i] = (uint16)value[i];
- ok = TIFFWriteDirectoryTagShortArray(tif,ndir,dir,tag,count,(uint16*)conv);
- }
- else
- {
- for (i = 0; i < count; ++i)
- ((uint32*)conv)[i] = (uint32)value[i];
- ok = TIFFWriteDirectoryTagLongArray(tif,ndir,dir,tag,count,(uint32*)conv);
- }
- break;
- default:
- ok = 0;
- }
- _TIFFfree(conv);
- return (ok);
- }
- #if 0
- static int
- TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
- {
- switch (tif->tif_dir.td_sampleformat)
- {
- case SAMPLEFORMAT_IEEEFP:
- if (tif->tif_dir.td_bitspersample<=32)
- return(TIFFWriteDirectoryTagFloatPerSample(tif,ndir,dir,tag,(float)value));
- else
- return(TIFFWriteDirectoryTagDoublePerSample(tif,ndir,dir,tag,value));
- case SAMPLEFORMAT_INT:
- if (tif->tif_dir.td_bitspersample<=8)
- return(TIFFWriteDirectoryTagSbytePerSample(tif,ndir,dir,tag,(int8)value));
- else if (tif->tif_dir.td_bitspersample<=16)
- return(TIFFWriteDirectoryTagSshortPerSample(tif,ndir,dir,tag,(int16)value));
- else
- return(TIFFWriteDirectoryTagSlongPerSample(tif,ndir,dir,tag,(int32)value));
- case SAMPLEFORMAT_UINT:
- if (tif->tif_dir.td_bitspersample<=8)
- return(TIFFWriteDirectoryTagBytePerSample(tif,ndir,dir,tag,(uint8)value));
- else if (tif->tif_dir.td_bitspersample<=16)
- return(TIFFWriteDirectoryTagShortPerSample(tif,ndir,dir,tag,(uint16)value));
- else
- return(TIFFWriteDirectoryTagLongPerSample(tif,ndir,dir,tag,(uint32)value));
- default:
- return(1);
- }
- }
- #endif
- static int
- TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedAscii(tif,ndir,dir,tag,count,value));
- }
- static int
- TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedUndefinedArray(tif,ndir,dir,tag,count,value));
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedByte(tif,ndir,dir,tag,value));
- }
- #endif
- static int
- TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,count,value));
- }
- #if 0
- static int
- TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
- {
- static const char module[] = "TIFFWriteDirectoryTagBytePerSample";
- uint8* m;
- uint8* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint8));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
- }
- #endif
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSbyte(tif,ndir,dir,tag,value));
- }
- #endif
- static int
- TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,count,value));
- }
- #if 0
- static int
- TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
- {
- static const char module[] = "TIFFWriteDirectoryTagSbytePerSample";
- int8* m;
- int8* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int8));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
- }
- #endif
- static int
- TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,value));
- }
- static int
- TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,value));
- }
- static int
- TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
- {
- static const char module[] = "TIFFWriteDirectoryTagShortPerSample";
- uint16* m;
- uint16* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint16));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSshort(tif,ndir,dir,tag,value));
- }
- #endif
- static int
- TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,count,value));
- }
- #if 0
- static int
- TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
- {
- static const char module[] = "TIFFWriteDirectoryTagSshortPerSample";
- int16* m;
- int16* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int16));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
- }
- #endif
- static int
- TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value));
- }
- static int
- TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,value));
- }
- #if 0
- static int
- TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
- {
- static const char module[] = "TIFFWriteDirectoryTagLongPerSample";
- uint32* m;
- uint32* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint32));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
- }
- #endif
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSlong(tif,ndir,dir,tag,value));
- }
- #endif
- static int
- TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,count,value));
- }
- #if 0
- static int
- TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
- {
- static const char module[] = "TIFFWriteDirectoryTagSlongPerSample";
- int32* m;
- int32* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int32));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
- }
- #endif
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedLong8(tif,ndir,dir,tag,value));
- }
- #endif
- static int
- TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,tag,count,value));
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSlong8(tif,ndir,dir,tag,value));
- }
- #endif
- static int
- TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSlong8Array(tif,ndir,dir,tag,count,value));
- }
- static int
- TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedRational(tif,ndir,dir,tag,value));
- }
- static int
- TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedRationalArray(tif,ndir,dir,tag,count,value));
- }
- static int
- TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSrationalArray(tif,ndir,dir,tag,count,value));
- }
- #ifdef notdef
- static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedFloat(tif,ndir,dir,tag,value));
- }
- #endif
- static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,count,value));
- }
- #if 0
- static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
- {
- static const char module[] = "TIFFWriteDirectoryTagFloatPerSample";
- float* m;
- float* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(float));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
- }
- #endif
- #ifdef notdef
- static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedDouble(tif,ndir,dir,tag,value));
- }
- #endif
- static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,count,value));
- }
- #if 0
- static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
- {
- static const char module[] = "TIFFWriteDirectoryTagDoublePerSample";
- double* m;
- double* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(double));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
- }
- #endif
- static int
- TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,value));
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,tag,count,value));
- }
- #endif
- static int
- TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
- {
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- if (value<=0xFFFF)
- return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,(uint16)value));
- else
- return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value));
- }
- /************************************************************************/
- /* TIFFWriteDirectoryTagLongLong8Array() */
- /* */
- /* Write out LONG8 array as LONG8 for BigTIFF or LONG for */
- /* Classic TIFF with some checking. */
- /************************************************************************/
- static int
- TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
- {
- static const char module[] = "TIFFWriteDirectoryTagLongLong8Array";
- uint64* ma;
- uint32 mb;
- uint32* p;
- uint32* q;
- int o;
- /* is this just a counting pass? */
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- /* We always write LONG8 for BigTIFF, no checking needed. */
- if( tif->tif_flags&TIFF_BIGTIFF )
- return TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,
- tag,count,value);
- /*
- ** For classic tiff we want to verify everything is in range for LONG
- ** and convert to long format.
- */
- p = _TIFFmalloc(count*sizeof(uint32));
- if (p==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (q=p, ma=value, mb=0; mb<count; ma++, mb++, q++)
- {
- if (*ma>0xFFFFFFFF)
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Attempt to write value larger than 0xFFFFFFFF in Classic TIFF file.");
- _TIFFfree(p);
- return(0);
- }
- *q= (uint32)(*ma);
- }
- o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,p);
- _TIFFfree(p);
- return(o);
- }
- /************************************************************************/
- /* TIFFWriteDirectoryTagIfdIfd8Array() */
- /* */
- /* Write either IFD8 or IFD array depending on file type. */
- /************************************************************************/
- static int
- TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
- {
- static const char module[] = "TIFFWriteDirectoryTagIfdIfd8Array";
- uint64* ma;
- uint32 mb;
- uint32* p;
- uint32* q;
- int o;
- /* is this just a counting pass? */
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- /* We always write IFD8 for BigTIFF, no checking needed. */
- if( tif->tif_flags&TIFF_BIGTIFF )
- return TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,
- tag,count,value);
- /*
- ** For classic tiff we want to verify everything is in range for IFD
- ** and convert to long format.
- */
- p = _TIFFmalloc(count*sizeof(uint32));
- if (p==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (q=p, ma=value, mb=0; mb<count; ma++, mb++, q++)
- {
- if (*ma>0xFFFFFFFF)
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Attempt to write value larger than 0xFFFFFFFF in Classic TIFF file.");
- _TIFFfree(p);
- return(0);
- }
- *q= (uint32)(*ma);
- }
- o=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,p);
- _TIFFfree(p);
- return(o);
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
- {
- static const char module[] = "TIFFWriteDirectoryTagShortLongLong8Array";
- uint64* ma;
- uint32 mb;
- uint8 n;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- n=0;
- for (ma=value, mb=0; mb<count; ma++, mb++)
- {
- if ((n==0)&&(*ma>0xFFFF))
- n=1;
- if ((n==1)&&(*ma>0xFFFFFFFF))
- {
- n=2;
- break;
- }
- }
- if (n==0)
- {
- uint16* p;
- uint16* q;
- p=_TIFFmalloc(count*sizeof(uint16));
- if (p==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (ma=value, mb=0, q=p; mb<count; ma++, mb++, q++)
- *q=(uint16)(*ma);
- o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,p);
- _TIFFfree(p);
- }
- else if (n==1)
- {
- uint32* p;
- uint32* q;
- p=_TIFFmalloc(count*sizeof(uint32));
- if (p==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (ma=value, mb=0, q=p; mb<count; ma++, mb++, q++)
- *q=(uint32)(*ma);
- o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,p);
- _TIFFfree(p);
- }
- else
- {
- assert(n==2);
- o=TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,tag,count,value);
- }
- return(o);
- }
- #endif
- static int
- TIFFWriteDirectoryTagColormap(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
- {
- static const char module[] = "TIFFWriteDirectoryTagColormap";
- uint32 m;
- uint16* n;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=(1<<tif->tif_dir.td_bitspersample);
- n=_TIFFmalloc(3*m*sizeof(uint16));
- if (n==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- _TIFFmemcpy(&n[0],tif->tif_dir.td_colormap[0],m*sizeof(uint16));
- _TIFFmemcpy(&n[m],tif->tif_dir.td_colormap[1],m*sizeof(uint16));
- _TIFFmemcpy(&n[2*m],tif->tif_dir.td_colormap[2],m*sizeof(uint16));
- o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_COLORMAP,3*m,n);
- _TIFFfree(n);
- return(o);
- }
- static int
- TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
- {
- static const char module[] = "TIFFWriteDirectoryTagTransferfunction";
- uint32 m;
- uint16 n;
- uint16* o;
- int p;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=(1<<tif->tif_dir.td_bitspersample);
- n=tif->tif_dir.td_samplesperpixel-tif->tif_dir.td_extrasamples;
- /*
- * Check if the table can be written as a single column,
- * or if it must be written as 3 columns. Note that we
- * write a 3-column tag if there are 2 samples/pixel and
- * a single column of data won't suffice--hmm.
- */
- if (n>3)
- n=3;
- if (n==3)
- {
- if (!_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16)))
- n=2;
- }
- if (n==2)
- {
- if (!_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16)))
- n=1;
- }
- if (n==0)
- n=1;
- o=_TIFFmalloc(n*m*sizeof(uint16));
- if (o==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- _TIFFmemcpy(&o[0],tif->tif_dir.td_transferfunction[0],m*sizeof(uint16));
- if (n>1)
- _TIFFmemcpy(&o[m],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16));
- if (n>2)
- _TIFFmemcpy(&o[2*m],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16));
- p=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_TRANSFERFUNCTION,n*m,o);
- _TIFFfree(o);
- return(p);
- }
- static int
- TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
- {
- static const char module[] = "TIFFWriteDirectoryTagSubifd";
- uint64 m;
- int n;
- if (tif->tif_dir.td_nsubifd==0)
- return(1);
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=tif->tif_dataoff;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32* o;
- uint64* pa;
- uint32* pb;
- uint16 p;
- o=_TIFFmalloc(tif->tif_dir.td_nsubifd*sizeof(uint32));
- if (o==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- pa=tif->tif_dir.td_subifd;
- pb=o;
- for (p=0; p < tif->tif_dir.td_nsubifd; p++)
- {
- assert(pa != 0);
- assert(*pa <= 0xFFFFFFFFUL);
- *pb++=(uint32)(*pa++);
- }
- n=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,o);
- _TIFFfree(o);
- }
- else
- n=TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,tif->tif_dir.td_subifd);
- if (!n)
- return(0);
- /*
- * Total hack: if this directory includes a SubIFD
- * tag then force the next <n> directories to be
- * written as ``sub directories'' of this one. This
- * is used to write things like thumbnails and
- * image masks that one wants to keep out of the
- * normal directory linkage access mechanism.
- */
- tif->tif_flags|=TIFF_INSUBIFD;
- tif->tif_nsubifd=tif->tif_dir.td_nsubifd;
- if (tif->tif_dir.td_nsubifd==1)
- tif->tif_subifdoff=0;
- else
- tif->tif_subifdoff=m;
- return(1);
- }
- static int
- TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value)
- {
- assert(sizeof(char)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_ASCII,count,count,value));
- }
- static int
- TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
- {
- assert(sizeof(uint8)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_UNDEFINED,count,count,value));
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
- {
- assert(sizeof(uint8)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,1,1,&value));
- }
- #endif
- static int
- TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
- {
- assert(sizeof(uint8)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,count,count,value));
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
- {
- assert(sizeof(int8)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,1,1,&value));
- }
- #endif
- static int
- TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value)
- {
- assert(sizeof(int8)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,count,count,value));
- }
- static int
- TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
- {
- uint16 m;
- assert(sizeof(uint16)==2);
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(&m);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,1,2,&m));
- }
- static int
- TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value)
- {
- assert(count<0x80000000);
- assert(sizeof(uint16)==2);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfShort(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,count,count*2,value));
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
- {
- int16 m;
- assert(sizeof(int16)==2);
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)(&m));
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,1,2,&m));
- }
- #endif
- static int
- TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value)
- {
- assert(count<0x80000000);
- assert(sizeof(int16)==2);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfShort((uint16*)value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,count,count*2,value));
- }
- static int
- TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
- {
- uint32 m;
- assert(sizeof(uint32)==4);
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&m);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,1,4,&m));
- }
- static int
- TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
- {
- assert(count<0x40000000);
- assert(sizeof(uint32)==4);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,count,count*4,value));
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
- {
- int32 m;
- assert(sizeof(int32)==4);
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)(&m));
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,1,4,&m));
- }
- #endif
- static int
- TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value)
- {
- assert(count<0x40000000);
- assert(sizeof(int32)==4);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong((uint32*)value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,count,count*4,value));
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value)
- {
- uint64 m;
- assert(sizeof(uint64)==8);
- assert(tif->tif_flags&TIFF_BIGTIFF);
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(&m);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,1,8,&m));
- }
- #endif
- static int
- TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
- {
- assert(count<0x20000000);
- assert(sizeof(uint64)==8);
- assert(tif->tif_flags&TIFF_BIGTIFF);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong8(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,count,count*8,value));
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value)
- {
- int64 m;
- assert(sizeof(int64)==8);
- assert(tif->tif_flags&TIFF_BIGTIFF);
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)(&m));
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,1,8,&m));
- }
- #endif
- static int
- TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value)
- {
- assert(count<0x20000000);
- assert(sizeof(int64)==8);
- assert(tif->tif_flags&TIFF_BIGTIFF);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong8((uint64*)value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,count,count*8,value));
- }
- static int
- TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
- {
- uint32 m[2];
- assert(value>=0.0);
- assert(sizeof(uint32)==4);
- if (value<=0.0)
- {
- m[0]=0;
- m[1]=1;
- }
- else if (value==(double)(uint32)value)
- {
- m[0]=(uint32)value;
- m[1]=1;
- }
- else if (value<1.0)
- {
- m[0]=(uint32)(value*0xFFFFFFFF);
- m[1]=0xFFFFFFFF;
- }
- else
- {
- m[0]=0xFFFFFFFF;
- m[1]=(uint32)(0xFFFFFFFF/value);
- }
- if (tif->tif_flags&TIFF_SWAB)
- {
- TIFFSwabLong(&m[0]);
- TIFFSwabLong(&m[1]);
- }
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,1,8,&m[0]));
- }
- static int
- TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
- {
- static const char module[] = "TIFFWriteDirectoryTagCheckedRationalArray";
- uint32* m;
- float* na;
- uint32* nb;
- uint32 nc;
- int o;
- assert(sizeof(uint32)==4);
- m=_TIFFmalloc(count*2*sizeof(uint32));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=value, nb=m, nc=0; nc<count; na++, nb+=2, nc++)
- {
- if (*na<=0.0)
- {
- nb[0]=0;
- nb[1]=1;
- }
- else if (*na==(float)(uint32)(*na))
- {
- nb[0]=(uint32)(*na);
- nb[1]=1;
- }
- else if (*na<1.0)
- {
- nb[0]=(uint32)((*na)*0xFFFFFFFF);
- nb[1]=0xFFFFFFFF;
- }
- else
- {
- nb[0]=0xFFFFFFFF;
- nb[1]=(uint32)(0xFFFFFFFF/(*na));
- }
- }
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong(m,count*2);
- o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,count,count*8,&m[0]);
- _TIFFfree(m);
- return(o);
- }
- static int
- TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
- {
- static const char module[] = "TIFFWriteDirectoryTagCheckedSrationalArray";
- int32* m;
- float* na;
- int32* nb;
- uint32 nc;
- int o;
- assert(sizeof(int32)==4);
- m=_TIFFmalloc(count*2*sizeof(int32));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=value, nb=m, nc=0; nc<count; na++, nb+=2, nc++)
- {
- if (*na<0.0)
- {
- if (*na==(int32)(*na))
- {
- nb[0]=(int32)(*na);
- nb[1]=1;
- }
- else if (*na>-1.0)
- {
- nb[0]=-(int32)((-*na)*0x7FFFFFFF);
- nb[1]=0x7FFFFFFF;
- }
- else
- {
- nb[0]=-0x7FFFFFFF;
- nb[1]=(int32)(0x7FFFFFFF/(-*na));
- }
- }
- else
- {
- if (*na==(int32)(*na))
- {
- nb[0]=(int32)(*na);
- nb[1]=1;
- }
- else if (*na<1.0)
- {
- nb[0]=(int32)((*na)*0x7FFFFFFF);
- nb[1]=0x7FFFFFFF;
- }
- else
- {
- nb[0]=0x7FFFFFFF;
- nb[1]=(int32)(0x7FFFFFFF/(*na));
- }
- }
- }
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong((uint32*)m,count*2);
- o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SRATIONAL,count,count*8,&m[0]);
- _TIFFfree(m);
- return(o);
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
- {
- float m;
- assert(sizeof(float)==4);
- m=value;
- TIFFCvtNativeToIEEEFloat(tif,1,&m);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabFloat(&m);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,1,4,&m));
- }
- #endif
- static int
- TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
- {
- assert(count<0x40000000);
- assert(sizeof(float)==4);
- TIFFCvtNativeToIEEEFloat(tif,count,&value);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfFloat(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,count,count*4,value));
- }
- #ifdef notdef
- static int
- TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
- {
- double m;
- assert(sizeof(double)==8);
- m=value;
- TIFFCvtNativeToIEEEDouble(tif,1,&m);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabDouble(&m);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,1,8,&m));
- }
- #endif
- static int
- TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
- {
- assert(count<0x20000000);
- assert(sizeof(double)==8);
- TIFFCvtNativeToIEEEDouble(tif,count,&value);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfDouble(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,count,count*8,value));
- }
- static int
- TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
- {
- assert(count<0x40000000);
- assert(sizeof(uint32)==4);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD,count,count*4,value));
- }
- static int
- TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
- {
- assert(count<0x20000000);
- assert(sizeof(uint64)==8);
- assert(tif->tif_flags&TIFF_BIGTIFF);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong8(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD8,count,count*8,value));
- }
- static int
- TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data)
- {
- static const char module[] = "TIFFWriteDirectoryTagData";
- uint32 m;
- m=0;
- while (m<(*ndir))
- {
- assert(dir[m].tdir_tag!=tag);
- if (dir[m].tdir_tag>tag)
- break;
- m++;
- }
- if (m<(*ndir))
- {
- uint32 n;
- for (n=*ndir; n>m; n--)
- dir[n]=dir[n-1];
- }
- dir[m].tdir_tag=tag;
- dir[m].tdir_type=datatype;
- dir[m].tdir_count=count;
- dir[m].tdir_offset.toff_long8 = 0;
- if (datalength<=((tif->tif_flags&TIFF_BIGTIFF)?0x8U:0x4U))
- _TIFFmemcpy(&dir[m].tdir_offset,data,datalength);
- else
- {
- uint64 na,nb;
- na=tif->tif_dataoff;
- nb=na+datalength;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- nb=(uint32)nb;
- if ((nb<na)||(nb<datalength))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Maximum TIFF file size exceeded");
- return(0);
- }
- if (!SeekOK(tif,na))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data");
- return(0);
- }
- assert(datalength<0x80000000UL);
- if (!WriteOK(tif,data,(tmsize_t)datalength))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data");
- return(0);
- }
- tif->tif_dataoff=nb;
- if (tif->tif_dataoff&1)
- tif->tif_dataoff++;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 o;
- o=(uint32)na;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&o);
- _TIFFmemcpy(&dir[m].tdir_offset,&o,4);
- }
- else
- {
- dir[m].tdir_offset.toff_long8 = na;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(&dir[m].tdir_offset.toff_long8);
- }
- }
- (*ndir)++;
- return(1);
- }
- /*
- * Link the current directory into the directory chain for the file.
- */
- static int
- TIFFLinkDirectory(TIFF* tif)
- {
- static const char module[] = "TIFFLinkDirectory";
- tif->tif_diroff = (TIFFSeekFile(tif,0,SEEK_END)+1) &~ 1;
- /*
- * Handle SubIFDs
- */
- if (tif->tif_flags & TIFF_INSUBIFD)
- {
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 m;
- m = (uint32)tif->tif_diroff;
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong(&m);
- (void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
- if (!WriteOK(tif, &m, 4)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing SubIFD directory link");
- return (0);
- }
- /*
- * Advance to the next SubIFD or, if this is
- * the last one configured, revert back to the
- * normal directory linkage.
- */
- if (--tif->tif_nsubifd)
- tif->tif_subifdoff += 4;
- else
- tif->tif_flags &= ~TIFF_INSUBIFD;
- return (1);
- }
- else
- {
- uint64 m;
- m = tif->tif_diroff;
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&m);
- (void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
- if (!WriteOK(tif, &m, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing SubIFD directory link");
- return (0);
- }
- /*
- * Advance to the next SubIFD or, if this is
- * the last one configured, revert back to the
- * normal directory linkage.
- */
- if (--tif->tif_nsubifd)
- tif->tif_subifdoff += 8;
- else
- tif->tif_flags &= ~TIFF_INSUBIFD;
- return (1);
- }
- }
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 m;
- uint32 nextdir;
- m = (uint32)(tif->tif_diroff);
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong(&m);
- if (tif->tif_header.classic.tiff_diroff == 0) {
- /*
- * First directory, overwrite offset in header.
- */
- tif->tif_header.classic.tiff_diroff = (uint32) tif->tif_diroff;
- (void) TIFFSeekFile(tif,4, SEEK_SET);
- if (!WriteOK(tif, &m, 4)) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Error writing TIFF header");
- return (0);
- }
- return (1);
- }
- /*
- * Not the first directory, search to the last and append.
- */
- nextdir = tif->tif_header.classic.tiff_diroff;
- while(1) {
- uint16 dircount;
- uint32 nextnextdir;
- if (!SeekOK(tif, nextdir) ||
- !ReadOK(tif, &dircount, 2)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory count");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabShort(&dircount);
- (void) TIFFSeekFile(tif,
- nextdir+2+dircount*12, SEEK_SET);
- if (!ReadOK(tif, &nextnextdir, 4)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory link");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong(&nextnextdir);
- if (nextnextdir==0)
- {
- (void) TIFFSeekFile(tif,
- nextdir+2+dircount*12, SEEK_SET);
- if (!WriteOK(tif, &m, 4)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
- return (0);
- }
- break;
- }
- nextdir=nextnextdir;
- }
- }
- else
- {
- uint64 m;
- uint64 nextdir;
- m = tif->tif_diroff;
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&m);
- if (tif->tif_header.big.tiff_diroff == 0) {
- /*
- * First directory, overwrite offset in header.
- */
- tif->tif_header.big.tiff_diroff = tif->tif_diroff;
- (void) TIFFSeekFile(tif,8, SEEK_SET);
- if (!WriteOK(tif, &m, 8)) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Error writing TIFF header");
- return (0);
- }
- return (1);
- }
- /*
- * Not the first directory, search to the last and append.
- */
- nextdir = tif->tif_header.big.tiff_diroff;
- while(1) {
- uint64 dircount64;
- uint16 dircount;
- uint64 nextnextdir;
- if (!SeekOK(tif, nextdir) ||
- !ReadOK(tif, &dircount64, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory count");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&dircount64);
- if (dircount64>0xFFFF)
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Sanity check on tag count failed, likely corrupt TIFF");
- return (0);
- }
- dircount=(uint16)dircount64;
- (void) TIFFSeekFile(tif,
- nextdir+8+dircount*20, SEEK_SET);
- if (!ReadOK(tif, &nextnextdir, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory link");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&nextnextdir);
- if (nextnextdir==0)
- {
- (void) TIFFSeekFile(tif,
- nextdir+8+dircount*20, SEEK_SET);
- if (!WriteOK(tif, &m, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
- return (0);
- }
- break;
- }
- nextdir=nextnextdir;
- }
- }
- return (1);
- }
- /************************************************************************/
- /* TIFFRewriteField() */
- /* */
- /* Rewrite a field in the directory on disk without regard to */
- /* updating the TIFF directory structure in memory. Currently */
- /* only supported for field that already exist in the on-disk */
- /* directory. Mainly used for updating stripoffset / */
- /* stripbytecount values after the directory is already on */
- /* disk. */
- /* */
- /* Returns zero on failure, and one on success. */
- /************************************************************************/
- int
- _TIFFRewriteField(TIFF* tif, uint16 tag, TIFFDataType in_datatype,
- tmsize_t count, void* data)
- {
- static const char module[] = "TIFFResetField";
- /* const TIFFField* fip = NULL; */
- uint16 dircount;
- tmsize_t dirsize;
- uint8 direntry_raw[20];
- uint16 entry_tag = 0;
- uint16 entry_type = 0;
- uint64 entry_count = 0;
- uint64 entry_offset = 0;
- int value_in_entry = 0;
- uint64 read_offset;
- uint8 *buf_to_write = NULL;
- TIFFDataType datatype;
- /* -------------------------------------------------------------------- */
- /* Find field definition. */
- /* -------------------------------------------------------------------- */
- /*fip =*/ TIFFFindField(tif, tag, TIFF_ANY);
- /* -------------------------------------------------------------------- */
- /* Do some checking this is a straight forward case. */
- /* -------------------------------------------------------------------- */
- if( isMapped(tif) )
- {
- TIFFErrorExt( tif->tif_clientdata, module,
- "Memory mapped files not currently supported for this operation." );
- return 0;
- }
- if( tif->tif_diroff == 0 )
- {
- TIFFErrorExt( tif->tif_clientdata, module,
- "Attempt to reset field on directory not already on disk." );
- return 0;
- }
- /* -------------------------------------------------------------------- */
- /* Read the directory entry count. */
- /* -------------------------------------------------------------------- */
- if (!SeekOK(tif, tif->tif_diroff)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Seek error accessing TIFF directory",
- tif->tif_name);
- return 0;
- }
- read_offset = tif->tif_diroff;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- if (!ReadOK(tif, &dircount, sizeof (uint16))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Can not read TIFF directory count",
- tif->tif_name);
- return 0;
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabShort(&dircount);
- dirsize = 12;
- read_offset += 2;
- } else {
- uint64 dircount64;
- if (!ReadOK(tif, &dircount64, sizeof (uint64))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Can not read TIFF directory count",
- tif->tif_name);
- return 0;
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&dircount64);
- dircount = (uint16)dircount64;
- dirsize = 20;
- read_offset += 8;
- }
- /* -------------------------------------------------------------------- */
- /* Read through directory to find target tag. */
- /* -------------------------------------------------------------------- */
- while( dircount > 0 )
- {
- if (!ReadOK(tif, direntry_raw, dirsize)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Can not read TIFF directory entry.",
- tif->tif_name);
- return 0;
- }
- memcpy( &entry_tag, direntry_raw + 0, sizeof(uint16) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort( &entry_tag );
- if( entry_tag == tag )
- break;
- read_offset += dirsize;
- }
- if( entry_tag != tag )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Could not find tag %d.",
- tif->tif_name, tag );
- return 0;
- }
- /* -------------------------------------------------------------------- */
- /* Extract the type, count and offset for this entry. */
- /* -------------------------------------------------------------------- */
- memcpy( &entry_type, direntry_raw + 2, sizeof(uint16) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort( &entry_type );
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 value;
-
- memcpy( &value, direntry_raw + 4, sizeof(uint32) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong( &value );
- entry_count = value;
- memcpy( &value, direntry_raw + 8, sizeof(uint32) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong( &value );
- entry_offset = value;
- }
- else
- {
- memcpy( &entry_count, direntry_raw + 4, sizeof(uint64) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8( &entry_count );
- memcpy( &entry_offset, direntry_raw + 12, sizeof(uint64) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8( &entry_offset );
- }
- /* -------------------------------------------------------------------- */
- /* What data type do we want to write this as? */
- /* -------------------------------------------------------------------- */
- if( TIFFDataWidth(in_datatype) == 8 && !(tif->tif_flags&TIFF_BIGTIFF) )
- {
- if( in_datatype == TIFF_LONG8 )
- datatype = TIFF_LONG;
- else if( in_datatype == TIFF_SLONG8 )
- datatype = TIFF_SLONG;
- else if( in_datatype == TIFF_IFD8 )
- datatype = TIFF_IFD;
- else
- datatype = in_datatype;
- }
- else
- datatype = in_datatype;
- /* -------------------------------------------------------------------- */
- /* Prepare buffer of actual data to write. This includes */
- /* swabbing as needed. */
- /* -------------------------------------------------------------------- */
- buf_to_write =
- (uint8 *)_TIFFCheckMalloc(tif, count, TIFFDataWidth(datatype),
- "for field buffer.");
- if (!buf_to_write)
- return 0;
- if( datatype == in_datatype )
- memcpy( buf_to_write, data, count * TIFFDataWidth(datatype) );
- else if( datatype == TIFF_SLONG && in_datatype == TIFF_SLONG8 )
- {
- tmsize_t i;
- for( i = 0; i < count; i++ )
- {
- ((int32 *) buf_to_write)[i] =
- (int32) ((int64 *) data)[i];
- if( (int64) ((int32 *) buf_to_write)[i] != ((int64 *) data)[i] )
- {
- _TIFFfree( buf_to_write );
- TIFFErrorExt( tif->tif_clientdata, module,
- "Value exceeds 32bit range of output type." );
- return 0;
- }
- }
- }
- else if( (datatype == TIFF_LONG && in_datatype == TIFF_LONG8)
- || (datatype == TIFF_IFD && in_datatype == TIFF_IFD8) )
- {
- tmsize_t i;
- for( i = 0; i < count; i++ )
- {
- ((uint32 *) buf_to_write)[i] =
- (uint32) ((uint64 *) data)[i];
- if( (uint64) ((uint32 *) buf_to_write)[i] != ((uint64 *) data)[i] )
- {
- _TIFFfree( buf_to_write );
- TIFFErrorExt( tif->tif_clientdata, module,
- "Value exceeds 32bit range of output type." );
- return 0;
- }
- }
- }
- if( TIFFDataWidth(datatype) > 1 && (tif->tif_flags&TIFF_SWAB) )
- {
- if( TIFFDataWidth(datatype) == 2 )
- TIFFSwabArrayOfShort( (uint16 *) buf_to_write, count );
- else if( TIFFDataWidth(datatype) == 4 )
- TIFFSwabArrayOfLong( (uint32 *) buf_to_write, count );
- else if( TIFFDataWidth(datatype) == 8 )
- TIFFSwabArrayOfLong8( (uint64 *) buf_to_write, count );
- }
- /* -------------------------------------------------------------------- */
- /* Is this a value that fits into the directory entry? */
- /* -------------------------------------------------------------------- */
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- if( TIFFDataWidth(datatype) * count <= 4 )
- {
- entry_offset = read_offset + 8;
- value_in_entry = 1;
- }
- }
- else
- {
- if( TIFFDataWidth(datatype) * count <= 8 )
- {
- entry_offset = read_offset + 12;
- value_in_entry = 1;
- }
- }
- /* -------------------------------------------------------------------- */
- /* If the tag type, and count match, then we just write it out */
- /* over the old values without altering the directory entry at */
- /* all. */
- /* -------------------------------------------------------------------- */
- if( entry_count == (uint64)count && entry_type == (uint16) datatype )
- {
- if (!SeekOK(tif, entry_offset)) {
- _TIFFfree( buf_to_write );
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Seek error accessing TIFF directory",
- tif->tif_name);
- return 0;
- }
- if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) {
- _TIFFfree( buf_to_write );
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
- return (0);
- }
- _TIFFfree( buf_to_write );
- return 1;
- }
- /* -------------------------------------------------------------------- */
- /* Otherwise, we write the new tag data at the end of the file. */
- /* -------------------------------------------------------------------- */
- if( !value_in_entry )
- {
- entry_offset = TIFFSeekFile(tif,0,SEEK_END);
-
- if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) {
- _TIFFfree( buf_to_write );
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
- return (0);
- }
- }
- else
- {
- memcpy( &entry_offset, buf_to_write, count*TIFFDataWidth(datatype));
- }
- _TIFFfree( buf_to_write );
- buf_to_write = 0;
- /* -------------------------------------------------------------------- */
- /* Adjust the directory entry. */
- /* -------------------------------------------------------------------- */
- entry_type = datatype;
- memcpy( direntry_raw + 2, &entry_type, sizeof(uint16) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort( (uint16 *) (direntry_raw + 2) );
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 value;
- value = (uint32) entry_count;
- memcpy( direntry_raw + 4, &value, sizeof(uint32) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong( (uint32 *) (direntry_raw + 4) );
- value = (uint32) entry_offset;
- memcpy( direntry_raw + 8, &value, sizeof(uint32) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong( (uint32 *) (direntry_raw + 8) );
- }
- else
- {
- memcpy( direntry_raw + 4, &entry_count, sizeof(uint64) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8( (uint64 *) (direntry_raw + 4) );
- memcpy( direntry_raw + 12, &entry_offset, sizeof(uint64) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8( (uint64 *) (direntry_raw + 12) );
- }
- /* -------------------------------------------------------------------- */
- /* Write the directory entry out to disk. */
- /* -------------------------------------------------------------------- */
- if (!SeekOK(tif, read_offset )) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Seek error accessing TIFF directory",
- tif->tif_name);
- return 0;
- }
- if (!WriteOK(tif, direntry_raw,dirsize))
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Can not write TIFF directory entry.",
- tif->tif_name);
- return 0;
- }
-
- return 1;
- }
- /* vim: set ts=8 sts=8 sw=8 noet: */
- /*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
|