October 28, 2020, 05:56:57 AM

Author Topic: [bb] Get TTF Font File Data by pantsonhead.com [ 1+ years ago ]  (Read 1320 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Get TTF Font File Data
Author : pantsonhead.com
Posted : 1+ years ago

Description : This include file will give you a function that lets you get data stored in any TTF file.

Now you can read the proper fontname directly from Blitz. :)


Code :
Code: BlitzBasic
  1. ;   Example for BlitzPlus
  2. ;       Include "GetTTFdata.bb"
  3. ;       filename$=RequestFile$( "Select a TTF file","ttf" )
  4. ;       Print filename$
  5. ;       For x = 0 To 7
  6. ;               fontdata$=GetTTFdata$(filename$,x)
  7. ;               Print x+"="+fontdata$
  8. ;       Next
  9. ;       WaitKey()
  10.  
  11.  
  12. ;       datatypes
  13. ;   gfiCopyrightNotice = 0      ; Copyright notice
  14. ;   gfiFontFamilyName = 1       ; Font Family name
  15. ;   gfiFontSubfamilyName = 2    ; Font Style (usually)
  16. ;   gfiUniqueFontIdentifier = 3 ; Some unique ID For this font.
  17. ;   gfiFullFontName = 4         ; combination of strings 1 And 2. Exception:
  18. ;   gfiVersionString = 5        ; Version String (sometime includes a date).
  19. ;   gfiPostscriptName = 6       ; Postscript name.
  20. ;   gfiTrademark = 7            ; Trademark notice/information.
  21.  
  22.  
  23. Function GetTTFdata$(filename$, datatype=1)
  24.  
  25.         ;Create Banks
  26.         bnkTableOffsets = CreateBank(12)
  27.            
  28.         ; Open the file to read from
  29.         FontName$=""
  30.         If Lower(Right(Trim(filename$),4))=".ttf" And FileType(filename$)=1 Then
  31.  
  32.                 fontfile=ReadFile(filename$)
  33.                
  34.                 ;Read the OffSetTable
  35.                 ReadBytes bnkTableOffsets,fontfile,0,12
  36.                 For i = 0 To PeekShort(bnkTableOffsets,5)-1
  37.                         SeekFile(fontfile,12+i*16)
  38.                         word$=""
  39.                         For x = 1 To 4
  40.                                 word$=word$+Chr$(ReadByte(fontfile))
  41.                         Next
  42.                         If Lower(word$)="name" Then
  43.                                 ChkSum=Int_SwapEndian%(ReadInt(fontfile))
  44.                                 Offset=Int_SwapEndian%(ReadInt(fontfile))
  45.                                 Length=Int_SwapEndian%(ReadInt(fontfile))
  46.                         ElseIf Lower(word$)="cmap" Then
  47.                                 cmapChkSum=Int_SwapEndian%(ReadInt(fontfile))
  48.                                 cmapOffset=Int_SwapEndian%(ReadInt(fontfile))
  49.                                 cmapLength=Int_SwapEndian%(ReadInt(fontfile))
  50.                                 SeekFile(fontfile,cmapOffset)
  51.                                 TableVersion = Short_SwapEndian%(ReadShort(fontfile))
  52.                                 TableCount = Short_SwapEndian%(ReadShort(fontfile))
  53.                                 PlatformID = Short_SwapEndian%(ReadShort(fontfile))
  54.                                 EncodingID = Short_SwapEndian%(ReadShort(fontfile))
  55.                                 cmapSubOffset=Int_SwapEndian%(ReadInt(fontfile))
  56.                                 SeekFile(fontfile,cmapSubOffset)
  57.                                 cmapFormat=Short_SwapEndian%(ReadShort(fontfile))
  58.                                 words$=Words$+"|"+cmapOffset+">"+cmapFormat
  59.                         EndIf
  60.  
  61.                         words$=Words$+"|"+word$
  62.                 Next
  63.                
  64.                
  65.                 ;now we find the Correct Name Record
  66.                 SeekFile(fontfile,offset)
  67.                 FormatSelector=Short_SwapEndian%(ReadShort(fontfile))
  68.                 NumberNameRecords=Short_SwapEndian%(ReadShort(fontfile))
  69.                 StorageOffset= Short_SwapEndian%(ReadShort(fontfile))
  70.                
  71.                 ;loop thru NameRecords
  72.                 While (NameID<>datatype) And  (Eof(fontfile) <>1)
  73.                         PlatformID = Short_SwapEndian%(ReadShort(fontfile))
  74.                         EncodingID = Short_SwapEndian%(ReadShort(fontfile))
  75.                         LanguageID = Short_SwapEndian%(ReadShort(fontfile))
  76.                         NameID = Short_SwapEndian%(ReadShort(fontfile))
  77.                        
  78.                         If NameID=datatype      ;This is what we're looking for
  79.                                 NameLength = Short_SwapEndian%(ReadShort(fontfile))
  80.                                 NameOffset = Short_SwapEndian%(ReadShort(fontfile))
  81.                         Else
  82.                                 junk = ReadInt(fontfile) ;NameLength + NameOffset
  83.                         EndIf
  84.                 Wend
  85.  
  86.                 ;Now we can get the data
  87.                 SeekFile(fontfile,offset+StorageOffset+NameOffset)
  88.                 For x = 1 To NameLength
  89.                         newChar=ReadByte(fontfile)
  90.                         If newChar<>0 Then fontdata$=fontdata$+ Chr$(newChar) ;filters unicode chr(0)s
  91.                 Next
  92.                 Return fontdata$
  93.                 CloseFile(fontfile)
  94.         EndIf
  95.         FreeBank bnkTableOffsets
  96.  
  97. End Function
  98.  
  99. ; We use these for "ByteSwapping" since TTF format is other endian
  100. Function Int_SwapEndian%(n%)
  101.         Return ((n And $FF) Shl 24) Or ((n And $FF00) Shl 8) Or ((n And $FF0000) Shr 8) Or ((n And $FF000000) Shr 24)
  102. End Function
  103.  
  104. Function Short_SwapEndian%(n%)
  105.         Return ((n And $FF) Shl 8) Or ((n And $FF00) Shr 8)
  106. End Function


Comments :


big10p(Posted 1+ years ago)

 This has saved me a LOAD of work. Thanks a lot! :)[edit] This has a memory leak - you're returning from the function before closing the file and freeing the bank. Easily fixed, though. :)BTW, does datatype 0 (copyright notice) ever return anything?


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal