FreeType 1.31.1
This commit is contained in:
222
pascal/test/zonetv.pas
Normal file
222
pascal/test/zonetv.pas
Normal file
@@ -0,0 +1,222 @@
|
||||
{****************************************************************************}
|
||||
{* *}
|
||||
{* ZoneTV.PAS *}
|
||||
{* *}
|
||||
{* This unit implements a simple TrueType zone points viewer for the *}
|
||||
{* FREETYPE project debugger. *}
|
||||
{* *}
|
||||
{****************************************************************************}
|
||||
|
||||
Unit ZoneTV;
|
||||
|
||||
interface
|
||||
|
||||
uses Objects, Views, Drivers, FreeType, TTTypes, TTTables, TTObjs, TTDebug;
|
||||
|
||||
{$I DEBUGGER.INC}
|
||||
|
||||
type
|
||||
|
||||
{ TZoneViewer }
|
||||
|
||||
{ This TView is a simple point array viewer }
|
||||
|
||||
PZoneViewer = ^TZoneViewer;
|
||||
TZoneViewer = object( TListViewer )
|
||||
|
||||
constructor Init( var Bounds : TRect;
|
||||
AZone : PGlyph_Zone );
|
||||
|
||||
procedure Draw; virtual;
|
||||
procedure HandleEvent( var Event : TEvent ); virtual;
|
||||
|
||||
private
|
||||
Zone : PGlyph_Zone; { Pointer to the zone being displayed }
|
||||
Save : TGlyph_Zone; { A copy of the zone to highlight }
|
||||
{ changes }
|
||||
procedure Copy_Zone;
|
||||
|
||||
end;
|
||||
|
||||
{ TCodeWindow }
|
||||
|
||||
PZoneWindow = ^TZoneWindow;
|
||||
TZoneWindow = object( TWindow )
|
||||
ZoneView : PZoneViewer;
|
||||
constructor Init( var Bounds : TRect;
|
||||
AZone : PGlyph_Zone );
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{ TZoneViewer }
|
||||
|
||||
constructor TZoneViewer.Init;
|
||||
var
|
||||
n : Int;
|
||||
begin
|
||||
inherited Init( Bounds, 1, nil, nil );
|
||||
|
||||
GrowMode := gfGrowHiX or gfGrowHiY;
|
||||
DragMode := dmDragGrow or dmLimitLoX or dmLimitLoY;
|
||||
Options := Options or ofSelectable;
|
||||
EventMask := EventMask or evWave;
|
||||
|
||||
Zone := AZone;
|
||||
|
||||
GetMem( Save.org, zone^.n_points*2*sizeof(Long) );
|
||||
GetMem( Save.cur, zone^.n_points*2*sizeof(Long) );
|
||||
GetMem( Save.flags, zone^.n_points*sizeof(Byte) );
|
||||
|
||||
Save.n_points := Zone^.n_points;
|
||||
Save.n_contours := Zone^.n_contours;
|
||||
|
||||
Copy_Zone;
|
||||
|
||||
SetRange( Save.n_points );
|
||||
end;
|
||||
|
||||
|
||||
procedure TZoneViewer.Copy_Zone;
|
||||
var
|
||||
n : Int;
|
||||
begin
|
||||
n := 2*zone^.n_points * sizeof(Long);
|
||||
|
||||
(* Note that we save also the original coordinates, as we're not sure *)
|
||||
(* that the debugger is debugged ! *)
|
||||
|
||||
move( Zone^.org^, Save.org^, n );
|
||||
move( Zone^.cur^, Save.cur^, n );
|
||||
move( Zone^.flags^, Save.flags^, zone^.n_points );
|
||||
end;
|
||||
|
||||
|
||||
procedure TZoneViewer.HandleEvent( var Event : TEvent );
|
||||
var
|
||||
Limits : TRect;
|
||||
Mini, Maxi : Objects.TPoint;
|
||||
begin
|
||||
|
||||
inherited HandleEvent(Event);
|
||||
|
||||
Case Event.What of
|
||||
|
||||
evWave : case Event.Command of
|
||||
|
||||
cmNewExecution : Copy_Zone;
|
||||
|
||||
cmRefocus : DrawView;
|
||||
|
||||
end;
|
||||
|
||||
evCommand : case Event.Command of
|
||||
|
||||
cmResize: begin
|
||||
Owner^.GetExtent(Limits);
|
||||
SizeLimits( Mini, Maxi );
|
||||
DragView(Event, DragMode, Limits, Mini, Maxi );
|
||||
ClearEvent(Event);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TZoneViewer.Draw;
|
||||
const
|
||||
Colors : array[0..3] of byte
|
||||
= ($30,$3F,$0B,$0E);
|
||||
Touchs : array[0..3] of Char
|
||||
= (' ','x','y','b');
|
||||
OnOff : array[0..1] of Char
|
||||
= (' ',':');
|
||||
var
|
||||
I, J, Item : Int;
|
||||
B : TDrawBuffer;
|
||||
S : String;
|
||||
Indent : Int;
|
||||
Ligne : Int;
|
||||
|
||||
Changed : Boolean;
|
||||
|
||||
Back_Color,
|
||||
Color : word;
|
||||
|
||||
On_BP : boolean;
|
||||
BP : PBreakPoint;
|
||||
|
||||
begin
|
||||
|
||||
if HScrollBar <> nil then Indent := HScrollBar^.Value
|
||||
else Indent := 0;
|
||||
|
||||
with Save do
|
||||
begin
|
||||
|
||||
for I := 0 to Self.Size.Y-1 do
|
||||
begin
|
||||
|
||||
MoveChar( B, ' ', Colors[0], Self.Size.X );
|
||||
|
||||
Item := TopItem + I;
|
||||
|
||||
if (Range > 0) and
|
||||
( Focused = Item ) then Back_Color := 2
|
||||
else Back_Color := 0;
|
||||
|
||||
if Item < n_points then
|
||||
begin
|
||||
|
||||
Color := Back_Color;
|
||||
if ( flags^[item] <> Zone^.flags^[item] ) then inc( Color );
|
||||
|
||||
S := Hex16( Item ) + ': ';
|
||||
S[1] := OnOff[Zone^.flags^[item] and 1];
|
||||
S[7] := Touchs[(Zone^.flags^[item] and TT_Flag_Touched_Both) shr 1];
|
||||
|
||||
MoveStr( B, S, Colors[Color] );
|
||||
|
||||
Color := Back_Color;
|
||||
if ( org^[item].x <> Zone^.org^[item].x ) then inc( Color );
|
||||
|
||||
MoveStr ( B[8], Hex32( Zone^.org^[item].x ), Colors[Color] );
|
||||
MoveChar( B[16], ',', Colors[0], 1 );
|
||||
|
||||
Color := Back_Color;
|
||||
if ( org^[item].y <> Zone^.org^[item].y ) then inc( Color );
|
||||
|
||||
MoveStr( B[17], Hex32( Zone^.org^[item].y ), Colors[Color] );
|
||||
MoveStr( B[25], ' : ', Colors[0] );
|
||||
|
||||
Color := Back_Color;
|
||||
if ( cur^[item].x <> Zone^.cur^[item].x ) then inc( Color );
|
||||
|
||||
MoveStr ( B[28], Hex32( Zone^.cur^[item].x ), Colors[Color] );
|
||||
MoveChar( B[36], ',', Colors[0], 1 );
|
||||
|
||||
Color := Back_Color;
|
||||
if ( cur^[item].y <> Zone^.cur^[item].y ) then inc( Color );
|
||||
|
||||
MoveStr( B[37], Hex32( Zone^.cur^[item].y ), Colors[Color] );
|
||||
|
||||
end;
|
||||
|
||||
WriteLine( 0, I, Self.Size.X, 1, B );
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ TZoneWindow }
|
||||
|
||||
constructor TZoneWindow.Init;
|
||||
begin
|
||||
inherited Init( Bounds,'Zone',wnNoNumber );
|
||||
GetExtent( Bounds );
|
||||
Bounds.Grow(-1,-1);
|
||||
New( ZoneView, Init( Bounds, AZone ) );
|
||||
Insert( ZoneView );
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user