www.pudn.com > racecar.zip > Font.pas
// ---------------------
// Unit: Font.pas
//
// Holds Font objects which can
// Load and display bitmap fonts.
//
// Author: Michael Pote
// Date: 02 Jan 2002
// -------------------
unit Font;
interface
Uses OpenGL;
type FontRect = Record
T1,U1,T2,U2, W, H: single;
end;
FontObj = Object
F: array of FontRect;
StartChar, FontLen, CharOffset: integer;
TexInd: glUInt;
SpaceWidth: single;
Procedure Load(const Path:string);
Procedure Draw(Const X,Y: single;Const Txt:string; Lev:single);
Function TextLen(Const Txt: string): single;
end;
implementation
Uses Classes, TGATexture;
procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external 'opengl32.dll';
Procedure DrawQuadRT(X, Y, Wid, Hgt, Lev, Tu, Tu2, Tv,Tv2: single);
begin
Tv := 1-Tv;
Tv2 := 1-Tv2;
glBegin(GL_QUADS);
glTexCoord2f(Tu, Tv); glVertex3f(X, Y, -lev);
glTexCoord2f(Tu2, Tv); glVertex3f(X+Wid, Y, -lev);
glTexCoord2f(Tu2,Tv2); glVertex3f(X+Wid, Y-Hgt, -lev);
glTexCoord2f(Tu, Tv2); glVertex3f(X, Y-Hgt, -lev);
glEnd;
end;
Procedure FontObj.Load(Const Path:string);
Var Fi: TfileStream;
I, Data: integer;
StPos: longint;
begin
LoadTGA(Path, TexInd, False);
SpaceWidth := 5;
Fi := TFileStream.Create(Path, $0000);
Fi.Seek(-sizeof(longint), soFromEnd);
Fi.Read(Stpos, sizeof(longint));
Fi.Seek(Stpos, soFromBeginning);
Fi.Read(Data, Sizeof(integer));
FontLen := Data;
Fi.Read(Data, Sizeof(integer));
StartChar := Data;
Fi.Read(Data, Sizeof(integer));
CharOffset := Data;
Setlength(F, FontLen+1);
For I := 0 to high(F) do
begin
Fi.Read(F[I], sizeof(FontRect));
end;
Fi.Free;
end;
Function FontObj.TextLen(Const Txt:string): single;
Var I, Let: integer;
Len: single;
begin
Len := 0;
For I := 0 to length(Txt) do
begin
Let := Ord(Txt[I])-StartChar;
if (Let <> -1) then
begin
Len := Len + F[Let].W+1-CharOffset;
end
else
Len := Len + SpaceWidth;
end;
Result := Len;
end;
Procedure FontObj.Draw(Const X,Y: single;Const Txt:string; Lev:single);
Var I, Let: integer;
Xx: Single;
begin
if txt = '' then exit;
glBindTexture(GL_TEXTURE_2D,TexInd);
Xx := X;
For I := 1 to length(Txt) do
begin
Let := Ord(Txt[I])-StartChar;
if (Let <> -1) and not (let > FontLen) then
begin
DrawQuadRT(Xx,Y, F[Let].W+1.25,F[Let].H+1.25,Lev,F[Let].T1,F[Let].T2+0.005,F[Let].U1,F[Let].U2+0.005);
Xx := Xx + F[Let].W+1.25-CharOffset;
end
else
Xx := Xx + SpaceWidth;
end;
end;
end.