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