| Conditions | 23 |
| Total Lines | 178 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | <?php |
||
| 20 | public function __construct($img, $resize=1.0, $invert=false, $weight = 0.5, $dither=self::DITHER_ERROR){ |
||
| 21 | $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); |
||
| 22 | if ($ext == 'jpg') $ext = 'jpeg'; |
||
| 23 | $imagecreator = 'imagecreatefrom' . $ext; |
||
| 24 | |||
| 25 | if (!function_exists($imagecreator)) |
||
| 26 | throw new \Exception('Image format not supported.', 1); |
||
| 27 | |||
| 28 | $im = $imagecreator($img); |
||
| 29 | $w = imagesx($im); |
||
| 30 | $h = imagesy($im); |
||
| 31 | |||
| 32 | // Resize image |
||
| 33 | $nw = ceil($resize * $w); |
||
| 34 | $nh = ceil($resize * $h * 0.75); |
||
| 35 | $new_img = imagecreatetruecolor($nw, $nh); |
||
| 36 | imagesavealpha ($new_img, true); |
||
| 37 | imagealphablending ($new_img, false); |
||
| 38 | imagefill ($new_img, 0, 0, imagecolorallocate($new_img, 255, 255, 255)); |
||
| 39 | imagecopyresized ($new_img, $im, 0, 0, 0, 0, $nw, $nh, $w, $h); |
||
| 40 | imagedestroy ($im); |
||
| 41 | $im = $new_img; |
||
| 42 | $w = $nw; $h = $nh; |
||
| 43 | |||
| 44 | // Init Dot Matrix |
||
| 45 | parent::__construct($w, $h); |
||
| 46 | |||
| 47 | // Create the color matrix |
||
| 48 | $color_img_w = ceil($w/2); |
||
| 49 | $color_img_h = ceil($h/4); |
||
| 50 | |||
| 51 | // Lower precision -> faster palette lookup -> uglier colors. |
||
| 52 | $min_color_precision = 20; |
||
| 53 | |||
| 54 | $color_img = imagecreatetruecolor($color_img_w, $color_img_h); |
||
| 55 | imagesavealpha ($color_img, true); |
||
| 56 | imagealphablending ($color_img, false); |
||
| 57 | imagefill ($color_img, 0, 0, imagecolorallocate($color_img, 255, 255, 255)); |
||
| 58 | imagecopyresized ($color_img, $im, 0, 0, 0, 0, $color_img_w, $color_img_h, $w, $h); |
||
| 59 | |||
| 60 | // ANSI 8bit Palette |
||
| 61 | $ansi256palette = [ |
||
| 62 | 0x000000,0x800000,0x008000,0x808000,0x000080,0x800080,0x008080,0xc0c0c0, |
||
| 63 | 0x808080,0xff0000,0x00ff00,0xffff00,0x0000ff,0xff00ff,0x00ffff,0xffffff, |
||
| 64 | 0x000000,0x00005f,0x000087,0x0000af,0x0000d7,0x0000ff,0x005f00,0x005f5f, |
||
| 65 | 0x005f87,0x005faf,0x005fd7,0x005fff,0x008700,0x00875f,0x008787,0x0087af, |
||
| 66 | 0x0087d7,0x0087ff,0x00af00,0x00af5f,0x00af87,0x00afaf,0x00afd7,0x00afff, |
||
| 67 | 0x00d700,0x00d75f,0x00d787,0x00d7af,0x00d7d7,0x00d7ff,0x00ff00,0x00ff5f, |
||
| 68 | 0x00ff87,0x00ffaf,0x00ffd7,0x00ffff,0x5f0000,0x5f005f,0x5f0087,0x5f00af, |
||
| 69 | 0x5f00d7,0x5f00ff,0x5f5f00,0x5f5f5f,0x5f5f87,0x5f5faf,0x5f5fd7,0x5f5fff, |
||
| 70 | 0x5f8700,0x5f875f,0x5f8787,0x5f87af,0x5f87d7,0x5f87ff,0x5faf00,0x5faf5f, |
||
| 71 | 0x5faf87,0x5fafaf,0x5fafd7,0x5fafff,0x5fd700,0x5fd75f,0x5fd787,0x5fd7af, |
||
| 72 | 0x5fd7d7,0x5fd7ff,0x5fff00,0x5fff5f,0x5fff87,0x5fffaf,0x5fffd7,0x5fffff, |
||
| 73 | 0x870000,0x87005f,0x870087,0x8700af,0x8700d7,0x8700ff,0x875f00,0x875f5f, |
||
| 74 | 0x875f87,0x875faf,0x875fd7,0x875fff,0x878700,0x87875f,0x878787,0x8787af, |
||
| 75 | 0x8787d7,0x8787ff,0x87af00,0x87af5f,0x87af87,0x87afaf,0x87afd7,0x87afff, |
||
| 76 | 0x87d700,0x87d75f,0x87d787,0x87d7af,0x87d7d7,0x87d7ff,0x87ff00,0x87ff5f, |
||
| 77 | 0x87ff87,0x87ffaf,0x87ffd7,0x87ffff,0xaf0000,0xaf005f,0xaf0087,0xaf00af, |
||
| 78 | 0xaf00d7,0xaf00ff,0xaf5f00,0xaf5f5f,0xaf5f87,0xaf5faf,0xaf5fd7,0xaf5fff, |
||
| 79 | 0xaf8700,0xaf875f,0xaf8787,0xaf87af,0xaf87d7,0xaf87ff,0xafaf00,0xafaf5f, |
||
| 80 | 0xafaf87,0xafafaf,0xafafd7,0xafafff,0xafd700,0xafd75f,0xafd787,0xafd7af, |
||
| 81 | 0xafd7d7,0xafd7ff,0xafff00,0xafff5f,0xafff87,0xafffaf,0xafffd7,0xafffff, |
||
| 82 | 0xd70000,0xd7005f,0xd70087,0xd700af,0xd700d7,0xd700ff,0xd75f00,0xd75f5f, |
||
| 83 | 0xd75f87,0xd75faf,0xd75fd7,0xd75fff,0xd78700,0xd7875f,0xd78787,0xd787af, |
||
| 84 | 0xd787d7,0xd787ff,0xd7af00,0xd7af5f,0xd7af87,0xd7afaf,0xd7afd7,0xd7afff, |
||
| 85 | 0xd7d700,0xd7d75f,0xd7d787,0xd7d7af,0xd7d7d7,0xd7d7ff,0xd7ff00,0xd7ff5f, |
||
| 86 | 0xd7ff87,0xd7ffaf,0xd7ffd7,0xd7ffff,0xff0000,0xff005f,0xff0087,0xff00af, |
||
| 87 | 0xff00d7,0xff00ff,0xff5f00,0xff5f5f,0xff5f87,0xff5faf,0xff5fd7,0xff5fff, |
||
| 88 | 0xff8700,0xff875f,0xff8787,0xff87af,0xff87d7,0xff87ff,0xffaf00,0xffaf5f, |
||
| 89 | 0xffaf87,0xffafaf,0xffafd7,0xffafff,0xffd700,0xffd75f,0xffd787,0xffd7af, |
||
| 90 | 0xffd7d7,0xffd7ff,0xffff00,0xffff5f,0xffff87,0xffffaf,0xffffd7,0xffffff, |
||
| 91 | 0x080808,0x121212,0x1c1c1c,0x262626,0x303030,0x3a3a3a,0x444444,0x4e4e4e, |
||
| 92 | 0x585858,0x606060,0x666666,0x767676,0x808080,0x8a8a8a,0x949494,0x9e9e9e, |
||
| 93 | 0xa8a8a8,0xb2b2b2,0xbcbcbc,0xc6c6c6,0xd0d0d0,0xdadada,0xe4e4e4,0xeeeeee |
||
| 94 | ]; |
||
| 95 | |||
| 96 | $colormap = []; |
||
| 97 | foreach ($ansi256palette as $rgb) $colormap[] = [ |
||
| 98 | ($rgb >> 16) & 0xFF, |
||
| 99 | ($rgb >> 8) & 0xFF, |
||
| 100 | ($rgb) & 0xFF |
||
| 101 | ]; |
||
| 102 | $ansi256palette = $colormap; |
||
| 103 | $colormap = []; |
||
|
|
|||
| 104 | |||
| 105 | // Find nearest match of passed RGB with ANSI palette |
||
| 106 | $nearest = function($rgb) use ($ansi256palette, $min_color_precision){ |
||
| 107 | $best = 0; $dist = 10000; |
||
| 108 | foreach ($ansi256palette as $idx => $a) { |
||
| 109 | $d = sqrt( |
||
| 110 | pow($rgb['red']-$a[0],2) + pow($rgb['green']-$a[1],2) + pow($rgb['blue']-$a[2],2) |
||
| 111 | ); |
||
| 112 | if($d < $dist) { |
||
| 113 | $dist = $d; |
||
| 114 | $best = $idx; |
||
| 115 | if($d <= $min_color_precision) break; |
||
| 116 | } |
||
| 117 | } |
||
| 118 | return $best; |
||
| 119 | }; |
||
| 120 | |||
| 121 | // Read colors |
||
| 122 | $c = $this->colors; |
||
| 123 | for($y = $color_img_h; $y--;){ |
||
| 124 | $y0 = $y * $color_img_w; |
||
| 125 | for($x = $color_img_w; $x-- ;){ |
||
| 126 | $c[ $y0 + $x ] = $nearest(imagecolorsforindex($color_img,imagecolorat($color_img, $x, $y))); |
||
| 127 | } |
||
| 128 | } |
||
| 129 | $this->colors = $c; |
||
| 130 | imagedestroy($color_img); |
||
| 131 | |||
| 132 | // Invert image for dark backgrounds |
||
| 133 | if ($invert) imagefilter($im, IMG_FILTER_NEGATE); |
||
| 134 | |||
| 135 | |||
| 136 | $pixels = new \SplFixedArray($w * $h); |
||
| 137 | for($y = $h ; $y-- ;){ |
||
| 138 | for($x = $w, $y0 = $y * $w ; $x-- ;){ |
||
| 139 | $pixels[$x + $y0] = imagecolorat($im, $x, $y); |
||
| 140 | } |
||
| 141 | } |
||
| 142 | imagedestroy($im); |
||
| 143 | |||
| 144 | $m = $this->matrix; |
||
| 145 | switch($dither){ |
||
| 146 | |||
| 147 | // Threshold 1-bit quantization |
||
| 148 | case self::DITHER_NONE: |
||
| 149 | default: |
||
| 150 | $tresh = (0xffffff * $weight) & 0xffffff; |
||
| 151 | $b = $invert?1:0; |
||
| 152 | for ($y=0; $y < $h; $y++){ |
||
| 153 | $y0 = $y * $w; $y1 = $y0 + $w; $y2 = $y1 + $w; |
||
| 154 | for ($x=0; $x < $w; $x++) { |
||
| 155 | $idx = $x + $y0; |
||
| 156 | $m[$idx] = $pixels[$idx]<=$tresh?$pixels[$idx]:$b; |
||
| 157 | } |
||
| 158 | } |
||
| 159 | break; |
||
| 160 | |||
| 161 | // Dither image with 1-bit Atkinson Dithering |
||
| 162 | // Adapted from : https://gist.github.com/lordastley/1342627 |
||
| 163 | case self::DITHER_ERROR: |
||
| 164 | $tresh = (0xffffff * $weight) & 0xffffff; |
||
| 165 | for ($y=0; $y < $h; $y++){ |
||
| 166 | $y0 = $y * $w; $y1 = $y0 + $w; $y2 = $y1 + $w; |
||
| 167 | for ($x=0; $x < $w; $x++) { |
||
| 168 | $idx = $x + $y0; |
||
| 169 | $old = $pixels[$idx]; |
||
| 170 | |||
| 171 | if ($old > $tresh){ |
||
| 172 | $error_diffusion = ($old - 0xffffff) >> 3; |
||
| 173 | } else { |
||
| 174 | $error_diffusion = $old >> 3; |
||
| 175 | $m[$idx] = $old; |
||
| 176 | } |
||
| 177 | |||
| 178 | |||
| 179 | $x1 = $x + 1; $x2 = $x + 2; $x_1 = $x - 1; |
||
| 180 | |||
| 181 | foreach([ |
||
| 182 | $x1 + $y0, |
||
| 183 | $x2 + $y0, |
||
| 184 | $x_1 + $y1, |
||
| 185 | $x + $y1, |
||
| 186 | $x1 + $y1, |
||
| 187 | $x + $y2, |
||
| 188 | ] as $ofs) { |
||
| 189 | if (isset($pixels[$ofs])) $pixels[$ofs] += $error_diffusion; |
||
| 190 | } |
||
| 191 | } |
||
| 192 | } |
||
| 193 | |||
| 194 | break; |
||
| 195 | } |
||
| 196 | |||
| 197 | } |
||
| 198 | |||
| 199 | } |
This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.
Both the
$myVarassignment in line 1 and the$higherassignment in line 2 are dead. The first because$myVaris never used and the second because$higheris always overwritten for every possible time line.