BGRABitmap tutorial Font rendering/fr: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | - | ||
| 1 | + | Des fonctions de texte de base sont disponibles avec les objets _TBGRABitmap_. Vous trouverez des explications à ce sujet dans le [[BGRABitmap tutorial 12/fr|tutoriel 12]]. | |
| 2 | 2 | ||
| 3 | - | ||
| 3 | + | Voyons les façons avancées de dessiner du texte. | |
| 4 | 4 | ||
| 5 | + | ## Contents | |
| 6 | + | ||
| 7 | + | * 1 La propriété FontRenderer | |
| 8 | + | * 1.1 Ajouter des effets | |
| 9 | + | * 1.1.1 Utiliser un éclairage de Phong | |
| 10 | + | * 1.2 Utiliser les polices avec LazFreeType intégré à Lazarus | |
| 11 | + | * 1.2.1 Éclairage de Phong | |
| 12 | + | ||
| 5 | 13 | ### La propriété FontRenderer | |
| 6 | 14 | ||
| 7 | - | ||
| 15 | + | Les images _TBGRABitmap_ ont une propriété _FontRenderer_. Par défaut, le moteur de rendu utilisant le dessin de la LCL est utilisé, éventuellement en dessinant le texte plus gros et en appliquant un anticrénelage. Cela est réalisé par la classe _TLCLFontRenderer_ de l'unité _BGRAText_. Cependant, ce mode de dessin ne permet pas de faire des ombrage ou de dessiner un contour au texte. De plus, il est un peu lent pour dessiner du texte dans un rectangle (fonction _TextRect_). | |
| 8 | 16 | ||
| 9 | - | ||
| 17 | + | Vous pouvez remplacer le moteur de rendu en créant un objet dérivé de la classe _TBGRACustomFontRenderer_ et en l'affectant à la propriété _FontRenderer_. Notez qu'une instance ne peut être utilisée que pour un seul objet, qui en devient le propriétaire. Vous n'avez alors pas à libérer vous-même le moteur de rendu. | |
| 10 | 18 | ||
| 11 | 19 | #### Ajouter des effets | |
| 12 | 20 | ||
| 13 | - | ||
| 14 | - | ||
| 15 | - | ||
| 21 | + | Pour améliorer la vitesse du rendu et ajouter des effets, vous aurez besoin de la classe _TBGRATextEffectFontRenderer_ qui se trouve dans l'unité _BGRATextFX_. Pour cela, écrivez simplement ceci : | |
| 22 | + | ``` | |
| 16 | 23 | Uses BGRABitmap, BGRATextFX; | |
| 17 | - | ||
| 18 | - | ||
| 19 | - | ||
| 20 | - | ||
| 21 | - | ||
| 22 | - | ||
| 23 | - | ||
| 24 | - | ||
| 24 | + | ||
| 25 | + | var Bitmap: TBGRABitmap; | |
| 26 | + | Renderer: TBGRATextEffectFontRenderer; | |
| 27 | + | ||
| 28 | + | begin | |
| 29 | + | ... | |
| 30 | + | Renderer := TBGRATextEffectFontRenderer.Create; | |
| 31 | + | Bitmap.FontRenderer := Renderer; | |
| 25 | 32 | ``` | |
| 26 | 33 | ||
| 27 | - | ||
| 28 | - | ||
| 29 | - | ||
| 30 | - | ||
| 34 | + | Notez que vous pourriez affecter directement l'objet créé sans passer par la variable _Renderer_ , mais cette dernière va vous permettre de choisir les effets appliqués. | |
| 31 | 35 | ||
| 32 | - | ||
| 36 | + | * Pour l'ombrage, utilisez les propriétés _ShadowVisible_ , _ShadowColor_ , _ShadowOffset_ et _ShadowRadius_. Pour qu'une ombre soit visible, il faut que _ShadowVisible_ soit à _True_ et que _ShadowColor_ ne soit pas transparent. | |
| 37 | + | * Pour ajouter un contour, utilisez _OutlineVisible_ , _OuterOutlineOnly_ , _OutlineColor_ ou _OutlineTexture_ et _OutlineWidth_. Pour qu'un contour soit visible, il faut que _OutlineVisible_ soit à _True_ , et qu'une texture soit définie ou sinon une couleur non transparente. De plus, _OutlineWidth_ ne doit pas être égal à zéro. | |
| 33 | 38 | ||
| 34 | - | ||
| 39 | + | Par exemple, définissez l'événement _OnPaint_ en double-cliquant dans l'inspecteur d'objet d'une fenêtre et écrivez : | |
| 40 | + | ``` | |
| 35 | 41 | Uses BGRABitmap, BGRABitmapTypes, BGRATextFX; | |
| 36 | - | ||
| 37 | - | ||
| 38 | - | ||
| 39 | - | ||
| 40 | - | ||
| 41 | - | ||
| 42 | - | ||
| 43 | - | ||
| 44 | - | ||
| 45 | - | ||
| 46 | - | ||
| 47 | - | ||
| 48 | - | ||
| 49 | - | ||
| 50 | - | ||
| 51 | - | ||
| 52 | - | ||
| 53 | - | ||
| 42 | + | ||
| 43 | + | procedure TForm1.FormPaint(Sender: TObject); | |
| 44 | + | var | |
| 45 | + | bmp: TBGRABitmap; | |
| 46 | + | renderer: TBGRATextEffectFontRenderer; | |
| 47 | + | begin | |
| 48 | + | bmp := TBGRABitmap.Create(ClientWidth,ClientHeight,ColorToRGB(clBtnFace)); | |
| 49 | + | renderer := TBGRATextEffectFontRenderer.Create; | |
| 50 | + | bmp.FontRenderer := renderer; | |
| 51 | + | renderer.ShadowVisible := True; | |
| 52 | + | renderer.OutlineVisible := True; | |
| 53 | + | renderer.OutlineColor := BGRABlack; | |
| 54 | + | renderer.OuterOutlineOnly := True; | |
| 55 | + | bmp.FontFullHeight := 50; | |
| 56 | + | bmp.TextOut(5,5,'Hello world',CSSRed); | |
| 57 | + | bmp.Draw(Canvas,0,0); | |
| 58 | + | bmp.Free; | |
| 59 | + | end; | |
| 54 | 60 | ``` | |
| 55 | 61 | ||
| 56 | - | ||
| 57 | - | ||
| 58 | - | ||
| 59 | - | ||
| 60 | - | ||
| 61 | - | ||
| 62 | + | [](</File:bgratexteffectfontrendering.png>) | |
| 62 | 63 | ||
| 63 | - | ||
| 64 | - | ||
| 64 | + | Notez que l'anticrénelage n'est pas activé. Vous pouvez le faire avec : | |
| 65 | 65 | ``` | |
| 66 | + | bmp.FontQuality:= fqFineAntialiasing; | |
| 67 | + | ``` | |
| 66 | 68 | ||
| 67 | - | ||
| 68 | - | ||
| 69 | - | ||
| 70 | - | ||
| 69 | + | [](</File:bgratexteffectfontrendering_aa.png>) | |
| 71 | 70 | ||
| 72 | 71 | ##### Utiliser un éclairage de Phong | |
| 73 | 72 | ||
| 74 | - | ||
| 75 | - | ||
| 76 | - | ||
| 73 | + | Pour avoir un éclairage de Phong, vous aurez besoin d'un _shader_. Pour le créer : | |
| 74 | + | ``` | |
| 77 | 75 | uses BGRAGradients; | |
| 78 | - | ||
| 79 | - | ||
| 80 | - | ||
| 81 | - | ||
| 82 | - | ||
| 83 | - | ||
| 76 | + | var | |
| 77 | + | shader: TPhongShading; | |
| 78 | + | renderer: TBGRATextEffectFontRenderer; | |
| 79 | + | begin | |
| 80 | + | shader := TPhongShading.Create; | |
| 81 | + | renderer := TBGRATextEffectFontRenderer.Create(shader, True); //le deuxième paramètre indique que le shader appartient au moteur de rendu | |
| 84 | 82 | ``` | |
| 85 | 83 | ||
| 86 | - | ||
| 87 | - | ||
| 88 | - | ||
| 84 | + | L'exemple au complet, en utilisant un ombrage, devient : | |
| 85 | + | ``` | |
| 89 | 86 | uses BGRABitmap, BGRABitmapTypes, BGRATextFX, BGRAGradients; | |
| 90 | - | ||
| 91 | - | ||
| 92 | - | ||
| 93 | - | ||
| 94 | - | ||
| 95 | - | ||
| 96 | - | ||
| 97 | - | ||
| 98 | - | ||
| 99 | - | ||
| 100 | - | ||
| 101 | - | ||
| 102 | - | ||
| 103 | - | ||
| 87 | + | ||
| 88 | + | procedure TForm1.FormPaint(Sender: TObject); | |
| 89 | + | var bmp: TBGRABitmap; | |
| 90 | + | shader: TPhongShading; | |
| 91 | + | renderer: TBGRATextEffectFontRenderer; | |
| 92 | + | begin | |
| 93 | + | bmp := TBGRABitmap.Create(ClientWidth,ClientHeight,ColorToRGB(clBtnFace)); | |
| 94 | + | shader := TPhongShading.Create; | |
| 95 | + | renderer := TBGRATextEffectFontRenderer.Create(shader,True); | |
| 96 | + | bmp.FontRenderer := renderer; | |
| 97 | + | renderer.ShadowVisible := True; | |
| 98 | + | bmp.FontFullHeight := 50; | |
| 99 | + | bmp.FontQuality:= fqFineAntialiasing; | |
| 100 | + | bmp.TextOut(5,5,'Hello world',CSSRed); | |
| 104 | 101 | ``` | |
| 105 | 102 | ||
| 106 | - | ||
| 107 | - | ||
| 108 | - | ||
| 109 | - | ||
| 103 | + | [](</File:bgratexteffectfontrendering_shader.png>) | |
| 110 | 104 | ||
| 111 | 105 | #### Utiliser les polices avec LazFreeType intégré à Lazarus | |
| 112 | 106 | ||
| 113 | - | ||
| 114 | - | ||
| 115 | - | ||
| 107 | + | Depuis la version 1.0 de Lazarus, un moteur de police FreeType est intégré à Lazarus. Notez que vous devez fournir vous-même les fichiers ou les flux contenant les polices que vous voulez afficher. Les répertoires du système et les polices installées sont ignorés, à moins bien entendu que vous ajoutiez explicitement ces fichiers. Notez que dans l'implémentation actuelle, il est nécessaire de fournir la police Arial même si vous ne l'utilisez pas. | |
| 116 | 108 | ||
| 117 | - | ||
| 109 | + | Afin de définir les polices, écrivez ceci lors de la création de votre application : | |
| 110 | + | ``` | |
| 118 | 111 | uses LazFreeTypeFontCollection; | |
| 119 | - | ||
| 120 | - | ||
| 121 | - | ||
| 122 | - | ||
| 123 | - | ||
| 124 | - | ||
| 125 | - | ||
| 126 | - | ||
| 127 | - | ||
| 128 | - | ||
| 129 | - | ||
| 130 | - | ||
| 131 | - | ||
| 132 | - | ||
| 133 | - | ||
| 112 | + | ||
| 113 | + | var FFontCollection: TFreeTypeFontCollection; | |
| 114 | + | ||
| 115 | + | procedure TForm1.FormCreate(Sender: TObject); | |
| 116 | + | begin | |
| 117 | + | FFontCollection := TFreeTypeFontCollection.Create; | |
| 118 | + | FFontCollection.AddFile('Arial.ttf'); //en supposant que le fichier se trouve à coté de l'application | |
| 119 | + | SetDefaultFreeTypeFontCollection(FFontCollection); | |
| 120 | + | end; | |
| 121 | + | ||
| 122 | + | procedure TForm1.FormDestroy(Sender: TObject); | |
| 123 | + | begin | |
| 124 | + | SetDefaultFreeTypeFontCollection(nil); | |
| 125 | + | FreeAndNil(FFontCollection); | |
| 126 | + | end; | |
| 134 | 127 | ``` | |
| 135 | 128 | ||
| 136 | - | ||
| 137 | - | ||
| 138 | - | ||
| 129 | + | À présent, pour utiliser ces polices, définissez la propriété _FontRenderer_ : | |
| 130 | + | ``` | |
| 139 | 131 | uses BGRABitmap, BGRABitmapTypes, BGRAFreeType; | |
| 140 | - | ||
| 141 | - | ||
| 142 | - | ||
| 143 | - | ||
| 144 | - | ||
| 145 | - | ||
| 146 | - | ||
| 147 | - | ||
| 148 | - | ||
| 149 | - | ||
| 150 | - | ||
| 151 | - | ||
| 152 | - | ||
| 153 | - | ||
| 154 | - | ||
| 155 | - | ||
| 132 | + | ||
| 133 | + | procedure TForm1.FormPaint(Sender: TObject); | |
| 134 | + | var | |
| 135 | + | bmp: TBGRABitmap; | |
| 136 | + | renderer: TBGRAFreeTypeFontRenderer; | |
| 137 | + | begin | |
| 138 | + | bmp := TBGRABitmap.Create(ClientWidth,ClientHeight,ColorToRGB(clBtnFace)); | |
| 139 | + | renderer := TBGRAFreeTypeFontRenderer.Create; | |
| 140 | + | bmp.FontRenderer := renderer; | |
| 141 | + | bmp.FontName := 'Arial'; | |
| 142 | + | bmp.FontFullHeight:= 50; | |
| 143 | + | bmp.FontQuality := fqFineClearTypeRGB; | |
| 144 | + | bmp.TextOut(10,10,'Hello world',BGRABlack); | |
| 145 | + | bmp.Draw(Canvas,0,0); | |
| 146 | + | bmp.Free; | |
| 147 | + | end; | |
| 156 | 148 | ``` | |
| 157 | 149 | ||
| 158 | - | ||
| 159 | - | ||
| 160 | - | ||
| 161 | - | ||
| 162 | - | ||
| 163 | - | ||
| 150 | + | [](</File:bgrafreetyperenderer.png>) | |
| 164 | 151 | ||
| 165 | - | ||
| 166 | - | ||
| 152 | + | Vous pouvez ajouter une ombre avec la propriété _Shadow_ : | |
| 167 | 153 | ``` | |
| 168 | - | ||
| 169 | - | ||
| 170 | - | ||
| 171 | - | ||
| 172 | - | ||
| 154 | + | renderer.ShadowVisible := True; | |
| 155 | + | ``` | |
| 173 | 156 | ||
| 174 | - | ||
| 157 | + | [](</File:bgrafreetyperenderer_shadow.png>) | |
| 175 | 158 | ||
| 176 | - | ||
| 177 | - | ||
| 178 | - | ||
| 179 | - | ||
| 159 | + | Pour ajouter un contour : | |
| 180 | 160 | ``` | |
| 161 | + | renderer.OutlineVisible := True; | |
| 162 | + | renderer.OutlineColor := CSSBlack; | |
| 163 | + | renderer.OuterOutlineOnly := True; | |
| 164 | + | ``` | |
| 181 | 165 | ||
| 182 | - | ||
| 183 | - | ||
| 184 | - | ||
| 185 | - | ||
| 166 | + | [](</File:bgrafreetyperenderer_outline.png>) | |
| 186 | 167 | ||
| 187 | 168 | ##### Éclairage de Phong | |
| 188 | 169 | ||
| 189 | - | ||
| 190 | - | ||
| 191 | - | ||
| 170 | + | Pour avoir un éclairage de Phong, vous aurez besoin d'un _shader_. Pour le créer : | |
| 171 | + | ``` | |
| 192 | 172 | uses BGRAGradients; | |
| 193 | - | ||
| 194 | - | ||
| 195 | - | ||
| 196 | - | ||
| 197 | - | ||
| 198 | - | ||
| 173 | + | var | |
| 174 | + | shader: TPhongShading; | |
| 175 | + | renderer: TBGRAFreeTypeFontRenderer; | |
| 176 | + | begin | |
| 177 | + | shader := TPhongShading.Create; | |
| 178 | + | renderer := TBGRAFreeTypeFontRenderer.Create(shader, True); //le deuxième paramètre indique que le shader appartient au moteur de rendu | |
| 199 | 179 | ``` | |
| 200 | 180 | ||
| 201 | - | ||
| 202 | - | ||
| 203 | - | ||
| 204 | - | ||
| 181 | + | [](</File:bgrafreetyperenderer_shader.png>) | |
| 205 | 182 | ||
| 206 | 183 | --- | |
| 207 | - | ||
| 208 | - | ||
| 184 | + | *From the Free Pascal wiki, page "BGRABitmap tutorial Font rendering/fr", as the Internet Archive kept it on 2023-03-30. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
