Typeface - Sprite-based Schrift-Include/Module

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Typeface - Sprite-based Schrift-Include/Module

Beitrag von STARGÅTE »

ccode_new hat geschrieben: Es wäre aber auch toll wenn man das "Character set"-Fenster schließen könnte.
Man kann zwar über die mittlere Maustaste (Scrollrad) im "Character set"-Fenster navigieren, aber normale Scrollbalken wären auch schön.
Ich dachte eigentlich, dass man den Zeichensatz "immer" sehen will. Aber klar, kann ich einbauen.
Normale Scrollbalken kann ich auch einbauen.

PS: Ich gebe zu der Editor ist etwas "sperrig", von daher ist Feedback auch da sehr willkommen.
ccode_new hat geschrieben:So! Dank dir bastele ich mir jetzt aus Bildern mit Zeichen meine eigenen xml-Fonts.
Cool, gerne mal teilen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Typeface - Sprite-based Schrift-Include/Module

Beitrag von mk-soft »

STARGÅTE hat geschrieben:@mk-soft:

Ich weiß :cry: , liegt aber nicht "an mir":
[PB 5.22x86] TransformSprite() is acting strange
TransformSprite - OpenGL.
...
Vorallem die z-Parameter werden in OpenGL völlig ignoriert, damit sieht die Texture immer komisch aus.
Habe ich mir schon gedacht das es nicht an den Code liegt, sondern ein Bug ist.
Vielleicht wird der Bug irgendwann behoben
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
pforzheimer
Beiträge: 8
Registriert: 10.10.2008 01:28

Re: Typeface - Sprite-based Schrift-Include/Module

Beitrag von pforzheimer »

Hallo STARGÅTE,
danke für die neue Version, sieht super aus!
Schön, das ich dich animieren konnte das alte Projekt nochmal anzufassen. :)

Ich habe noch zwei Wünsche:
1.) Fonts die auch grösser als 128 Pixel sein können (1024 genügt mir)
2.) Die Möglichkeit die Fonts auch aus der DataSection zu laden nennen wir es "CatchTypeface".
Ich weiss, Nachladen geht prima, aber manchmal möchte man es eben in einer Datei haben.
Ich hänge hier ein Beispiel von mir an, das ich im Wesentlichen aus LoadTypeface(Typeface.i, FileName.s) umgewandelt habe.
Bei mir funktioniert es prima mit einem 128pixel-Font.
Vielleicht kannst du das ja einfach integrieren, der Filename wäre auch zum Auswählen in der DataSection denkbar.

Grüsse vom Pforzheimer

Code: Alles auswählen

