* Fix bug #0034063, using provided patch

git-svn-id: trunk@39530 -
This commit is contained in:
michael 2018-07-30 14:10:06 +00:00
parent 67adab1155
commit 66efdeff83

View File

@ -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;
checksum := checksum and $FFFFFFFF; end;
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);