Bitmap Fontsystem , comment ça marche ?

Vous avez développé un logiciel en PureBasic et vous souhaitez le faire connaitre ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Bitmap Fontsystem , comment ça marche ?

Message par comtois »

J'ai vu un super éditeur sur le forum anglais
http://www.purebasicforums.com/english/ ... hp?t=14415

ça me semble plutôt bien , mais je n'arrive pas colorer les caractères comme dans les fichiers exemple , quelqu'un sait comment il faut faire ??

je n'ose pas demander à son auteur , mon anglais est tellement faible que j'aurais du mal à exprimer mon problème.
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Message par Torp »

Salut,

J'ai testé le truc et je ne pense pas que ceux soit un éditeur au sens ou tu l'attends. Tu ne peux pas dessiner les caractères avec. D'aprés ce que j'ai compris, tu dessines au préalable tout tes caractères dans un logiciel de dessin classique, et tu importes l'image dans l'editeur. Ensuite tu fais cadrer tes caractères dans chaque case, tu y associe un code ascii et ca te sort un fichier texte associé à ton image avec la position des lettres sur l'image et les codes associés. Le tout en vu de l'exploiter dans PB.

Enfin c'est que j'ai compris... ;)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oui c'est ce que je commençais à soupçonner :?

mais tu n'as pas à dessiner au préalable tes caractères dans un logiciel de dessin .

Ce logiciel te permet justement de générer un fichier bitmap à partir d'une police .Mais ensuite , il faut travailler la couleur de ce bitmap avec un logiciel de dessin ? dommage .

Enfin , de pouvoir créer la planche de caractères facilement ,c'est déjà pas si mal que ça :)

quand on voit les planches qu'il propose , il y a déjà de bons résultats .
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

non, on peut travailler la couleur avec ma lib effect par exemple.

tu dessines ton texte en blanc sur fond noir. ensuite tu peux appliquer un filte bleu pour avoir les carac en bleu (le noir va pas changer lui) par exemple.

enfin, on peut imager plein d'effet autre que les couleurs.
détectés les bords du carac et le mettre en rouge par exemple.

Une autre astuce, dessine tes caractères en très grand (environ 4 fois plus grand que la taille nécessaire)
tu appliques tes effets dessus cette image
puis tu redimensionnes la à la taille souhaitée
Tu auras un lissage de tes carac, ça peut être sympa :)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

est ce qu'on pourrait pas appliquer une texture (un bitmap quelconque) à une police sur ton principe ?

. on detecte les bordures
. on créé un masque
. on dessine une texture dans la zone masquée
. on reduit par 4 pour lisser
. et voilà

je dis ca mais je sais meme pas comment resoudre la premiere etape ( detection des bordures ) :)
en reflechissant un peu je me dis que je ferais comme çà, dis moi si je me trompe :
. on choisit une couleur de fond ( noir rgb(0,0,0) par ex. )
. on balaye l'image pixel apres pixel ( de w en h ) avec Point(x,y)
. si le point est de couleur differente que la couleur de fond alors ce point appartient au masque
. et apres...
Image
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

texte en blanc
fond en noir

pour appliquer une texture, c'est très simple :

On dessine la texture sur une image ayant la même taille que les caracs

on regarde chaque pixel de l'image des carac, et si la couleur est blanche, on remplace par la pixel équivalent de la texture.


Pour les bordures, c'est également simple :

Pour une bordure à l'extérieur de la police

Pour chaque pixel de l'image, si il est noir
on regarde les pixel au nord, sud est ouest
si l'un d'entre eux est blanc, on est sur la bordure extérieur d'un carac

Pour épaissir le trait de bordure, il suffit de regarder plus loin autour du point noir
attention, pour travailler propement, il faut regarder si on peut trouver un point blanc à coté du point noir appartenant à un cercle de rayon X, X étant l'épaisseur de la bordure

pour une bordure à l'intérieur de la police, c'est l'inverse, on regarde si le point est blanc et si oui, on regarde les pixel au nord, sud est ouest
si l'un d'entre eux est noir, on est sur la bordure intérieur d'un carac

voilà :)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

un exemple de texte avec bordure

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
;
; Explication du programme :

Structure TextTableInfo
  Width.l
  Height.l
  ImageID.l
EndStructure

