Changeset 115933 in spip-zone


Ignore:
Timestamp:
Jul 11, 2019, 4:23:42 PM (9 days ago)
Author:
cedric@…
Message:

Passage en production des methodes alternatives de generation de vignette apercu (gradients, potrace, geometrize) activable dans la page de config du plugin
+ mise a jour de la lib geometrize, en partie refactoree et optimisee
+ un mode debug activable par la config pour voir les apercus au survol des images (permet de tester sur un echantillon d'image et de choisir la methode la plus adaptee au site)

Location:
_plugins_/adaptive_images/trunk
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/adaptive_images/trunk/adaptive_images_options.php

    r115922 r115933  
    110110                $AdaptiveImages->lazyload = true;
    111111
    112         // Experimental : generer des thumbnails svg a base de gradients (mais resultat assez bof)
    113         //$AdaptiveImages->thumbnailGeneratorCallback = "adaptive_images_preview_gradients";
    114         // Experimental : generer des thumbnails svg a base de Potrace
    115         //$AdaptiveImages->thumbnailGeneratorCallback = "adaptive_images_preview_potrace";
    116         // Experimental : generer des thumbnails svg a base de Geometrize PHP
    117         $AdaptiveImages->thumbnailGeneratorCallback = "adaptive_images_preview_geometrize";
     112        if (isset($settings['thumbnail_method'])
     113                and function_exists($f = "adaptive_images_preview_" . $settings['thumbnail_method'])) {
     114                $AdaptiveImages->thumbnailGeneratorCallback = $f;
     115        }
     116
     117        if (isset($settings['thumbnail_debug']) and intval($settings['thumbnail_debug'])) {
     118                define('_ADAPTIVE_IMAGES_DEBUG_PREVIEW', true);
     119        }
    118120}
    119121
     
    197199function adaptive_images_preview_gradients($image, $options) {
    198200        $gradients = charger_fonction("image_gradients", "preview");
    199         //spip_timer('gradients');
     201        spip_timer($m = 'GRADIENTS');
    200202        if ($thumbnail = $gradients($image, $options)) {
    201                 //var_dump($thumbnail,filesize($thumbnail),spip_timer('gradients'));
     203                spip_log("$m: $thumbnail t=".spip_timer($m)." length:" . filesize($thumbnail), 'ai_preview' . _LOG_DEBUG);
    202204                return array($thumbnail, 'gradients');
    203205        }
     
    207209function adaptive_images_preview_potrace($image, $options) {
    208210        $gradients = charger_fonction("image_potrace", "preview");
    209         //spip_timer('potrace');
     211        spip_timer($m = 'POTRACE');
    210212        if ($thumbnail = $gradients($image, $options)) {
    211                 //var_dump($thumbnail,filesize($thumbnail),spip_timer('potrace'));
     213                spip_log("$m: $thumbnail t=".spip_timer($m)." length:" . filesize($thumbnail), 'ai_preview' . _LOG_DEBUG);
    212214                return array($thumbnail, 'potrace');
    213215        }
     
    218220function adaptive_images_preview_geometrize($image, $options) {
    219221        $geometrize = charger_fonction("image_geometrize", "preview");
    220         //spip_timer('geometrize');
     222        spip_timer($m = 'GEOMETRIZE');
    221223        if ($thumbnail = $geometrize($image, $options)) {
    222                 //var_dump($thumbnail,filesize($thumbnail),spip_timer('geometrize'));
     224                spip_log("$m: $thumbnail t=".spip_timer($m)." length:" . filesize($thumbnail), 'ai_preview' . _LOG_DEBUG);
    223225                return array($thumbnail, 'geometrize');
    224226        }
     
    387389                        $texte .= "<script type='text/javascript' src='$js'></script>\n";
    388390        }
     391        if (defined('_ADAPTIVE_IMAGES_DEBUG_PREVIEW') and _ADAPTIVE_IMAGES_DEBUG_PREVIEW) {
     392                $texte .= "<style type='text/css'>.adapt-img:hover {opacity: 1 !important;}</style>";
     393        }
     394
    389395        return $texte;
    390396}
    391 
    392 ?>
  • _plugins_/adaptive_images/trunk/formulaires/configurer_adaptive_images.html

    r115809 r115933  
    88                #ACTION_FORMULAIRE
    99                #SET{fl,adaptive_images}
    10                 <ul class="editer-groupe">
     10                <div class="editer-groupe">
    1111                        #SET{name,lowsrc_jpg_bg_color}#SET{obli,''}#SET{defaut,'#ffffff'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    12                         <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     12                        <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    1313                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    1414                                <span class='erreur_message'>(#GET{erreurs})</span>
    1515                                ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    16                         </li>
     16                        </div>
    1717                        #SET{name,max_width_1x}#SET{obli,''}#SET{defaut,'640'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    18                         <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     18                        <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    1919                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    2020                                <span class='erreur_message'>(#GET{erreurs})</span>
    2121                                ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    22                         </li>
     22                        </div>
    2323                        #SET{name,max_width_mobile_version}#SET{obli,''}#SET{defaut,'320'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    24                         <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     24                        <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    2525                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    2626                                <span class='erreur_message'>(#GET{erreurs})</span>
    2727                                ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    28                         </li>
     28                        </div>
    2929                        #SET{name,min_width_1x}#SET{obli,''}#SET{defaut,'320'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    30                         <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     30                        <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    3131                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    3232                                <span class='erreur_message'>(#GET{erreurs})</span>
    3333                                ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    34                         </li>
     34                        </div>
    3535                        #SET{name,min_filesize}#SET{obli,''}#SET{defaut,'20'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    36                         <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     36                        <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    3737                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    3838                                <span class='erreur_message'>(#GET{erreurs})</span>
    3939                                ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    40                         </li>
     40                        </div>
    4141                        #SET{name,default_bkpts}#SET{obli,''}#SET{defaut,'160,320,480,640,960,1440'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    42                         <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     42                        <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    4343                                <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    4444                                <span class='erreur_message'>(#GET{erreurs})</span>
    4545                                ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    46                         </li>
     46                        </div>
    4747                        #SET{name,on_demand_production}#SET{obli,''}#SET{defaut,'0'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    48                         <li class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[
     48                        <div class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[
    4949                                <span class='erreur_message'>(#GET{erreurs})</span>
    5050                                ]
     
    5757                                </div>
    5858                                <p class="explication"><:adaptive_images:explication_on_demand_production:></p>
    59                         </li>
     59                        </div>
    6060                        #SET{name,lazy_load}#SET{obli,''}#SET{defaut,'0'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    61                         <li class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[
     61                        <div class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[
    6262                                <span class='erreur_message'>(#GET{erreurs})</span>
    6363                                ]
     
    6969                                        <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
    7070                                </div>
    71                         </li>
     71                        </div>
    7272
    73                         <li class="fieldset">
     73                        <div class="fieldset">
    7474                                <fieldset>
    7575                                        <legend><:adaptive_images:legend_compression_jpg:></legend>
    7676                                        <p class="explication"><:adaptive_images:explication_compression_jpg:></p>
    77                                         <ul class="editer-groupe">
     77                                        <div class="editer-groupe">
    7878                                                #SET{name,10x_jpg_quality}#SET{obli,''}#SET{defaut,'75'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    79                                                 <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     79                                                <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    8080                                                        <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    8181                                                        <span class='erreur_message'>(#GET{erreurs})</span>
    8282                                                        ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    83                                                 </li>
     83                                                </div>
    8484                                                #SET{name,15x_jpg_quality}#SET{obli,''}#SET{defaut,'65'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    85                                                 <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     85                                                <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    8686                                                        <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    8787                                                        <span class='erreur_message'>(#GET{erreurs})</span>
    8888                                                        ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    89                                                 </li>
     89                                                </div>
    9090                                                #SET{name,20x_jpg_quality}#SET{obli,''}#SET{defaut,'45'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    91                                                 <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     91                                                <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    9292                                                        <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    9393                                                        <span class='erreur_message'>(#GET{erreurs})</span>
    9494                                                        ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    95                                                 </li>
    96                                         </ul>
     95                                                </div>
     96                                        </div>
    9797                                </fieldset>
    98                         </li>
     98                        </div>
    9999
    100                         <li class="fieldset">
     100                        <div class="fieldset">
    101101                                <fieldset>
    102                                         <legend><:adaptive_images:legend_miniature_basse_def:></legend>
    103                                         <p class="explication"><:adaptive_images:explication_miniature_basse_def:></p>
    104                                         <ul class="editer-groupe">
    105                                                 #SET{name,lowsrc_width}#SET{obli,''}#SET{defaut,'128'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    106                                                 <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    107                                                         <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    108                                                         <span class='erreur_message'>(#GET{erreurs})</span>
    109                                                         ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    110                                                 </li>
    111                                                 #SET{name,lowsrc_jpg_quality}#SET{obli,''}#SET{defaut,'40'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    112                                                 <li class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    113                                                         <label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
    114                                                         <span class='erreur_message'>(#GET{erreurs})</span>
    115                                                         ]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
    116                                                 </li>
    117                                         </ul>
     102                                        <legend><:adaptive_images:legend_miniature_preview:></legend>
     103                                        <p class="explication"><:adaptive_images:explication_thumbnail_method:></p>
     104                                        #SET{name,thumbnail_method}#SET{obli,''}#SET{defaut,'lowsrc'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
     105                                        <div class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
     106                                                <label>[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
     107                                                <span class='erreur_message'>(#GET{erreurs})</span>
     108                                                ]
     109                                                #SET{val,gradients}
     110                                                <div class="choix">
     111                                                        <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}" aria-describedby="#GET{name}_explication" [(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
     112                                                        <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
     113                                                </div>
     114                                                #SET{val,lowsrc}
     115                                                <div class="choix">
     116                                                        <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}" aria-describedby="#GET{name}_explication" [(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
     117                                                        <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
     118                                                </div>
     119                                                <div class="suite fieldset">
     120                                                        <p class="explication"><:adaptive_images:explication_miniature_basse_def:></p>
     121                                                        <div class="editer-groupe">
     122                                                                #SET{name2,lowsrc_width}#SET{obli2,''}#SET{defaut2,'128'}#SET{erreurs2,#ENV**{erreurs}|table_valeur{#GET{name2}}}
     123                                                                <div class="editer long_label editer_[(#GET{name2})][ (#GET{obli2})][ (#GET{erreurs2}|oui)erreur]">
     124                                                                        <label for="#GET{name2}">[(#GET{fl}|concat{':label_',#GET{name2}}|_T)]</label>[
     125                                                                        <span class='erreur_message'>(#GET{erreurs2})</span>
     126                                                                        ]<input type="text" name="#GET{name2}" class="text" value="#ENV*{#GET{name2},#GET{defaut2}}" id="#GET{name2}" [(#HTML5|et{#GET{obli2}})required='required']/>
     127                                                                </div>
     128                                                                #SET{name2,lowsrc_jpg_quality}#SET{obli,''}#SET{defaut2,'40'}#SET{erreurs2,#ENV**{erreurs}|table_valeur{#GET{name2}}}
     129                                                                <div class="editer long_label editer_[(#GET{name2})][ (#GET{obli2})][ (#GET{erreurs2}|oui)erreur]">
     130                                                                        <label for="#GET{name2}">[(#GET{fl}|concat{':label_',#GET{name2}}|_T)]</label>[
     131                                                                        <span class='erreur_message'>(#GET{erreurs2})</span>
     132                                                                        ]<input type="text" name="#GET{name2}" class="text" value="#ENV*{#GET{name2},#GET{defaut2}}" id="#GET{name2}" [(#HTML5|et{#GET{obli2}})required='required']/>
     133                                                                </div>
     134                                                        </div>
     135                                                </div>
     136                                                #SET{val,potrace}
     137                                                <div class="choix">
     138                                                        <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}" aria-describedby="#GET{name}_explication" [(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
     139                                                        <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
     140                                                </div>
     141                                                #SET{val,geometrize}
     142                                                <div class="choix">
     143                                                        <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}" aria-describedby="#GET{name}_explication" [(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
     144                                                        <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
     145                                                </div>
     146                                        </div>
     147
     148                                        #SET{name,thumbnail_debug}#SET{obli,''}#SET{defaut,'0'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
     149                                        <div class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[
     150                                                <span class='erreur_message'>(#GET{erreurs})</span>
     151                                                ]
     152                                                #SET{val,0}
     153                                                <input type="hidden" name="#GET{name}" value="#GET{val}" />
     154                                                #SET{val,1}
     155                                                <div class="choix">
     156                                                        <input type="checkbox" name="#GET{name}" class="checkbox" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
     157                                                        <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
     158                                                </div>
     159                                        </div>
     160
    118161                                </fieldset>
    119                         </li>
     162                        </div>
    120163
    121                 </ul>
     164                </div>
    122165
    123166                <p class='boutons'><input class='submit' type="submit" name="_cfg_ok" value="<:bouton_enregistrer:>" /></p>
     
    125168
    126169</div>
     170<style type="text/css">
     171        .suite {padding-left: 40px;}
     172        .choix + .suite {
     173                border-top:1px solid #ddd;
     174        }
     175</style>
  • _plugins_/adaptive_images/trunk/lang/adaptive_images_fr.php

    r115809 r115933  
    2929Evite de générer toutes les images d\'un coup ce qui peut produire des erreurs sur les pages avec beaucoup d\'images.',
    3030        'legend_compression_jpg' => 'Compression JPG',
    31         'legend_miniature_basse_def' => 'Génération de l\'aperçu basse définition',
    32         'explication_compression_jpg' => 'Indiquez la qualité des images produites : de 0 (compression maximale, poids minimum) à 100 (pas de compression, poids maximum).',
    33         'explication_miniature_basse_def' => 'L\'image d\'aperçu basse définition est envoyée dans le html de la page, pour proposer un aperçu (flouté) pendant que les vrais images chargent. Elle doit donc être aussi légère que possible.<br />
    34  Un bon compromis de reglage est : Largeur 128px/Qualité 40.',
    35         'label_lowsrc_width' => 'Largeur de l\'aperçu (px)',
    36         'label_lowsrc_jpg_quality' => 'Qualité de l\'aperçu',
    3731        'label_10x_jpg_quality' => 'Image 1x',
    3832        'label_15x_jpg_quality' => 'Image 1.5x',
    3933        'label_20x_jpg_quality' => 'Image 2x',
     34
     35
     36        'legend_miniature_preview' => 'Génération de l\'image d\'aperçu',
     37
     38        'explication_compression_jpg' => 'Indiquez la qualité des images produites : de 0 (compression maximale, poids minimum) à 100 (pas de compression, poids maximum).',
     39
     40        'explication_thumbnail_method' => 'L\'image d\'aperçu est envoyée dans le html de la page, pour proposer un aperçu visuel pendant que les vrais images chargent. Elle doit donc être aussi légère que possible',
     41
     42        'label_thumbnail_method' => 'Méthode de génération de l\'aperçu',
     43        'label_thumbnail_method_gradients' => 'Fond dégradé horizontal+vertical',
     44
     45        'label_thumbnail_method_lowsrc' => 'Image basse définition floutée',
     46        'explication_miniature_basse_def' => 'Un bon compromis de reglage est : Largeur 128px/Qualité 40.',
     47        'label_lowsrc_width' => 'Largeur de l\'aperçu (px)',
     48        'label_lowsrc_jpg_quality' => 'Qualité de l\'aperçu',
     49
     50        'label_thumbnail_method_potrace' => 'Tracé d\'un contour issu de l\'image',
     51        'label_thumbnail_method_geometrize' => 'Géométrization de l\'image <i>(nécessite de la puissance de calcul)</i>',
     52
     53        'label_thumbnail_debug_1' => '<i>Activer le debug (les aperçus apparaissent au survol de l\'image)</i>',
     54
    4055);
    4156
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/exporter/SvgExporter.class.php

    r115922 r115933  
    5151        }
    5252
     53        static public function exportPolygon($points) {
     54                return geometrize_exporter_SvgExporter::exportLines($points, true);
     55        }
     56
    5357        /**
    5458         * @param array $points
    5559         *   each element is a ['x'=>int, 'y'=>int] array
     60         * @param bool $closed
    5661         * @return string
    5762         */
    58         static public function exportPolygon($points) {
    59                 $s1 = "<polygon points=\"";
     63        static public function exportLines($points, $closed = false) {
     64                $s1 = "<path d=\"M";
    6065
     66                $point = array_shift($points);
     67                $s1 .= $point['x'] . "," . $point['y'];
     68
     69                $prevPoint = $point;
    6170                foreach ($points as $point) {
    62                         $s1 .= $point['x'] . " " . $point['y'] . " ";
     71                        // find the shortest command to draw a line to this new point
     72                        $dx = $point['x']-$prevPoint['x'];
     73                        $dy = $point['y']-$prevPoint['y'];
     74                        if ($dx === 0) {
     75                                $pa = "V".$point['y'];
     76                                $pr = "v".$dy;
     77                        } elseif ($dy === 0) {
     78                                $pa = "H".$point['x'];
     79                                $pr = "h".$dx;
     80                        }
     81                        else {
     82                                $pa = "L" . $point['x'] . "," . $point['y'];
     83                                $pr = "l" . $dx . ',' . $dy;
     84                        }
     85                        if (strlen($pr)<strlen($pa)) {
     86                                $s1 .= $pr;
     87                        }
     88                        else {
     89                                $s1 .= $pa;
     90                        }
     91                        $prevPoint = $point;
    6392                }
    64                 $s1 = rtrim($s1);
     93                if ($closed) {
     94                        $s1 .= "z";
     95                }
    6596                $s1 .= "\" " . geometrize_exporter_SvgExporter::$SVG_STYLE_HOOK . "/>";
    6697                return $s1;
     
    98129                switch ($shape->getType()) {
    99130                        case geometrize_shape_ShapeTypes::T_LINE:
     131                                $style = geometrize_exporter_SvgExporter::strokeForColor($shape->color);
     132                                $style .= geometrize_exporter_SvgExporter::strokeOpacityForAlpha($shape->color & 255);
     133                                break;
    100134                        case geometrize_shape_ShapeTypes::T_QUADRATIC_BEZIER:
    101                                 $style = geometrize_exporter_SvgExporter::strokeForColor($shape->color) . " stroke-width=\"1\" fill=\"none\" ";
     135                                $style = geometrize_exporter_SvgExporter::strokeForColor($shape->color) . " fill=\"none\" ";
    102136                                $style .= geometrize_exporter_SvgExporter::strokeOpacityForAlpha($shape->color & 255);
    103137                                break;
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Circle.class.php

    r115922 r115933  
    33// Generated by Haxe 3.4.7
    44class geometrize_shape_Circle extends geometrize_shape_Ellipse {
     5
    56        public function __construct($xBound, $yBound){
    67                parent::__construct($xBound, $yBound);
    7                 $this->rx = mt_rand(1, 32);
    88                $this->ry = $this->rx;
    99        }
     
    1313                switch ($r) {
    1414                        case 0:
    15                                 {
    16                                         $value = $this->x;
    17                                         if (!true){
    18                                                 throw new HException("FAIL: lower <= upper");
    19                                         }
    20                                         $value1 = $value+mt_rand(-16, +16);
    21                                         $max = $this->xBound-1;
    22                                         if (!(0<=$max)){
    23                                                 throw new HException("FAIL: min <= max");
    24                                         }
    25                                         $tmp = null;
    26                                         if ($value1<0){
    27                                                 $tmp = 0;
    28                                         } else {
    29                                                 if ($value1>$max){
    30                                                         $tmp = $max;
    31                                                 } else {
    32                                                         $tmp = $value1;
    33                                                 }
    34                                         }
    35                                         $this->x = $tmp;
    36                                         $value2 = $this->y;
    37                                         if (!true){
    38                                                 throw new HException("FAIL: lower <= upper");
    39                                         }
    40                                         $value3 = $value2+mt_rand(-16, +16);
    41                                         $max1 = $this->yBound-1;
    42                                         if (!(0<=$max1)){
    43                                                 throw new HException("FAIL: min <= max");
    44                                         }
    45                                         $tmp1 = null;
    46                                         if ($value3<0){
    47                                                 $tmp1 = 0;
    48                                         } else {
    49                                                 if ($value3>$max1){
    50                                                         $tmp1 = $max1;
    51                                                 } else {
    52                                                         $tmp1 = $value3;
    53                                                 }
    54                                         }
    55                                         $this->y = $tmp1;
    56                                 }
     15                                $this->x += mt_rand(-16, +16);
     16                                $this->x = max(min($this->x, $this->xBound-1),0);
     17                                $this->y += mt_rand(-16, +16);
     18                                $this->y = max(min($this->y, $this->yBound-1),0);
     19                                break;
    5720                                break;
    5821                        case 1:
    59                                 {
    60                                         $value4 = $this->rx;
    61                                         if (!true){
    62                                                 throw new HException("FAIL: lower <= upper");
    63                                         }
    64                                         $value5 = $value4+mt_rand(-16, +16);
    65                                         $max2 = $this->xBound-1;
    66                                         if (!(1<=$max2)){
    67                                                 throw new HException("FAIL: min <= max");
    68                                         }
    69                                         $r1 = null;
    70                                         if ($value5<1){
    71                                                 $r1 = 1;
    72                                         } else {
    73                                                 if ($value5>$max2){
    74                                                         $r1 = $max2;
    75                                                 } else {
    76                                                         $r1 = $value5;
    77                                                 }
    78                                         }
    79                                         $this->rx = $r1;
    80                                         $this->ry = $r1;
    81                                 }
     22                                $this->rx += mt_rand(-16, +16);
     23                                $this->rx = max(min($this->rx, $this->xBound-1),1);
     24                                $this->ry = $this->rx;
    8225                                break;
    8326                }
    84         }
    8527
    86         public function hclone(){
    87                 $circle = new geometrize_shape_Circle($this->xBound, $this->yBound);
    88                 $circle->x = $this->x;
    89                 $circle->y = $this->y;
    90                 $circle->rx = $this->rx;
    91                 $circle->ry = $this->ry;
    92                 $circle->color = $this->color;
    93 
    94                 return $circle;
     28                // force to rasterize the new shape
     29                $this->lines = null;
    9530        }
    9631
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Ellipse.class.php

    r115922 r115933  
    33// Generated by Haxe 3.4.7
    44class geometrize_shape_Ellipse implements geometrize_shape_Shape {
    5         public $x;
    6         public $y;
    7         public $rx;
    8         public $ry;
    9         public $xBound;
    10         public $yBound;
     5
     6        /**
     7         * @var int
     8         */
     9        protected $x;
     10
     11        /**
     12         * @var int
     13         */
     14        protected $y;
     15
     16        /**
     17         * @var int
     18         */
     19        protected $rx;
     20
     21        /**
     22         * @var int
     23         */
     24        protected $ry;
     25
     26        /**
     27         * @var int
     28         */
     29        protected $xBound;
     30
     31        /**
     32         * @var int
     33         */
     34        protected $yBound;
     35
     36        /**
     37         * @var int
     38         */
    1139        public $color;
     40
     41        /**
     42         * Rasterized lines
     43         * @var null|array
     44         */
     45        protected $lines = null;
    1246
    1347        public function __construct($xBound, $yBound){
     
    2054        }
    2155
     56        /**
     57         * Rasterize the shape
     58         * @return array
     59         * @throws HException
     60         */
    2261        public function rasterize(){
    23                 $lines = [];
    24                 $aspect = $this->rx/$this->ry;
    25                 $w = $this->xBound;
    26                 $h = $this->yBound;
    27                 {
    28                         $_g1 = 0;
    29                         $_g = $this->ry;
    30                         while ($_g1<$_g){
    31                                 $_g1 = $_g1+1;
    32                                 $dy = $_g1-1;
     62                if (!$this->lines){
     63                        $this->lines = [];
     64
     65                        $aspect = $this->rx/$this->ry;
     66                        $w = $this->xBound;
     67                        $h = $this->yBound;
     68
     69                        for ($dy = 0; $dy<$this->ry; $dy++) {
    3370                                $y1 = $this->y-$dy;
    3471                                $y2 = $this->y+$dy;
    35                                 $tmp = null;
    36                                 $tmp1 = null;
     72
     73                                $s = null;
     74                                if ($y1>=0 or $y2<$h){
     75                                        $s = intval(sqrt($this->ry*$this->ry-$dy*$dy)*$aspect);
     76                                        $x1 = max($this->x-$s, 0);
     77                                        $x2 = min($this->x+$s, $w-1);
     78                                }
     79
    3780                                if ($y1>=0){
    38                                         $tmp1 = $y1>=$h;
    39                                 } else {
    40                                         $tmp1 = true;
     81                                        $this->lines[] = new geometrize_rasterizer_Scanline($y1, $x1, $x2);
    4182                                }
    42                                 if ($tmp1){
    43                                         if ($y2>=0){
    44                                                 $tmp = $y2>=$h;
    45                                         } else {
    46                                                 $tmp = true;
    47                                         }
    48                                 } else {
    49                                         $tmp = false;
     83                                if ($y2<$h){
     84                                        $this->lines[] = new geometrize_rasterizer_Scanline($y2, $x1, $x2);
    5085                                }
    51                                 if ($tmp){
    52                                         continue;
    53                                 }
    54                                 $s = intval(sqrt($this->ry*$this->ry-$dy*$dy)*$aspect);
    55                                 $x1 = $this->x-$s;
    56                                 $x2 = $this->x+$s;
    57                                 if ($x1<0){
    58                                         $x1 = 0;
    59                                 }
    60                                 if ($x2>=$w){
    61                                         $x2 = $w-1;
    62                                 }
    63                                 $tmp2 = null;
    64                                 if ($y1>=0){
    65                                         $tmp2 = $y1<$h;
    66                                 } else {
    67                                         $tmp2 = false;
    68                                 }
    69                                 if ($tmp2){
    70                                         $lines[] = new geometrize_rasterizer_Scanline($y1, $x1, $x2);
    71                                 }
    72                                 $tmp3 = null;
    73                                 $tmp4 = null;
    74                                 if ($y2>=0){
    75                                         $tmp4 = $y2<$h;
    76                                 } else {
    77                                         $tmp4 = false;
    78                                 }
    79                                 if ($tmp4){
    80                                         $tmp3 = $dy>0;
    81                                 } else {
    82                                         $tmp3 = false;
    83                                 }
    84                                 if ($tmp3){
    85                                         $lines[] = (new geometrize_rasterizer_Scanline($y2, $x1, $x2));
    86                                 }
    87                                 unset($y2, $y1, $x2, $x1, $tmp4, $tmp3, $tmp2, $tmp1, $tmp, $s, $dy);
    8886                        }
    8987                }
    90                 return $lines;
     88                return $this->lines;
    9189        }
    9290
     91        /**
     92         * Mutate the shape
     93         * @throws HException
     94         */
    9395        public function mutate(){
    9496                $r = mt_rand(0, 2);
    9597                switch ($r) {
    9698                        case 0:
    97                                 {
    98                                         $value = $this->x;
    99                                         if (!true){
    100                                                 throw new HException("FAIL: lower <= upper");
    101                                         }
    102                                         $value1 = $value+mt_rand(-16, +16);
    103                                         $max = $this->xBound-1;
    104                                         if (!(0<=$max)){
    105                                                 throw new HException("FAIL: min <= max");
    106                                         }
    107                                         $tmp = null;
    108                                         if ($value1<0){
    109                                                 $tmp = 0;
    110                                         } else {
    111                                                 if ($value1>$max){
    112                                                         $tmp = $max;
    113                                                 } else {
    114                                                         $tmp = $value1;
    115                                                 }
    116                                         }
    117                                         $this->x = $tmp;
    118                                         $value2 = $this->y;
    119                                         if (!true){
    120                                                 throw new HException("FAIL: lower <= upper");
    121                                         }
    122                                         $value3 = $value2+mt_rand(-16, +16);
    123                                         $max1 = $this->yBound-1;
    124                                         if (!(0<=$max1)){
    125                                                 throw new HException("FAIL: min <= max");
    126                                         }
    127                                         $tmp1 = null;
    128                                         if ($value3<0){
    129                                                 $tmp1 = 0;
    130                                         } else {
    131                                                 if ($value3>$max1){
    132                                                         $tmp1 = $max1;
    133                                                 } else {
    134                                                         $tmp1 = $value3;
    135                                                 }
    136                                         }
    137                                         $this->y = $tmp1;
    138                                 }
     99                                $this->x += mt_rand(-16, +16);
     100                                $this->x = max(min($this->x, $this->xBound-1),0);
     101                                $this->y += mt_rand(-16, +16);
     102                                $this->y = max(min($this->y, $this->yBound-1),0);
    139103                                break;
     104
    140105                        case 1:
    141                                 {
    142                                         $value4 = $this->rx;
    143                                         if (!true){
    144                                                 throw new HException("FAIL: lower <= upper");
    145                                         }
    146                                         $value5 = $value4+mt_rand(-16, +16);
    147                                         $max2 = $this->xBound-1;
    148                                         if (!(1<=$max2)){
    149                                                 throw new HException("FAIL: min <= max");
    150                                         }
    151                                         $tmp2 = null;
    152                                         if ($value5<1){
    153                                                 $tmp2 = 1;
    154                                         } else {
    155                                                 if ($value5>$max2){
    156                                                         $tmp2 = $max2;
    157                                                 } else {
    158                                                         $tmp2 = $value5;
    159                                                 }
    160                                         }
    161                                         $this->rx = $tmp2;
    162                                 }
     106                                $this->rx += mt_rand(-16, +16);
     107                                $this->rx = max(min($this->rx, $this->xBound-1),1);
    163108                                break;
    164109                        case 2:
    165                                 {
    166                                         $value6 = $this->ry;
    167                                         if (!true){
    168                                                 throw new HException("FAIL: lower <= upper");
    169                                         }
    170                                         $value7 = $value6+mt_rand(-16, +16);
    171                                         $max3 = $this->xBound-1;
    172                                         if (!(1<=$max3)){
    173                                                 throw new HException("FAIL: min <= max");
    174                                         }
    175                                         $tmp3 = null;
    176                                         if ($value7<1){
    177                                                 $tmp3 = 1;
    178                                         } else {
    179                                                 if ($value7>$max3){
    180                                                         $tmp3 = $max3;
    181                                                 } else {
    182                                                         $tmp3 = $value7;
    183                                                 }
    184                                         }
    185                                         $this->ry = $tmp3;
    186                                 }
     110                                $this->ry += mt_rand(-16, +16);
     111                                $this->ry = max(min($this->ry, $this->yBound-1),1);
    187112                                break;
    188113                }
     114
     115                // force to rasterize the new shape
     116                $this->lines = null;
     117
    189118        }
    190119
     120        /**
     121         * @param int $xBound
     122         * @param int $yBound
     123         */
    191124        public function rescale($xBound, $yBound){
    192125                $xScale = ($xBound-1) / ($this->xBound-1);
     
    198131                $this->rx = intval(round($this->rx*$xScale));
    199132                $this->ry = intval(round($this->ry*$yScale));
     133
     134                if ($this->lines) {
     135                        foreach ($this->lines as &$line) {
     136                                $line->rescale($xScale, $yScale);
     137                        }
     138                }
    200139        }
    201140
    202141        public function hclone(){
    203                 $ellipse = new geometrize_shape_Ellipse($this->xBound, $this->yBound);
    204                 $ellipse->x = $this->x;
    205                 $ellipse->y = $this->y;
    206                 $ellipse->rx = $this->rx;
    207                 $ellipse->ry = $this->ry;
    208                 $ellipse->color = $this->color;
     142                return clone $this;
     143        }
    209144
    210                 return $ellipse;
    211         }
     145        public function __clone() {
     146                if ($this->lines) {
     147                        foreach ($this->lines as $k=>&$line) {
     148                                $this->lines[$k] = clone $line;
     149                        }
     150                }
     151  }
    212152
    213153        public function getType(){
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Line.class.php

    r115922 r115933  
    22
    33// Generated by Haxe 3.4.7
    4 class geometrize_shape_Line implements geometrize_shape_Shape {
    5         public $x1;
    6         public $y1;
    7         public $x2;
    8         public $y2;
    9         public $xBound;
    10         public $yBound;
    11         public $color;
    12 
    13         public function __construct($xBound, $yBound){
    14                 $this->x1 = mt_rand(0, $xBound-1);
    15                 $this->y1 = mt_rand(0, $yBound-1);
    16                 $value = $this->x1;
    17                 $value1 = $value+mt_rand(1, 32);
    18                 if (!(0<=$xBound)){
    19                         throw new HException("FAIL: min <= max");
    20                 }
    21                 $tmp = null;
    22                 if ($value1<0){
    23                         $tmp = 0;
    24                 } else {
    25                         if ($value1>$xBound){
    26                                 $tmp = $xBound;
    27                         } else {
    28                                 $tmp = $value1;
    29                         }
    30                 }
    31                 $this->x2 = $tmp;
    32                 $value2 = $this->y1;
    33                 $value3 = $value2+mt_rand(1, 32);
    34                 if (!(0<=$yBound)){
    35                         throw new HException("FAIL: min <= max");
    36                 }
    37                 $tmp1 = null;
    38                 if ($value3<0){
    39                         $tmp1 = 0;
    40                 } else {
    41                         if ($value3>$yBound){
    42                                 $tmp1 = $yBound;
    43                         } else {
    44                                 $tmp1 = $value3;
    45                         }
    46                 }
    47                 $this->y2 = $tmp1;
    48                 $this->xBound = $xBound;
    49                 $this->yBound = $yBound;
    50         }
     4class geometrize_shape_Line extends geometrize_shape_Rectangle {
    515
    526        /**
     
    559         */
    5610        public function rasterize(){
    57                 $points = [
    58                         ['x' => $this->x1, 'y' => $this->y1],
    59                         ['x' => $this->x2, 'y' => $this->y2]
    60                 ];
     11                if (!$this->lines){
     12                        list($xm1, $ym1, $xm2, $ym2) = $this->getRawShapeData();
    6113
    62                 return geometrize_rasterizer_Rasterizer::scanlinesForPath($points, $this->xBound, $this->yBound);
    63         }
     14                        $this->lines = [];
     15                        if ($xm2>$xm1 or $ym2>$ym1){
     16                                $points = [
     17                                        ['x' => $xm1, 'y' => $ym1],
     18                                        ['x' => $xm2, 'y' => $ym2]
     19                                ];
     20                                $this->lines = geometrize_rasterizer_Rasterizer::scanlinesForPath($points, $this->xBound, $this->yBound);
     21                        }
     22                }
    6423
    65         public function mutate(){
    66                 $r = mt_rand(0, 3); // TODO : fixme 0,1
    67                 switch ($r) {
    68                         case 0:
    69                                 {
    70                                         $value = $this->x1;
    71                                         if (!true){
    72                                                 throw new HException("FAIL: lower <= upper");
    73                                         }
    74                                         $value1 = $value+mt_rand(-16, +16);
    75                                         $max = $this->xBound-1;
    76                                         if (!(0<=$max)){
    77                                                 throw new HException("FAIL: min <= max");
    78                                         }
    79                                         $tmp = null;
    80                                         if ($value1<0){
    81                                                 $tmp = 0;
    82                                         } else {
    83                                                 if ($value1>$max){
    84                                                         $tmp = $max;
    85                                                 } else {
    86                                                         $tmp = $value1;
    87                                                 }
    88                                         }
    89                                         $this->x1 = $tmp;
    90                                         $value2 = $this->y1;
    91                                         if (!true){
    92                                                 throw new HException("FAIL: lower <= upper");
    93                                         }
    94                                         $value3 = $value2+mt_rand(-16, +16);
    95                                         $max1 = $this->yBound-1;
    96                                         if (!(0<=$max1)){
    97                                                 throw new HException("FAIL: min <= max");
    98                                         }
    99                                         $tmp1 = null;
    100                                         if ($value3<0){
    101                                                 $tmp1 = 0;
    102                                         } else {
    103                                                 if ($value3>$max1){
    104                                                         $tmp1 = $max1;
    105                                                 } else {
    106                                                         $tmp1 = $value3;
    107                                                 }
    108                                         }
    109                                         $this->y1 = $tmp1;
    110                                 }
    111                                 break;
    112                         case 1:
    113                                 {
    114                                         $value4 = $this->x2;
    115                                         if (!true){
    116                                                 throw new HException("FAIL: lower <= upper");
    117                                         }
    118                                         $value5 = $value4+mt_rand(-16, +16);
    119                                         $max2 = $this->xBound-1;
    120                                         if (!(0<=$max2)){
    121                                                 throw new HException("FAIL: min <= max");
    122                                         }
    123                                         $tmp2 = null;
    124                                         if ($value5<0){
    125                                                 $tmp2 = 0;
    126                                         } else {
    127                                                 if ($value5>$max2){
    128                                                         $tmp2 = $max2;
    129                                                 } else {
    130                                                         $tmp2 = $value5;
    131                                                 }
    132                                         }
    133                                         $this->x2 = $tmp2;
    134                                         $value6 = $this->y2;
    135                                         if (!true){
    136                                                 throw new HException("FAIL: lower <= upper");
    137                                         }
    138                                         $value7 = $value6+mt_rand(-16, +16);
    139                                         $max3 = $this->yBound-1;
    140                                         if (!(0<=$max3)){
    141                                                 throw new HException("FAIL: min <= max");
    142                                         }
    143                                         $tmp3 = null;
    144                                         if ($value7<0){
    145                                                 $tmp3 = 0;
    146                                         } else {
    147                                                 if ($value7>$max3){
    148                                                         $tmp3 = $max3;
    149                                                 } else {
    150                                                         $tmp3 = $value7;
    151                                                 }
    152                                         }
    153                                         $this->y2 = $tmp3;
    154                                 }
    155                                 break;
    156                 }
    157         }
    158 
    159         public function rescale($xBound, $yBound){
    160                 $xScale = ($xBound-1) / ($this->xBound-1);
    161                 $yScale = ($yBound-1) / ($this->yBound-1);
    162                 $this->xBound = $xBound;
    163                 $this->yBound = $yBound;
    164                 $this->x1 = intval(round($this->x1*$xScale));
    165                 $this->y1 = intval(round($this->y1*$yScale));
    166                 $this->x2 = intval(round($this->x2*$xScale));
    167                 $this->y2 = intval(round($this->y2*$yScale));
    168         }
    169 
    170         public function hclone(){
    171                 $line = new geometrize_shape_Line($this->xBound, $this->yBound);
    172                 $line->x1 = $this->x1;
    173                 $line->y1 = $this->y1;
    174                 $line->x2 = $this->x2;
    175                 $line->y2 = $this->y2;
    176                 $line->color = $this->color;
    177 
    178                 return $line;
     24                return $this->lines;
    17925        }
    18026
     
    18430
    18531        /**
    186          * @return array
    187          */
    188         public function getRawShapeData(){
    189                 return [
    190                         $this->x1,
    191                         $this->y1,
    192                         $this->x2,
    193                         $this->y2
    194                 ];
    195         }
    196 
    197         /**
    19832         * @return string
    19933         */
    20034        public function getSvgShapeData(){
    201                 return "<line x1=\"" . $this->x1 . "\" y1=\"" . $this->y1 . "\" x2=\"" . $this->x2 . "\" y2=\"" . $this->y2 . "\" " . geometrize_exporter_SvgExporter::$SVG_STYLE_HOOK . " />";
    202         }
    203 
    204         public function __call($m, $a){
    205                 if (isset($this->$m) && is_callable($this->$m)){
    206                         return call_user_func_array($this->$m, $a);
    207                 } else {
    208                         if (isset($this->__dynamics[$m]) && is_callable($this->__dynamics[$m])){
    209                                 return call_user_func_array($this->__dynamics[$m], $a);
    210                         } else {
    211                                 if ('toString'==$m){
    212                                         return $this->__toString();
    213                                 } else {
    214                                         throw new HException('Unable to call <' . $m . '>');
    215                                 }
    216                         }
    217                 }
     35                list($xm1, $ym1, $xm2, $ym2) = $this->getRawShapeData();
     36                $points = [
     37                        ['x' => $xm1, 'y' => $ym1],
     38                        ['x' => $xm2, 'y' => $ym2]
     39                ];
     40                return geometrize_exporter_SvgExporter::exportLines($points);
    21841        }
    21942
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/QuadraticBezier.class.php

    r115922 r115933  
    33// Generated by Haxe 3.4.7
    44class geometrize_shape_QuadraticBezier implements geometrize_shape_Shape {
    5         public $cx;
    6         public $cy;
    7         public $x1;
    8         public $y1;
    9         public $x2;
    10         public $y2;
    11         public $xBound;
    12         public $yBound;
     5
     6        /**
     7         * @var int
     8         */
     9        protected $cx;
     10
     11        /**
     12         * @var int
     13         */
     14        protected $cy;
     15
     16        /**
     17         * @var int
     18         */
     19        protected $x1;
     20
     21        /**
     22         * @var int
     23         */
     24        protected $y1;
     25
     26        /**
     27         * @var int
     28         */
     29        protected $x2;
     30
     31        /**
     32         * @var int
     33         */
     34        protected $y2;
     35
     36        /**
     37         * @var int
     38         */
     39        protected $xBound;
     40
     41        /**
     42         * @var int
     43         */
     44        protected $yBound;
     45
     46        /**
     47         * @var int
     48         */
    1349        public $color;
    1450
     51        /**
     52         * Rasterized lines
     53         * @var null|array
     54         */
     55        protected $lines = null;
     56
    1557        public function __construct($xBound, $yBound){
    16                 $upper = $xBound-1;
    17                 if (!(0<=$upper)){
    18                         throw new HException("FAIL: lower <= upper");
    19                 }
    20                 $this->x1 = mt_rand(0, $upper);
    21                 $upper1 = $yBound-1;
    22                 if (!(0<=$upper1)){
    23                         throw new HException("FAIL: lower <= upper");
    24                 }
    25                 $this->y1 = mt_rand(0, $upper1);
    26                 $upper2 = $xBound-1;
    27                 if (!(0<=$upper2)){
    28                         throw new HException("FAIL: lower <= upper");
    29                 }
    30                 $this->cx = mt_rand(0, $upper2);
    31                 $upper3 = $yBound-1;
    32                 if (!(0<=$upper3)){
    33                         throw new HException("FAIL: lower <= upper");
    34                 }
    35                 $this->cy = mt_rand(0, $upper3);
    36                 $upper4 = $xBound-1;
    37                 if (!(0<=$upper4)){
    38                         throw new HException("FAIL: lower <= upper");
    39                 }
    40                 $this->x2 = mt_rand(0, $upper4);
    41                 $upper5 = $yBound-1;
    42                 if (!(0<=$upper5)){
    43                         throw new HException("FAIL: lower <= upper");
    44                 }
    45                 $this->y2 = mt_rand(0, $upper5);
     58                $this->x1 = mt_rand(0, $xBound-1);
     59                $this->y1 = mt_rand(0, $yBound-1);
     60
     61                $this->x2 = mt_rand(0, $xBound-1);
     62                $this->y2 = mt_rand(0, $yBound-1);
     63
     64                $this->cx = mt_rand(0, $xBound-1);
     65                $this->cy = mt_rand(0, $yBound-1);
     66
    4667                $this->xBound = $xBound;
    4768                $this->yBound = $yBound;
     
    4970
    5071        public function rasterize(){
    51                 $points = [];
    52                 $pointCount = 20;
    53 
    54                 $_g1 = 0;
    55                 $_g = $pointCount-1;
    56                 while ($_g1<$_g){
    57                         $_g1 = $_g1+1;
    58                         $i = $_g1-1;
    59                         $t = $i/$pointCount;
    60                         $tp = 1-$t;
    61                         $x = intval($tp*($tp*$this->x1+$t*$this->cx)+$t*($tp*$this->cx+$t*$this->x2));
    62                         $y = intval($tp*($tp*$this->y1+$t*$this->cy)+$t*($tp*$this->cy+$t*$this->y2));
    63                         $points[] = ["x" => $x, "y" => $y];
    64                 }
    65 
    66                 return geometrize_rasterizer_Rasterizer::scanlinesForPath($points, $this->xBound, $this->yBound);
    67         }
    68 
     72                if (!$this->lines){
     73                        $points = [];
     74                        $pointCount = 20;
     75
     76                        for ($i=0;$i<=$pointCount;$i++) {
     77                                $t = $i/$pointCount;
     78                                $tp = 1-$t;
     79                                $x = intval(round($tp*($tp*$this->x1+$t*$this->cx)+$t*($tp*$this->cx+$t*$this->x2)));
     80                                $y = intval(round($tp*($tp*$this->y1+$t*$this->cy)+$t*($tp*$this->cy+$t*$this->y2)));
     81                                $points[] = ["x" => $x, "y" => $y];
     82                        }
     83
     84                        $prevPoint = array_shift($points);
     85                        $this->lines = [];
     86                        foreach ($points as $point){
     87                                $this->lines = array_merge($this->lines, geometrize_rasterizer_Rasterizer::scanlinesForPath([$prevPoint, $point], $this->xBound, $this->yBound));
     88                                $prevPoint = $point;
     89                        }
     90                }
     91
     92                return $this->lines;
     93        }
     94
     95        /**
     96         * Mutate the shape
     97         */
    6998        public function mutate(){
    70                 if (!true){
    71                         throw new HException("FAIL: lower <= upper");
    72                 }
    7399                $r = mt_rand(0, 2);
    74100                switch ($r) {
    75101                        case 0:
    76                                 {
    77                                         $value = $this->cx;
    78                                         if (!true){
    79                                                 throw new HException("FAIL: lower <= upper");
    80                                         }
    81                                         $value1 = $value+mt_rand(-8, +8);
    82                                         $max = $this->xBound-1;
    83                                         if (!(0<=$max)){
    84                                                 throw new HException("FAIL: min <= max");
    85                                         }
    86                                         $tmp = null;
    87                                         if ($value1<0){
    88                                                 $tmp = 0;
    89                                         } else {
    90                                                 if ($value1>$max){
    91                                                         $tmp = $max;
    92                                                 } else {
    93                                                         $tmp = $value1;
    94                                                 }
    95                                         }
    96                                         $this->cx = $tmp;
    97                                         $value2 = $this->cy;
    98                                         if (!true){
    99                                                 throw new HException("FAIL: lower <= upper");
    100                                         }
    101                                         $value3 = $value2+mt_rand(-8, +8);
    102                                         $max1 = $this->yBound-1;
    103                                         if (!(0<=$max1)){
    104                                                 throw new HException("FAIL: min <= max");
    105                                         }
    106                                         $tmp1 = null;
    107                                         if ($value3<0){
    108                                                 $tmp1 = 0;
    109                                         } else {
    110                                                 if ($value3>$max1){
    111                                                         $tmp1 = $max1;
    112                                                 } else {
    113                                                         $tmp1 = $value3;
    114                                                 }
    115                                         }
    116                                         $this->cy = $tmp1;
    117                                 }
     102                                $this->cx += mt_rand(-8, +8);
     103                                $this->cx = max(min($this->cx, $this->xBound-1),0);
     104                                $this->cy += mt_rand(-8, +8);
     105                                $this->cy = max(min($this->cy, $this->yBound-1),0);
    118106                                break;
     107
    119108                        case 1:
    120                                 {
    121                                         $value4 = $this->x1;
    122                                         if (!true){
    123                                                 throw new HException("FAIL: lower <= upper");
    124                                         }
    125                                         $value5 = $value4+mt_rand(-8, +8);
    126                                         $max2 = $this->xBound-1;
    127                                         if (!(1<=$max2)){
    128                                                 throw new HException("FAIL: min <= max");
    129                                         }
    130                                         $tmp2 = null;
    131                                         if ($value5<1){
    132                                                 $tmp2 = 1;
    133                                         } else {
    134                                                 if ($value5>$max2){
    135                                                         $tmp2 = $max2;
    136                                                 } else {
    137                                                         $tmp2 = $value5;
    138                                                 }
    139                                         }
    140                                         $this->x1 = $tmp2;
    141                                         $value6 = $this->y1;
    142                                         if (!true){
    143                                                 throw new HException("FAIL: lower <= upper");
    144                                         }
    145                                         $value7 = $value6+mt_rand(-8, +8);
    146                                         $max3 = $this->yBound-1;
    147                                         if (!(1<=$max3)){
    148                                                 throw new HException("FAIL: min <= max");
    149                                         }
    150                                         $tmp3 = null;
    151                                         if ($value7<1){
    152                                                 $tmp3 = 1;
    153                                         } else {
    154                                                 if ($value7>$max3){
    155                                                         $tmp3 = $max3;
    156                                                 } else {
    157                                                         $tmp3 = $value7;
    158                                                 }
    159                                         }
    160                                         $this->y1 = $tmp3;
    161                                 }
     109                                $this->x1 += mt_rand(-8, +8);
     110                                $this->x1 = max(min($this->x1, $this->xBound-1),0);
     111                                $this->y1 += mt_rand(-8, +8);
     112                                $this->y1 = max(min($this->y1, $this->yBound-1),0);
    162113                                break;
     114
    163115                        case 2:
    164                                 {
    165                                         $value8 = $this->x2;
    166                                         if (!true){
    167                                                 throw new HException("FAIL: lower <= upper");
    168                                         }
    169                                         $value9 = $value8+mt_rand(-8, +8);
    170                                         $max4 = $this->xBound-1;
    171                                         if (!(1<=$max4)){
    172                                                 throw new HException("FAIL: min <= max");
    173                                         }
    174                                         $tmp4 = null;
    175                                         if ($value9<1){
    176                                                 $tmp4 = 1;
    177                                         } else {
    178                                                 if ($value9>$max4){
    179                                                         $tmp4 = $max4;
    180                                                 } else {
    181                                                         $tmp4 = $value9;
    182                                                 }
    183                                         }
    184                                         $this->x2 = $tmp4;
    185                                         $value10 = $this->y2;
    186                                         if (!true){
    187                                                 throw new HException("FAIL: lower <= upper");
    188                                         }
    189                                         $value11 = $value10+mt_rand(-8, +8);
    190                                         $max5 = $this->yBound-1;
    191                                         if (!(1<=$max5)){
    192                                                 throw new HException("FAIL: min <= max");
    193                                         }
    194                                         $tmp5 = null;
    195                                         if ($value11<1){
    196                                                 $tmp5 = 1;
    197                                         } else {
    198                                                 if ($value11>$max5){
    199                                                         $tmp5 = $max5;
    200                                                 } else {
    201                                                         $tmp5 = $value11;
    202                                                 }
    203                                         }
    204                                         $this->y2 = $tmp5;
    205                                 }
     116                                $this->x2 += mt_rand(-8, +8);
     117                                $this->x2 = max(min($this->x2, $this->xBound-1),0);
     118                                $this->y2 += mt_rand(-8, +8);
     119                                $this->y2 = max(min($this->y2, $this->yBound-1),0);
    206120                                break;
    207121                }
     122
     123                // force to rasterize the new shape
     124                $this->lines = null;
    208125        }
    209126
     
    219136                $this->x2 = intval(round($this->x2*$xScale));
    220137                $this->y2 = intval(round($this->y2*$yScale));
     138
     139                if ($this->lines) {
     140                        foreach ($this->lines as &$line) {
     141                                $line->rescale($xScale, $yScale);
     142                        }
     143                }
    221144        }
    222145
    223146        public function hclone(){
    224                 $bezier = new geometrize_shape_QuadraticBezier($this->xBound, $this->yBound);
    225                 $bezier->cx = $this->cx;
    226                 $bezier->cy = $this->cy;
    227                 $bezier->x1 = $this->x1;
    228                 $bezier->y1 = $this->y1;
    229                 $bezier->x2 = $this->x2;
    230                 $bezier->y2 = $this->y2;
    231                 $bezier->color = $this->color;
    232 
    233                 return $bezier;
    234         }
     147                return clone $this;
     148        }
     149
     150        public function __clone() {
     151                if ($this->lines) {
     152                        foreach ($this->lines as $k=>&$line) {
     153                                $this->lines[$k] = clone $line;
     154                        }
     155                }
     156  }
     157
    235158
    236159        public function getType(){
     
    256179         */
    257180        public function getSvgShapeData(){
    258                 return "<path d=\"M" . $this->x1 . " " . $this->y1 . " Q " . $this->cx . " " . $this->cy . " " . $this->x2 . " " . $this->y2 . "\" " . geometrize_exporter_SvgExporter::$SVG_STYLE_HOOK . " />";
     181                return "<path d=\"M" . $this->x1 . "," . $this->y1 . "Q" . $this->cx . "," . $this->cy . " " . $this->x2 . "," . $this->y2 . "\" " . geometrize_exporter_SvgExporter::$SVG_STYLE_HOOK . " />";
    259182        }
    260183
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Rectangle.class.php

    r115922 r115933  
    33// Generated by Haxe 3.4.7
    44class geometrize_shape_Rectangle implements geometrize_shape_Shape {
    5         public $x1;
    6         public $y1;
    7         public $x2;
    8         public $y2;
    9         public $xBound;
    10         public $yBound;
     5
     6        /**
     7         * @var int
     8         */
     9        protected $x1;
     10
     11        /**
     12         * @var int
     13         */
     14        protected $y1;
     15
     16        /**
     17         * @var int
     18         */
     19        protected $x2;
     20
     21        /**
     22         * @var int
     23         */
     24        protected $y2;
     25
     26        /**
     27         * @var int
     28         */
     29        protected $xBound;
     30
     31        /**
     32         * @var int
     33         */
     34        protected $yBound;
     35
     36        /**
     37         * @var int
     38         */
    1139        public $color;
     40
     41        /**
     42         * Rasterized lines
     43         * @var null|array
     44         */
     45        protected $lines = null;
    1246
    1347        public function __construct($xBound, $yBound){
    1448                $this->x1 = mt_rand(0, $xBound-1);
    1549                $this->y1 = mt_rand(0, $yBound-1);
    16                 $value = $this->x1;
    17                 $value1 = $value+mt_rand(1, 32);
    18                 $max = $xBound-1;
    19                 if (!(0<=$max)){
    20                         throw new HException("FAIL: min <= max");
    21                 }
    22                 $tmp = null;
    23                 if ($value1<0){
    24                         $tmp = 0;
    25                 } else {
    26                         if ($value1>$max){
    27                                 $tmp = $max;
    28                         } else {
    29                                 $tmp = $value1;
    30                         }
    31                 }
    32                 $this->x2 = $tmp;
    33                 $value2 = $this->y1;
    34                 $value3 = $value2+mt_rand(1, 32);
    35                 $max1 = $yBound-1;
    36                 if (!(0<=$max1)){
    37                         throw new HException("FAIL: min <= max");
    38                 }
    39                 $tmp1 = null;
    40                 if ($value3<0){
    41                         $tmp1 = 0;
    42                 } else {
    43                         if ($value3>$max1){
    44                                 $tmp1 = $max1;
    45                         } else {
    46                                 $tmp1 = $value3;
    47                         }
    48                 }
    49                 $this->y2 = $tmp1;
     50
     51                $this->x2 = $this->x1 + mt_rand(1, 32);
     52                $this->x2 = min($this->x2, $xBound-1);
     53
     54                $this->y2 = $this->y1 + mt_rand(1, 32);
     55                $this->y2 = min($this->y2, $yBound-1);
     56
    5057                $this->xBound = $xBound;
    5158                $this->yBound = $yBound;
    5259        }
    5360
     61        /**
     62         * Rasterize the shape
     63         * @return array
     64         * @throws HException
     65         */
    5466        public function rasterize(){
    55                 list($xm1, $ym1, $xm2, $ym2) = $this->getRawShapeData();
    56 
    57                 $lines = [];
    58                 if ($xm2>$xm1){
    59                         for ($y = $ym1; $y<=$ym2; $y++){
    60                                 $lines[] = new geometrize_rasterizer_Scanline($y, $xm1, $xm2);
    61                         }
    62                 }
    63 
    64                 return $lines;
    65         }
    66 
     67                if (!$this->lines) {
     68                        list($xm1, $ym1, $xm2, $ym2) = $this->getRawShapeData();
     69
     70                        $this->lines = [];
     71                        if ($xm2>$xm1){
     72                                for ($y = $ym1; $y<=$ym2; $y++){
     73                                        $this->lines[] = new geometrize_rasterizer_Scanline($y, $xm1, $xm2);
     74                                }
     75                        }
     76                }
     77
     78                return $this->lines;
     79        }
     80
     81        /**
     82         * Mutate the shape
     83         * @throws HException
     84         */
    6785        public function mutate(){
    6886                $r = mt_rand(0, 1);
    6987                switch ($r) {
    7088                        case 0:
    71                                 {
    72                                         $value = $this->x1;
    73                                         if (!true){
    74                                                 throw new HException("FAIL: lower <= upper");
    75                                         }
    76                                         $value1 = $value+mt_rand(-16, +16);
    77                                         $max = $this->xBound-1;
    78                                         if (!(0<=$max)){
    79                                                 throw new HException("FAIL: min <= max");
    80                                         }
    81                                         $tmp = null;
    82                                         if ($value1<0){
    83                                                 $tmp = 0;
    84                                         } else {
    85                                                 if ($value1>$max){
    86                                                         $tmp = $max;
    87                                                 } else {
    88                                                         $tmp = $value1;
    89                                                 }
    90                                         }
    91                                         $this->x1 = $tmp;
    92                                         $value2 = $this->y1;
    93                                         if (!true){
    94                                                 throw new HException("FAIL: lower <= upper");
    95                                         }
    96                                         $value3 = $value2+mt_rand(-16, +16);
    97                                         $max1 = $this->yBound-1;
    98                                         if (!(0<=$max1)){
    99                                                 throw new HException("FAIL: min <= max");
    100                                         }
    101                                         $tmp1 = null;
    102                                         if ($value3<0){
    103                                                 $tmp1 = 0;
    104                                         } else {
    105                                                 if ($value3>$max1){
    106                                                         $tmp1 = $max1;
    107                                                 } else {
    108                                                         $tmp1 = $value3;
    109                                                 }
    110                                         }
    111                                         $this->y1 = $tmp1;
    112                                 }
     89                                $this->x1 += mt_rand(-16, +16);
     90                                $this->x1 = max(min($this->x1, $this->xBound-1),0);
     91                                $this->y1 += mt_rand(-16, +16);
     92                                $this->y1 = max(min($this->y1, $this->yBound-1),0);
    11393                                break;
    11494                        case 1:
    115                                 {
    116                                         $value4 = $this->x2;
    117                                         if (!true){
    118                                                 throw new HException("FAIL: lower <= upper");
    119                                         }
    120                                         $value5 = $value4+mt_rand(-16, +16);
    121                                         $max2 = $this->xBound-1;
    122                                         if (!(0<=$max2)){
    123                                                 throw new HException("FAIL: min <= max");
    124                                         }
    125                                         $tmp2 = null;
    126                                         if ($value5<0){
    127                                                 $tmp2 = 0;
    128                                         } else {
    129                                                 if ($value5>$max2){
    130                                                         $tmp2 = $max2;
    131                                                 } else {
    132                                                         $tmp2 = $value5;
    133                                                 }
    134                                         }
    135                                         $this->x2 = $tmp2;
    136                                         $value6 = $this->y2;
    137                                         if (!true){
    138                                                 throw new HException("FAIL: lower <= upper");
    139                                         }
    140                                         $value7 = $value6+mt_rand(-16, +16);
    141                                         $max3 = $this->yBound-1;
    142                                         if (!(0<=$max3)){
    143                                                 throw new HException("FAIL: min <= max");
    144                                         }
    145                                         $tmp3 = null;
    146                                         if ($value7<0){
    147                                                 $tmp3 = 0;
    148                                         } else {
    149                                                 if ($value7>$max3){
    150                                                         $tmp3 = $max3;
    151                                                 } else {
    152                                                         $tmp3 = $value7;
    153                                                 }
    154                                         }
    155                                         $this->y2 = $tmp3;
    156                                 }
     95                                $this->x2 += mt_rand(-16, +16);
     96                                $this->x2 = max(min($this->x2, $this->xBound-1),0);
     97                                $this->y2 += mt_rand(-16, +16);
     98                                $this->y2 = max(min($this->y2, $this->yBound-1),0);
    15799                                break;
    158100                }
     101
     102                // force to rasterize the new shape
     103                $this->lines = null;
    159104        }
    160105
     
    168113                $this->x2 = intval(round($this->x2*$xScale));
    169114                $this->y2 = intval(round($this->y2*$yScale));
     115
     116                if ($this->lines) {
     117                        foreach ($this->lines as &$line) {
     118                                $line->rescale($xScale, $yScale);
     119                        }
     120                }
    170121        }
    171122
    172123        public function hclone(){
    173                 $rectangle = new geometrize_shape_Rectangle($this->xBound, $this->yBound);
    174                 $rectangle->x1 = $this->x1;
    175                 $rectangle->y1 = $this->y1;
    176                 $rectangle->x2 = $this->x2;
    177                 $rectangle->y2 = $this->y2;
    178                 $rectangle->color = $this->color;
    179 
    180                 return $rectangle;
    181         }
     124                return clone $this;
     125        }
     126
     127        public function __clone() {
     128                if ($this->lines) {
     129                        foreach ($this->lines as $k=>&$line) {
     130                                $this->lines[$k] = clone $line;
     131                        }
     132                }
     133  }
    182134
    183135        public function getType(){
     
    216168         */
    217169        public function getSvgShapeData(){
     170                // exportPolygon is able to generape a <path...> more compact than the basic <rect>
    218171                list($xm1, $ym1, $xm2, $ym2) = $this->getRawShapeData();
    219                 $width = $xm2 - $xm1;
    220                 $height = $ym2 - $ym1;
    221                 return "<rect x=\"$xm1\" y=\"$ym1\" width=\"$width\" height=\"$height\" " . geometrize_exporter_SvgExporter::$SVG_STYLE_HOOK . " />";
     172                $points = [
     173                        ["x" => $xm1, "y" => $ym1],
     174                        ["x" => $xm1, "y" => $ym2],
     175                        ["x" => $xm2, "y" => $ym2],
     176                        ["x" => $xm2, "y" => $ym1]
     177                ];
     178                return geometrize_exporter_SvgExporter::exportPolygon($points);
    222179        }
    223180
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/RotatedEllipse.class.php

    r115922 r115933  
    33// Generated by Haxe 3.4.7
    44class geometrize_shape_RotatedEllipse implements geometrize_shape_Shape {
    5         public $x;
    6         public $y;
    7         public $rx;
    8         public $ry;
    9         public $angle;
    10         public $xBound;
    11         public $yBound;
     5
     6        /**
     7         * @var int
     8         */
     9        protected $x;
     10
     11        /**
     12         * @var int
     13         */
     14        protected $y;
     15
     16        /**
     17         * @var int
     18         */
     19        protected $rx;
     20
     21        /**
     22         * @var int
     23         */
     24        protected $ry;
     25
     26        /**
     27         * @var int
     28         */
     29        protected $angle;
     30
     31        /**
     32         * @var int
     33         */
     34        protected $xBound;
     35
     36        /**
     37         * @var int
     38         */
     39        protected $yBound;
     40
     41        /**
     42         * @var int
     43         */
    1244        public $color;
     45
     46        /**
     47         * Rasterized lines
     48         * @var null|array
     49         */
     50        protected $lines = null;
     51
    1352
    1453        public function __construct($xBound, $yBound){
     
    2362
    2463        public function rasterize(){
    25                 $pointCount = 20;
    26                 $points = [];
    27                 $rads = $this->angle*(M_PI/180.0);
    28                 $c = cos($rads);
    29                 $s = sin($rads);
     64                if (!$this->lines){
     65                        $pointCount = 20;
     66                        $points = [];
     67                        $rads = $this->angle*(M_PI/180.0);
     68                        $c = cos($rads);
     69                        $s = sin($rads);
    3070
    31                 $_g1 = 0;
    32                 $_g = $pointCount;
    33                 while ($_g1<$_g){
    34                         $_g1 = $_g1+1;
    35                         $i = $_g1-1;
    36                         $rot = 360.0/$pointCount*$i*(M_PI/180.0);
    37                         $crx = $this->rx;
    38                         $crx1 = $crx*cos($rot);
    39                         $cry = $this->ry;
    40                         $cry1 = $cry*sin($rot);
    41                         $tx = intval($crx1*$c-$cry1*$s+$this->x);
    42                         $ty = intval($crx1*$s+$cry1*$c+$this->y);
    43                         $points[] = ["x" => $tx, "y" => $ty];
     71                        for ($i = 0; $i<$pointCount; $i++) {
     72                                $rot = 360.0/$pointCount*$i*(M_PI/180.0);
     73                                $crx = $this->rx;
     74                                $crx1 = $crx*cos($rot);
     75                                $cry = $this->ry;
     76                                $cry1 = $cry*sin($rot);
     77                                $tx = intval(round($crx1*$c-$cry1*$s+$this->x));
     78                                $ty = intval(round($crx1*$s+$cry1*$c+$this->y));
     79                                $points[] = ["x" => $tx, "y" => $ty];
     80                        }
     81
     82                        $this->lines = geometrize_rasterizer_Rasterizer::scanlinesForPolygon($points, $this->xBound, $this->yBound);
    4483                }
    45 
    46                 return geometrize_rasterizer_Rasterizer::scanlinesForPolygon($points, $this->xBound, $this->yBound);
     84                return $this->lines;
    4785        }
    4886
     
    5189                switch ($r) {
    5290                        case 0:
    53                                 {
    54                                         $value = $this->x;
    55                                         if (!true){
    56                                                 throw new HException("FAIL: lower <= upper");
    57                                         }
    58                                         $value1 = $value+mt_rand(-16, +16);
    59                                         $max = $this->xBound-1;
    60                                         if (!(0<=$max)){
    61                                                 throw new HException("FAIL: min <= max");
    62                                         }
    63                                         $tmp = null;
    64                                         if ($value1<0){
    65                                                 $tmp = 0;
    66                                         } else {
    67                                                 if ($value1>$max){
    68                                                         $tmp = $max;
    69                                                 } else {
    70                                                         $tmp = $value1;
    71                                                 }
    72                                         }
    73                                         $this->x = $tmp;
    74                                         $value2 = $this->y;
    75                                         if (!true){
    76                                                 throw new HException("FAIL: lower <= upper");
    77                                         }
    78                                         $value3 = $value2+mt_rand(-16, +16);
    79                                         $max1 = $this->yBound-1;
    80                                         if (!(0<=$max1)){
    81                                                 throw new HException("FAIL: min <= max");
    82                                         }
    83                                         $tmp1 = null;
    84                                         if ($value3<0){
    85                                                 $tmp1 = 0;
    86                                         } else {
    87                                                 if ($value3>$max1){
    88                                                         $tmp1 = $max1;
    89                                                 } else {
    90                                                         $tmp1 = $value3;
    91                                                 }
    92                                         }
    93                                         $this->y = $tmp1;
    94                                 }
     91                                $this->x += mt_rand(-16, +16);
     92                                $this->x = max(min($this->x, $this->xBound-1),0);
     93                                $this->y += mt_rand(-16, +16);
     94                                $this->y = max(min($this->y, $this->yBound-1),0);
    9595                                break;
     96
    9697                        case 1:
    97                                 {
    98                                         $value4 = $this->rx;
    99                                         if (!true){
    100                                                 throw new HException("FAIL: lower <= upper");
    101                                         }
    102                                         $value5 = $value4+mt_rand(-16, +16);
    103                                         $max2 = $this->xBound-1;
    104                                         if (!(1<=$max2)){
    105                                                 throw new HException("FAIL: min <= max");
    106                                         }
    107                                         $tmp2 = null;
    108                                         if ($value5<1){
    109                                                 $tmp2 = 1;
    110                                         } else {
    111                                                 if ($value5>$max2){
    112                                                         $tmp2 = $max2;
    113                                                 } else {
    114                                                         $tmp2 = $value5;
    115                                                 }
    116                                         }
    117                                         $this->rx = $tmp2;
    118                                 }
     98                                $this->rx += mt_rand(-16, +16);
     99                                $this->rx = max(min($this->rx, $this->xBound-1),1);
    119100                                break;
     101
    120102                        case 2:
    121                                 {
    122                                         $value6 = $this->ry;
    123                                         if (!true){
    124                                                 throw new HException("FAIL: lower <= upper");
    125                                         }
    126                                         $value7 = $value6+mt_rand(-16, +16);
    127                                         $max3 = $this->yBound-1;
    128                                         if (!(1<=$max3)){
    129                                                 throw new HException("FAIL: min <= max");
    130                                         }
    131                                         $tmp3 = null;
    132                                         if ($value7<1){
    133                                                 $tmp3 = 1;
    134                                         } else {
    135                                                 if ($value7>$max3){
    136                                                         $tmp3 = $max3;
    137                                                 } else {
    138                                                         $tmp3 = $value7;
    139                                                 }
    140                                         }
    141                                         $this->ry = $tmp3;
    142                                 }
     103                                $this->ry += mt_rand(-16, +16);
     104                                $this->ry = max(min($this->ry, $this->yBound-1),1);
    143105                                break;
     106
    144107                        case 3:
    145                                 {
    146                                         $value8 = $this->angle;
    147                                         if (!true){
    148                                                 throw new HException("FAIL: lower <= upper");
    149                                         }
    150                                         $value9 = $value8+mt_rand(-4, +4);
    151                                         if (!true){
    152                                                 throw new HException("FAIL: min <= max");
    153                                         }
    154                                         $tmp4 = null;
    155                                         if ($value9<0){
    156                                                 $tmp4 = 0;
    157                                         } else {
    158                                                 if ($value9>360){
    159                                                         $tmp4 = 360;
    160                                                 } else {
    161                                                         $tmp4 = $value9;
    162                                                 }
    163                                         }
    164                                         $this->angle = $tmp4;
    165                                 }
     108                                $this->angle += mt_rand(-4, +4);
     109                                $this->angle = (360 + $this->angle) % 360;
    166110                                break;
    167111                }
     112
     113                // force to rasterize the new shape
     114                $this->lines = null;
     115
    168116        }
    169117
     
    177125                $this->rx = intval(round($this->rx*$xScale));
    178126                $this->ry = intval(round($this->ry*$yScale));
     127
     128                if ($this->lines) {
     129                        foreach ($this->lines as &$line) {
     130                                $line->rescale($xScale, $yScale);
     131                        }
     132                }
    179133        }
    180134
    181135        public function hclone(){
    182                 $ellipse = new geometrize_shape_RotatedEllipse($this->xBound, $this->yBound);
    183                 $ellipse->x = $this->x;
    184                 $ellipse->y = $this->y;
    185                 $ellipse->rx = $this->rx;
    186                 $ellipse->ry = $this->ry;
    187                 $ellipse->angle = $this->angle;
    188                 $ellipse->color = $this->color;
     136                return clone $this;
     137        }
    189138
    190                 return $ellipse;
    191         }
     139        public function __clone() {
     140                if ($this->lines) {
     141                        foreach ($this->lines as $k=>&$line) {
     142                                $this->lines[$k] = clone $line;
     143                        }
     144                }
     145  }
    192146
    193147        public function getType(){
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/RotatedRectangle.class.php

    r115922 r115933  
    33// Generated by Haxe 3.4.7
    44class geometrize_shape_RotatedRectangle implements geometrize_shape_Shape {
    5         public $x1;
    6         public $y1;
    7         public $x2;
    8         public $y2;
    9         public $angle;
    10         public $xBound;
    11         public $yBound;
     5
     6        /**
     7         * @var int
     8         */
     9        protected $x1;
     10
     11        /**
     12         * @var int
     13         */
     14        protected $y1;
     15
     16        /**
     17         * @var int
     18         */
     19        protected $x2;
     20
     21        /**
     22         * @var int
     23         */
     24        protected $y2;
     25
     26        /**
     27         * @var int
     28         */
     29        protected $angle;
     30
     31        /**
     32         * @var int
     33         */
     34        protected $xBound;
     35
     36        /**
     37         * @var int
     38         */
     39        protected $yBound;
     40
     41        /**
     42         * @var int
     43         */
    1244        public $color;
     45
     46        /**
     47         * Rasterized lines
     48         * @var null|array
     49         */
     50        protected $lines = null;
    1351
    1452        public function __construct($xBound, $yBound){
    1553                $this->x1 = mt_rand(0, $xBound-1);
    1654                $this->y1 = mt_rand(0, $yBound-1);
    17                 $value = $this->x1;
    18                 $value1 = $value+mt_rand(1, 32);
    19                 if (!(0<=$xBound)){
    20                         throw new HException("FAIL: min <= max");
    21                 }
    22                 $tmp = null;
    23                 if ($value1<0){
    24                         $tmp = 0;
    25                 } else {
    26                         if ($value1>$xBound){
    27                                 $tmp = $xBound;
    28                         } else {
    29                                 $tmp = $value1;
    30                         }
    31                 }
    32                 $this->x2 = $tmp;
    33                 $value2 = $this->y1;
    34                 $value3 = $value2+mt_rand(1, 32);
    35                 if (!(0<=$yBound)){
    36                         throw new HException("FAIL: min <= max");
    37                 }
    38                 $tmp1 = null;
    39                 if ($value3<0){
    40                         $tmp1 = 0;
    41                 } else {
    42                         if ($value3>$yBound){
    43                                 $tmp1 = $yBound;
    44                         } else {
    45                                 $tmp1 = $value3;
    46                         }
    47                 }
    48                 $this->y2 = $tmp1;
    49                 if (!true){
    50                         throw new HException("FAIL: lower <= upper");
    51                 }
    52                 $this->angle = mt_rand(0, 360);
     55
     56                $this->x2 = $this->x1 + mt_rand(1, 32);
     57                $this->x2 = min($this->x2, $xBound-1);
     58
     59                $this->y2 = $this->y1 + mt_rand(1, 32);
     60                $this->y2 = min($this->y2, $yBound-1);
     61
     62                $this->angle = mt_rand(0, 359);
     63
    5364                $this->xBound = $xBound;
    5465                $this->yBound = $yBound;
    5566        }
    5667
     68        /**
     69         * Rasterize the shape
     70         * @return array
     71         * @throws HException
     72         */
    5773        public function rasterize(){
    58                 $points = $this->getCornerPoints();
    59                 return geometrize_rasterizer_Rasterizer::scanlinesForPolygon($points, $this->xBound, $this->yBound);
    60         }
    61 
     74                if (!$this->lines){
     75                        $points = $this->getCornerPoints();
     76                        $this->lines = geometrize_rasterizer_Rasterizer::scanlinesForPolygon($points, $this->xBound, $this->yBound);
     77                }
     78                return $this->lines;
     79        }
     80
     81        /**
     82         * Mutate the shape
     83         * @throws HException
     84         */
    6285        public function mutate(){
    6386                $r = mt_rand(0, 2);
    6487                switch ($r) {
    6588                        case 0:
    66                                 {
    67                                         $value = $this->x1;
    68                                         if (!true){
    69                                                 throw new HException("FAIL: lower <= upper");
    70                                         }
    71                                         $value1 = $value+mt_rand(-16, +16);
    72                                         $max = $this->xBound-1;
    73                                         if (!(0<=$max)){
    74                                                 throw new HException("FAIL: min <= max");
    75                                         }
    76                                         $tmp = null;
    77                                         if ($value1<0){
    78                                                 $tmp = 0;
    79                                         } else {
    80                                                 if ($value1>$max){
    81                                                         $tmp = $max;
    82                                                 } else {
    83                                                         $tmp = $value1;
    84                                                 }
    85                                         }
    86                                         $this->x1 = $tmp;
    87                                         $value2 = $this->y1;
    88                                         if (!true){
    89                                                 throw new HException("FAIL: lower <= upper");
    90                                         }
    91                                         $value3 = $value2+mt_rand(-16, +16);
    92                                         $max1 = $this->yBound-1;
    93                                         if (!(0<=$max1)){
    94                                                 throw new HException("FAIL: min <= max");
    95                                         }
    96                                         $tmp1 = null;
    97                                         if ($value3<0){
    98                                                 $tmp1 = 0;
    99                                         } else {
    100                                                 if ($value3>$max1){
    101                                                         $tmp1 = $max1;
    102                                                 } else {
    103                                                         $tmp1 = $value3;
    104                                                 }
    105                                         }
    106                                         $this->y1 = $tmp1;
    107                                 }
     89                                $this->x1 += mt_rand(-16, +16);
     90                                $this->x1 = max(min($this->x1, $this->xBound-1),0);
     91                                $this->y1 += mt_rand(-16, +16);
     92                                $this->y1 = max(min($this->y1, $this->yBound-1),0);
    10893                                break;
    10994                        case 1:
    110                                 {
    111                                         $value4 = $this->x2;
    112                                         if (!true){
    113                                                 throw new HException("FAIL: lower <= upper");
    114                                         }
    115                                         $value5 = $value4+mt_rand(-16, +16);
    116                                         $max2 = $this->xBound-1;
    117                                         if (!(0<=$max2)){
    118                                                 throw new HException("FAIL: min <= max");
    119                                         }
    120                                         $tmp2 = null;
    121                                         if ($value5<0){
    122                                                 $tmp2 = 0;
    123                                         } else {
    124                                                 if ($value5>$max2){
    125                                                         $tmp2 = $max2;
    126                                                 } else {
    127                                                         $tmp2 = $value5;
    128                                                 }
    129                                         }
    130                                         $this->x2 = $tmp2;
    131                                         $value6 = $this->y2;
    132                                         if (!true){
    133                                                 throw new HException("FAIL: lower <= upper");
    134                                         }
    135                                         $value7 = $value6+mt_rand(-16, +16);
    136                                         $max3 = $this->yBound-1;
    137                                         if (!(0<=$max3)){
    138                                                 throw new HException("FAIL: min <= max");
    139                                         }
    140                                         $tmp3 = null;
    141                                         if ($value7<0){
    142                                                 $tmp3 = 0;
    143                                         } else {
    144                                                 if ($value7>$max3){
    145                                                         $tmp3 = $max3;
    146                                                 } else {
    147                                                         $tmp3 = $value7;
    148                                                 }
    149                                         }
    150                                         $this->y2 = $tmp3;
    151                                 }
     95                                $this->x2 += mt_rand(-16, +16);
     96                                $this->x2 = max(min($this->x2, $this->xBound-1),0);
     97                                $this->y2 += mt_rand(-16, +16);
     98                                $this->y2 = max(min($this->y2, $this->yBound-1),0);
    15299                                break;
    153100                        case 2:
    154                                 {
    155                                         $value8 = $this->angle;
    156                                         if (!true){
    157                                                 throw new HException("FAIL: lower <= upper");
    158                                         }
    159                                         $value9 = $value8+mt_rand(-4, +4);
    160                                         if (!true){
    161                                                 throw new HException("FAIL: min <= max");
    162                                         }
    163                                         $tmp4 = null;
    164                                         if ($value9<0){
    165                                                 $tmp4 = 0;
    166                                         } else {
    167                                                 if ($value9>360){
    168                                                         $tmp4 = 360;
    169                                                 } else {
    170                                                         $tmp4 = $value9;
    171                                                 }
    172                                         }
    173                                         $this->angle = $tmp4;
    174                                 }
     101                                $this->angle += mt_rand(-4, +4);
     102                                $this->angle = (360 + $this->angle) % 360;
    175103                                break;
    176104                }
     105
     106                // force to rasterize the new shape
     107                $this->lines = null;
    177108        }
    178109
     
    186117                $this->x2 = intval(round($this->x2*$xScale));
    187118                $this->y2 = intval(round($this->y2*$yScale));
     119
     120                if ($this->lines) {
     121                        foreach ($this->lines as &$line) {
     122                                $line->rescale($xScale, $yScale);
     123                        }
     124                }
    188125        }
    189126
    190127        public function hclone(){
    191                 $rectangle = new geometrize_shape_RotatedRectangle($this->xBound, $this->yBound);
    192                 $rectangle->x1 = $this->x1;
    193                 $rectangle->y1 = $this->y1;
    194                 $rectangle->x2 = $this->x2;
    195                 $rectangle->y2 = $this->y2;
    196                 $rectangle->angle = $this->angle;
    197                 $rectangle->color = $this->color;
    198 
    199                 return $rectangle;
    200         }
     128                return clone $this;
     129        }
     130
     131        public function __clone() {
     132                if ($this->lines) {
     133                        foreach ($this->lines as $k=>&$line) {
     134                                $this->lines[$k] = clone $line;
     135                        }
     136                }
     137  }
    201138
    202139        public function getType(){
     
    252189                $oy1 = $ym1-$cy;
    253190                $oy2 = $ym2-$cy;
    254                 $rads = $this->angle*M_PI/180.0;
     191                $rads = $this->angle * M_PI/180.0;
    255192                $c = cos($rads);
    256193                $s = sin($rads);
    257                 $ulx = intval($ox1*$c-$oy1*$s+$cx);
    258                 $uly = intval($ox1*$s+$oy1*$c+$cy);
    259                 $blx = intval($ox1*$c-$oy2*$s+$cx);
    260                 $bly = intval($ox1*$s+$oy2*$c+$cy);
    261                 $urx = intval($ox2*$c-$oy1*$s+$cx);
    262                 $ury = intval($ox2*$s+$oy1*$c+$cy);
    263                 $brx = intval($ox2*$c-$oy2*$s+$cx);
    264                 $bry = intval($ox2*$s+$oy2*$c+$cy);
     194
     195                $ulx = intval(round($ox1*$c-$oy1*$s+$cx));
     196                $uly = intval(round($ox1*$s+$oy1*$c+$cy));
     197                $blx = intval(round($ox1*$c-$oy2*$s+$cx));
     198                $bly = intval(round($ox1*$s+$oy2*$c+$cy));
     199                $urx = intval(round($ox2*$c-$oy1*$s+$cx));
     200                $ury = intval(round($ox2*$s+$oy1*$c+$cy));
     201                $brx = intval(round($ox2*$c-$oy2*$s+$cx));
     202                $bry = intval(round($ox2*$s+$oy2*$c+$cy));
    265203
    266204                $corners = [
  • _plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Triangle.class.php

    r115922 r115933  
    159159        }
    160160
     161        /**
     162         * @return array
     163         */
    161164        public function getRawShapeData(){
    162165                return [
  • _plugins_/adaptive_images/trunk/paquet.xml

    r115806 r115933  
    22        prefix="adaptive_images"
    33        categorie="multimedia"
    4         version="1.11.2"
     4        version="1.12.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.2.*]"
  • _plugins_/adaptive_images/trunk/preview/image_geometrize.php

    r115923 r115933  
    3232        // dimension de la miniature a vectoriser
    3333        $geometrize_options = [
     34                // toutes ces shapes sont viables : rapides a calculer et compact a l'export SVG
     35                // "shapeTypes" => [geometrize_shape_ShapeTypes::T_TRIANGLE,geometrize_shape_ShapeTypes::T_RECTANGLE,geometrize_shape_ShapeTypes::T_LINE],
     36                // mais c'est plus joli avec juste des triangles :)
    3437                "shapeTypes" => [geometrize_shape_ShapeTypes::T_TRIANGLE],
    3538                "alpha" => 255, // beaucoup plus rapide qu'avec une transparence
    36                 "candidateShapesPerStep" => 150,
    37                 "shapeMutationsPerStep" => 100,
    38                 "steps" => 75, // budget pour une taille acceptable de miniature (~4ko en texte, 2ko en Base 64+Gzip)
     39                "candidateShapesPerStep" => 100,
     40                "shapeMutationsPerStep" => 75,
     41                "steps" => 85, // budget pour une taille acceptable de miniature (~4ko en texte, 2ko en Base 64+Gzip)
    3942        ];
    40         $time_budget = 5; // secondes par iteration
     43        if (defined('_ADAPTIVE_IMAGES_GEOMETRIZE_SHAPES')) {
     44                $geometrize_options['shapeTypes'] = explode(',', _ADAPTIVE_IMAGES_GEOMETRIZE_SHAPES);
     45        }
     46
     47        $time_budget = 5; // temps maxi en secondes par iteration
    4148
    4249        // le premieres iterations sont sur une petite miniature
     
    145152                // optimize the size :
    146153                $svg_image[1] = str_replace(' fill-opacity="1"/>', '/>', $svg_image[1]);
     154                $svg_image[1] = str_replace(' />', '/>', $svg_image[1]);
    147155                $svg_image[1] = preg_replace_callback("/rgb\((\d+),(\d+),(\d+)\)/ims", "svg_color_hexa", $svg_image[1]);
     156
     157                #$svg_image[1] = preg_replace(',fill="(#[0-9a-f]+)",Uims', 'fill=\\1', $svg_image[1]);
     158
    148159                $svg_image[1] = str_replace(">\n", ">", $svg_image[1]);
     160                $svg_image[1] = trim($svg_image[1]);
    149161
    150162
Note: See TracChangeset for help on using the changeset viewer.