mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 20:29:14 +02:00
parent
67adab1155
commit
66efdeff83
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user