|
@@ -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);
|