; Lädt die angegebene 'Typeface' aus der angegebenen DataSection, FileName ist optional
; Loads the 'Typeface' from the XML file in the DataSection, FileName is optional
Procedure.i CatchTypeface(Typeface.i, FileName.s="")
 Protected fontpointer = ?Font_1_xml
 Protected fontpointer_len = ?Font_1_xml_end -?Font_1_xml
 Protected *Typeface.Typeface
 Protected XML.i = CatchXML(#PB_Any, fontpointer , fontpointer_len ,#PB_XML_StreamStart , #PB_UTF8)
 Protected *MainNode, *Node, Index.i, *SourceNode, *OutlayNode
 Protected *CurrentKerningPair.Typeface_KerningPair, Hash.i, Left.u, Right.u
 If Not XML
  ProcedureReturn #False
 EndIf
 *MainNode = MainXMLNode(XML)
 *Typeface = Typeface_Create(Typeface)
 ;*Typeface\CharacterSet\Sprite = LoadSprite(#PB_Any, GetXMLAttribute(*MainNode, "Image"), #PB_Sprite_AlphaBlending)
 *Typeface\CharacterSet\Sprite = CatchSprite(#PB_Any, ?Font_1_Sprite, #PB_Sprite_AlphaBlending)
 *Node = ChildXMLNode(*MainNode)
 While *Node
  If XMLNodeType(*Node) <> #PB_XML_Normal
   *Node = NextXMLNode(*Node)
   Continue
  EndIf
  Select GetXMLNodeName(*Node)
   Case "KerningPair"
    Left = Val(GetXMLAttribute(*Node, "Left"))
    Right = Val(GetXMLAttribute(*Node, "Right"))
    If (Left <= 255 And Right <= 255) Or #PB_Compiler_Unicode
     AddElement(*Typeface\CharacterSet\Elements\KerningPair())
     With *Typeface\CharacterSet\Elements\KerningPair()
      \CharacterPair = Left | Right<<16
      \Amount    = Val(GetXMLAttribute(*Node, "Amount"))
      Hash      = \CharacterPair % #Typeface_KerningSlots
      *CurrentKerningPair = *Typeface\CharacterSet\KerningPair(Hash)
      If *CurrentKerningPair
       While *CurrentKerningPair\NextPair
        *CurrentKerningPair = *CurrentKerningPair\NextPair
       Wend
       *CurrentKerningPair\NextPair = @*Typeface\CharacterSet\Elements\KerningPair()
      Else
       *Typeface\CharacterSet\KerningPair(Hash) = @*Typeface\CharacterSet\Elements\KerningPair()
      EndIf
     EndWith
    EndIf
   Case "Character"
    Index = Val(GetXMLAttribute(*Node, "Index"))
    If Index <= 255 Or #PB_Compiler_Unicode
     *SourceNode = XMLNodeFromPath(*Node, "Source")
     *OutlayNode = XMLNodeFromPath(*Node, "Outlay")
     *Typeface\CharacterSet\Character(Index) = AddElement(*Typeface\CharacterSet\Elements\Character())
     With *Typeface\CharacterSet\Elements\Character()
      \Source\X   = Val(GetXMLAttribute(*SourceNode, "X"))
      \Source\Y   = Val(GetXMLAttribute(*SourceNode, "Y"))
      \Source\Width = Val(GetXMLAttribute(*SourceNode, "Width"))
      \Source\Height = Val(GetXMLAttribute(*SourceNode, "Height"))
      \Outlay\x   = Val(GetXMLAttribute(*OutlayNode, "X"))
      \Outlay\y   = Val(GetXMLAttribute(*OutlayNode, "Y"))
      \Outlay\Width = Val(GetXMLAttribute(*OutlayNode, "Width"))
      \Outlay\Height = Val(GetXMLAttribute(*OutlayNode, "Height"))
     EndWith
    EndIf
  EndSelect
  *Node = NextXMLNode(*Node)
 Wend
 FreeXML(XML)
 ProcedureReturn *Typeface
EndProcedure

DataSection
 Font_1_xml:
 IncludeBinary "Fonts\Something.128.xml"
 Font_1_xml_end:
 Font_1_Sprite:
 IncludeBinary "Fonts\Something.128.xml.png"   
EndDataSection
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Typeface - Sprite-based Schrift-Include/Module

Beitrag von STARGÅTE »

pforzheimer hat geschrieben:Ich habe noch zwei Wünsche:
1.) Fonts die auch grösser als 128 Pixel sein können (1024 genügt mir)
Wie ist das gemeint? (rein theoretisch) ist die Große der Fonts nicht limitiert (nur durch die Image/Sprite Größe von PureBasic) und durch den aktuell genutzte Variablentyp in der TF-Datei (diese liegt aber bei 65535).
2.) Die Möglichkeit die Fonts auch aus der DataSection zu laden nennen wir es "CatchTypeface".
Diese Funktion gibt es bereits, allerdings nur für das binary Format (*.tf), was du aber mit dem Editor erzeugen kannst.

Code: Alles auswählen

Declare.i CatchTypeface(Typeface.i, *Memory)
Du kannst hier einfach den Zeicher auf die DataSection übergeben:

Code: Alles auswählen

CatchTypeface(#Typeface, ?Font_1)
DataSection
  Font_1:
  IncludeBinary "Fonts\Something.128.tf"
EndDataSection
Damit man von dem Editor unabhängig ist, kann ich aber noch die möglichkeit einbinden, XML und Bild als Zeiger zu übergeben
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
pforzheimer
Beiträge: 8
Registriert: 10.10.2008 01:28

Re: Typeface - Sprite-based Schrift-Include/Module

Beitrag von pforzheimer »

Hallo STARGÅTE,
ich meinte bei Wunsch 1.) das dein Editor Fonts grösser als 128 Pixel aus TTF erzeugen kann, bei mir ist da Ende bei der Auswahl.
Eine andere Beschränkung hast du bei "max width", also der Graphikbreite eingebaut, da ist bei 1024 Schluss, von mir aus könnte das gern zumindestens 1920, also Full-HD-Breite sein, oder auch 3840. Okay, die "Zeichensatz"-Anzeige braucht dann einen Zoom oder Scrollbalken.

Gerüchteweise haben ja manche Graphikkarten ein Problem, wenn Graphiken o.Ä. breiter als der Screen sind. Ich selbst habe schon Graphiken mit 8192pixel Breite ohne Probleme eingesetzt. Nicht wundern, ich versuche meine graphischen Sachen jetzt schon immer auf 4k, also 3840x2160pixel zu programmieren und dann runter zu skalieren.

Und bei 2.) hatte ich mir selbst ein CatchTypeface geschrieben, da es in der Typeface-Version die ich benutzte nicht enthalten war. Ich habe jetzt nochmal in deine neue Version geschaut und siehe da, wir haben sogar genau den gleichen Procedurenamen gewählt :) Naja, das ergab sich ja logisch aus anderen Namen innerhalb PB.
STARGÅTE hat geschrieben: Du kannst hier einfach den Zeiger auf die DataSection übergeben:

