Changeset 6176


Ignore:
Timestamp:
May 13, 2010, 10:21:05 PM (10 years ago)
Author:
grum
Message:

Improve algorythm for colors analysis + use GPCRequestBuilder interface instead of a local interface

Location:
extensions/ColorStat
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • extensions/ColorStat/admin/cstat_config.tpl

    r6107 r6176  
    2525<script type="text/javascript">
    2626
     27  function displayConfig(tabsheet)
     28  {
     29    switch(tabsheet)
     30    {
     31      case 'database':
     32        $('#iDisplayConfigDatabase').css('display', 'block');
     33        $('#iDisplayConfigStatSearch').css('display', 'none');
     34        $('#iDisplayConfigDisplay').css('display', 'none');
     35        break;
     36      case 'statsearch':
     37        $('#iDisplayConfigDatabase').css('display', 'none');
     38        $('#iDisplayConfigStatSearch').css('display', 'block');
     39        $('#iDisplayConfigDisplay').css('display', 'none');
     40        break;
     41      case 'display':
     42        $('#iDisplayConfigDatabase').css('display', 'none');
     43        $('#iDisplayConfigStatSearch').css('display', 'none');
     44        $('#iDisplayConfigDisplay').css('display', 'block');
     45        break;
     46    }
     47
     48  }
    2749
    2850  function init()
     
    3860      });
    3961    $("#icstat_stat_minPct_slider a").addClass('gcBgInput');
     62    displayConfig('database');
    4063  }
    4164
     
    4871{/literal}
    4972
    50 
     73{$configTabsheet}
    5174
    5275<h2>{'cstat_config_plugin'|@translate}</h2>
     
    5477<form id="iConfig" method="post" action="" class="general">
    5578
    56   <fieldset>
    57     <legend>{'cstat_stat_and_search'|@translate}</legend>
     79  <div id='iDisplayConfigDatabase' style='display:none;'>
    5880
    59     <table class="formtable">
    60       <tr>
    61         <td colspan="2">{'cstat_percent_min_significant'|@translate}</td>
    62       </tr>
    63       <tr>
    64         <td>
    65           <input type="hidden" name="f_stat_minPct" id="icstat_stat_minPct" value="{$datas.minPct}">
    66           <div id="icstat_stat_minPct_slider" class="gcBgInput gcBorderInput"></div>
    67         </td>
    68         <td width="90px">
    69           <div id="icstat_stat_minPct_display"></div>
    70         </td>
    71       </tr>
    72     </table>
     81  </div>
    7382
    74   </fieldset>
     83  <div id='iDisplayConfigStatSearch'  style='display:none;'>
     84    <fieldset>
     85      <legend>{'cstat_stat_and_search'|@translate}</legend>
    7586
     87      <table class="formtable">
     88        <tr>
     89          <td colspan="2">{'cstat_percent_min_significant'|@translate}</td>
     90        </tr>
     91        <tr>
     92          <td>
     93            <input type="hidden" name="f_stat_minPct" id="icstat_stat_minPct" value="{$datas.minPct}">
     94            <div id="icstat_stat_minPct_slider" class="gcBgInput gcBorderInput"></div>
     95          </td>
     96          <td width="90px">
     97            <div id="icstat_stat_minPct_display"></div>
     98          </td>
     99        </tr>
     100      </table>
     101    </fieldset>
     102  </div>
    76103
    77   <fieldset>
    78     <legend>{'cstat_gallery_integration'|@translate}</legend>
     104  <div id='iDisplayConfigDisplay'  style='display:none;'>
     105    <fieldset>
     106      <legend>{'cstat_gallery_integration'|@translate}</legend>
    79107
    80     <label>
    81       <input type="checkbox" id='idisplay_gallery_showColorsCBox' onclick="$('#idisplay_gallery_showColors').val(($('#idisplay_gallery_showColorsCBox').get(0).checked=='on')?'y':'n');"  {if $datas.showColors=='y'}checked{/if} >
    82       {'cstat_display_colors_on_image'|@translate}
    83       <input type="hidden" id='idisplay_gallery_showColors' name='f_display_gallery_showColors' value='{$datas.showColors}'>
    84     </label>
     108      <label>
     109        <input type="checkbox" id='idisplay_gallery_showColorsCBox' onclick="$('#idisplay_gallery_showColors').val(($('#idisplay_gallery_showColorsCBox').get(0).checked=='on')?'y':'n');"  {if $datas.showColors=='y'}checked{/if} >
     110        {'cstat_display_colors_on_image'|@translate}
     111        <input type="hidden" id='idisplay_gallery_showColors' name='f_display_gallery_showColors' value='{$datas.showColors}'>
     112      </label>
    85113
    86   </fieldset>
    87 
    88 
     114    </fieldset>
     115  </div>
    89116
    90117  <input type="submit" value="{'cstat_apply'|@translate}" name="submit_save_config" style="margin-left:1em;" >
  • extensions/ColorStat/admin/cstat_search.tpl

    r6107 r6176  
    1 {known_script id="jquery.ui" src=$ROOT_URL|@cat:"themes/default/js/ui/packed/ui.core.packed.js"}
    2 {known_script id="jquery.ui.dialog" src=$ROOT_URL|@cat:"themes/default/js/ui/packed/ui.dialog.packed.js"}
    3 {known_script id="jquery.tipTip" src=$ROOT_URL|@cat:"themes/default/js/plugins/jquery.tipTip.minified.js"}
    4 
    5 {known_script id="gpc.pagesNavigator" src=$ROOT_URL|@cat:"plugins/GrumPluginClasses/js/pagesNavigator.js"}
    6 
    7 
    8 {literal}
    9 <script type="text/javascript">
    10 var cb=null;
    11 
    12   interfaceManager = function(optionsToSet)
    13   {
    14     var pn=null;
    15     var requestNumber=0;
    16 
    17     options =
    18       {
    19         requestCriterionsVisible:'',
    20         requestCriterionsHidden:'',
    21         requestResult:'',
    22         requestResultContent:'',
    23         requestResultNfo:'',
    24         requestResultPagesNavigator:'',
    25         requestResultRequestNumber:0,
    26         onPageChange:null,
    27         numberPerPage:30,
    28       };
    29 
    30     /**
    31      *
    32      */
    33     this.doAction = function(fct)
    34     {
    35       switch(fct)
    36       {
    37         case 'queryResult':
    38           /* function 'queryResult' : when query is executed, prepare the interface
    39            */
    40           if(arguments.length==3)
    41           {
    42             displayQueryResult(arguments[1], arguments[2]);
    43           }
    44           break;
    45         case 'queryPage':
    46           /* function 'queryPage' : display returned page
    47            */
    48           if(arguments.length==3)
    49           {
    50             displayQueryPage(arguments[1], arguments[2]);
    51           }
    52           break;
    53         case 'show':
    54           /* function 'show' : show/hide the query/result
    55            */
    56           if(arguments.length==2)
    57           {
    58             show(arguments[1]);
    59           }
    60           break;
    61         case 'setOptions':
    62           /* function 'setOptions' : allows to set options after the object was
    63            *                         created
    64            */
    65           if(arguments.length==2)
    66           {
    67             setOptions(arguments[1]);
    68           }
    69           break;
    70       }
    71     }
    72 
    73     /**
    74      * returns the current request number
    75      */
    76     this.getRequestNumber = function ()
    77     {
    78       return(requestNumber);
    79     }
    80 
    81     /**
    82      * returns the number of items per page
    83      */
    84     this.getNumberPerPage = function ()
    85     {
    86       return(options.numberPerPage);
    87     }
    88 
    89     /**
    90      * this function show/hide the different panels
    91      *  'buildQuery'  : hide the result panel and display the panel to build query
    92      *  'resultQuery' : hide the panel to build query and display the result panel
    93      */
    94     var show = function(mode)
    95     {
    96       switch(mode)
    97       {
    98         case 'buildQuery':
    99           $('.'+options.requestCriterionsVisible).css('display', 'block');
    100           $('.'+options.requestCriterionsHidden).css('display', 'none');
    101           $('.'+options.requestResult).css('display', 'none');
    102           break;
    103         case 'resultQuery':
    104           $('#iResultQueryContent').html("<br><img src='./plugins/GrumPluginClasses/icons/processing.gif'>");
    105           $('.'+options.requestCriterionsVisible).css('display', 'none');
    106           $('.'+options.requestCriterionsHidden).css('display', 'block');
    107           $('.'+options.requestResult).css('display', 'block');
    108           break;
    109       }
    110     }
    111 
    112     /**
    113      * this function display the number of items found and prepare the page
    114      * navigator
    115      *
    116      * @param String nfo : 2 information separated with a semi-colon ';'
    117      *                      requestNumber;numberOfItems
    118      */
    119     var displayQueryResult = function (isSuccess, nfo)
    120     {
    121       if(isSuccess)
    122       {
    123         nfo=nfo.split(';');
    124 
    125         requestNumber=nfo[0];
    126         $('#iResultQueryNfo').html(nfo[1]);
    127         pn.doAction('setOptions', { numberItem:nfo[1], defaultPage:1 } );
    128         show('resultQuery');
    129       }
    130       else
    131       {
    132         //$('#'+options.requestResultContent).html("");
    133         show('buildQuery');
    134         alert('Something is wrong on the server-side !');
    135       }
    136     }
    137 
    138 
    139     /**
    140      * this function display the number of items found and prepare the page
    141      * navigator
    142      *
    143      * @param String nfo : 2 information separated with a semi-colon ';'
    144      *                      requestNumber;numberOfItems
    145      */
    146     var displayQueryPage = function (isSuccess, nfo)
    147     {
    148       if(isSuccess)
    149       {
    150         $('#iResultQueryContent').html(nfo);
    151       }
    152       else
    153       {
    154         alert('Something is wrong on the server-side !');
    155       }
    156     }
    157 
    158 
    159     /**
    160      *
    161      * @param Object optionsToSet : set the given options
    162      */
    163     var setOptions = function(optionsToSet)
    164     {
    165       if(typeof optionsToSet=='object')
    166       {
    167         options = jQuery.extend(options, optionsToSet);
    168       }
    169     }
    170 
    171     /**
    172      * initialize the object
    173      */
    174     var init = function (optionsToSet)
    175     {
    176       setOptions(optionsToSet);
    177 
    178       pn = new pagesNavigator(options.requestResultPagesNavigator,
    179         {
    180           itemPerPage:options.numberPerPage,
    181           displayNumPage:9,
    182           classActive:'pnActive{/literal}{$datas.themeName}{literal}',
    183           classInactive:'pnInactive{/literal}{$datas.themeName}{literal}',
    184           onPageChange: function (page)
    185             {
    186               if(options.onPageChange!=null && jQuery.isFunction(options.onPageChange))
    187               {
    188                 options.onPageChange(requestNumber, page, options.numberPerPage);
    189               }
    190             },
    191         }
    192       );
    193 
    194       requestNumber=options.requestResultRequestNumber;
    195     }
    196 
    197     init(optionsToSet);
    198   }
    199 
    200 
    201   function init()
    202   {
    203     im = new interfaceManager(
    204       {
    205         requestCriterionsVisible:'cRequestCriterions',
    206         requestCriterionsHidden:'cModifyRequest',
    207         requestResult:'cResultQuery',
    208         requestResultContent:'iResultQueryContent',
    209         requestResultNfo:'iResultQueryNfo',
    210         requestResultPagesNavigator:'iPagesNavigator',
    211       }
    212     );
    213 
    214     requestBuilderOptions.imgEditUrl='{/literal}{$ROOT_URL}{$themeconf.admin_icon_dir}{literal}/edit_s.png';
    215     requestBuilderOptions.imgDeleteUrl='{/literal}{$ROOT_URL}{$themeconf.admin_icon_dir}{literal}/delete.png';
    216     requestBuilderOptions.classGroup='gcBorderInput gcTextInput';
    217     requestBuilderOptions.classItem='gcBgInput gcTextInput';
    218     requestBuilderOptions.classOperator='cbOperator cbOperatorBg{/literal}{$datas.themeName}{literal} gcLinkHover';
    219     requestBuilderOptions.onRequestSuccess = function (msg) { im.doAction('queryResult', true, msg); cb.doAction('getPage', im.getRequestNumber(), 1, im.getNumberPerPage()); };
    220     requestBuilderOptions.onRequestError = function (msg) { im.doAction('queryResult', false, msg); };
    221     requestBuilderOptions.onGetPageSuccess = function (msg) { im.doAction('queryPage', true, msg); };
    222     requestBuilderOptions.onGetPageError = function (msg) { im.doAction('queryPage', false, msg); };
    223 
    224     cb = new criteriaBuilder('iListColorsChoosen', requestBuilderOptions);
    225 
    226     im.doAction('setOptions',
    227       { onPageChange:
    228           function (requestNumber, page, numberPerPage)
    229           {
    230             $('#iResultQueryContent').html("<br><img src='./plugins/GrumPluginClasses/icons/processing.gif'>");
    231             cb.doAction('getPage', requestNumber, page, numberPerPage);
    232           }
    233       }
    234     );
    235 
    236   }
    237 
    238 
    239 
    240 </script>
    241 {/literal}
    242 
    243 {$datas.dialogBox}
    2441
    2452<h2>{'cstat_search_by_color'|@translate}</h2>
    2463
    247 <form>
    248   <fieldset>
    249     <legend>{'cstat_search_criterion'|@translate}</legend>
    250 
    251     <div id='iRequestCriterions' class='cRequestCriterions'>
    252       <div style='width:100%;min-height:250px;margin-bottom:8px;'>
    253         <ul id='iListColorsChoosen'>
    254         </ul>
    255       </div>
    256 
    257       <div class='gcBgInput cbButtons'>{literal}<a onclick="colorBox.show({cBuilder:cb});">{/literal}{'cstat_add_colors'|@translate}</a></div>
    258       <div class='gcBgInput cbButtons'>{literal}<a onclick="cb.doAction('clear');">{/literal}{'cstat_clear_colors'|@translate}</a></div>
    259     </div>
    260     <div class='cModifyRequest' style='display:none;'>
    261       <div class='gcBgInput cbButtons'>{literal}<a onclick="im.doAction('show', 'buildQuery');">{/literal}{'cstat_do_modify_request'|@translate}</a></div>
    262     </div>
    263 
    264   </fieldset>
    265 
    266   <input type="button" class='cRequestCriterions' style="margin-left:1em;" onclick="cb.doAction('send');" value="{'cstat_search'|@translate}">
    267 </form>
    268 
    269   <fieldset id='iResultQuery' style='display:none;' class='cResultQuery'>
    270     <legend>{'cstat_result_query'|@translate}</legend>
    271 
    272     <div id='iResultQueryContent' style='width:100%;min-height:250px;max-height:450px;overflow:auto;margin-bottom:8px;'></div>
    273 
    274     <div class='gcBgInput gcTextInput'>
    275       <div id='iPagesNavigator' style='float:right;'></div>
    276       <div style='text-align:left;padding:4px;'>{'cstat_number_of_item_found'|@translate}&nbsp;:&nbsp;<span id='iResultQueryNfo'></span></div>
    277     </div>
    278 
    279   </fieldset>
    280 
    281 
    282 <script type="text/javascript">
    283  init();
    284 </script>
     4{$cstat_search_page}
  • extensions/ColorStat/cstat.css

    r6107 r6176  
    4141}
    4242
    43 
    44 #iListColorsChoosen { padding:0px; }
    45 
    46 #iListColorsChoosen ul li, #dragHelper ul li {
    47   clear:both;
    48   min-height:32px;
    49   list-style-image:none;
    50   list-style-position:outside;
    51   list-style-type:none;
    52   margin:4px;
    53   padding:0px;
    54 }
    55 
    56 #iListColorsChoosen ul { padding:0px; }
    57 
    58 
    59 .cbGroup { border-width:1px; border-style:solid; padding:0px; margin:2px; min-height:30px; list-style:none; }
    60 .cbItem {   padding:2px; margin:8px; min-height:34px; list-style:none; }
    61 
    62 #iListColorsChoosen ul li.cbItem, #dragHelper ul li.cbItem { padding:2px; }
    63 
    64 .cbItemButtons { padding:2px; }
    65 .cbItem img { cursor: pointer; }
    66 
    67 .cbSortHandle { cursor:move; }
    68 
    69 div.cbOperator {
    70  cursor:pointer;
    71  padding:4px;
    72  text-align:left;
    73  font-weight:bold;
    74 }
    75 
    76 div.cbOperatorBgroma {
    77  background:#333333;
    78 }
    79 
    80 div.cbOperatorBgclear {
    81  background:#dbe8f3;
    82 }
    83 
    84 .cbButtons {
    85   float:left;
    86   margin:2px;
    87   padding:8px;
    88 }
    89 
    90 .helper {
    91  border:2px dashed #777777;
    92 }
    93 
    94 .cPnActive, .cPnDisabled, .cPnInactive { margin:2px; padding:2px;  min-width:20px; text-align:center; }
    95 .pnInactiveclear, .pnInactiveroma { cursor:pointer; }
    96 .pnInactiveclear:hover { background:#F1F1F1; }
    97 .pnActiveclear { background:#F1F1F1; font-weight:bold; }
    98 .pnInactiveroma:hover { background:#999999; color:#444444; }
    99 .pnActiveroma { background:#999999; color:#444444; font-weight:bold; }
    100 #iPagesNavigator ul { margin:0px; }
    101 
    10243.color1px { border-spacing:1px; }
    10344.color0px { border-spacing:0px; }
  • extensions/ColorStat/cstat_aip.class.inc.php

    r6107 r6176  
    221221                dirname($this->getFileLocation()).'/admin/cstat_stat.tpl');
    222222
    223     $colorTable=$this->getColorTableWithStat();
     223    $colorTable=CStat_functions::getColorTableWithStat();
    224224
    225225
    226226    $datas=Array(
    227227      //'themeconf' => Array('name' => $template->get_themeconf('name')),
    228       'colorTable' => $this->htmlColorTable(
     228      'colorTable' => CStat_functions::htmlColorTable(
    229229                        $colorTable,
    230230                        ($this->config['analyze_colorTable']=='small')?19:10,
    231231                        "",
    232                         "color0px"
     232                        "color0px",
     233                        "<br>"
    233234                      ),
    234235      'urlRequest' => $this->getAdminLink(),
     
    250251                dirname($this->getFileLocation()).'/admin/cstat_search.tpl');
    251252
    252     $datas=Array(
    253       'dialogBox' => $this->dialogBoxColor(),
    254       'themeName' => $template->get_themeconf('name'),
    255     );
    256 
    257     $template->assign('datas', $datas);
     253    $template->assign('cstat_search_page', GPCRequestBuilder::displaySearchPage());
    258254
    259255    $template->assign_var_from_handle('CSTAT_BODY_PAGE', 'body_page');
     
    297293  {
    298294    global $template, $lang;
     295
     296    $configTabs=new GPCTabSheet('configTabsheet', $this->tabsheet->get_titlename(), 'tabsheet2 gcBorder', 'itab2');
     297    $configTabs->add('database',
     298                      l10n('cstat_database'),
     299                      '', true, "displayConfig('database');");
     300    $configTabs->add('statsearch',
     301                      l10n('cstat_stat_and_search'),
     302                      '', false, "displayConfig('statsearch');");
     303    $configTabs->add('display',
     304                      l10n('cstat_gallery_integration'),
     305                      '', false, "displayConfig('display');");
     306    $configTabs->assign();
    299307
    300308    $template->set_filename('body_page',
     
    390398
    391399
    392   protected function getGeneralStats()
    393   {
    394     $returned=Array(
    395       'nbImages' => 0,
    396       'totalTime' => 0,
    397       'pixelsAnalyzedMax' => 0,
    398       'pixelsAnalyzedMin' => 0,
    399       'pixelsAnalyzedAvg' => 0,
    400       'pixelsAnalyzedSum' => 0,
    401       'totalPixels' => 0,
    402       'ppsMax' => 0,
    403       'ppsMin' => 0,
    404       'ppsAvg' => 0,
    405       'qualityMax' => 0,
    406       'qualityMin' => 0,
    407       'qualityAvg' => 0,
    408     );
    409     $sql="SELECT COUNT(image_id) AS nbImages,
    410                  SUM(time) AS totalTime,
    411                  MAX(analyzed_pixels) AS pixelsAnalyzedMax,
    412                  MIN(analyzed_pixels) AS pixelsAnalyzedMin,
    413                  AVG(analyzed_pixels) AS pixelsAnalyzedAvg,
    414                  SUM(analyzed_pixels) AS pixelsAnalyzedSum,
    415                  SUM(num_pixels) AS totalPixels,
    416                  MAX(pps) AS ppsMax,
    417                  MIN(pps) AS ppsMin,
    418                  AVG(pps) AS ppsAvg,
    419                  MAX(quality) AS qualityMax,
    420                  MIN(quality) AS qualityMin,
    421                  AVG(quality) AS qualityAvg
    422           FROM ".$this->tables['images']."
    423           WHERE analyzed='y';";
    424     $result=pwg_query($sql);
    425     if($result)
    426     {
    427       while($row=pwg_db_fetch_assoc($result))
    428       {
    429         $returned=$row;
    430       }
    431     }
    432     return($returned);
    433   }
    434 
    435 
    436400  /**
    437401   * make consolidation for the color_table :
     
    626590      {
    627591        $colorTable=ColorStat::getColorTable(
    628           $this->colorTableSize[$this->config['analyze_colorTable']][0],
    629           $this->colorTableSize[$this->config['analyze_colorTable']][1]
     592          CStat_root::$colorTableSize[$this->config['analyze_colorTable']][0],
     593          CStat_root::$colorTableSize[$this->config['analyze_colorTable']][1]
    630594        );
    631595
     
    688652                  dirname($this->getFileLocation()).'/admin/cstat_stat_show_iListColors.tpl');
    689653
    690     $generalStats=$this->getGeneralStats();
     654    $generalStats=CStat_functions::getGeneralStats();
    691655
    692656    $sql="SELECT color_id, num_images, num_pixels
  • extensions/ColorStat/cstat_aip_install.class.inc.php

    r6107 r6176  
    126126                dirname($this->getFileLocation()).'/admin/cstat_install_page.tpl');
    127127
    128     $smallColorTable=ColorStat::getColorTable($this->colorTableSize['small'][0],$this->colorTableSize['small'][1]);
    129     $largeColorTable=ColorStat::getColorTable($this->colorTableSize['large'][0],$this->colorTableSize['large'][1]);
    130     $template->assign('smallTableColor', $this->htmlColorTable($smallColorTable, 19, '', 'color0px'));
    131     $template->assign('largeTableColor', $this->htmlColorTable($largeColorTable, 10, '', 'color0px'));
     128    $smallColorTable=ColorStat::getColorTable(CStat_root::$colorTableSize['small'][0],CStat_root::$colorTableSize['small'][1]);
     129    $largeColorTable=ColorStat::getColorTable(CStat_root::$colorTableSize['large'][0],CStat_root::$colorTableSize['large'][1]);
     130    $template->assign('smallTableColor', CStat_functions::htmlColorTable($smallColorTable, 19, '', 'color0px'));
     131    $template->assign('largeTableColor', CStat_functions::htmlColorTable($largeColorTable, 10, '', 'color0px'));
    132132
    133133    $template->assign(
    134134      'smallColorList1',
    135       $this->htmlColorList(
     135      CStat_functions::htmlColorList(
    136136        ColorStat::getFileColors(dirname($this->getFileLocation()).'/image/sample1.png', $smallColorTable, Array('quality' => 8, 'numColors' => 16)),
    137137        16, 18, '', 'colorListSample color0px'
     
    142142    $template->assign(
    143143      'largeColorList1',
    144       $this->htmlColorList(
     144      CStat_functions::htmlColorList(
    145145        ColorStat::getFileColors(dirname($this->getFileLocation()).'/image/sample1.png', $largeColorTable, Array('quality' => 8, 'numColors' => 16)),
    146146        16, 18, '', 'colorListSample color0px'
     
    151151    $template->assign(
    152152      'smallColorList2',
    153       $this->htmlColorList(
     153      CStat_functions::htmlColorList(
    154154        ColorStat::getFileColors(dirname($this->getFileLocation()).'/image/sample2.png', $smallColorTable, Array('quality' => 8, 'numColors' => 16)),
    155155        16, 18, '', 'colorListSample color0px'
     
    160160    $template->assign(
    161161      'largeColorList2',
    162       $this->htmlColorList(
     162      CStat_functions::htmlColorList(
    163163        ColorStat::getFileColors(dirname($this->getFileLocation()).'/image/sample2.png', $largeColorTable, Array('quality' => 8, 'numColors' => 16)),
    164164        16, 18, '', 'colorListSample color0px'
     
    205205    $this->saveConfig();
    206206
    207     $colorTable=ColorStat::getColorTable($this->colorTableSize[$tableSize][0],$this->colorTableSize[$tableSize][1]);
    208 
    209     foreach($colorTable as $key => $val)
     207    $colorTable=ColorStat::getColorTable(CStat_root::$colorTableSize[$tableSize][0],CStat_root::$colorTableSize[$tableSize][1]);
     208
     209    foreach($colorTable as $key => $hue)
    210210    {
    211       foreach($val as $key2 => $val2)
     211      foreach($hue as $key2 => $saturation)
    212212      {
    213         $hsv=$val2->get();
    214         $sql.=(($sql=="")?"":", ")."('".$val2->getRGB()->getHexString()."',
    215                '".$hsv['H']."',
    216                '".$hsv['S']."',
    217                '".$hsv['V']."',
    218                0, 0)";
     213        foreach($saturation as $key3=>$value)
     214        {
     215          $hsv=$value->get();
     216          $sql.=(($sql=="")?"":", ")."('".$value->getRGB()->getHexString()."',
     217                 '".$hsv['H']."',
     218                 '".$hsv['S']."',
     219                 '".$hsv['V']."',
     220                 0, 0)";
     221        }
    219222      }
    220223    }
  • extensions/ColorStat/cstat_colorstat.class.inc.php

    r6107 r6176  
    4646  --------------------------------------------------------------------------- */
    4747
    48   if(!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
     48if(!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
     49
     50/**
     51 * if DEBUG_MODE is set to true, the getFileColors function save a jpg file of
     52 * the 'viewed' image :
     53 *  - resampled file
     54 *  - color from the color table
     55 *
     56 * use it only for debug, or if you are curious about what the function really
     57 * see
     58 */
     59define('DEBUG_MODE', false);
     60
     61
    4962
    5063/**
     
    5972  }
    6073
     74  /**
     75   * set the R,G and B values
     76   *
     77   * @param Byte $R : the red value, between [0..255]
     78   * @param Byte $G : the green value, between [0..255]
     79   * @param Byte $B : the blue value, between [0..255]
     80   * @return Array('R'=>$R, 'G'=>$G, 'B'=>$B)
     81   */
    6182  public function set($R, $G, $B)
    6283  {
     
    6788  }
    6889
     90  /**
     91   * set RGB values from an Integer (0xFFFFFF : white value)
     92   *
     93   * @param Integer $value : the RGB value
     94   * @return Array('R'=>$R, 'G'=>$G, 'B'=>$B)
     95   */
    6996  public function setInt($value)
    7097  {
     
    76103  }
    77104
     105  /**
     106   * returns the current RGB values as array
     107   *
     108   * @param Boolean $floatValue : if set to true, values are returned as float
     109   *                              values between [0..1] otherwise values are
     110   *                              returned as integer between [0..255]
     111   * @return Array('R'=>$R, 'G'=>$G, 'B'=>$B)
     112   */
    78113  public function get($floatValue=false)
    79114  {
     
    94129  }
    95130
     131
     132  /**
     133   * returns the current RGB values as hex string  ('FFFFFF' : white)
     134   *
     135   * @return String
     136   */
    96137  public function getHexString()
    97138  {
     
    99140  }
    100141
     142  /**
     143   * returns the current RGB values as integer  (0xFFFFFF : white)
     144   *
     145   * @return Integer
     146   */
    101147  public function getInt()
    102148  {
     
    104150  }
    105151
     152
     153  /**
     154   * returns the current RGB values as a HSV object
     155   *
     156   * @return HSV
     157   */
    106158  public function getHSV()
    107159  {
     
    109161  }
    110162
     163  /**
     164   * set the RGB values from a HSV ojbect
     165   *
     166   * @param HSV $hsv : a HSV object
     167   */
    111168  public function setHSV(HSV $hsv)
    112169  {
     
    118175  }
    119176
     177  /**
     178   * set the RGB property
     179   *
     180   * @param String $property : 'R', 'G', 'B'
     181   * @param Integer $value : value between [0..255]
     182   * @return Integer : value of the property
     183   */
    120184  private function setProperty($property, $value)
    121185  {
     
    143207  }
    144208
     209  /**
     210   * set the H, S and V values
     211   *
     212   * @param Integer $H : the hue value, between [0..360]
     213   * @param Byte $S    : the saturation value, between [0..100]
     214   * @param Byte $V    : the value value, between [0..100]
     215   * @return Array('H'=>$H, 'S'=>$S, 'V'=>$V)
     216   */
    145217  public function set($H, $S, $V)
    146218  {
     
    151223  }
    152224
     225  /**
     226   * returns the current HSV values as array
     227   *
     228   * @return Array('H'=>$H, 'S'=>$S, 'V'=>$V)
     229   */
    153230  public function get()
    154231  {
     
    156233  }
    157234
     235  /**
     236   * returns the current HSV values as a RGB object
     237   *
     238   * @return RGB
     239   */
    158240  public function getRGB()
    159241  {
     
    161243  }
    162244
     245
     246
     247  /**
     248   * set the HSV values from a RGB ojbect
     249   *
     250   * @param RGB $rgb : a RGB object
     251   */
    163252  public function setRGB(RGB $rgb)
    164253  {
     
    170259  }
    171260
     261  /**
     262   * set the HSV property
     263   *
     264   * @param String $property : 'H', 'S', 'V'
     265   * @param Integer $value : value between [0..255]
     266   * @return Integer : value of the property
     267   */
    172268  private function setProperty($property, $value)
    173269  {
     
    203299
    204300  /**
     301   * returns colors of an image file
     302   *
     303   * return :
     304   *
     305   *
    205306   *
    206307   * @param String $fileName : the name of picture to scan
     
    212313   *                          if 'maxTime' and 'pps' are greater than zero, the
    213314   *                          quality parameter is computed automatically
    214    * @return Array : an array of HSV objects
     315   * @return : -1 if file doesn't exist
     316   *           -2 if file is not a PNG, a JPEG or a GIF file
     317   *           -3 if a fatal error occurs
     318   *            array of HSV objects if everthing is Ok
    215319   */
    216320  static function getFileColors($fileName, $colorTable, $options=array())
     
    229333      $time=microtime(true);
    230334
    231       if(preg_match('/.*\.gif$/i', $fileName))
     335      try
    232336      {
    233         $image = imagecreatefromgif($fileName);
     337        if(preg_match('/.*\.gif$/i', $fileName))
     338        {
     339          $image = imagecreatefromgif($fileName);
     340        }
     341        elseif(preg_match('/.*\.(jpg|jpeg)$/i', $fileName))
     342        {
     343          $image = imagecreatefromjpeg($fileName);
     344        }
     345        elseif(preg_match('/.*\.png$/i', $fileName))
     346        {
     347          $image = imagecreatefrompng($fileName);
     348        }
     349        else
     350        {
     351          return(-2);
     352        }
     353
     354
     355        $imageWidth=imagesx($image);
     356        $imageHeight=imagesy($image);
     357
     358        if($options['pps']>0 && $options['maxTime']>0)
     359        {
     360          $quality=round(sqrt($imageWidth*$imageHeight/($options['pps']*$options['maxTime'])), 0);
     361        }
     362        else
     363        {
     364          $quality=$options['quality'];
     365        }
     366
     367        $imageWorkWidth=round($imageWidth/$quality,0);
     368        $imageWorkHeight=round($imageHeight/$quality,0);
     369        $imageWork=imagecreatetruecolor($imageWorkWidth,$imageWorkHeight);
     370        imagecopyresampled($imageWork, $image, 0, 0, 0, 0, $imageWorkWidth, $imageWorkHeight, $imageWidth, $imageHeight);
     371        //imagecopyresized($imageWork, $image, 0, 0, 0, 0, $imageWorkWidth, $imageWorkHeight, $imageWidth, $imageHeight);
     372        imagedestroy($image);
     373
     374        $returned=Array();
     375
     376        $i=0;
     377        for($px=0;$px<$imageWorkWidth;$px++)
     378        {
     379          for($py=0;$py<$imageWorkHeight;$py++)
     380          {
     381            $i++;
     382            $value=imagecolorat($imageWork, $px, $py);
     383
     384            $rgb=self::IntToRGB($value);
     385            //echo sprintf("%06x", $value)." => ".$rgb->getHexString();
     386
     387
     388            //echo " ($i) ".$color->getHexString()."<br>";
     389
     390            if(DEBUG_MODE)
     391            {
     392              $color=self::getColorFromTable($rgb->getHSV(), $colorTable);
     393              $newRGB=$color->get();
     394              $col=imagecolorallocate($imageWork, $newRGB['R'], $newRGB['G'], $newRGB['B']);
     395              imagesetpixel($imageWork, $px, $py, $col);
     396              imagecolordeallocate($imageWork, $col);
     397              $color=$color->getHexString();
     398              unset($newRGB);
     399            }
     400            else
     401            {
     402              $color=self::getColorFromTable($rgb->getHSV(), $colorTable)->getHexString();
     403            }
     404
     405
     406            if(array_key_exists($color, $returned))
     407            {
     408              $returned[$color]['num']++;
     409            }
     410            else
     411            {
     412              $returned[$color]=Array(
     413                'hsv' => $rgb->getHSV()->get(),
     414                'num' => 1,
     415                'pct' => 0,
     416              );
     417            }
     418            unset($rgb);
     419          }
     420        }
     421
     422
     423        if(DEBUG_MODE)
     424        {
     425          $fName="q".$quality."_c".$options['numColors']."_nb".count($returned)."_".$fileName.".png";
     426          imagepng($imageWork, $fName);
     427        }
     428
     429
     430        imagedestroy($imageWork);
     431        uasort($returned, Array('ColorStat', 'sortTones'));
     432
     433        if($options['numColors']>0)
     434        {
     435          foreach($returned as $key=>$val)
     436          {
     437            $returnedColors[$key]=$val;
     438            $options['numColors']--;
     439            if($options['numColors']<=0) break;
     440          }
     441        }
     442        else
     443        {
     444          $returnedColors=$returned;
     445        }
     446
     447        self::$fileColorsStat=Array(
     448          'pixels'   => $imageWidth*$imageHeight,
     449          'analyzed' => $i,
     450          'time'     => microtime(true)-$time,
     451          'colors'   => count($returned),
     452          'pps'      => $i/(microtime(true)-$time),
     453          'quality'  => $quality,
     454        );
     455
     456        if(DEBUG_MODE)
     457        {
     458          self::$fileColorsStat['fileName']=$fName;
     459        }
     460
     461        unset($returned);
     462
     463        foreach($returnedColors as $key => $val)
     464        {
     465          $returnedColors[$key]['pct']=round(100*$val['num']/self::$fileColorsStat['analyzed'],2);
     466        }
     467
     468        return($returnedColors);
    234469      }
    235       elseif(preg_match('/.*\.(jpg|jpeg)$/i', $fileName))
     470      catch (Exception $e)
    236471      {
    237         $image = imagecreatefromjpeg($fileName);
     472        echo "ERROR!<br>".print_r($e, true);
     473        return(-3);
    238474      }
    239       elseif(preg_match('/.*\.png$/i', $fileName))
    240       {
    241         $image = imagecreatefrompng($fileName);
    242       }
    243       else
    244       {
    245         return(-2);
    246       }
    247 
    248       $imageWidth=imagesx($image);
    249       $imageHeight=imagesy($image);
    250 
    251       if($options['pps']>0 && $options['maxTime']>0)
    252       {
    253         $quality=round(sqrt($imageWidth*$imageHeight/($options['pps']*$options['maxTime'])), 0);
    254       }
    255       else
    256       {
    257         $quality=$options['quality'];
    258       }
    259 
    260       $imageWorkWidth=round($imageWidth/$quality,0);
    261       $imageWorkHeight=round($imageHeight/$quality,0);
    262       $imageWork=imagecreatetruecolor($imageWorkWidth,$imageWorkHeight);
    263       imagecopyresampled($imageWork, $image, 0, 0, 0, 0, $imageWorkWidth, $imageWorkHeight, $imageWidth, $imageHeight);
    264       //imagecopyresized($imageWork, $image, 0, 0, 0, 0, $imageWorkWidth, $imageWorkHeight, $imageWidth, $imageHeight);
    265       imagedestroy($image);
    266 
    267       $returned=Array();
    268 
    269       $i=0;
    270       for($px=0;$px<$imageWorkWidth;$px++)
    271       {
    272         for($py=0;$py<$imageWorkHeight;$py++)
    273         {
    274           $i++;
    275           $value=imagecolorat($imageWork, $px, $py);
    276 
    277           $rgb=self::IntToRGB($value);
    278           //echo sprintf("%06x", $value)." => ".$rgb->getHexString();
    279 
    280           $color=self::getColorFromTable($rgb->getHSV(), $colorTable)->getHexString();
    281           //echo " ($i) $color<br>";
    282 
    283           if(array_key_exists($color, $returned))
    284           {
    285             $returned[$color]['num']=$returned[$color]['num']+1;
    286           }
    287           else
    288           {
    289             $returned[$color]=Array(
    290               'hsv' => $rgb->getHSV()->get(),
    291               'num' => 1,
    292               'pct' => 0,
    293             );
    294           }
    295           unset($rgb);
    296         }
    297       }
    298 
    299       /*
    300       $fName="q".$quality."_c".$options['numColors']."_".$fileName.".png";
    301       imagepng($imageWork, $fName);
    302       */
    303 
    304       imagedestroy($imageWork);
    305       uasort($returned, Array('ColorStat', 'sortTones'));
    306 
    307       if($options['numColors']>0)
    308       {
    309         foreach($returned as $key=>$val)
    310         {
    311           $returnedColors[$key]=$val;
    312           $options['numColors']--;
    313           if($options['numColors']<=0) break;
    314         }
    315       }
    316       else
    317       {
    318         $returnedColors=$returned;
    319       }
    320 
    321       self::$fileColorsStat=Array(
    322         'pixels'   => $imageWidth*$imageHeight,
    323         'analyzed' => $i,
    324         'time'     => microtime(true)-$time,
    325         'colors'   => count($returned),
    326         'pps'      => $i/(microtime(true)-$time),
    327         'quality'  => $quality,
    328         //'fileName' => $fName,
    329       );
    330 
    331       unset($returned);
    332 
    333       foreach($returnedColors as $key => $val)
    334       {
    335         $returnedColors[$key]['pct']=round(100*$val['num']/self::$fileColorsStat['analyzed'],2);
    336       }
    337 
    338       return($returnedColors);
     475
    339476    }
    340477    else
     
    432569  /**
    433570   * return a color table
    434    *  $table = Array(
    435    *              Array(),
    436    *              Array(),
    437    *              ...
    438    *              Array(),
    439    *              Array(),
    440    *           )
    441    *  $table[n]    => Array of all colors for a given hue value
    442    *  $table[n][m] => HSV object or a color string RRGGBB
    443    *
     571   *  $table[h][s][v] => HSV object or string 'RRGGBB'
    444572   *
    445573   * @param Int $huePrec : degree of precision for hue [1..360]
    446574   * @param Float $prec    : precision step for saturation & value [1..100]
    447575   * @param String $returnedType : 'HSV'   => return a HSV object
    448    *                               'color' => return a color string RRGGBB
     576   *                               'color' => return a color string 'RRGGBB'
    449577   * @return Array : the color table
    450578   */
     
    452580  {
    453581    $returned=Array();
    454     for($hue=0;$hue<=360;$hue+=$huePrec)
     582    for($hue=0;$hue<360;$hue+=$huePrec)
    455583    {
    456584      $hueValues=Array();
    457585
    458       $saturation=100;
    459       for($value=0;$value<100;$value=$value+=$prec)
     586      for($saturation=0;$saturation<=100;$saturation+=$prec)
    460587      {
    461         $hsv=new HSV($hue, $saturation, $value);
    462         if($returnedType=='HSV')
    463         {
    464           $hueValues[]=$hsv;
    465         }
    466         else
    467         {
    468           $hueValues[]=$hsv->getRGB()->getHexString();
    469         }
    470         unset($hsv);
     588        $saturationValues=Array();
     589
     590        for($value=0;$value<=100;$value+=$prec)
     591        {
     592          $hsv=new HSV($hue, $saturation, $value);
     593          if($returnedType=='HSV')
     594          {
     595            $saturationValues[$value]=$hsv;
     596          }
     597          else
     598          {
     599            $saturationValues[$value]=$hsv->getRGB()->getHexString();
     600          }
     601          unset($hsv);
     602        }
     603
     604        $hueValues[$saturation]=$saturationValues;
     605        unset($saturationValues);
    471606      }
    472 
    473       $value=100;
    474       for($saturation=100;$saturation>=0;$saturation-=$prec)
    475       {
    476         $hsv=new HSV($hue, $saturation, $value);
    477         if($returnedType=='HSV')
    478         {
    479           $hueValues[]=$hsv;
    480         }
    481         else
    482         {
    483           $hueValues[]=$hsv->getRGB()->getHexString();
    484         }
    485         unset($hsv);
    486       }
    487 
    488 
    489       for($tmp=$prec;$tmp<=100;$tmp+=$prec)
    490       {
    491         $hsv=new HSV($hue, $tmp, 100-$tmp);
    492         if($returnedType=='HSV')
    493         {
    494           $hueValues[]=$hsv;
    495         }
    496         else
    497         {
    498           $hueValues[]=$hsv->getRGB()->getHexString();
    499         }
    500         unset($hsv);
    501       }
    502       for($tmp=$prec;$tmp<=100;$tmp+=$prec)
    503       {
    504         $hsv=new HSV($hue, $tmp, $tmp);
    505         if($returnedType=='HSV')
    506         {
    507           $hueValues[]=$hsv;
    508         }
    509         else
    510         {
    511           $hueValues[]=$hsv->getRGB()->getHexString();
    512         }
    513         unset($hsv);
    514       }
    515 
    516       $returned[]=$hueValues;
     607      $returned[$hue]=$hueValues;
    517608      unset($hueValues);
    518609    }
    519610
    520     $hue=0;
    521     $saturation=0;
    522     $hueValues=Array();
    523     //$prec=1/(count($returned[0])-2);
    524     for($value=0;$value<=100;$value+=$prec/4)
    525     {
    526       $hsv=new HSV($hue, $saturation, round($value,0));
    527       if($returnedType=='HSV')
    528       {
    529         $hueValues[]=$hsv;
    530       }
    531       else
    532       {
    533         $hueValues[]=$hsv->getRGB()->getHexString();
    534       }
    535       unset($hsv);
    536     }
    537 
    538     $returned[]=$hueValues;
    539     unset($hueValues);
    540611
    541612    return($returned);
     
    621692  }
    622693
    623   static public function getColorFromTable(HSV $hsvObject, $colorTable)
    624   {
    625     $hue=360/(count($colorTable)-2);
    626     $step=count($colorTable[0]);
    627 //echo "*hue:$hue<br>";
    628 //echo "*step:$step<br>";
    629 
     694  /**
     695   * for the given color, return the nearest color of the color table
     696   *
     697   * @param HSV $hsvObject    : the color, as HSV object
     698   * @param Array $colorTable : the colorTable
     699   * @param String $mode      : 'HSV' or 'RGB' to define the returned object
     700   * @return HSV or RGB       : the color
     701   */
     702  static public function getColorFromTable(HSV $hsvObject, $colorTable, $mode='RGB')
     703  {
    630704    $hsv=$hsvObject->get();
    631 
     705//echo "*H:".$hsv['H']." ";
     706//echo "*S:".$hsv['S']." ";
     707//echo "*V:".$hsv['V']."<br>";
     708
     709    $hue=360/count($colorTable);
    632710    $hueNumber=round($hsv['H']/$hue,0);
    633 //echo "*hueNumber:$hueNumber<br>";
    634 
    635 //echo "*H:".$hsv['H']."<br>";
    636 //echo "*S:".$hsv['S']."<br>";
     711    $step=100/(count($colorTable[0])-1);
     712//echo "*H_Step:$hue<br>";
     713//echo "*SV_Step:$step<br>";
     714
     715    $hsv['S']=round((100/$step)*$hsv['S']/100,0)*$step;
     716    $hsv['V']=round((100/$step)*$hsv['V']/100,0)*$step;
     717    $hsv['H']=($hueNumber*$hue)%360;
     718//echo "*H:".$hsv['H']." ";
     719//echo "*S:".$hsv['S']." ";
    637720//echo "*V:".$hsv['V']."<br>";
    638721
    639     if($hsv['V']==0)
    640     {
    641 //echo "-black-<br>";
    642       // black
    643       return(new RGB(0,0,0));
    644     }
    645     elseif($hsv['S']==0 && $hsv['V']==100)
    646     {
    647 //echo "-white-<br>";
    648       // white
    649       return(new RGB(255,255,255));
    650     }
    651     elseif($hsv['S']==0 && $hsv['V']<100 && $hsv['V']>0)
    652     {
    653 //echo "-grey-<br>";
    654       // grey
    655       $stepNumber=round($hsv['V']*($step-1)/100,0);
    656       return($colorTable[count($colorTable)-1][$stepNumber]->getRGB());
    657     }
    658     elseif($hsv['S']==100 && $hsv['V']<100 && $hsv['V']>0)
    659     {
    660 //echo "-value-<br>";
    661       //color 'value'
    662       $stepNumber=round($hsv['V']*$step/400,0);
    663       return($colorTable[$hueNumber][$stepNumber]->getRGB());
    664     }
    665     elseif($hsv['V']==100 && $hsv['S']<100 && $hsv['S']>0)
    666     {
    667 //echo "-saturation-<br>";
    668       //color 'saturation'
    669       $stepNumber=round(($step/4)+(100-$hsv['S'])*($step/400),0);
    670       return($colorTable[$hueNumber][$stepNumber]->getRGB());
    671     }
    672     elseif($hsv['V']==100 && $hsv['S']==100)
    673     {
    674 //echo "-pure-<br>";
    675       //color 'pure'
    676       $stepNumber=$step/4;
    677       return($colorTable[$hueNumber][$stepNumber]->getRGB());
    678     }
    679     elseif(
    680       ($hsv['V']<100 && $hsv['V']>50 && $hsv['S']<50 && $hsv['S']>0) ||
    681       ($hsv['S']<100 && $hsv['S']>50 && $hsv['V']<50 && $hsv['V']>0))
    682     {
    683 //echo "-desaturated 1-<br>";
    684       //color 'desaturated'
    685       $stepNumber=($step/2)+(100-$hsv['V'])*$step/400;
    686       return($colorTable[$hueNumber][$stepNumber]->getRGB());
    687     }
    688     elseif($hsv['V']<100 && $hsv['V']>0 && $hsv['S']<100 && $hsv['S']>0)
    689     {
    690 //echo "-desaturated 2-<br>";
    691       //color 'desaturated'
    692       $stepNumber=($step*0.75)+$hsv['V']*$step/400;
    693       return($colorTable[$hueNumber][$stepNumber]->getRGB());
    694     }
    695 //echo "-none-<br>";
    696     return(new RGB(0,0,0));
     722    if($mode=='RGB')
     723    {
     724      return($colorTable[$hsv['H']][$hsv['S']][$hsv['V']]->getRGB());
     725    }
     726    else
     727    {
     728      return($colorTable[$hsv['H']][$hsv['S']][$hsv['V']]);
     729    }
    697730  }
    698731
  • extensions/ColorStat/cstat_install.class.inc.php

    r6107 r6176  
    125125                      quality=0;");
    126126      pwg_query("INSERT INTO ".$this->tables['images']."
    127                   SELECT id, 'n', 0, 0, 0, 0, 0, 0, ''
     127                  SELECT id, 'n', 0, 0, 0, 0, 0, 0, '', ''
    128128                    FROM ".IMAGES_TABLE."
    129129                    WHERE id NOT IN (SELECT image_id FROM ".$this->tables['images'].")");
  • extensions/ColorStat/cstat_pip.class.inc.php

    r6107 r6176  
    6868    global $page, $template;
    6969
    70     $colors=$this->getImageColors($page['image_id']);
     70    $colors=CStat_functions::getImageColors($page['image_id']);
    7171
    7272
     
    8585        'TITLE' => l10n('cstat_colors'),
    8686        'lines' => Array(
    87           l10n('cstat_colors_on_image') => $this->htmlColorList($tmp, 8, 25, "", "color1px", "/"),
     87          l10n('cstat_colors_on_image') => CStat_functions::htmlColorList($tmp, 8, 25, "", "color1px", "/"),
    8888        )
    8989      );
  • extensions/ColorStat/cstat_rb_callback.class.inc.php

    r6107 r6176  
    1515  if(!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
    1616
     17  //include_once('')
    1718  include_once(PHPWG_PLUGINS_PATH.'GrumPluginClasses/classes/GPCRequestBuilder.class.inc.php');
    1819
     
    119120   * return HTML code for a given colors list
    120121   *
    121    * ==> this is the same function than the CStat_root::htmlColorList() function
    122    *     make a copy here only top optimize performance (don't load the
    123    *     CStat_root file for one function)
    124122   *
    125123   * @param Array $colors : list of colors
     
    163161  }
    164162
     163
     164  /**
     165   * this function is called by the request builder to make the search page, and
     166   * must return the HTML & JS code of the dialogbox used to select criterion
     167   *
     168   * Notes :
     169   *  - the dialogbox is a JS object with a public method 'show'
     170   *  - when the method show is called, one parameter is given by the request
     171   *    builder ; the parameter is an object defined as this :
     172   *      {
     173   *        cBuilder: an instance of the criteriaBuilder object used in the page,
     174   *        eventOK : a callback function, called when the OK button is pushed
     175   *        id:
     176   *      }
     177   *
     178   *
     179   *
     180   *
     181   * @param String $mode : can take 'admin' or 'public' values, allowing to
     182   *                       return different interface if needed
     183   * @return String : HTML formatted value
     184   */
     185  static public function getInterfaceContent($mode='admin')
     186  {
     187    return(CStat_functions::dialogBoxColor());
     188  }
     189
     190  /**
     191   * this function returns the label displayed in the criterion menu
     192   *
     193   * @return String : label displayed in the criterions menu
     194   */
     195  static public function getInterfaceLabel()
     196  {
     197    return(l10n('cstat_add_colors'));
     198  }
     199
     200  /**
     201   * this function returns the name of the dialog box class
     202   *
     203   * @return String : name of the dialogbox class
     204   */
     205  static public function getInterfaceDBClass()
     206  {
     207    return('dialogChooseColorBox');
     208  }
     209
    165210}
    166211
  • extensions/ColorStat/cstat_root.class.inc.php

    r6107 r6176  
    2424  class CStat_root extends CommonPlugin
    2525  {
     26    static public $pluginName='ColorStat';
     27    static public $pluginNameFile='cstat';
     28    static public $pluginTables=array('images', 'color_table', 'images_colors');
     29    static public $colorTableSize=Array('small' => Array(30,20), 'large' => Array(10,10));
     30
    2631    protected $css;   //the css object
    27     protected $colorTableSize=Array('small' => Array(30,20), 'large' => Array(10,10));
    2832
    2933    public function __construct($prefixeTable, $filelocation)
    3034    {
    31       $this->setPluginName('ColorStat');
    32       $this->setPluginNameFiles("cstat");
     35      $this->setPluginName(self::$pluginName);
     36      $this->setPluginNameFiles(self::$pluginNameFile);
    3337      parent::__construct($prefixeTable, $filelocation);
    3438      $this->section_name=$this->getPluginNameFiles();
    3539
    36       $this->setTablesList(array('images', 'color_table', 'images_colors'));
     40      $this->setTablesList(self::$pluginTables);
    3741
    3842
     
    6771      $this->config=array(
    6872        'newInstall' => 'n',
    69         'analyze_maxTime' => 0.1,
     73        'analyze_maxTime' => 1,
    7074        'analyze_colorTable' => 'small',
    7175        'analyze_pps' => 0,
     
    7377        'display_gallery_showColors' => 'n',
    7478        'display_stat_orderType' => 'img',
    75         'stat_minPct' => 3.5,
    76       );
     79        'stat_minPct' => 1.5,
     80      );
     81    }
     82
     83    /* ---------------------------------------------------------------------------
     84      ajax functions
     85    --------------------------------------------------------------------------- */
     86
     87
     88  } //class
     89
     90
     91  class CStat_functions
     92  {
     93    static private $tables = Array();
     94    static private $config = Array();
     95
     96    /**
     97     * initialise the class
     98     *
     99     * @param String $prefixeTable : the piwigo prefixe used on tables name
     100     * @param String $pluginNameFile : the plugin name used for tables name
     101     */
     102    static public function init($prefixeTable)
     103    {
     104      GPCCore::loadConfig(CStat_root::$pluginNameFile, self::$config);
     105      $list=CStat_root::$pluginTables;
     106
     107      for($i=0;$i<count($list);$i++)
     108      {
     109        self::$tables[$list[$i]]=$prefixeTable.CStat_root::$pluginNameFile.'_'.$list[$i];
     110      }
     111    }
     112
     113    /**
     114     * return a color table with stat on color
     115     *
     116     * @return Array : a color table with statistics on colors
     117     */
     118    static public function getColorTableWithStat()
     119    {
     120      $generalStats=self::getGeneralStats();
     121
     122      $colors=Array();
     123      $sql="SELECT color_id, num_images, num_pixels
     124            FROM ".self::$tables['color_table']."
     125            WHERE num_images > 0
     126            ORDER BY color_id ";
     127      $result=pwg_query($sql);
     128      if($result)
     129      {
     130        while($row=pwg_db_fetch_assoc($result))
     131        {
     132          $colors[$row['color_id']]=Array('num_images' => $row['num_images'], 'num_pixels' => $row['num_pixels']);
     133        }
     134      }
     135
     136      $colorTable=ColorStat::getColorTable(
     137       CStat_root::$colorTableSize[self::$config['analyze_colorTable']][0],
     138       CStat_root::$colorTableSize[self::$config['analyze_colorTable']][1]
     139      );
     140
     141      foreach($colorTable as $key=>$hue)
     142      {
     143        foreach($hue as $key2=>$saturation)
     144        {
     145          foreach($saturation as $key3=>$value)
     146          {
     147            $rgb=$value->getRGB()->getHexString();
     148            $colorTable[$key][$key2][$key3]=Array(
     149              'color' => $rgb,
     150              'pct'   => '', //(array_key_exists($rgb, $colors))?sprintf("%.2f", round(100*$colors[$rgb]['num_pixels']/$generalStats['pixelsAnalyzedSum'],2)):"",
     151              'num'   => (array_key_exists($rgb, $colors))?$colors[$rgb]['num_images']:"",
     152            );
     153          }
     154        }
     155      }
     156
     157      unset($colors);
     158      return($colorTable);
    77159    }
    78160
     
    86168     * @return String : HTML code
    87169     */
    88     public function htmlColorTable($colorTable, $size=5, $id="", $class="")
     170    static public function htmlColorTable($colorTable, $size=5, $id="", $class="", $br='<br>')
    89171    {
    90172      global $template;
    91173
    92174      $template->set_filename('color_table_page',
    93                     dirname($this->getFileLocation()).'/templates/cstat_color_table.tpl');
    94 
     175                    dirname(__FILE__).'/templates/cstat_color_table.tpl');
     176
     177      switch(count($colorTable))
     178      {
     179        case 12;
     180          $break=4;
     181          $size=10;
     182          break;
     183        case 15;
     184          $break=5;
     185          $size=10;
     186          break;
     187        case 18;
     188          $break=6;
     189          $size=5;
     190          break;
     191        case 20;
     192          $break=5;
     193          $size=10;
     194          break;
     195        case 24;
     196          $break=6;
     197          $size=5;
     198          break;
     199        case 30;
     200          $break=6;
     201          $size=5;
     202          break;
     203        case 36;
     204          $break=6;
     205          $size=5;
     206          break;
     207        case 45;
     208          $break=9;
     209          $size=3;
     210          break;
     211      }
     212
     213      $colors=Array();
    95214      $nbHue=count($colorTable);
    96215      $nbStep=count($colorTable[0]);
    97       $colors=Array();
    98       for($step=0;$step<$nbStep;$step++)
    99       {
    100         $row=Array();
    101         for($hue=0;$hue<$nbHue;$hue++)
    102         {
    103 
    104           if($colorTable[$hue][$step] instanceof HSV)
     216      $col=0;
     217      $row=0;
     218      foreach($colorTable as $key => $hue)
     219      {
     220        $lrow=0;
     221        foreach($hue as $key2 => $saturation)
     222        {
     223          $lcol=0;
     224          foreach($saturation as $key3 => $value)
    105225          {
    106             $row[]=Array('color' => $colorTable[$hue][$step]->getRGB()->getHexString(), 'pct' => "", 'num' => "");
     226            //if(!($col!=0 and $hsv['V']==0) and !($row!=0 and $hsv['S']==0))
     227            $trow=$lcol+$col*$nbStep;
     228            $tcol=$lrow+$row*$nbStep;
     229
     230            if($colorTable[$key][$key2][$key3] instanceof HSV)
     231            {
     232              $colors[$tcol][$trow]=Array('color' => $colorTable[$key][$key2][$key3]->getRGB()->getHexString(), 'pct' => "", 'num' => "");
     233            }
     234            elseif(is_array($colorTable[$key][$key2][$key3]))
     235            {
     236              $colors[$tcol][$trow]=Array(
     237                'color' => (array_key_exists('color', $colorTable[$key][$key2][$key3]))?$colorTable[$key][$key2][$key3]['color']:"",
     238                'pct' => (array_key_exists('pct', $colorTable[$key][$key2][$key3]))?$colorTable[$key][$key2][$key3]['pct']:"",
     239                'num' => (array_key_exists('num', $colorTable[$key][$key2][$key3]))?$colorTable[$key][$key2][$key3]['num']:"",
     240              );
     241            }
     242            else
     243            {
     244              $colors[$tcol][$trow]=Array('color' => $colorTable[$key][$key2][$key3], 'pct' => "", 'num' => "");
     245            }
     246            $lcol++;
    107247          }
    108           elseif(is_array($colorTable[$hue][$step]))
    109           {
    110             $row[]=Array(
    111               'color' => (array_key_exists('color', $colorTable[$hue][$step]))?$colorTable[$hue][$step]['color']:"",
    112               'pct' => (array_key_exists('pct', $colorTable[$hue][$step]))?$colorTable[$hue][$step]['pct']:"",
    113               'num' => (array_key_exists('num', $colorTable[$hue][$step]))?$colorTable[$hue][$step]['num']:"",
    114             );
    115           }
    116           else
    117           {
    118             $row[]=Array('color' => $colorTable[$hue][$step], 'pct' => "", 'num' => "");
    119           }
    120         }
    121         $colors[]=$row;
    122         unset($row);
    123       }
    124 
    125       $data=array(
    126         'colorTable' => $colors,
    127         'size' => $size,
    128         'id' => $id,
    129         'class' => $class
    130       );
    131 
    132       $template->assign('data', $data);
    133       unset($data);
    134 
    135       return($template->parse('color_table_page', true));
    136     }
    137 
    138     /**
    139      * return HTML code for a given colors list
    140      *
    141      * @param Array $colors : list of colors
    142      * @param Int $size     : size for colorbox in the HTML table
    143      * @return String : HTML code
    144      */
    145     public function htmlColorList($colorList, $split=8, $size=5, $id="", $class="", $br='<br>')
    146     {
    147       global $template;
    148 
    149       $template->set_filename('color_table_page',
    150                     dirname($this->getFileLocation()).'/templates/cstat_color_table.tpl');
    151 
    152       $colors=Array();
    153 
    154       $row=0;
    155       $num=0;
    156       foreach($colorList as $key => $val)
    157       {
    158         $colors[$row][]=Array('color' => $key, 'pct' => $val['pct'], 'num' => "");
    159         $num++;
    160         if($num==$split)
    161         {
    162           $num=0;
     248          $lrow++;
     249        }
     250
     251        $col++;
     252        if($col==$break)
     253        {
     254          $col=0;
    163255          $row++;
    164256        }
     
    180272
    181273    /**
     274     * return HTML code for a given colors list
     275     *
     276     * @param Array $colors : list of colors
     277     * @param Int $size     : size for colorbox in the HTML table
     278     * @return String : HTML code
     279     */
     280    static public function htmlColorList($colorList, $split=8, $size=5, $id="", $class="", $br='<br>')
     281    {
     282      global $template;
     283
     284      $template->set_filename('color_table_page',
     285                    dirname(__FILE__).'/templates/cstat_color_table.tpl');
     286
     287      $colors=Array();
     288
     289      $row=0;
     290      $num=0;
     291      foreach($colorList as $key => $val)
     292      {
     293        $colors[$row][]=Array('color' => $key, 'pct' => $val['pct'], 'num' => "");
     294        $num++;
     295        if($num==$split)
     296        {
     297          $num=0;
     298          $row++;
     299        }
     300      }
     301
     302      $data=array(
     303        'colorTable' => $colors,
     304        'size' => $size,
     305        'id' => $id,
     306        'class' => $class,
     307        'br' => $br,
     308      );
     309
     310      $template->assign('data', $data);
     311      unset($data);
     312
     313      return($template->parse('color_table_page', true));
     314    }
     315
     316    /**
    182317     * returns an array of colors & colors percent of an image
    183318     *
     
    185320     * @return Array('colors' => Array(), 'colors_pct' => Array())
    186321     */
    187     public function getImageColors($imageId)
     322    static public function getImageColors($imageId)
    188323    {
    189324      $returned=Array(
     
    193328
    194329      $sql="SELECT colors, colors_pct
    195             FROM ".$this->tables['images']."
     330            FROM ".self::$tables['images']."
    196331            WHERE image_id='".$imageId."'";
    197332      $result=pwg_query($sql);
     
    208343
    209344
    210 
    211345    /**
    212346     *  return all HTML&JS code necessary to display a dialogbox to choose
    213347     *  colors
    214348     */
    215     protected function dialogBoxColor()
     349    static public function dialogBoxColor()
    216350    {
    217351      global $template;
    218352
    219353      $template->set_filename('colors_choose',
    220                     dirname($this->getFileLocation()).'/templates/cstat_dialog_colors_choose.tpl');
    221 
    222       $colorTable=$this->getColorTableWithStat();
     354                    dirname(__FILE__).'/templates/cstat_dialog_colors_choose.tpl');
     355
     356      $colorTable=CStat_functions::getColorTableWithStat();
    223357
    224358      $datas=Array(
    225         'colorTable' => $this->htmlColorTable(
     359        'colorTable' => CStat_functions::htmlColorTable(
    226360                          $colorTable,
    227                           ($this->config['analyze_colorTable']=='small')?16:8,
     361                          (self::$config['analyze_colorTable']=='small')?16:8,
    228362                          "",
    229363                          "color0px"
     
    240374
    241375    /**
    242      * return a color table with stat on color
    243      *
    244      * @return Array : a color table with statistics on colors
    245      */
    246     protected function getColorTableWithStat()
    247     {
    248       $generalStats=$this->getGeneralStats();
    249 
    250       $colors=Array();
    251       $sql="SELECT color_id, num_images, num_pixels
    252             FROM ".$this->tables['color_table']."
    253             WHERE num_images > 0
    254             ORDER BY color_id ";
     376     * returns general stats on the analyzed colors process
     377     *
     378     * @return Array : array with keys
     379     *                  'nbImages',  'timeMax',  'timeMin', 'timeSum',
     380     *                  'pixelsAnalyzedMax', 'pixelsAnalyzedMin',
     381     *                  'pixelsAnalyzedAvg', 'pixelsAnalyzedSum', 'totalPixels',
     382     *                  'ppsMax', 'ppsMin', 'ppsAvg', 'qualityMax',
     383     *                  'qualityMin', 'qualityAvg'
     384     */
     385    static public function getGeneralStats()
     386    {
     387      $returned=Array(
     388        'nbImages' => 0,
     389        'timeMax' => 0,
     390        'timeMin' => 0,
     391        'timeSum' => 0,
     392        'pixelsAnalyzedMax' => 0,
     393        'pixelsAnalyzedMin' => 0,
     394        'pixelsAnalyzedAvg' => 0,
     395        'pixelsAnalyzedSum' => 0,
     396        'totalPixels' => 0,
     397        'ppsMax' => 0,
     398        'ppsMin' => 0,
     399        'ppsAvg' => 0,
     400        'qualityMax' => 0,
     401        'qualityMin' => 0,
     402        'qualityAvg' => 0,
     403      );
     404      $sql="SELECT COUNT(image_id) AS nbImages,
     405                   MAX(time) AS timeMax,
     406                   MIN(time) AS timeMin,
     407                   SUM(time) AS timeSum,
     408                   MAX(analyzed_pixels) AS pixelsAnalyzedMax,
     409                   MIN(analyzed_pixels) AS pixelsAnalyzedMin,
     410                   AVG(analyzed_pixels) AS pixelsAnalyzedAvg,
     411                   SUM(analyzed_pixels) AS pixelsAnalyzedSum,
     412                   SUM(num_pixels) AS totalPixels,
     413                   MAX(pps) AS ppsMax,
     414                   MIN(pps) AS ppsMin,
     415                   AVG(pps) AS ppsAvg,
     416                   MAX(quality) AS qualityMax,
     417                   MIN(quality) AS qualityMin,
     418                   AVG(quality) AS qualityAvg
     419            FROM ".self::$tables['images']."
     420            WHERE analyzed='y';";
    255421      $result=pwg_query($sql);
    256422      if($result)
     
    258424        while($row=pwg_db_fetch_assoc($result))
    259425        {
    260           $colors[$row['color_id']]=Array('num_images' => $row['num_images'], 'num_pixels' => $row['num_pixels']);
    261         }
    262       }
    263 
    264       $colorTable=ColorStat::getColorTable(
    265         $this->colorTableSize[$this->config['analyze_colorTable']][0],
    266         $this->colorTableSize[$this->config['analyze_colorTable']][1]
    267       );
    268       foreach($colorTable as $key=>$val)
    269       {
    270         foreach($val as $key2=>$val2)
    271         {
    272           $rgb=$val2->getRGB()->getHexString();
    273           $colorTable[$key][$key2]=Array(
    274             'color' => $rgb,
    275             'pct'   => '', //(array_key_exists($rgb, $colors))?sprintf("%.2f", round(100*$colors[$rgb]['num_pixels']/$generalStats['pixelsAnalyzedSum'],2)):"",
    276             'num'   => (array_key_exists($rgb, $colors))?$colors[$rgb]['num_images']:"",
    277           );
    278         }
    279       }
    280 
    281       unset($colors);
    282       return($colorTable);
    283     }
    284 
    285 
    286 
    287 
    288 
    289     /* ---------------------------------------------------------------------------
    290       ajax functions
    291     --------------------------------------------------------------------------- */
    292 
    293 
    294   } //class
     426          $returned=$row;
     427        }
     428      }
     429      return($returned);
     430    }
     431
     432  } //CStat_functions
    295433
    296434?>
  • extensions/ColorStat/language/fr_FR/plugin.lang.php

    r6107 r6176  
    2323Travailler sur une gamme réduite de couleurs augmente la probabilité de référencer des teintes minoritaires. Ceci a pour avantage de permettre d'effectuer des recherches sur des gammes de couleurs plus larges.
    2424
    25 En contrepartie, la variation des nuances étant plus réduite, la pertinence des résultats lors de la recherche sur une couleur particulière peut s'avérer peu probante.";
     25En contrepartie, la variation des nuances étant plus réduite, la pertinence des résultats lors de la recherche sur une couleur peut s'avérer étonnante, notamment sur les images peu saturées.";
    2626$lang['cstat_help_large_color_table'] = "
    2727Travailler sur une gamme élargie de couleurs permet de disposer d'un nombre accru de nuances pour une teinte donnée. Ceci a pour avantage de permettre d'affiner les recherches sur une gamme de couleurs plus précise et augmenter ainsi la pertinence des résultats.
     
    7979$lang['cstat_color_already_choosen']='La couleur est déjà sélectionnée dans la liste';
    8080$lang['cstat_add_colors']='Ajouter une sélection de couleurs';
    81 $lang['cstat_clear_colors']='Réinitialiser les critères';
    82 $lang['cstat_do_modify_request']='Modifier la recherche';
    83 $lang['cstat_search_criterion'] = 'Critères de recherche';
    84 $lang['cstat_number_of_item_found']='Nombre d\'images trouvées';
    85 $lang['cstat_result_query']='Résultat de la recherche';
     81
    8682
    8783$lang['cstat_config']='Configuration';
  • extensions/ColorStat/main.inc.php

    r6107 r6176  
    7878  //CStat admin interface loaded and active only if in admin page
    7979  include_once("cstat_aim.class.inc.php");
     80  CStat_functions::init($prefixeTable);
    8081  $obj=new CStat_AIM($prefixeTable, __FILE__);
    8182  $obj->initEvents();
  • extensions/ColorStat/templates/cstat_color_table.tpl

    r6107 r6176  
    44    {foreach from=$row item=col}
    55    <td id="cellColor_{$col.color}" style="width:{$data.size}px;height:{$data.size}px;background-color:#{$col.color};{if $col.num!=''}cursor:pointer;{/if}" class="tiptip {if $col.num!=''}csSelectable{/if}"
    6         title="{'cstat_color'|@translate}&nbsp;#{$col.color}{if $col.num!=''}&nbsp;:&nbsp;{$col.num}&nbsp;{'cstat_images'|@translate}{/if}{if $col.pct!=''} {$data.br} {'cstat_surface'|@translate}&nbsp;{$col.pct}%{/if}">
     6        title="<table><tr style='vertical-align:middle;'><td><div style='display:inline-block;width:18px;height:18px;background-color:#{$col.color};'></div></td><td style='display:inline-block;'>{'cstat_color'|@translate}&nbsp;#{$col.color}{if $col.num!=''}&nbsp;:&nbsp;{$col.num}&nbsp;{'cstat_images'|@translate}{/if}{if $col.pct!=''} {$data.br} {'cstat_surface'|@translate}&nbsp;{$col.pct}%{/if}</td></tr></table>">
    77    </td>
    88    {/foreach}
  • extensions/ColorStat/templates/cstat_dialog_colors_choose.tpl

    r6107 r6176  
    300300{/literal}
    301301
    302 <div id="iDialogColorChoose">
     302<div id="iDialogColorChoose" style='display:none;'>
    303303  <table style="padding-top:8px;">
    304304    <tr>
     
    320320</div>
    321321
    322 <script type="text/javascript">
    323  var colorBox=new dialogChooseColorBox();
    324 </script>
     322
Note: See TracChangeset for help on using the changeset viewer.