mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-09 00:08:12 +02:00
* Forgot to add fpfonttextmapping.pp
git-svn-id: trunk@35090 -
This commit is contained in:
parent
18077d9530
commit
7ead78e71b
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -2596,6 +2596,7 @@ packages/fcl-pdf/examples/testfppdf.lpr svneol=native#text/plain
|
||||
packages/fcl-pdf/fpmake.pp svneol=native#text/plain
|
||||
packages/fcl-pdf/readme.txt svneol=native#text/plain
|
||||
packages/fcl-pdf/src/fontmetrics_stdpdf.inc svneol=native#text/plain
|
||||
packages/fcl-pdf/src/fpfonttextmapping.pp svneol=native#text/plain
|
||||
packages/fcl-pdf/src/fpparsettf.pp svneol=native#text/plain
|
||||
packages/fcl-pdf/src/fppdf.pp svneol=native#text/plain
|
||||
packages/fcl-pdf/src/fpttf.pp svneol=native#text/plain
|
||||
|
@ -33,11 +33,15 @@ begin
|
||||
P.Version:='3.1.1';
|
||||
T:=P.Targets.AddUnit('src/fpttfencodings.pp');
|
||||
T:=P.Targets.AddUnit('src/fpparsettf.pp');
|
||||
T:=P.Targets.AddUnit('src/fpfonttextmapping.pp');
|
||||
With T do
|
||||
Dependencies.AddUnit('fpttfencodings');
|
||||
T:=P.Targets.AddUnit('src/fpttfsubsetter.pp');
|
||||
With T do
|
||||
begin
|
||||
Dependencies.AddUnit('fpparsettf');
|
||||
Dependencies.AddUnit('fpfonttextmapping');
|
||||
end;
|
||||
T:=P.Targets.AddUnit('src/fpttf.pp');
|
||||
T:=P.Targets.AddUnit('src/fppdf.pp');
|
||||
With T do
|
||||
|
239
packages/fcl-pdf/src/fpfonttextmapping.pp
Normal file
239
packages/fcl-pdf/src/fpfonttextmapping.pp
Normal file
@ -0,0 +1,239 @@
|
||||
{
|
||||
This file is part of the Free Component Library (FCL)
|
||||
Copyright (c) 2016 by Graeme Geldenhuys
|
||||
|
||||
This unit defines classes that manage font glyph IDs and unicode
|
||||
character codes.
|
||||
|
||||
See the file COPYING.FPC, included in this distribution,
|
||||
for details about the copyright.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
unit FPFontTextMapping;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes,
|
||||
SysUtils,
|
||||
contnrs;
|
||||
|
||||
type
|
||||
|
||||
TTextMapping = class(TObject)
|
||||
private
|
||||
FCharID: uint32;
|
||||
FGlyphID: uint32;
|
||||
FNewGlyphID: uint32;
|
||||
FGlyphData: TStream;
|
||||
FIsCompoundGlyph: boolean;
|
||||
public
|
||||
constructor Create;
|
||||
class function NewTextMap(const ACharID, AGlyphID: uint32): TTextMapping;
|
||||
property CharID: uint32 read FCharID write FCharID;
|
||||
property GlyphID: uint32 read FGlyphID write FGlyphID;
|
||||
property NewGlyphID: uint32 read FNewGlyphID write FNewGlyphID;
|
||||
property GlyphData: TStream read FGlyphData write FGlyphData;
|
||||
property IsCompoundGlyph: boolean read FIsCompoundGlyph write FIsCompoundGlyph;
|
||||
end;
|
||||
|
||||
|
||||
TTextMappingList = class(TObject)
|
||||
private
|
||||
FList: TFPObjectList;
|
||||
function GetCount: Integer;
|
||||
protected
|
||||
function GetItem(AIndex: Integer): TTextMapping; virtual;
|
||||
procedure SetItem(AIndex: Integer; AValue: TTextMapping); virtual;
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
function Add(AObject: TTextMapping): Integer; overload;
|
||||
function Add(const ACharID, AGlyphID: uint32): Integer; overload;
|
||||
function Contains(const AGlyphID: uint32): boolean;
|
||||
function ContainsCharID(const AID: uint32): boolean;
|
||||
function GetNewGlyphID(const ACharID: uint32): uint32;
|
||||
function GetMaxCharID: uint32;
|
||||
function GetMaxGlyphID: uint32;
|
||||
procedure Insert(const AIndex: integer; const ACharID, AGlyphID: uint32);
|
||||
procedure Sort;
|
||||
property Count: Integer read GetCount;
|
||||
property Items[AIndex: Integer]: TTextMapping read GetItem write SetItem; default;
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
{ TTextMapping }
|
||||
|
||||
constructor TTextMapping.Create;
|
||||
begin
|
||||
FGlyphData := nil;
|
||||
FCharID := 0;
|
||||
FGlyphID := 0;
|
||||
FNewGlyphID := 0;
|
||||
FIsCompoundGlyph := False;
|
||||
end;
|
||||
|
||||
class function TTextMapping.NewTextMap(const ACharID, AGlyphID: uint32): TTextMapping;
|
||||
begin
|
||||
Result := TTextMapping.Create;
|
||||
Result.CharID := ACharID;
|
||||
Result.GlyphID := AGlyphID;
|
||||
end;
|
||||
|
||||
{ TTextMappingList }
|
||||
|
||||
function TTextMappingList.GetCount: Integer;
|
||||
begin
|
||||
Result := FList.Count;
|
||||
end;
|
||||
|
||||
function TTextMappingList.GetItem(AIndex: Integer): TTextMapping;
|
||||
begin
|
||||
Result := TTextMapping(FList.Items[AIndex]);
|
||||
end;
|
||||
|
||||
procedure TTextMappingList.SetItem(AIndex: Integer; AValue: TTextMapping);
|
||||
begin
|
||||
FList.Items[AIndex] := AValue;
|
||||
end;
|
||||
|
||||
constructor TTextMappingList.Create;
|
||||
begin
|
||||
FList := TFPObjectList.Create(True);
|
||||
end;
|
||||
|
||||
destructor TTextMappingList.Destroy;
|
||||
begin
|
||||
FList.Free;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TTextMappingList.Add(AObject: TTextMapping): Integer;
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
Result := -1;
|
||||
for i := 0 to FList.Count-1 do
|
||||
begin
|
||||
if TTextMapping(FList.Items[i]).CharID = AObject.CharID then
|
||||
Exit; // mapping already exists
|
||||
end;
|
||||
Result := FList.Add(AObject);
|
||||
end;
|
||||
|
||||
function TTextMappingList.Add(const ACharID, AGlyphID: uint32): Integer;
|
||||
var
|
||||
o: TTextMapping;
|
||||
begin
|
||||
o := TTextMapping.Create;
|
||||
o.CharID := ACharID;
|
||||
o.GlyphID := AGlyphID;
|
||||
Result := Add(o);
|
||||
if Result = -1 then
|
||||
o.Free;
|
||||
end;
|
||||
|
||||
function TTextMappingList.Contains(const AGlyphID: uint32): boolean;
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
Result := False;
|
||||
for i := 0 to Count-1 do
|
||||
begin
|
||||
if Items[i].GlyphID = AGlyphID then
|
||||
begin
|
||||
Result := True;
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TTextMappingList.ContainsCharID(const AID: uint32): boolean;
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
Result := False;
|
||||
for i := 0 to Count-1 do
|
||||
begin
|
||||
if Items[i].CharID = AID then
|
||||
begin
|
||||
Result := True;
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TTextMappingList.GetNewGlyphID(const ACharID: uint32): uint32;
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
for i := 0 to Count-1 do
|
||||
begin
|
||||
if Items[i].CharID = ACharID then
|
||||
begin
|
||||
Result := Items[i].NewGlyphID;
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TTextMappingList.GetMaxCharID: uint32;
|
||||
begin
|
||||
Sort;
|
||||
Result := Items[Count-1].CharID;
|
||||
end;
|
||||
|
||||
function TTextMappingList.GetMaxGlyphID: uint32;
|
||||
var
|
||||
gid: uint32;
|
||||
i: integer;
|
||||
begin
|
||||
gid := 0;
|
||||
for i := 0 to Count-1 do
|
||||
begin
|
||||
if Items[i].GlyphID > gid then
|
||||
gid := Items[i].GlyphID;
|
||||
end;
|
||||
result := gid;
|
||||
end;
|
||||
|
||||
procedure TTextMappingList.Insert(const AIndex: integer; const ACharID, AGlyphID: uint32);
|
||||
var
|
||||
o: TTextMapping;
|
||||
begin
|
||||
o := TTextMapping.Create;
|
||||
o.CharID := ACharID;
|
||||
o.GlyphID := AGlyphID;
|
||||
FList.Insert(AIndex, o);
|
||||
end;
|
||||
|
||||
function CompareByCharID(A, B: TTextMapping): Integer; inline;
|
||||
begin
|
||||
if A.CharID < B.CharID then
|
||||
Result := -1
|
||||
else if A.CharID > B.CharID then
|
||||
Result := 1
|
||||
else
|
||||
Result := 0;
|
||||
end;
|
||||
|
||||
function CompareByCharIDPtr(A, B: Pointer): Integer;
|
||||
begin
|
||||
Result := CompareByCharID(TTextMapping(A), TTextMapping(B));
|
||||
end;
|
||||
|
||||
procedure TTextMappingList.Sort;
|
||||
begin
|
||||
FList.Sort(@CompareByCharIDPtr);
|
||||
end;
|
||||
|
||||
end.
|
Loading…
Reference in New Issue
Block a user