Procedure.l TextTable(Table.l, Police.s, Taille.l, Style.l)
  Protected Image.l, Font.l, FontID.l, Txt.s, Couleur.l , n, i, ii, Win, Progress, Text
  
  Win = OpenWindow(#PB_Any, 0, 0, 200, 35, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, Police + " (" + Str(Taille) + ")")
  If Win
    If CreateGadgetList(WindowID())
      Text = TextGadget(#PB_Any, 0, 0, 200, 15, "")
      Progress = ProgressBarGadget(#PB_Any, 0, 15, 200, 20, 0, 255 - 32)
      
      #TextTableZoom = 6
      
      #Bordure = 1
      
      ; On charge la police
      Font = LoadFont(#PB_Any, Police, Taille * #TextTableZoom, Style)
      FontID = FontID()
      
      For n = 32 To 255
        Txt = Chr(n)
        SetGadgetText(Text, Txt)
        SetGadgetState(Progress, n - 32)
        UpdateWindow_(WindowID())
        While WindowEvent()
        Wend
        
        ; on calcul la taille du caractère
        Image.l = CreateImage(#PB_Any, 10, 10)
        hdc = StartDrawing(ImageOutput())
          DrawingFont(FontID())
          GetTextExtentPoint32_(hdc, @Txt, 1, Size.SIZE)
        StopDrawing()
        FreeImage(Image)
        
        ; on ajoute une bordure
        Size\cx + #Bordure * #TextTableZoom * 2
        Size\cy + #Bordure * #TextTableZoom * 2
        
        ; on dessine le caractère
        Image.l = CreateImage(#PB_Any, Size\cx, Size\cy)
        StartDrawing(ImageOutput())
          DrawingFont(FontID)
          DrawingMode(1)
          FrontColor($FF, $FF, $FF)
          Locate(#Bordure * #TextTableZoom, #Bordure * #TextTableZoom)
          DrawText(Txt)
        StopDrawing()
        
        ; On récupère l'image sous forme de tableau pour travailler plus vite
        Dim TableTemp.l(Size\cx - 1, Size\cy - 1)
        
        GetImageBits(UseImage(Image), @TableTemp())
        
        ; On pixellise la police pour travailler facilement dessus
        For i = 0 To Size\cx - 1
          For ii = 0 To Size\cy - 1
            Couleur = TableTemp(i, ii)
            If Couleur > 0 And Couleur < $FFFFFF
              If Couleur > 127
                TableTemp(i, ii) = $FFFFFF
              Else
                TableTemp(i, ii) = 0
              EndIf
            EndIf
          Next
        Next
        
        ; On dessine la bordure externe
        For i = 0 To Size\cx - 1
          For ii = 0 To Size\cy - 1
            If TableTemp(i, ii) = 0
              For j = -#Bordure * #TextTableZoom To #Bordure * #TextTableZoom
                For jj = -#Bordure * #TextTableZoom To #Bordure * #TextTableZoom
                  If i + j >= 0 And i + j <= Size\cx - 1 And ii + jj >= 0 And ii + jj <= Size\cy - 1
                    If TableTemp(i + j, ii + jj) = $FFFFFF
                      Longueur = j * j + jj * jj
                      If Longueur <= #Bordure * #Bordure * #TextTableZoom * #TextTableZoom
                        TableTemp(i, ii) = $FF
                        Break 2
                      EndIf
                    EndIf
                  EndIf
                Next
              Next
            EndIf
          Next
        Next
        
        SetImageBits(UseImage(Image), @TableTemp())
        
        Size\cx / #TextTableZoom
        Size\cy / #TextTableZoom
        
        ResizeImage(Image, Size\cx, Size\cy, #PB_Image_Smooth)
        
        PokeL(Table + SizeOf(TextTableInfo) * n, Size\cx)
        PokeL(Table + SizeOf(TextTableInfo) * n + 4, Size\cy)
        PokeL(Table + SizeOf(TextTableInfo) * n + 8, Image)
        
      Next
      
      CloseFont(Font)
      
      Dim TableTemp(0, 0)
      
    EndIf
    CloseWindow(Win)
  EndIf
EndProcedure

Procedure DrawTextTable(Table.l, x.l, y.l, Txt.s)
  Protected n.l, nn.l, Pos.l, Image.l, cx.l
  Pos = 0
  For n = 1 To Len(Txt)
    nn = Asc(Mid(Txt, n, 1))
    Image = PeekL(Table + SizeOf(TextTableInfo) * nn + 8)
    cx = PeekL(Table + SizeOf(TextTableInfo) * nn)
    DrawImage(UseImage(Image), x + Pos, y)
    Pos + cx
  Next
EndProcedure



; On crée la police sous forme de BMP
Dim Text.TextTableInfo(255)
TextTable(@Text(), "tahoma", 16, #PB_Font_HighQuality)

; On dessine la police sur une image
CreateImage(0, 300, 200)
StartDrawing(ImageOutput())
  DrawTextTable(@Text(), 0, 0, "Bonjour les zamis !")
  DrawTextTable(@Text(), 0, Text(100)\Height, "Comment ça va bien ?")
  DrawTextTable(@Text(), 0, Text(100)\Height * 2, "0123456789")
StopDrawing()

; Text(100)\Height
; je prends un carac au pif et je la hauteur (tous les carac ont la même hauteur)

; Création de la fenêtre principale
UseImage(0)

OpenWindow(0, 0, 0, ImageWidth(), ImageHeight(), #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "TextTable")
CreateGadgetList(WindowID())

ImageGadget(0, 0, 0, 0, 0, UseImage(0))


Repeat
  Event = WaitWindowEvent()
  
  
  
Until Event = #PB_EventCloseWindow

End
Il faut ma lib Effect mise à jour, il y avait un bug dedans ;)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

au lieu de scaner la fonte avec point
l'utilisation judicieuse de " DrawingMode(Mode) "
peut etre un secour plus rapide il me semble ! :D
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

heu, la, je vois pas d'ou tu sors ceci
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Merci LSI , j'y jetterai un oeil . Un bon exemple à mettre sur 2Dev :)

Sinon en modifiant le source, j'ai pu obtenir la création d'une planche avec des caractères en couleur. Iil faudrait compléter le code pour gérer différents effets , comme celui proposé par LSI , et en ajouter d'autres.

Je mets ça dans ma liste "des trucs à faire éventuellement un jour de pluie" .
Répondre