瀏覽代碼

* fixed tab handling

master
Bergmann89 10 年之前
父節點
當前提交
47bb93569a
共有 2 個文件被更改,包括 19 次插入33 次删除
  1. +1
    -0
      examples/PostProcess/PostProcess.lpi
  2. +18
    -33
      utsTextSuite.pas

+ 1
- 0
examples/PostProcess/PostProcess.lpi 查看文件

@@ -43,6 +43,7 @@
<ComponentName Value="MainForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="uMainForm"/>
</Unit1>
</Units>
</ProjectOptions>


+ 18
- 33
utsTextSuite.pas 查看文件

@@ -140,9 +140,7 @@ type
fChars: array[Byte] of PtsFontCharArray;
fCreateChars: Boolean;

//function HasChar(const aCharCode: WideChar): Boolean;
function GetChar(const aCharCode: WideChar): TtsChar;
//function GetCharCreate(const aCharCode: WideChar): TtsChar;
procedure AddChar(const aCharCode: WideChar; const aChar: TtsChar); overload;
protected
{%H-}constructor Create(const aRenderer: TtsRenderer; const aGenerator: TtsFontGenerator; const aProperties: TtsFontProperties);
@@ -266,6 +264,9 @@ type
tsItemTypeSpacing: (
Spacing: Integer;
);
tsItemTypeTab: (
TabWidth: Integer; // with of tab (in pixel)
);
end;

TtsLineFlag = (
@@ -977,14 +978,6 @@ end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TtsFont///////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
function TtsFont.HasChar(const aCharCode: WideChar): Boolean;
begin
result := Assigned(GetChar(aCharCode));
end;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TtsFont.GetChar(const aCharCode: WideChar): TtsChar;
var
@@ -997,16 +990,6 @@ begin
result := nil;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
function TtsFont.GetCharCreate(const aCharCode: WideChar): TtsChar;
begin
result := GetChar(aCharCode);
if not Assigned(result) then
result := AddChar(aCharCode);
end;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TtsFont.AddChar(const aCharCode: WideChar; const aChar: TtsChar);
var
@@ -1036,7 +1019,7 @@ begin
fGenerator := aGenerator;
fProperties := aProperties;
fCharSpacing := 0;
fTabWidth := 0;
fTabWidth := 1;
fLineSpacing := 0.0;
fCreateChars := true;
fGenerator.RegisterFont(self);
@@ -1550,6 +1533,8 @@ begin
fLastLine^.meta.Width := fLastLine^.meta.Width + aItem^.TextWidth;
tsItemTypeSpacing:
fLastLine^.meta.Width := fLastLine^.meta.Width + aItem^.Spacing;
tsItemTypeTab:
fLastLine^.meta.Width := fLastLine^.meta.Width + aItem^.TabWidth;
end;
result := true;
end;
@@ -1646,9 +1631,8 @@ var

case State of
tsItemTypeText, tsItemTypeSpace: begin
p^.Text := tsStrAlloc(TextLength);
TextLength := 0;
Text := p^.Text;
p^.Text := tsStrAlloc(TextLength);
Text := p^.Text;
while (TextBegin <> aText) do begin
Text^ := TextBegin^;
inc(Text, 1);
@@ -1657,18 +1641,15 @@ var
AddItem(p);
end;

tsItemTypeLineBreak: begin
AddItem(p);
TextBegin := aText;
end;

tsItemTypeTab: begin
tsItemTypeLineBreak, tsItemTypeTab: begin
AddItem(p);
end;

else
Dispose(p);
end;
TextBegin := aText;
TextLength := 0;
end;

begin
@@ -1702,8 +1683,7 @@ begin

// tabulator
#$0009: begin
if (State <> tsItemTypeTab) then
ExtractWord;
ExtractWord;
State := tsItemTypeTab;
end;

@@ -1725,6 +1705,7 @@ end;
function TtsTextBlock.SplitIntoLines(aItem: PtsLineItem): Boolean;
var
p: PtsLineItem;
tab: Integer;
begin
result := false;
if not Assigned(fCurrentFont) then
@@ -1779,6 +1760,8 @@ begin
end;

tsItemTypeTab: begin
tab := fCurrentFont.TabWidth * fCurrentFont.Properties.Size;
p^.TabWidth := (1 + fLastLine^.meta.Width div tab) * tab - fLastLine^.meta.Width;
if not PushLineItem(p) then
FreeLineItem(p);
end;
@@ -2102,7 +2085,9 @@ var
// get current x pos and round it to TabWidth
pos := GetDrawPos;
tab := font.TabWidth * font.Properties.Size;
pos.x := Ceil(pos.x * tab) div tab;
if (tab = 0) then
tab := 1;
pos.x := aBlock.Left + (1 + (pos.x - aBlock.Left) div tab) * tab;
SetDrawPos(pos.x, pos.y);
end;



Loading…
取消
儲存