source: spip-zone/_core_/branches/spip-2.1/plugins/filtres_images/filtres/images_typo.php @ 44010

Last change on this file since 44010 was 44010, checked in by prigent.yohann@…, 9 years ago

Pouvoir définir une option padding_vertical et padding_horizontal. C'est bien plus pratique parce que souvent les polices ne dépassent de la boite que en vertical, donc l'intérêt aussi de l'élargir sur l'horizontal est pas terrible...
Ce qui manque serait de pouvoir définir vraiment un padding top right bottom left.
Une petite astuce pour ceux qui voudraient ne garder qu'un padding en bas à présent (et donc mettre limage typo *aux bords* même avec une police qui dépasse :

{{

#SET{padding,15}
#SET{hauteur_tout,#NOM_SITE_SPIP|image_typo{police=LEVIBRUSH.TTF, taille=#GET{taille}, couleur=#GET{couleur_tout}#GET{couleur_tout}, padding_vertical=#GET{padding}}|extraire_attribut{src}|hauteur}
#SET{new_hauteur, #GET{hauteur_tout}|moins{#GET{padding}}}

#SET{largeur_tout,#NOM_SITE_SPIP|image_typo{police=LEVIBRUSH.TTF, taille=#GET{taille}, couleur=#GET{couleur_tout}, padding_vertical=#GET{padding}}|extraire_attribut{src}|largeur}
[(#NOM_SITE_SPIP|image_typo{police=LEVIBRUSH.TTF, taille=#GET{taille}, couleur=#GET{couleur_tout}, padding_vertical=#GET{padding}}|extraire_attribut{src}|image_recadre{#GET{largeur_tout}
,#GET{new_hauteur},bottom})]

}}

C'est sûr que c'est lourd, mais avec le cache de SPIP, ça fonctionne plutôt bien.
Et ça ne casse en rien les existants padding : ils resteront comme avant.

File size: 19.0 KB
Line 
1<?php
2/***************************************************************************\
3 *  SPIP, Systeme de publication pour l'internet                           *
4 *                                                                         *
5 *  Copyright (c) 2001-2009                                                *
6 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
7 *                                                                         *
8 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
9 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
10\***************************************************************************/
11
12// librairie de base du core
13include_spip('inc/filtres_images_mini');
14
15
16// Image typographique
17// Fonctions pour l'arabe
18
19// http://doc.spip.org/@rtl_mb_ord
20function rtl_mb_ord($char){
21
22        if (($c = ord($char)) < 216) return $c;
23        else return 256 * rtl_mb_ord(substr($char, 0, -1)) + ord(substr($char, -1));
24
25        /*      return (strlen($char) < 2) ?
26                        ord($char) : 256 * mb_ord(substr($char, 0, -1))
27                                + ord(substr($char, -1));
28                               
29        */                     
30}
31
32
33// http://doc.spip.org/@rtl_reverse
34function rtl_reverse($mot, $rtl_global) {
35        $rtl_prec = $rtl_global;
36
37        $ponctuations = array("/", "-", "«","»", "“", "”", ",", ".", " ", ":", ";", "(", ")", "،", "؟", "?", "!", " ");
38        foreach($ponctuations as $ponct) {
39                $ponctuation[$ponct] = true;
40        }
41
42               
43
44        for ($i = 0; $i < spip_strlen($mot); $i++) {
45                $lettre = spip_substr($mot, $i, 1);
46               
47                $code = rtl_mb_ord($lettre);
48                # echo "<li>$lettre - $code";
49
50                if (($code >= 54928 && $code <= 56767) ||  ($code >= 15707294 && $code <= 15711164)) {
51                        $rtl = true;
52                }
53                else $rtl = false;
54               
55                if ($lettre == "٠" || $lettre == "١" || $lettre == "٢" || $lettre == "٣" || $lettre == "٤" || $lettre == "٥"
56                                 || $lettre == "٦" || $lettre == "٧" || $lettre == "٨" || $lettre == "٩") $rtl = false;
57               
58                if ($ponctuation[$lettre]) {
59                        # le truc mega casse-gueule de l'inversion unicode:
60                        # traiter le sens de placement en fonction de la lettre precedente
61                        # (et non automatiquement le rtl_global)
62                        $rtl = $rtl_prec;
63                       
64                        if ($rtl) {
65                                switch ($lettre) {
66                                        case "(": $lettre = ")"; break;
67                                        case ")": $lettre = "("; break;
68                                        case "«": $lettre = "»"; break;
69                                        case "»": $lettre = "«"; break;
70                                        case "“": $lettre = "”"; break;
71                                        case "”": $lettre = "“"; break;
72                                }
73                        }
74                }
75               
76               
77                if ($rtl) $res = $lettre.$res;
78                else $res = $res.$lettre;
79               
80                $rtl_prec = $rtl;
81               
82        }
83        return $res;
84}
85
86
87
88// http://doc.spip.org/@rtl_visuel
89function rtl_visuel($texte, $rtl_global) {
90        // hebreu + arabe: 54928 => 56767
91        // hebreu + presentation A: 15707294 => 15710140
92        // arabe presentation: 15708336 => 15711164
93       
94        #       echo hexdec("efb7bc");
95
96        // premiere passe pour determiner s'il y a du rtl
97        // de facon a placer ponctuation et mettre les mots dans l'ordre
98
99
100        $arabic_letters = array(
101                array("ي", // lettre 0
102                        "ﻱ",  // isolee 1
103                        "ﻳ", // debut 2
104                        "ﻴ", // milieu 3
105                        "ﻲ"),
106                array("ب", // lettre 0
107                        "ﺏ",  // isolee 1
108                        "ﺑ", // debut 2
109                        "ﺒ", // milieu 3
110                        "ﺐ"),
111                array("ا", // lettre 0
112                        "ا",  // isolee 1
113                        "ﺍ", // debut 2
114                        "ﺍ", // milieu 3
115                        "ﺎ"),
116                array("إ", // lettre 0
117                        "إ",  // isolee 1
118                        "إ", // debut 2
119                        "ﺈ", // milieu 3
120                        "ﺈ"),
121                array("ل", // lettre 0
122                        "ﻝ",  // isolee 1
123                        "ﻟ", // debut 2
124                        "ﻠ", // milieu 3
125                        "ﻞ"),
126                array("خ", // lettre 0
127                        "ﺥ",  // isolee 1
128                        "ﺧ", // debut 2
129                        "ﺨ", // milieu 3
130                        "ﺦ"),
131                array("ج", // lettre 0
132                        "ﺝ",  // isolee 1
133                        "ﺟ", // debut 2
134                        "ﺠ", // milieu 3
135                        "ﺞ"),
136                array("س", // lettre 0
137                        "ﺱ",  // isolee 1
138                        "ﺳ", // debut 2
139                        "ﺴ", // milieu 3
140                        "ﺲ"),
141                array("ن", // lettre 0
142                        "ﻥ",  // isolee 1
143                        "ﻧ", // debut 2
144                        "ﻨ", // milieu 3
145                        "ﻦ"),
146                array("ش", // lettre 0
147                        "ﺵ",  // isolee 1
148                        "ﺷ", // debut 2
149                        "ﺸ", // milieu 3
150                        "ﺶ"),
151                array("ق", // lettre 0
152                        "ﻕ",  // isolee 1
153                        "ﻗ", // debut 2
154                        "ﻘ", // milieu 3
155                        "ﻖ"),
156                array("ح", // lettre 0
157                        "ﺡ",  // isolee 1
158                        "ﺣ", // debut 2
159                        "ﺤ", // milieu 3
160                        "ﺢ"),
161                array("م", // lettre 0
162                        "ﻡ",  // isolee 1
163                        "ﻣ", // debut 2
164                        "ﻤ", // milieu 3
165                        "ﻢ"),
166                array("ر", // lettre 0
167                        "ر",  // isolee 1
168                        "ﺭ", // debut 2
169                        "ﺮ", // milieu 3
170                        "ﺮ"),
171                array("ع", // lettre 0
172                        "ع",  // isolee 1
173                        "ﻋ", // debut 2
174                        "ﻌ", // milieu 3
175                        "ﻊ"),
176                array("و", // lettre 0
177                        "و",  // isolee 1
178                        "ﻭ", // debut 2
179                        "ﻮ", // milieu 3
180                        "ﻮ"),
181                array("ة", // lettre 0
182                        "ة",  // isolee 1
183                        "ة", // debut 2
184                        "ﺔ", // milieu 3
185                        "ﺔ"),
186                array("ف", // lettre 0
187                        "ﻑ",  // isolee 1
188                        "ﻓ", // debut 2
189                        "ﻔ", // milieu 3
190                        "ﻒ"),
191                array("ﻻ", // lettre 0
192                        "ﻻ",  // isolee 1
193                        "ﻻ", // debut 2
194                        "ﻼ", // milieu 3
195                        "ﻼ"),
196                array("ح", // lettre 0
197                        "ﺡ",  // isolee 1
198                        "ﺣ", // debut 2
199                        "ﺤ", // milieu 3
200                        "ﺢ"),
201                array("ت", // lettre 0
202                        "ﺕ",  // isolee 1
203                        "ﺗ", // debut 2
204                        "ﺘ", // milieu 3
205                        "ﺖ"),
206                array("ض", // lettre 0
207                        "ﺽ",  // isolee 1
208                        "ﺿ", // debut 2
209                        "ﻀ", // milieu 3
210                        "ﺾ"),
211                array("ك", // lettre 0
212                        "ك",  // isolee 1
213                        "ﻛ", // debut 2
214                        "ﻜ", // milieu 3
215                        "ﻚ"),
216                array("ه", // lettre 0
217                        "ﻩ",  // isolee 1
218                        "ﻫ", // debut 2
219                        "ﻬ", // milieu 3
220                        "ﻪ"),
221                array("ي", // lettre 0
222                        "ي",  // isolee 1
223                        "ﻳ", // debut 2
224                        "ﻴ", // milieu 3
225                        "ﻲ"),
226                array("ئ", // lettre 0
227                        "ﺉ",  // isolee 1
228                        "ﺋ", // debut 2
229                        "ﺌ", // milieu 3
230                        "ﺊ"),
231                array("ص", // lettre 0
232                        "ﺹ",  // isolee 1
233                        "ﺻ", // debut 2
234                        "ﺼ", // milieu 3
235                        "ﺺ"),
236                array("ث", // lettre 0
237                        "ﺙ",  // isolee 1
238                        "ﺛ", // debut 2
239                        "ﺜ", // milieu 3
240                        "ﺚ"),
241                array("ﻷ", // lettre 0
242                        "ﻷ",  // isolee 1
243                        "ﻷ", // debut 2
244                        "ﻸ", // milieu 3
245                        "ﻸ"),
246                array("د", // lettre 0
247                        "ﺩ",  // isolee 1
248                        "ﺩ", // debut 2
249                        "ﺪ", // milieu 3
250                        "ﺪ"),
251                array("ذ", // lettre 0
252                        "ﺫ",  // isolee 1
253                        "ﺫ", // debut 2
254                        "ﺬ", // milieu 3
255                        "ﺬ"),
256                array("ط", // lettre 0
257                        "ﻁ",  // isolee 1
258                        "ﻃ", // debut 2
259                        "ﻄ", // milieu 3
260                        "ﻂ"),
261                array("آ", // lettre 0
262                        "آ",  // isolee 1
263                        "آ", // debut 2
264                        "ﺂ", // milieu 3
265                        "ﺂ"),
266                array("أ", // lettre 0
267                        "أ",  // isolee 1
268                        "أ", // debut 2
269                        "ﺄ", // milieu 3
270                        "ﺄ"),
271                array("ؤ", // lettre 0
272                        "ؤ",  // isolee 1
273                        "ؤ", // debut 2
274                        "ﺆ", // milieu 3
275                        "ﺆ"),
276                array("ز", // lettre 0
277                        "ز",  // isolee 1
278                        "ز", // debut 2
279                        "ﺰ", // milieu 3
280                        "ﺰ"),
281                array("ظ", // lettre 0
282                        "ظ",  // isolee 1
283                        "ﻇ", // debut 2
284                        "ﻈ", // milieu 3
285                        "ﻆ"),
286                array("غ", // lettre 0
287                        "غ",  // isolee 1
288                        "ﻏ", // debut 2
289                        "ﻐ", // milieu 3
290                        "ﻎ"),
291                array("ى", // lettre 0
292                        "ى",  // isolee 1
293                        "ﯨ", // debut 2
294                        "ﯩ", // milieu 3
295                        "ﻰ"),
296                array("پ", // lettre 0
297                        "پ",  // isolee 1
298                        "ﭘ", // debut 2
299                        "ﭙ", // milieu 3
300                        "ﭗ"),
301                array("چ", // lettre 0
302                        "چ",  // isolee 1
303                        "ﭼ", // debut 2
304                        "ﭽ", // milieu 3
305                        "ﭻ")
306        );
307       
308        if(init_mb_string() AND mb_regex_encoding() !== "UTF-8") echo "Attention: dans php.ini, il faut indiquer:<br /><strong>mbstring.internal_encoding = UTF-8</strong>";
309       
310       
311        $texte = explode(" ", $texte);
312       
313        foreach ($texte as $mot) {
314                $res = "";
315
316                // Inserer des indicateurs de debut/fin
317                $mot = "^".$mot."^";
318
319                $mot = preg_replace(",&nbsp;,u", " ", $mot);
320                $mot = preg_replace(",&#171;,u", "«", $mot);
321                $mot = preg_replace(",&#187;,u", "»", $mot);
322
323                // ponctuations
324                $ponctuations = array("/", "-", "«","»", "“", "”", ",", ".", " ", ":", ";", "(", ")", "،", "؟", "?", "!"," ");
325                foreach($ponctuations as $ponct) {
326                        $mot = str_replace("$ponct", "^$ponct^", $mot);
327                }
328
329                // lettres forcant coupure
330                $mot = preg_replace(",ا,u", "ا^", $mot);
331                $mot = preg_replace(",د,u", "د^", $mot);
332                $mot = preg_replace(",أ,u", "أ^", $mot);
333                $mot = preg_replace(",إ,u", "إ^", $mot);
334                $mot = preg_replace(",أ,u", "أ^", $mot);
335                $mot = preg_replace(",ر,u", "ر^", $mot);
336                $mot = preg_replace(",ذ,u", "ذ^", $mot);
337                $mot = preg_replace(",ز,u", "ز^", $mot);
338                $mot = preg_replace(",و,u", "و^", $mot);
339                $mot = preg_replace(",و,u", "و^", $mot);
340                $mot = preg_replace(",ؤ,u", "ؤ^", $mot);
341                $mot = preg_replace(",ة,u", "ة^", $mot);
342                //              $mot = preg_replace(",ل,u", "^ل", $mot);
343                //              $mot = preg_replace(",,", "^", $mot);
344
345
346                $mot = preg_replace(",٠,u", "^٠^", $mot);
347                $mot = preg_replace(",١,u", "^١^", $mot);
348                $mot = preg_replace(",٢,u", "^٢^", $mot);
349                $mot = preg_replace(",٣,u", "^٣^", $mot);
350                $mot = preg_replace(",٤,u", "^٤^", $mot);
351                $mot = preg_replace(",٥,u", "^٥^", $mot);
352                $mot = preg_replace(",٦,u", "^٦^", $mot);
353                $mot = preg_replace(",٧,u", "^٧^", $mot);
354                $mot = preg_replace(",٨,u", "^٨^", $mot);
355                $mot = preg_replace(",٩,u", "^٩^", $mot);
356
357
358                // Ligatures
359                $mot = preg_replace(",لا,u", "ﻻ", $mot);
360                $mot = preg_replace(",لأ,u", "ﻷ", $mot);
361               
362               
363                foreach ($arabic_letters as $a_l) {
364                        $mot = preg_replace(",([^\^])".$a_l[0]."([^\^]),u", "\\1".$a_l[3]."\\2", $mot);
365                        $mot = preg_replace(",\^".$a_l[0]."([^\^]),u", "^".$a_l[2]."\\1", $mot);
366                        $mot = preg_replace(",([^\^])".$a_l[0]."\^,u", "\\1".$a_l[4]."^", $mot);
367                        // il semble qu'il ne soit pas necessaire de remplacer
368                        // la lettre isolee
369                        //                      $mot = preg_replace(",\^".$a_l[0]."\^,u", "^".$a_l[1]."^", $mot);
370                }
371               
372                                $mot = preg_replace(",\^,u", "", $mot);
373               
374                $res = $mot;
375                $res = rtl_reverse($mot, $rtl_global);
376
377                /*
378                $rtl = false;           
379                for ($i = 0; $i < spip_strlen($mot); $i++) {
380                        $lettre = spip_substr($mot, $i, 1);
381                        $code = rtl_mb_ord($lettre);
382                        if (($code >= 54928 && $code <= 56767) ||  ($code >= 15708336 && $code <= 15711164)) $rtl = true;
383                }
384                */
385               
386               
387                if ($rtl_global) $retour = $res . " " . $retour;
388                else $retour = $retour. " ".$res;
389        }
390       
391       
392        return $retour;
393}
394
395
396// http://doc.spip.org/@printWordWrapped
397function printWordWrapped($image, $top, $left, $maxWidth, $font, $couleur, $text, $textSize, $align="left", $hauteur_ligne = 0) {
398        static $memps = array();
399
400        // imageftbbox exige un float, et settype aime le double pour php < 4.2.0
401        settype($textSize, 'double');
402
403        // calculer les couleurs ici, car fonctionnement different selon TTF ou PS
404        $black = imagecolorallocatealpha($image, hexdec("0x{".substr($couleur, 0,2)."}"), hexdec("0x{".substr($couleur, 2,2)."}"), hexdec("0x{".substr($couleur, 4,2)."}"), 0);
405        $grey2 = imagecolorallocatealpha($image, hexdec("0x{".substr($couleur, 0,2)."}"), hexdec("0x{".substr($couleur, 2,2)."}"), hexdec("0x{".substr($couleur, 4,2)."}"), 127);
406
407        // Gaffe, T1Lib ne fonctionne carrement pas bien des qu'on sort de ASCII
408        // C'est dommage, parce que la rasterisation des caracteres est autrement plus jolie qu'avec TTF.
409        // A garder sous le coude en attendant que ca ne soit plus une grosse bouse.
410        // Si police Postscript et que fonction existe...
411        if (
412        false AND
413        strtolower(substr($font,-4)) == ".pfb"
414        AND function_exists("imagepstext")) {
415                // Traitement specifique pour polices PostScript (experimental)
416                $textSizePs = round(1.32 * $textSize);
417                if (!$fontps = $memps["$font"]) {
418                        $fontps = imagepsloadfont($font);
419                        // Est-ce qu'il faut reencoder? Pas testable proprement, alors...
420                        // imagepsencodefont($fontps,find_in_path('polices/standard.enc'));
421                        $memps["$font"] = $fontps;
422                }
423        }
424
425        $rtl_global = false;
426        for ($i = 0; $i < spip_strlen($text); $i++) {
427                $lettre = spip_substr($text, $i, 1);
428                $code = rtl_mb_ord($lettre);
429                if (($code >= 54928 && $code <= 56767) ||  ($code >= 15707294 && $code <= 15711164)) {
430                        $rtl_global = true;
431                }
432        }
433
434
435        // split the text into an array of single words
436        $words = explode(' ', $text);
437
438        // les espaces
439        foreach($words as $k=>$v)
440                $words[$k] = str_replace(array('~'), array(' '), $v);
441
442
443        if ($hauteur_ligne == 0) $lineHeight = floor($textSize * 1.3);
444        else $lineHeight = $hauteur_ligne;
445
446        $dimensions_espace = imageftbbox($textSize, 0, $font, ' ', array());
447        if ($dimensions_espace[2] < 0)
448                $dimensions_espace = imageftbbox($textSize, 0, $font, $line, array());
449        $largeur_espace = $dimensions_espace[2] - $dimensions_espace[0];
450        $retour["espace"] = $largeur_espace;
451
452
453        $line = '';
454        while (count($words) > 0) {
455               
456                $mot = $words[0];
457               
458                if ($rtl_global) $mot = rtl_visuel($mot,$rtl_global);
459       
460                $dimensions = imageftbbox($textSize, 0, $font, $line.' '.$mot, array());
461                $lineWidth = $dimensions[2] - $dimensions[0]; // get the length of this line, if the word is to be included
462                if ($lineWidth > $maxWidth) { // if this makes the text wider that anticipated
463                        $lines[] = $line; // add the line to the others
464                        $line = ''; // empty it (the word will be added outside the loop)
465                }
466                $line .= ' '.$words[0]; // add the word to the current sentence
467                $words = array_slice($words, 1); // remove the word from the array
468        }
469        if ($line != '') { $lines[] = $line; } // add the last line to the others, if it isn't empty
470        $height = count($lines) * $lineHeight; // the height of all the lines total
471        // do the actual printing
472        $i = 0;
473
474        // Deux passes pour recuperer, d'abord, largeur_ligne
475        // necessaire pour alignement right et center
476        foreach ($lines as $line) {
477                if ($rtl_global) $line = rtl_visuel($line, $rtl_global);
478               
479                $dimensions = imageftbbox($textSize, 0, $font, $line, array());
480                $largeur_ligne = $dimensions[2] - $dimensions[0];
481                if ($largeur_ligne > $largeur_max) $largeur_max = $largeur_ligne;
482        }
483
484        foreach ($lines as $i => $line) {
485                if ($rtl_global) $line = rtl_visuel($line, $rtl_global);
486
487                $dimensions = imageftbbox($textSize, 0, $font, $line, array());
488                $largeur_ligne = $dimensions[2] - $dimensions[0];
489                if ($align == "right") $left_pos = $largeur_max - $largeur_ligne;
490                else if ($align == "center") $left_pos = floor(($largeur_max - $largeur_ligne)/2);
491                else $left_pos = 0;
492               
493               
494                if ($fontps) {
495                        $line = trim($line);
496                        imagepstext ($image, "$line", $fontps, $textSizePs, $black, $grey2, $left + $left_pos, $top + $lineHeight * $i, 0, 0, 0, 16);
497                }
498                else imagefttext($image, $textSize, 0, $left + $left_pos, $top + $lineHeight * $i, $black, $font, trim($line), array());
499        }
500        $retour["height"] = $height;# + round(0.3 * $hauteur_ligne);
501        $retour["width"] = $largeur_max;
502                 
503        return $retour;
504}
505
506//array imagefttext ( resource image, float size, float angle, int x, int y, int col, string font_file, string text [, array extrainfo] )
507//array imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )
508
509// http://doc.spip.org/@produire_image_typo
510function produire_image_typo() {
511        /*
512        arguments autorises:
513       
514        $texte : le texte a transformer; attention: c'est toujours le premier argument, et c'est automatique dans les filtres
515        $couleur : la couleur du texte dans l'image - pas de dieze
516        $police: nom du fichier de la police (inclure terminaison)
517        $largeur: la largeur maximale de l'image ; attention, l'image retournee a une largeur inferieure, selon les limites reelles du texte
518        $hauteur_ligne: la hauteur de chaque ligne de texte si texte sur plusieurs lignes
519        (equivalent a "line-height")
520        $padding: forcer de l'espace autour du placement du texte; necessaire pour polices a la con qui "depassent" beaucoup de leur boite
521        $padding_vertical: forcer de l'espace autour du placement du texte en vertical; necessaire pour polices a la con qui "depassent" beaucoup de leur boite
522        $padding_horizontal: forcer de l'espace autour du placement du texte en horizontal; necessaire pour polices a la con qui "depassent" beaucoup de leur boite
523        $align: alignement left, right, center
524        */
525
526
527
528        // Recuperer les differents arguments
529        $numargs = func_num_args();
530        $arg_list = func_get_args();
531        $texte = $arg_list[0];
532        for ($i = 1; $i < $numargs; $i++) {
533                if (($p = strpos($arg_list[$i], "="))!==FALSE) {
534                        $nom_variable = substr($arg_list[$i], 0, $p);
535                        $val_variable = substr($arg_list[$i], $p+1);
536               
537                        $variable["$nom_variable"] = $val_variable;
538                }
539               
540        }
541
542        // Construire requete et nom fichier
543        $text = str_replace("&nbsp;", "~", $texte);     
544        $text = preg_replace(",(\r|\n)+,ms", " ", $text);
545        include_spip('inc/charsets');
546        $text = html2unicode(strip_tags($text));
547        if (strlen($text) == 0) return "";
548
549        $taille = $variable["taille"];
550        if ($taille < 1) $taille = 16;
551
552        $couleur = couleur_html_to_hex($variable["couleur"]);
553        if (strlen($couleur) < 6) $couleur = "000000";
554
555        $alt = $texte;
556               
557        $align = $variable["align"];
558        if (!$variable["align"]) $align="left";
559         
560        $police = $variable["police"];
561        if (strlen($police) < 2) $police = "dustismo.ttf";
562
563        $largeur = $variable["largeur"];
564        if ($largeur < 5) $largeur = 600;
565
566        if ($variable["hauteur_ligne"] > 0) $hauteur_ligne = $variable["hauteur_ligne"];
567        else $hauteur_ligne = 0;
568        if ($variable["padding"] > 0) $padding = $variable["padding"];
569        else $padding = 0;
570        if ($variable["padding_vertical"] > 0) $padding_vertical = $variable["padding_vertical"];
571        else $padding_vertical = 0;
572        if ($variable["padding_horizontal"] > 0) $padding_horizontal = $variable["padding_horizontal"];
573        else $padding_horizontal = 0;
574        if ($padding_horizontal == 0 AND $padding_vertical == 0 AND $padding > 0) {
575                $padding_horizontal = $padding;
576                $padding_vertical = $padding;
577        }
578
579
580        $string = "$text-$taille-$couleur-$align-$police-$largeur-$hauteur_ligne-$padding-$padding_vertical-$padding_horizontal";
581        $query = md5($string);
582        $dossier = sous_repertoire(_DIR_VAR, 'cache-texte');
583        $fichier = "$dossier$query.png";
584
585        $flag_gd_typo = function_exists("imageftbbox")
586                && function_exists('imageCreateTrueColor');
587
588       
589        if (@file_exists($fichier))
590                $image = $fichier;
591        else if (!$flag_gd_typo)
592                return $texte;
593        else {
594                $font = find_in_path('polices/'.$police);
595                if (!$font) {
596                        spip_log(_T('fichier_introuvable', array('fichier' => $police)));
597                        $font = find_in_path('polices/'."dustismo.ttf");
598                }
599
600                $imgbidon = imageCreateTrueColor($largeur, 45);
601                $retour = printWordWrapped($imgbidon, $taille+5, 0, $largeur, $font, $couleur, $text, $taille, 'left', $hauteur_ligne);
602                $hauteur = $retour["height"];
603                $largeur_reelle = $retour["width"];
604                $espace = $retour["espace"];
605                imagedestroy($imgbidon);
606
607                $im = imageCreateTrueColor($largeur_reelle-$espace+(2*$padding_horizontal), $hauteur+5+(2*$padding_vertical));
608                imagealphablending ($im, FALSE );
609                imagesavealpha ( $im, TRUE );
610               
611                // Creation de quelques couleurs
612               
613                $grey2 = imagecolorallocatealpha($im, hexdec("0x{".substr($couleur, 0,2)."}"), hexdec("0x{".substr($couleur, 2,2)."}"), hexdec("0x{".substr($couleur, 4,2)."}"), 127);
614                ImageFilledRectangle ($im,0,0,$largeur_reelle+(2*$padding_horizontal),$hauteur+5+(2*$padding_vertical),$grey2);
615               
616                // Le texte a dessiner
617                printWordWrapped($im, $taille+5+$padding_vertical, $padding_horizontal, $largeur, $font, $couleur, $text, $taille, $align, $hauteur_ligne);
618               
619               
620                // Utiliser imagepng() donnera un texte plus claire,
621                // compare a l'utilisation de la fonction imagejpeg()
622                _image_gd_output($im,array('fichier_dest'=>$fichier,'format_dest'=>'png'));
623                imagedestroy($im);
624               
625                $image = $fichier;
626        }
627
628
629        $dimensions = getimagesize($image);
630        $largeur = $dimensions[0];
631        $hauteur = $dimensions[1];
632       
633        return inserer_attribut("<img src='$image' width='$largeur' height='$hauteur' style='width:".$largeur."px;height:".$hauteur."px;' />", 'alt', $alt);
634}
635
636
637?>
Note: See TracBrowser for help on using the repository browser.