Oldskool bitmap font (police bitmap)

Soyez le premier à donner votre avis sur cette source.

Vue 8 707 fois - Téléchargée 700 fois

Description

Exemple montrant comment convertir une chaine de caractère dans son équivalent bitmap.
Cet exemple contient trois dossiers :

- bmpfont :
Ce dossier contient toutes les unités utilisées pour arriver à nos fins. Consultez les deux fichiers
pour plus d'informations.

- demo :
Contient l'exemple proprement dit. Une capture est associée (example.jpg).

- fontmap :
Programme permettant la visualisation d'une texture de font découpée. Une texture se trouve dans
le dossier rsrc de l'exemple (font025.bmp). Pour l'utiliser, lancez le programme fontmap, cliquez sur
browse et sélectionnez votre fichier. Dans la case Cols, entrez 10 (10 colonnes de chars) et 6 pour
les lignes. Cliquez sur Go et vous obtenez la map de votre font (exemple : fontmap.jpg). N'oubliez pas
que vous pouvez zoomer sur un caractère pour voir si c'est bien découpé (ou si y'a des ajustements à faire).
Une texture doit être bien ajustée (dans le sens ou si vous avez 10 colonnes et qu'un char fait 32 de longueur,
la texture doit faire 10 * 32 = 320 pixels de longueur, pareil pour la hauteur).

Conclusion :


Il s'agit d'une alternative au code de Technix59, situé ici :
http://www.delphifr.com/codes/SCROLLING-AVEC-FONTE-GRAPHIQUE_21299.aspx

Si vous souhaitez, vous pouvez venir jeter un oeil à mes quelques vieux sources codes que j'ai distribué ainsi que les quelques nouveaux (les deux derniers en fait...) que j'ai mis en ligne :
http://sbibuilder.dc-france.com/download/?idsys=1&idcat=17

Have fun ...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

JulioDelphi
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
12 -
Pourquoi laisser du "mauvais" code alors que des gens ont tout bien corrigé ?
Voir les erreurs, les trouver dans des recherches ne peut qu'induire en erreur, non ?
hfr11
Messages postés
20
Date d'inscription
mardi 17 décembre 2002
Statut
Membre
Dernière intervention
8 octobre 2019
-
Bonjour à tous,
A l'attention des administrateurs...
Je télécharge pas mal de codes, histoire d'apprendre et de ne pas réinventer la roue...
Dans beaucoup de commentaires je trouve des messages du style :
Autre idée plus performante pour ta fonction toto()
puis suivent quelques lignes de code...
Je sais que ce serait relativement lourd mais ne serait-il pas intéressant de fournir l'ancien code avant le nouveau pour que les débutants puissent comprendre les améliorations amenées par le nouveau ?
En effet, quand on télécharge le code, les corrections ont déjà été effectuées !
Je vous laisse juger, je ne développerai pas de polémique là-dessus, ce n'est qu'une idée.
Merci de votre attention, cordialement, Patrice.
f0xi
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26 -
pour la deuxieme technique tu verras c'est trés simple a mettre en place ...

il te suffit d'appeler comme suis :

var CharsMap : TCharsMap;
MapStr : TMappedString;

procedure FormX.OnCreate(sender : TObject);
begin
CreateCharsMap(' !"****''()'+
'**,-. 0123'+
'456789:*<='+
'>**ABCDEFG'+
'HIJKLMNOPQ'+
'RSTUVWXYZ*', 0, CharsMap);
CharsMap['*'] := 0;
CopyUpIndexToLo(CharsMap);
end;


et ensuite, n'importe ou avant le dessins :

CreateMappedStr('Hello World!', CharsMap, MapStr);

ce qui donneras :

MapStr(40,37,44,44,47,0,55,47,50,44,36,2)
SiZiOUS
Messages postés
69
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 novembre 2006
-
"variable Font private de la fiche principale, masque la propriété Font de la dite fiche ..."
Aie oui en effet, j'ai même pas fait attention. Et Delphi me l'a pas fait remarqué.

"remplacement des panels de centrage de la fiche du zoom par des TBevel en mode bsSpacer (plus leger)"
Ah oui en effet j'avais pas pensé à ça.

"vidage preventif du tableau de bitmap avant tout autre chose :"
Tant qu'à faire autant faire for i := Low(Font) ... de plus j'ai une fonction qui fait ça alors autant l'appeller ^^

"preference a utiliser MessageDLG plutot que MessageBoxA (n'est pas une erreur ...)"
J'aime pas MessageDlg. Sinon j'aurais pu faire Application.MessageBox mais bon.

