Browse Source

* Fix bug #0034063, using provided patch

git-svn-id: trunk@39530 -
michael 7 years ago
parent
commit
66efdeff83
1 changed files with 17 additions and 8 deletions
  1. 17 8
      packages/fcl-pdf/src/fpttfsubsetter.pp

+ 17 - 8
packages/fcl-pdf/src/fpttfsubsetter.pp

@@ -42,6 +42,8 @@ type
   TGIDListEnumerator = class;
   TGIDListEnumerator = class;
 
 
 
 
+  { TFontSubsetter }
+
   TFontSubsetter = class(TObject)
   TFontSubsetter = class(TObject)
   private
   private
     FPrefix: string;
     FPrefix: string;
@@ -58,7 +60,7 @@ type
     function    ToUInt32(const ABytes: AnsiString): UInt32;
     function    ToUInt32(const ABytes: AnsiString): UInt32;
     function    GetRawTable(const ATableName: AnsiString): TMemoryStream;
     function    GetRawTable(const ATableName: AnsiString): TMemoryStream;
     function    WriteFileHeader(AOutStream: TStream; const nTables: integer): uint32;
     function    WriteFileHeader(AOutStream: TStream; const nTables: integer): uint32;
-    function    WriteTableHeader(AOutStream: TStream; const ATag: AnsiString; const AOffset: UInt32; const AData: TStream): int64;
+    function    WriteTableHeader(AOutStream: TStream; const ATag: AnsiString; const AOffset: UInt32; const AData: TStream): UInt32;
     function    GetNewGlyphId(const OldGid: integer): Integer;
     function    GetNewGlyphId(const OldGid: integer): Integer;
     procedure   WriteTableBodies(AOutStream: TStream; const ATables: TStringList);
     procedure   WriteTableBodies(AOutStream: TStream; const ATables: TStringList);
     procedure   UpdateOrigGlyphIDList;
     procedure   UpdateOrigGlyphIDList;
@@ -251,21 +253,28 @@ begin
 end;
 end;
 
 
 function TFontSubsetter.WriteTableHeader(AOutStream: TStream; const ATag: AnsiString; const AOffset: UInt32;
 function TFontSubsetter.WriteTableHeader(AOutStream: TStream; const ATag: AnsiString; const AOffset: UInt32;
-  const AData: TStream): int64;
+  const AData: TStream): UInt32;
 var
 var
-  checksum: Int64;
+  checksum, w: UInt32;
   n: integer;
   n: integer;
   lByte: Byte;
   lByte: Byte;
 begin
 begin
   AData.Position := 0;
   AData.Position := 0;
   checksum := 0;
   checksum := 0;
+  w := 0;
 
 
   for n := 0 to AData.Size-1 do
   for n := 0 to AData.Size-1 do
   begin
   begin
     lByte := AData.ReadByte;
     lByte := AData.ReadByte;
-    checksum := checksum + (((lByte and $FF) shl 24) - n mod 4 * 8);
+    //checksum := checksum + (((lByte and $FF) shl 24) - n mod 4 * 8);
+    w := w or (lByte shl ((3 - (n mod 4))*8));
+    if n mod 4 = 3 then begin
+      Inc(checksum, w);
+      w := 0;
+    end;
   end;
   end;
-  checksum := checksum and $FFFFFFFF;
+  Inc(checksum, w);
+  //checksum := checksum and $FFFFFFFF;
 
 
   AOutStream.WriteBuffer(Pointer(ATag)^, 4); // Tag is always 4 bytes - written as-is, no NtoBE() required
   AOutStream.WriteBuffer(Pointer(ATag)^, 4); // Tag is always 4 bytes - written as-is, no NtoBE() required
   WriteUInt32(AOutStream, checksum);
   WriteUInt32(AOutStream, checksum);
@@ -1011,7 +1020,7 @@ end;
 
 
 procedure TFontSubsetter.SaveToStream(const AStream: TStream);
 procedure TFontSubsetter.SaveToStream(const AStream: TStream);
 var
 var
-  checksum: int64;
+  checksum: UInt32;
   offset: int64;
   offset: int64;
   head: TStream;
   head: TStream;
   hhea: TStream;
   hhea: TStream;
@@ -1088,11 +1097,11 @@ begin
       offset := offset + o;
       offset := offset + o;
     end;
     end;
   end;
   end;
-  checksum := $B1B0AFBA - (checksum and $ffffffff);
+  checksum := UInt32($B1B0AFBA) - checksum;
 
 
   // update head.ChecksumAdjustment field
   // update head.ChecksumAdjustment field
   head.Seek(8, soBeginning);
   head.Seek(8, soBeginning);
-  WriteInt32(head, Int32(checksum));
+  WriteUInt32(head, checksum);
 
 
   // write table bodies
   // write table bodies
   WriteTableBodies(AStream, tables);
   WriteTableBodies(AStream, tables);