Code: Alles auswählen

CatchTypeface(#Typeface, ?Font_1)
DataSection
  Font_1:
  IncludeBinary "Fonts\Something.128.tf"
EndDataSection
Damit man von dem Editor unabhängig ist, kann ich aber noch die möglichkeit einbinden, XML und Bild als Zeiger zu übergeben
Das wäre eine gute Idee, wobei ich kein Problem mit deinem .tf-Format habe.
Ich habe aber auch vor bestimmte Graphiken für Sprites als .png einzubinden, darum wäre das schon gut.

Mir fällt gerade noch was ein:
3.) Wie wäre ein dynamischer Import von *.ttf in beliebiger Grösse nach Typeface?
Also ich brauche "FONT abc" in xxx Pixel, dann hole ich mir das vom System und kann es mit Typeface nutzen. So wie bei Loadfont.
Dieser Vorgang könnte ruhig ein wenig dauern, sowas macht man ja normalweise nicht laufend innerhalb einer Loop.

BTW: Schonmal DrawVectorText() / DrawVectorParagraph() versucht? Der kann bei mir scheinbar nur ASCII, wenn ein Umlaut wie ü vorkommt, sehe ich nur eine breite Leerstelle.

Grüsse
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Typeface - Sprite-based Schrift-Include/Module

Beitrag von STARGÅTE »

Hallo pforzheimer,

hier mal eine neue Version des Editors (mit größerem Font-Size import und Bildgröße).
Die Verwendung ist jedoch auf eigene Gefahr, denn bei einer 1024 großen Font, kann das Bild schon mal einige GB groß werden.
https://www.unionbytes.de/downloads/TypefaceEditor.exe

Das CatchTypeface habe ich auch aktualisiert:
https://www.unionbytes.de/downloads/TypefaceBeta.pbi

Code: Alles auswählen

; Loads a typeface from the memory address. (only TF format is supported)
;   Typeface         : A number as an identifier of the typeface or #PB_Any to assign the address itself as the identifier
;   *Memory          : The address of the memory buffer of the TF oder XML source
;   *ImageMemory     : The address of the memory buffer of the image
;   MemoryLength     : The length of the XML memory buffer. By default MemoryLength = *ImageMemory - *Memory
;   ProcedureReturn  : #False, if the loading fails, otherwise the address of the loaded typeface
Procedure.i CatchTypeface(Typeface.i, *Memory, *ImageMemory=#Null, MemoryLength.i=#Typeface_Ignore)
Zu 3. gibt es ein kleines Problem bezüglich der Kompatibilität auf Linux und Mac.
Aktuell benutze ich Windows API um zu bestimmen, welche Zeichen in einer Font enthalten sind.
Ich muss mal gucken, wie ich das einbaue.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten