@@ -2175,17 +2175,19 @@ def _verify_bytes_written(bytes_written: int | None, expected: int) -> None:
21752175 msg = f"wrote only { bytes_written } bytes but wanted { expected } "
21762176 raise RuntimeError (msg )
21772177
2178- def rewriteLastShortToLong (self , value : int ) -> None :
2179- self .f .seek (- 2 , os .SEEK_CUR )
2180- bytes_written = self .f .write (struct .pack (self .longFmt , value ))
2181- self ._verify_bytes_written (bytes_written , 4 )
2182-
2183- def _rewriteLast (self , value : int , field_size : int ) -> None :
2178+ def _rewriteLast (
2179+ self , value : int , field_size : int , new_field_size : int = 0
2180+ ) -> None :
21842181 self .f .seek (- field_size , os .SEEK_CUR )
2182+ if not new_field_size :
2183+ new_field_size = field_size
21852184 bytes_written = self .f .write (
2186- struct .pack (self .endian + self ._fmt (field_size ), value )
2185+ struct .pack (self .endian + self ._fmt (new_field_size ), value )
21872186 )
2188- self ._verify_bytes_written (bytes_written , field_size )
2187+ self ._verify_bytes_written (bytes_written , new_field_size )
2188+
2189+ def rewriteLastShortToLong (self , value : int ) -> None :
2190+ self ._rewriteLast (value , 2 , 4 )
21892191
21902192 def rewriteLastShort (self , value : int ) -> None :
21912193 return self ._rewriteLast (value , 2 )
@@ -2245,18 +2247,27 @@ def _fixOffsets(self, count: int, field_size: int) -> None:
22452247 for i in range (count ):
22462248 offset = self ._read (field_size )
22472249 offset += self .offsetOfNewPage
2248- if field_size == 2 and offset >= 65536 :
2249- # offset is now too large - we must convert shorts to longs
2250+
2251+ new_field_size = 0
2252+ if self ._bigtiff and field_size in (2 , 4 ) and offset >= 2 ** 32 :
2253+ # offset is now too large - we must convert long to long8
2254+ new_field_size = 8
2255+ elif field_size == 2 and offset >= 2 ** 16 :
2256+ # offset is now too large - we must convert short to long
2257+ new_field_size = 4
2258+ if new_field_size :
22502259 if count != 1 :
22512260 msg = "not implemented"
22522261 raise RuntimeError (msg ) # XXX TODO
22532262
22542263 # simple case - the offset is just one and therefore it is
22552264 # local (not referenced with another offset)
2256- self .rewriteLastShortToLong (offset )
2257- self .f .seek (- 10 , os .SEEK_CUR )
2258- self .writeShort (TiffTags .LONG ) # rewrite the type to LONG
2259- self .f .seek (8 , os .SEEK_CUR )
2265+ self ._rewriteLast (offset , field_size , new_field_size )
2266+ # Move back past the new offset, past 'count', and before 'field_type'
2267+ rewind = - new_field_size - 4 - 2
2268+ self .f .seek (rewind , os .SEEK_CUR )
2269+ self .writeShort (new_field_size ) # rewrite the type
2270+ self .f .seek (2 - rewind , os .SEEK_CUR )
22602271 else :
22612272 self ._rewriteLast (offset , field_size )
22622273
0 commit comments