123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 1993,97 by the Free Pascal development team
- 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.
- **********************************************************************}
- {***************************************************************************}
- { Textausgabe }
- {***************************************************************************}
- const
- { maximal 16 Vektorfonts unterst�tzen }
- { um mehr Fonts laden zu k”nnen, muá }
- { diese Variable erh”ht werden }
- maxfonts = 16;
- fontdivs:array[0..maxfonts]of integer=
- (1,4,3,4,4,4,4,4,4,3,3,1,1,1,1,1,1);
-
- type
- pbyte = ^byte;
- {$PACKRECORDS 1}
- pfontdata = ^tfontdata;
- tfontdata = record
- filetyp : char;
- nr_chars : word;
- undefined1 : byte;
- value_first_char : byte;
- undefined2 : array[1..3] of byte;
- dist_origin_top : shortint;
- dist_origin_baseline : shortint;
- dist_origin_bottom : shortint;
- undefined3 : array[1..5] of byte;
- end;
- {$PACKRECORDS NORMAL}
- tfontrec = record
- name : string[8];
- data : pointer;
- header : pfontdata;
- offsets : pword;
- widths : pbyte;
- instr : pbyte;
- end;
- var
- fonts : array[1..maxfonts] of tfontrec;
- installedfonts : longint;
- {$I FONT.PPI}
- { gibt true zur�ck, wenn p auf eine g�ltige Fontdatei zeigt }
- function testfont(p : pointer) : boolean;
- begin
- testfont:=(pchar(p)^='P') and
- (pchar(p+1)^='K') and
- (pchar(p+2)^=#8) and
- (pchar(p+3)^=#8);
- end;
- { setzt die Hilfsdaten f�r den Font mit der Nr. font }
- { der Zeiger data muá schon gesetzt sein }
- function setupfont(font : word) : integer;
- begin
- setupfont:=grOK;
- fonts[font].header:=fonts[font].data+$80;
- if fonts[font].header^.filetyp<>'+' then
- begin
- setupfont:=grInvalidFont;
- exit;
- end;
- fonts[font].offsets:=fonts[font].data+$90;
- fonts[font].widths:=pbyte(fonts[font].offsets+fonts[font].header^.nr_chars*2);
- fonts[font].instr:=fonts[font].widths+fonts[font].header^.nr_chars;
- end;
- function InstallUserFont(const FontFileName : string) : integer;
- begin
- _graphresult:=grOk;
- { es muá kein Graphikmodus gesetzt sein! }
- { ist noch Platz f�r einen Font ? }
- if installedfonts=maxfonts then
- begin
- _graphresult:=grError;
- exit;
- end;
- inc(installedfonts);
- fonts[installedfonts].name:=FontFileName;
- fonts[installedfonts].data:=nil;
- InstallUserFont:=installedfonts;
- end;
- function RegisterBGIfont(font : pointer) : integer;
- var
- hp : pbyte;
- b : word;
- name : string[12];
- begin
- { noch nicht garantiert, daá alles klappt }
- RegisterBGIfont:=grInvalidFontNum;
- { es muá kein Graphikmodus gesetzt sein! }
- if testfont(font) then
- begin
- hp:=pbyte(font);
- { Ende des Textheaders suchen }
- while hp^<>$1a do
- hp:=hp+1;
- { auf Start des Names springen }
- hp:=hp+3;
- { Namen lesen }
- name:='';
- for b:=0 to 3 do
- name:=name+char((hp+b)^);
- { richtigen Font suchen }
- for b:=1 to installedfonts do
- begin
- if fonts[b].name=name then
- begin
- fonts[b].data:=font;
- RegisterBGIfont:=grOK;
- RegisterBGIfont:=setupfont(b);
- end;
- end;
- end
- else
- RegisterBGIFont:=grInvalidFont;
- end;
- procedure GetTextSettings(var TextInfo : TextSettingsType);
- begin
- _graphresult:=grOk;
- if not isgraphmode then
- begin
- _graphresult:=grnoinitgraph;
- exit;
- end;
- textinfo:=akttextinfo;
- end;
- procedure OutText(const TextString : string);
- var x,y:integer;
- begin
- _graphresult:=grOk;
- if not isgraphmode then
- begin
- _graphresult:=grnoinitgraph;
- exit;
- end;
- x:=curx; y:=cury;
- OutTextXY(curx,cury,TextString);
- { wenn horizontal und linksb�ndig ausgegeben wird, dann }
- { Grafikcursor nachf�hren }
- if (akttextinfo.direction=HorizDir) and
- (akttextinfo.horiz=LeftText) then
- inc(x,textwidth(TextString));
- curx:=x; cury:=y; { LineTo manipuliert den GrafikCursor !! }
- end;
- procedure outtext(const charakter : char);
- var s:string;
- x,y:integer;
- begin
- s:=charakter;
- _graphresult:=grOk;
- if not isgraphmode then
- begin
- _graphresult:=grnoinitgraph;
- exit;
- end;
- x:=curx; y:=cury;
- OutTextXY(curx,cury,s);
- { wenn horizontal und linksb�ndig ausgegeben wird, dann }
- { Grafikcursor nachf�hren }
- { if (akttextinfo.direction=HorizDir) and
- (akttextinfo.horiz=LeftText) then }
- inc(x,textwidth(s));
- curx:=x; cury:=y; { LineTo manipuliert den GrafikCursor !! }
- end;
-
- procedure OutTextXY(x,y : integer;const TextString : string);
- var
- b1,b2 : shortint;
- c,instr,mask : byte;
- i,j,k : longint;
- oldvalues : linesettingstype;
- nextpos : word;
- xpos,ypos,offs: longint;
- FontPtr : Pointer;
- begin
- _graphresult:=grOk;
- if not isgraphmode then
- begin
- _graphresult:=grnoinitgraph;
- exit;
- end;
-
- { wirkliche x- und y-Startposition berechnen }
- if akttextinfo.direction=horizdir then
- begin
- case akttextinfo.horiz of
- centertext : XPos:=(textwidth(textstring) shr 1);
- lefttext : XPos:=0;
- righttext : XPos:=textwidth(textstring);
- end;
- case akttextinfo.vert of
- centertext : YPos:=(textheight(textstring) shr 1);
- bottomtext : YPos:=0;
- toptext : YPos:=textheight(textstring);
- end;
- end else
- begin
- case akttextinfo.horiz of
- centertext : XPos:=(textheight(textstring) shr 1);
- lefttext : XPos:=0;
- righttext : XPos:=textheight(textstring);
- end;
- case akttextinfo.vert of
- centertext : YPos:=(textwidth(textstring) shr 1);
- bottomtext : YPos:=0;
- toptext : YPos:=textwidth(textstring);
- end;
- end;
- X:=X-XPos; Y:=Y+YPos;
- XPos:=X; YPos:=Y;
-
- if akttextinfo.font=DefaultFont then begin
- y:=y-6;
- c:=textwidth(textstring) div 8 - 1; { Charcounter }
- FontPtr:=@defaultfontdata;
- for i:=0 to c do begin
- offs:=ord(textString[i+1]) shl 3; { Offset des Chars in Data }
- for j:=0 to 7 do begin
- mask:=$80;
- b1:=defaultfontdata[offs+j]; { Offset der Charzeile }
- xpos:=i shl 3+x;
- for k:=0 to 7 do begin
- if (b1 and mask) <> 0 then putpixel(xpos+k,j+y,aktcolor);
- mask:=mask shr 1;
- end;
- end;
- end;
- end else
-
- begin
- { Linienstil setzen }
- getlinesettings(oldvalues);
- setlinestyle(solidln,oldvalues.pattern,normwidth);
- if akttextinfo.direction=vertdir then xpos:=xpos + Textheight(textstring);
- curx:=xpos; cury:=ypos; x:=xpos; y:=ypos;
- for i:=1 to length(textstring) do
- begin
- c:=byte(textstring[i]);
- c:=c-fonts[akttextinfo.font].header^.value_first_char;
- { definiertes Zeichen ? }
- if (c<0) or (c>=fonts[akttextinfo.font].header^.nr_chars) then continue;
- nextpos:=fonts[akttextinfo.font].offsets[c];
- while true do
- begin
- b1:=fonts[akttextinfo.font].instr[nextpos];
- nextpos:=nextpos+1;
- b2:=fonts[akttextinfo.font].instr[nextpos];
- nextpos:=nextpos+1;
- instr:=((b1 and $80) shr 6)+((b2 and $80) shr 7);
- b1:=b1 and $7f;
- b2:=b2 and $7f;
- { Vorzeichen erweitern }
- if (b1 and $40)<>0 then b1:=b1 or $80;
- if (b2 and $40)<>0 then b2:=b2 or $80;
- { neue Stiftposition berechnen und skalieren }
- if akttextinfo.direction=VertDir then
- begin
- xpos:=x-((b2*aktmultx) div aktdivx);
- ypos:=y-((b1*aktmulty) div aktdivy);
- end
- else
- begin
- xpos:=x+((b1*aktmultx) div aktdivx) ;
- ypos:=y-((b2*aktmulty) div aktdivy) ;
- end;
- case instr of
- 0 : break;
- 2 : begin curx:=xpos; cury:=ypos; end;
- 3 : begin line(curx,cury,xpos,ypos);
- curx:=xpos; cury:=ypos;
- end;
- end;
- end;
- if akttextinfo.direction=VertDir then
- y:=y-(fonts[akttextinfo.font].widths[c]*aktmultx div aktdivx)
- else
- x:=x+(fonts[akttextinfo.font].widths[c]*aktmultx div aktdivx) ;
- end;
- setlinestyle( oldvalues.linestyle, oldvalues.pattern, oldvalues.thickness);
- end;
- end;
- procedure outtextxy(x,y: Integer;const charakter : char);
- var s:string;
- begin
- s:=charakter;
- outtextXY(x,y,s);
- end;
-
- function TextHeight(const TextString : string) : word;
- begin
- _graphresult:=grOk;
- if not isgraphmode then
- begin
- _graphresult:=grnoinitgraph;
- exit;
- end;
- if akttextinfo.font=DefaultFont
- then TextHeight:=6+akttextinfo.charsize
- else
- TextHeight:=(((fonts[akttextinfo.font].header^.dist_origin_top-
- fonts[akttextinfo.font].header^.dist_origin_bottom) * aktmulty) div aktdivy) ;
- end;
- function TextWidth(const TextString : string) : word;
- var i,x : Integer;
- c : byte;
- begin
- _graphresult:=grOk; x:=0;
- if not isgraphmode then
- begin
- _graphresult:=grnoinitgraph;
- exit;
- end;
- if akttextinfo.font = Defaultfont then
- TextWidth:=length(TextString)*8*akttextinfo.charsize
- else begin
- for i:=1 to length(TextString) do begin
- c:=byte(textstring[i]);
- dec(c,fonts[akttextinfo.font].header^.value_first_char);
- { definiertes Zeichen ? }
- if (c<0) or (c>=fonts[akttextinfo.font].header^.nr_chars) then
- continue;
- x:=x+fonts[akttextinfo.font].widths[c];
- end;
- TextWidth:=((x * aktmultx) div aktdivx) ;
- end;
- end;
- procedure SetTextJustify(horiz,vert : word);
- begin
- _graphresult:=grOk;
- if not isgraphmode then
- begin
- _graphresult:=grnoinitgraph;
- exit;
- end;
- if (horiz<0) or (horiz>2) or
- (vert<0) or (vert>2) then
- begin
- _graphresult:=grError;
- exit;
- end;
- akttextinfo.horiz:=horiz;
- akttextinfo.vert:=vert;
- end;
- procedure SetTextStyle(font,direction : word;charsize : word);
- var
- f : file;
- begin
- _graphresult:=grOk;
- if not isgraphmode then
- begin
- _graphresult:=grnoinitgraph;
- exit;
- end;
- { Parameter auf G�ltigkeit �berpr�fen }
- if font>installedfonts then
- begin
- _graphresult:=grInvalidFontNum;
- exit;
- end;
- akttextinfo.font:=font;
- if (direction<>HorizDir) and (direction<>VertDir) then
- direction:=HorizDir;
- akttextinfo.direction:=direction;
- akttextinfo.charsize:=charsize;
- if (charsize <> usercharsize) then begin
- aktmultx:=charsize;
- aktdivx:=fontdivs[font];
- aktmulty:=charsize;
- aktdivy:=fontdivs[font];
- end;
- { Fontdatei laden ? }
- if (font>0) and not assigned(fonts[font].data) then
- begin
- assign(f,bgipath+fonts[font].name+'.CHR');
- reset(f,1);
- if ioresult<>0 then
- begin
- _graphresult:=grFontNotFound;
- akttextinfo.font:=DefaultFont;
- exit;
- end;
- getmem(fonts[font].data,filesize(f));
- if not assigned(fonts[font].data) then
- begin
- _graphresult:=grNoFontMem;
- akttextinfo.font:=DefaultFont;
- exit;
- end;
- blockread(f,fonts[font].data^,filesize(f));
- if testfont(fonts[font].data) then
- _graphresult:=setupfont(font)
- else
- begin
- _graphresult:=grInvalidFont;
- akttextinfo.font:=DefaultFont;
- freemem(fonts[font].data,filesize(f));
- end;
- close(f);
- end;
- end;
- procedure SetUserCharSize(Multx,Divx,Multy,Divy : word);
- begin
- _graphresult:=grOk;
- if not isgraphmode then
- begin
- _graphresult:=grnoinitgraph;
- exit;
- end;
- aktmultx:=Multx;
- aktdivx:=Divx;
- aktmulty:=Multy;
- aktdivy:=Divy;
- end;
-
- {
- $Log$
- Revision 1.1 1998-03-25 11:18:42 root
- Initial revision
- Revision 1.3 1998/01/26 11:58:41 michael
- + Added log at the end
-
- Working file: rtl/dos/ppi/text.ppi
- description:
- ----------------------------
- revision 1.2
- date: 1997/12/01 12:21:34; author: michael; state: Exp; lines: +14 -0
- + added copyright reference in header.
- ----------------------------
- revision 1.1
- date: 1997/11/27 08:33:51; author: michael; state: Exp;
- Initial revision
- ----------------------------
- revision 1.1.1.1
- date: 1997/11/27 08:33:51; author: michael; state: Exp; lines: +0 -0
- FPC RTL CVS start
- =============================================================================
- }
|