mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-05 09:18:15 +02:00
134 lines
3.8 KiB
PHP
134 lines
3.8 KiB
PHP
|
|
function IsCJK_Unified_Ideographs(ACodePoint : Cardinal) : Boolean;inline;
|
|
begin
|
|
Result := (ACodePoint >= $4E00) and (ACodePoint <= $9FFF); // $9FCC, $9FFF
|
|
end;
|
|
|
|
function IsCJK_Compatibility_Ideographs(ACodePoint : Cardinal) : Boolean;inline;
|
|
begin
|
|
Result := (ACodePoint >= $F900) and (ACodePoint <= $FAFF);
|
|
end;
|
|
|
|
function IsTangut(ACodePoint : Cardinal) : Boolean;inline;
|
|
begin
|
|
Result := (ACodePoint >= $17000) and (ACodePoint <= $187FF);
|
|
end;
|
|
|
|
function IsTangutComponent(ACodePoint : Cardinal) : Boolean;inline;
|
|
begin
|
|
Result := (ACodePoint >= $18800) and (ACodePoint <= $18AFF);
|
|
end;
|
|
|
|
function IsTangutSupplement(ACodePoint : Cardinal) : Boolean;inline;
|
|
begin
|
|
Result := (ACodePoint >= $18D00) and (ACodePoint <= $18D7F);
|
|
end;
|
|
|
|
procedure DeriveWeightTangut(const ACodePoint : Cardinal; AResult : PUCA_PropWeights);inline;
|
|
begin
|
|
AResult[0].Weights[0] := Word($FB00);
|
|
AResult[0].Weights[1] := $20;
|
|
AResult[0].Weights[2] := $2;
|
|
|
|
AResult[1].Weights[0] := (ACodePoint - $17000) or $8000;
|
|
AResult[1].Weights[1] := 0;
|
|
AResult[1].Weights[2] := 0;
|
|
end;
|
|
|
|
function IsNushu(ACodePoint : Cardinal) : Boolean;inline;
|
|
begin
|
|
Result := (ACodePoint >= $1B170) and (ACodePoint <= $1B2FF);
|
|
end;
|
|
|
|
function IsKhitanSmallScript(ACodePoint : Cardinal) : Boolean;inline;
|
|
begin
|
|
Result := (ACodePoint >= $18B00) and (ACodePoint <= $18CFF);
|
|
end;
|
|
|
|
procedure DeriveWeightNushu(const ACodePoint : Cardinal; AResult : PUCA_PropWeights);inline;
|
|
begin
|
|
AResult[0].Weights[0] := Word($FB01);
|
|
AResult[0].Weights[1] := $20;
|
|
AResult[0].Weights[2] := $2;
|
|
|
|
AResult[1].Weights[0] := (ACodePoint - $1B170) or $8000;
|
|
AResult[1].Weights[1] := 0;
|
|
AResult[1].Weights[2] := 0;
|
|
end;
|
|
|
|
procedure DeriveWeightKhitanSmallScript(const ACodePoint : Cardinal; AResult : PUCA_PropWeights);inline;
|
|
begin
|
|
AResult[0].Weights[0] := Word($FB02);
|
|
AResult[0].Weights[1] := $20;
|
|
AResult[0].Weights[2] := $2;
|
|
|
|
AResult[1].Weights[0] := (ACodePoint - $18B00) or $8000;
|
|
AResult[1].Weights[1] := 0;
|
|
AResult[1].Weights[2] := 0;
|
|
end;
|
|
|
|
{$IFDEF UNI_BUILD_TIME}
|
|
function isUnifiedIdeograph(const ACodePoint : Cardinal; const AUnifiedIdeographs : TCodePointRecArray) : boolean;
|
|
begin
|
|
Result := IsIncluded(ACodePoint,AUnifiedIdeographs);
|
|
end;
|
|
{$ENDIF UNI_BUILD_TIME}
|
|
|
|
{$IFNDEF UNI_BUILD_TIME}
|
|
function isUnifiedIdeograph(const ACodePoint : Cardinal) : boolean;
|
|
var
|
|
p : PUC_Prop;
|
|
begin
|
|
p := GetProps(ACodePoint);
|
|
Result := (p <> nil) and p^.UnifiedIdeograph;
|
|
end;
|
|
{$ENDIF UNI_BUILD_TIME}
|
|
|
|
procedure DeriveWeight(
|
|
const ACodePoint : Cardinal;
|
|
AResult : PUCA_PropWeights
|
|
{$IFDEF UNI_BUILD_TIME}
|
|
;const AUnifiedIdeographs : TCodePointRecArray
|
|
{$ENDIF UNI_BUILD_TIME}
|
|
);
|
|
const
|
|
BASE_1 = Word($FB40);
|
|
BASE_2 = Word($FB80);
|
|
BASE_3 = Word($FBC0);
|
|
var
|
|
base : Word;
|
|
ui : boolean;
|
|
begin
|
|
if IsTangut(ACodePoint) or
|
|
IsTangutComponent(ACodePoint) or
|
|
IsTangutSupplement(ACodePoint)
|
|
then begin
|
|
DeriveWeightTangut(ACodePoint,AResult);
|
|
end else if IsNushu(ACodePoint) then begin
|
|
DeriveWeightNushu(ACodePoint,AResult);
|
|
end else if IsKhitanSmallScript(ACodePoint) then begin
|
|
DeriveWeightKhitanSmallScript(ACodePoint,AResult);
|
|
end else begin
|
|
ui := isUnifiedIdeograph(ACodePoint{$IFDEF UNI_BUILD_TIME},AUnifiedIdeographs{$ENDIF UNI_BUILD_TIME});
|
|
if ui and
|
|
(IsCJK_Unified_Ideographs(ACodePoint) or IsCJK_Compatibility_Ideographs(ACodePoint))
|
|
then begin
|
|
base := BASE_1
|
|
end else if ui and
|
|
not(IsCJK_Unified_Ideographs(ACodePoint) or IsCJK_Compatibility_Ideographs(ACodePoint))
|
|
then begin
|
|
base := BASE_2
|
|
end else begin
|
|
base := BASE_3;
|
|
end;
|
|
|
|
AResult[0].Weights[0] := base + (ACodePoint shr 15);
|
|
AResult[0].Weights[1] := $20;
|
|
AResult[0].Weights[2] := $2;
|
|
|
|
AResult[1].Weights[0] := (ACodePoint and $7FFF) or $8000;
|
|
AResult[1].Weights[1] := 0;
|
|
AResult[1].Weights[2] := 0;
|
|
end;
|
|
end;
|