diff --git a/components/fpexif/fpeiptcreadwrite.pas b/components/fpexif/fpeiptcreadwrite.pas index a9e898368..f80df41a2 100644 --- a/components/fpexif/fpeiptcreadwrite.pas +++ b/components/fpexif/fpeiptcreadwrite.pas @@ -421,11 +421,14 @@ const TAG_MARKER = $1C; procedure WriteString(AIptcTag: TIptcTag; AText: PChar; ALength: Integer); + var + byteAdded: Boolean; begin if odd(ALength) then begin inc(ALength); - end; - + byteAdded := true; + end else + byteAdded := false; // "Standard" dataset if ALength < 32768 then begin AIptcTag.Size := NtoBE(word(ALength)); @@ -447,13 +450,12 @@ const WriteDWord(AStream, NtoBE(ALength)); AStream.WriteBuffer(AText^, ALength); end; - if odd(ALength) then // zero-termination of string + if byteAdded then // Write 0 to added byte WriteByte(AStream, 0); end; var iptcTag: TIptcTag; - len: DWord; i: Integer; sa: TStringArray; begin @@ -469,41 +471,13 @@ begin end; ttString: begin - if ATag is TIptcMultiStringTag - then begin + if ATag is TIptcMultiStringTag then + begin sa := SplitMultiStringTag(ATag); for i := 0 to High(sa) do WriteString(iptcTag, PChar(sa[i]), Length(sa[i])); end else WriteString(iptcTag, PChar(ATag.RawData), Length(ATag.RawData)); - (* - len := Length(ATag.RawData); - if odd(len) then begin - inc(len); - end; - // "Standard" dataset - if len < 32768 then begin - iptcTag.Size := NtoBE(word(len)); - AStream.WriteBuffer(iptcTag, SizeOf(iptcTag)); - AStream.WriteBuffer(ATag.RawData[0], Length(ATag.RawData)); - end else - // "Extended" dataset - if len < 65536 then begin - // Size is 2, but we must set highest bit to mark tag as being extended. - iptcTag.Size := NtoBE($8002); - AStream.WriteBuffer(iptcTag, SizeOf(iptcTag)); - WriteWord(AStream, NtoBE(word(len))); - AStream.WriteBuffer(ATag.RawData[0], Length(ATag.RawData)); - end else begin - // Size is 4, but we must set highest bit to mark tag as being extended. - iptcTag.Size := $8004; - AStream.WriteBuffer(iptcTag, SizeOf(iptcTag)); - WriteDWord(AStream, NtoBE(len)); - AStream.WriteBuffer(ATag.RawData[0], Length(ATag.RawData)); - end; - if odd(Length(ATag.RawData)) then // zero-termination of string - WriteByte(AStream, 0); - *) end; else // I've never seen other tag types than USHORT and STRING...