/ Forside/ Teknologi / Udvikling / Delphi/Pascal / Tip
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Hvad er font navnet ud fra denne TTF fil~
Er bedømt af 1 brugere
Fra : gubi
Vist : 761 gange

Dato : 03-12-00 11:42

Giver dig det rigtige font navn, ud fra en TTF fil.

************************************************

type
tOffsetTable = record
sfntVersion : integer;
numTables : word;
searchRange : word;
entrySelector : word;
rangeShift : word;
end;

type
tTagTable = record
tag : array[0..3] of char;
checkSum : integer;
offset : array[1..4] of byte;
length : integer;
end;

function FindOffsetToTag(Filename,Tag : pChar) : integer;
var
TagComp : array[0..4] of char;
fh : integer;
ofs : tOFSTRUCT;
tot : tOffsetTable;
ttt : tTagTable;
Flag : boolean;
readBytes : integer;
b : byte;
w : integer;

begin
Result:=-1;
FillChar(TagComp,SizeOf(TagComp),#0);
FillChar (ofs,sizeof (TOFSTRUCT),#0);
if OpenFile(Filename,ofs,OF_EXIST or OF_READ)=-1 then
Exit;
FH:=OpenFile(filename,ofs,OF_REOPEN or OF_READ);
if FH=-1 then
Exit;
_lread(FH,@tot,sizeof(tOffsetTable));
Flag:=false;
Result:=-1;
while not Flag do
begin
readBytes:=_lread(FH,@ttt,sizeof(tTagTable));
if ReadBytes<>sizeof(tTagTable) then
Flag:=true
else
begin
for b:=0 to 3 do
TagComp[b]:=ttt.tag[b];
if StrIComp(TagComp,Tag)=0 then
begin
Flag:=true;
Result:=ttt.offset[1] shl 8;
Result:=Result or ttt.offset[2];
Result:=Result shl 16;
w:=ttt.offset[3] shl 8;
w:=w or ttt.offset[4];
Result:=Result or w;
end;
end;
end;
_lclose(FH);
end;

function GetNameRecordsNum(Filename : pChar;Offset : integer;var StringOfs : integer) : word;
var
ofs : tOfStruct;
fh : integer;
tnt : array[0..5] of byte;

begin
Result:=0;
FillChar (ofs,sizeof (TOFSTRUCT),#0);
if OpenFile(Filename,ofs,OF_EXIST or OF_READ)=-1 then
Exit;
FH:=OpenFile(filename,ofs,OF_REOPEN or OF_READ);
if FH=-1 then
Exit;
if _llseek (FH,offset,0)=-1 then
begin
_lclose(FH);
Exit;
end
else
begin
_lread(FH,@tnt,sizeof(tnt));
Result:=tnt[2] shl 8;
Result:=Result or tnt[3];
StringOfs:=tnt[4] shl 8;
StringOfs:=StringOfs or tnt[5];
end;
_lclose(FH);
end;

function GetTrueTypeFontName(Filename : string) : string;
type
tNameRec = record
PlatformID : word;
EncodingID : word;
LanguageID : word;
NameID : word;
StrLen : word;
StrOfs : word;
end;

procedure SwapBytes(var w : word);
var
msb,lsb : byte;

begin
msb:=LoByte(w);
lsb:=HiByte(w);
w:=msb shl 8;
w:=W or lsb;
end;

var
Offset : integer;
StrOfs : integer;
w : word;
i : word;
found : boolean;
ofs : tOfStruct;
fh : integer;
tnt : array[0..5] of byte;
tnr : tNameRec;
NameStr : array[0..255] of char;

begin
if FileExists(Filename) then
begin
Offset:=FindOffsetToTag(pChar(Filename),'name');
if Offset>0 then
begin
w:=GetNameRecordsNum(pChar(Filename),Offset,StrOfs);
FillChar(ofs,SizeOf(tOFStruct),#0);
if OpenFile(pChar(Filename),ofs,OF_EXIST or OF_READ)=-1 then
Exit;
FH:=OpenFile(pChar(filename),ofs,OF_REOPEN or OF_READ);
if FH=-1 then
Exit;
if _llseek (FH,offset,0)=-1 then
begin
_lclose(FH);
Exit;
end;
_lread(FH,@tnt,sizeof(tnt));
found:=false;
i:=1;
while (i<=w) and (not found) do
begin
_lread(FH,@tnr,sizeof(tnr));
SwapBytes(tnr.NameID);
if tnr.NameID=4 then
begin
found:=true;
SwapBytes(tnr.StrLen);
SwapBytes(tnr.StrOfs);
end;
inc(i);
end;
if found then
begin
_llseek(FH,offset+StrOfs+tnr.StrOfs,0);
_lread(FH,@NameStr,tnr.StrLen);
NameStr[tnr.StrLen]:=#0;
Result:=String(NameStr);
end;
_lclose(FH);
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
BEGIN
listbox1.Items.Add(GetTrueTypeFontName('C:\WINNT\Fonts\arialn.ttf'))
end;


 
 
Bedømmelse

Fra : vorfrue


Dato : 27-06-03 08:21



Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke lave en bedømmelse til dette tip.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 177414
Tips : 31962
Nyheder : 719565
Indlæg : 6407839
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste