. */ require_once(RYAPI_PATH.'data/ryzom/sbrick_db.php'); require_once(RYAPI_PATH.'data/ryzom/items_db.php'); $ryzom_item_icon_path = RYAPI_PATH.'data/ryzom/interface/'; // return TRUE if $bg was modified, FALSE if not // ryzom_item_icon_colorize if needed, apply mask if needed and mask color is set function ryzom_item_icon_load_image($bg, $fileName, $color=-1, $mColor=-1){ if(!file_exists($fileName) || is_dir($fileName)){ // requested fileName not found or it points to directory return false; } $im = @imagecreatefrompng($fileName); if($im===false){ return false; } imagesavealpha($im, true); $im_w=imagesx($im); $im_h=imagesy($im); $bg_w=imagesx($bg); $bg_h=imagesy($bg); if($color != -1) { $im=ryzom_item_icon_colorize($im, ($color >> 24) & 255, $color&255, ($color>>8)&255, ($color >> 16)&255); }elseif(/*$rzColor*/1 != -1){ $mask_file=str_replace('.png', '_mask.png', $fileName); if(file_exists($mask_file)){ $mask = imagecreatefrompng($mask_file); if($mask!==false){ imagesavealpha($mask, true); $mask=ryzom_item_icon_colorize($mask, ($mColor >> 24) & 255, $mColor&255, ($mColor>>8)&255, ($mColor >> 16)&255); imagecopy($im, $mask, 0, 0, 0, 0, $im_w, $im_h); imagedestroy($mask); } } } if($bg_w<$im_w){ // resize source image to background image (make it smaller) imagecopyresized($bg, $im, 0, 0, 0, 0, $bg_w, $bg_h, $im_w, $im_h); }else{ // center to background, but do not resize $pad_x=($bg_w-$im_w)/2; $pad_y=($bg_h-$im_h)/2; imagecopy($bg, $im, $pad_x, $pad_y, 0, 0, $im_w, $im_h); } imagedestroy($im); return true; } function ryzom_item_icon_colorize($im, $ca, $cr, $cg, $cb){ $w=imagesx($im); $h=imagesy($im); $out = imagecreatetruecolor($w, $h); imagealphablending($out, false); $black=imagecolorallocate($out, 0, 0, 0); imagefill($out, 0, 0, $black); for($y=0;$y<$h;$y++){ for($x=0;$x<$w;$x++){ $rgba= imagecolorat($im, $x, $y); $sa = ($rgba>>24)&255; $sr = ($rgba>>16)&255; $sg = ($rgba>>8)&255; $sb = ($rgba>>0)&255; $r=$cr*$sr/255; $g=$cg*$sg/255; $b=$cb*$sb/255; $c=imagecolorallocatealpha($out, $r, $g, $b, $sa); imagesetpixel($out, $x, $y, $c); } } return $out; } function ryzom_item_icon_image_typo_width($txt){ global $ryzom_item_icon_path; $x=0; for($i=0;$i array(233,22,0,255), 1 => array(220,140,50,255), 2 => array(170,250,0,255), 3 => array(0,215,120,255), 4 => array(50,100,255,255), 5 => array(170,55,110,255), 6 => array(250,250,250,255), 7 => array(80,80,120,255), ); $mask_color = -1; if(isset($color_array[$c])) { $mask_color = $color_array[$c][0] + ($color_array[$c][1] << 8) + ($color_array[$c][2] << 16); } list($bgFile, $bgColor) = split_fname($item['bg']); list($fgFile, $fgColor) = split_fname($item['fg']); list($i1File, $i1Color) = split_fname($item['i1']); list($i2File, $i2Color) = split_fname($item['i2']); // background image $bg=imagecreatetruecolor($w, $h); $transp=imagecolorallocatealpha($bg, 0, 0, 0, 127); imagefill($bg, 0, 0, $transp); imagesavealpha($bg, true); // stack item images on-top of background if(ryzom_item_icon_load_image($bg, $ryzom_item_icon_path.$bgFile, $bgColor, $mask_color)){ // draw background twice making semi-transparent background darker, // but still allowing icons with full transparent backgrounds like ixpca01.sitem (XP crystals) ryzom_item_icon_load_image($bg, $ryzom_item_icon_path.$bgFile, $bgColor, $mask_color); } ryzom_item_icon_load_image($bg, $ryzom_item_icon_path.$fgFile, $fgColor, $mask_color); ryzom_item_icon_load_image($bg, $ryzom_item_icon_path.$i1File, $i1Color, $mask_color); ryzom_item_icon_load_image($bg, $ryzom_item_icon_path.$i2File, $i2Color); if($w==24){// sbrick 24x24 if($q===true){ // sbrick level, bottom-right corner $txt_w=ryzom_item_icon_image_typo_width($item['lvl']); ryzom_item_icon_image_typo($bg, $item['lvl'], $w-$txt_w-1, $h-8, false); } if(!empty($s)){ ryzom_item_icon_image_typo($bg, $s, 1, $h-7, false); // 1px lower than lvl number } }else{ // item, 40x40 // put item name, quality, stack size and sap loar to final image if($label && $item['txt']!=''){ // top right ryzom_item_icon_image_typo($bg, $item['txt'], 1, 0, false); } if($q>0){ // to bottom-right corner ryzom_item_icon_image_typo($bg, $q, 40-strlen($q)*5-1, 32-1, true);// 40-8 } if($s>0){ // bottom-left corner ryzom_item_icon_image_typo($bg, 'x'.$s, 1, 32-1, true);// 40-8 } if($sap>=0){ // top-left corner $im=ryzom_item_icon_load_image($bg, $ryzom_item_icon_path.'sapload.png'); if($im!==false && $sap>=1){ ryzom_item_icon_image_typo($bg, $sap-1, 1, 2, true); } } if($destroyed){ ryzom_item_icon_load_image($bg, $ryzom_item_icon_path.'ico_task_failed.png'); } } imagepng($bg, $filename); return $filename; } function ryzom_item_icon_path($sheetid, $c, $q, $s, $sap, $destroyed, $label) { return RYAPI_PATH.'data/cache/item_icons/'.md5($sheetid.$c.$q.$s.$sap.$destroyed.$label).'.png'; } function ryzom_item_icon($sheetid, $c, $q, $s, $sap, $destroyed, $label) { global $use_cache; $filename = ryzom_item_icon_path($sheetid, $c, $q, $s, $sap, $destroyed, $label); // always use cache if(/*!$use_cache ||*/ !file_exists($filename)) { ryzom_item_icon_generate($filename, $sheetid, $c, $q, $s, $sap, $destroyed, $label); } return file_get_contents($filename); } function ryzom_item_icon_url($sheetid, $c=1, $q=0, $s=0, $sap=-1, $destroyed=false, $label='') { $filename = ryzom_item_icon_path($sheetid, $c, $q, $s, $sap, $destroyed, $label); if (!file_exists($filename)) ryzom_item_icon_generate($filename, $sheetid, $c, $q, $s, $sap, $destroyed, $label); return RYAPI_URL.'data/cache/item_icons/'.md5($sheetid.$c.$q.$s.$sap.$destroyed.$label).'.png'; } ?>