"beaucoup trop d'appel a StrToInt (preferer un stockage en variable integer)"
Ah c'est possible, j'ai pas fait attention :)

"faire attention a ne pas faire des trucs trop alambiqué :

bPrev.Enabled := CurrentIndex > 0;
bNext.Enabled := CurrentIndex < Main_Form.TotalChars-1;"

C'est pour activer/désactiver les boutons de la fenêtre zoom.

"ensuite la routine StrToIndex est beaucoup trop lourde, voici une version allégée :
(ne pas oublier qu'il n'y a que 256 caracteres dans la table Ascii, le type byte est donc suffisant au lieu du type word ou plus grand !)"
OK pour le type Byte j'avais pas pensé non plus ;)

const
SPECIAL_CHARS_SET : set of char = ['!','<','>','''',',','-','.',':'];
SPECIAL_CHARS : array[0..7] of TSpecialChar = (
// (i: 0 ; c: ' '), toujours 0 pour espace // ça dépend de ton bitmap
(i: 1 ; c: '!'),
(i: 8 ; c: '<'),
(i: 9 ; c: '>'),
(i: 7 ; c: ''''),
(i: 12 ; c: ','),
(i: 13 ; c: '-'),
(i: 14 ; c: '.'),
(i: 26 ; c: ':')
);

...
if C in ['a'..'z'] then Dec(C,$20); //bien vu pour le in ['a'..'z'] :)

Merci bien pour toutes ces précisions :)

Quand à ta deuxième méthode je jetterais un oeil cet après midi peut être.
f0xi
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26 -
tu m'as fait reflechir et j'ai penser a une autre technique :



type
// contient les index des caracteres dans l'image
TCharsMap = array[char] of byte;
// permet de stocker une chaine "mappée"
TMappedString = array of byte;


// methode a appeler en premier
// CharsEnum correspond aux lettres presente dans l'image
// dans l'ordre (gauche haut > droite bas) d'apparition
// NullIndex correspond a l'index "vide" pour les caracteres non presents (0 par exemple)
procedure CreateCharsMap(const CharsEnum : string; const NullIndex : byte; var CharsMap : TCharsMap);
var N : integer;
C : char;
begin
// on remplis avec NullIndex
FillChar(CharsMap, 256, NullIndex);

// pour chaque caracteres present on assigne l'index dans l'image
for N := 1 to Length(CharsEnum) do
CharsMap[CharsEnum[N]] := N-1;
end;

// methode permettant de transposer les index des caracteres majuscule au caracteres minuscule
procedure CopyUpIndexToLo(var CharsMap : TCharsMap);
var pS,pD : ^Char;
begin
pS := @CharsMap;
pD := @CharsMap;
inc(pS,$41); {'A'}
inc(pD,$61); {'a'}
Move(pS^,pD^,26); {de 'A'..'Z' a 'a'..'z'}
end;

// methode permettant de transposer les index des caracteres minuscule au caracteres majuscule
procedure CopyLoIndexToUp(var CharsMap : TCharsMap);
var pS,pD : ^Char;
begin
pS := @CharsMap;
pD := @CharsMap;
inc(pS,$61); {'a'}
inc(pD,$41); {'A'}
Move(pS^,pD^,26); {de 'a'..'z' a 'A'..'Z'}
end;

// Mapping d'une chaine ...
// S est la chaine a mapper
// CharsMap est la table d'index a utiliser pour le mapping
// MappedString est la table d'index resultante
procedure CreateMappedStr(const S : string; const CharsMap : TCharsMap; var MappedString : TMappedString);
var N : integer;
begin
for N := 1 to Length(S) do
MappedString[N-1] := CharsMap[S[N]];
end;


avantages :

+polyvalente : permet d'utiliser des fontes bitmaps differente plus ou moins complete et une utilisation plus large sur les traitements graphique en aval avec la gdi, gdi+, directX ou OpenGL, grace a son independance complete par rapport a ces derniers.

+performante : routines de traitements d'indexation et mapping plus simples, tout est pré-calculé avant les lourds traitements graphiques et reste stocké jusqu'a la fermeture du programme. Les ressources sont plus legere avec une consomation de 255 octets seulement pour chaque table d'index et un traitement rapide du mapping de chaine.

+ludique : un debutant saurat l'utiliser et l'implementer sans difficultées avec un minimum d'indications, un infographiste comprendrat immediatement comment construire l'image de la fonte, un developeur comprendras egalement trés vite qu'il peu enregistrer dans un fichier la chaine de base pour l'indexation (CharsEnum) et cela pour chaque fonte, ce qui permet de construire des programmes plus elaborés et plus souple niveau customisation/mise a jours.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.