[Alg] Proportioneel font maken aan de hand van een bitmap

Pagina: 1
Acties:

  • LAN
  • Registratie: Oktober 2000
  • Niet online
Ik ben op zoek geweest naar hoe je een proportioneel font kunt maken aan de hand van een bitmap, maar daar is niet veel over te vinden.

Ik zal eerst een inleiding geven waarover het gaat.

Op een bepaald platform heb ik een monospace font gemaakt aan de hand van een bitmap (andere opties zijn er niet, dus begin straks niet over vector fonts) waar iedere letter in staat (op volgorde volgens de ascii tabel).
Dat het monospace is maakt het makkelijk: iedere letter is even breed.
Je kunt dus berekenen op welke plek in de bitmap een bepaalde letter staat.

Voorbeeld:
Een letter is 10 pixels breed.
De bitmap bevat de letters van A tot en met Z.
De letter F staat dan dus op plek 6.
In de bitmap begint de letter F van pixel 50 en loopt tot pixel 60.
Teken dat gedeelte van de bitmap op het scherm waarin de letter F staat

Nu komt de vraag. Ik wil een proportioneel font implementeren met behulp van een bitmap.
Dat is namelijk wat trickier met berekenen. De I is tenslotte smaller dan de W. Dus een letter is dan niet altijd even breed en gaat de berekening van [locatie letter]*[breedte letter]=[locatie van letter in bitmap] niet meer op.
Maar, hoe doe je dat? Zijn hier bestaande, beproefde methoden voor? Zo ja, kun je een bron geven waarbij het een en ander wordt uitgelegd?
Of heb je zelf een idee van hoe je dit zou oplossen?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik neem aan dat je zelf al bedacht had dat je:
• Met een los bestandje ernaast de breedtes kunt opgeven
• De breedtes kunt "hardcoden"
• Een "scheidingspixel" kunt gebruiken in je bitmap met en bepaalde kleur
:?

Dan heb ik ook geen ander idee :+

De locatie is alle breedtes van de vorige letters uit de zin (+ evt. spacing) bij elkaar opgeteld.

[ Voor 25% gewijzigd door RobIII op 12-03-2005 12:27 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 24-11-2025

PommeFritz

...geen friet

nog veel makkelijker en sneller is om gewoon een lookup table voor alle karakters te maken:
a=0
b=8
c=10
d=15
e=22
..

dan loopt 'd' dus van pixel 15 tm 21.

[ Voor 5% gewijzigd door PommeFritz op 12-03-2005 12:34 ]

FireFox - neem het web in eigen hand


  • LAN
  • Registratie: Oktober 2000
  • Niet online
Die had ik ook bedacht ja.

Ik was benieuwd of er ook andere mogelijkheden zijn (die wellicht met een bepaald algoritme sneller zullen werken, hoewel ik eerst maar eens moet testen hoe snel onderstaande oplossing is en dan kijken of er uberhaupt wel geoptimaliseerd moet worden).
PommeFritz schreef op zaterdag 12 maart 2005 @ 12:33:
nog veel makkelijker en sneller is om gewoon een lookup table voor alle karakters te maken:
a=0
b=8
c=10
d=15
e=22
..

dan loopt 'd' dus van pixel 15 tm 21.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
LAN schreef op zaterdag 12 maart 2005 @ 12:41:
Die had ik ook bedacht ja.

Ik was benieuwd of er ook andere mogelijkheden zijn (die wellicht met een bepaald algoritme sneller zullen werken, hoewel ik eerst maar eens moet testen hoe snel onderstaande oplossing is en dan kijken of er uberhaupt wel geoptimaliseerd moet worden).
[...]
Op het moment dat je die letters gaat plaatsen onthoud je de laatste positie gewoon. Niks algoritme ;) De volgende letter komt dus gewoon op laatste_positie (+ evt. spacing) + 1 ofzo.

Overigens vind ik een struct per letter mooier, dat kun je namelijk makkelijker uitbreiden:

• Breedte
• Spacing-Links
• Spacing-Rechts
• ...etc

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij