@ 2015-12-10T15:21:43Z <?php
class Image{
public $filepath;
public $width;
public $height;
public $mime;
public $landscape;
public $imageFunct;
public $compression;
// Image resource identifier
private $image;
// Is it a temporary image
private $isTemp;
/**
* constructor
* @param type $fp
* @param type $isTemp - if true, will delete the image file on the destroy call
* @throws Exception
*/
public function __construct($fp, $isTemp = false){
// Make sure file exists
if(!file_exists($fp)) throw new Exception("Image source file does not exist: $fp");
$this->isTemp = $isTemp;
$this->filepath = $fp;
$data = getimagesize($fp);
$this->width = $data[0];
$this->height = $data[1];
$this->landscape = $this->width > $this->height;
$this->mime = $data['mime'];
switch($this->mime){
case("image/png"):
$this->image = imagecreatefrompng($this->filepath);
imagealphablending($this->image, false);
imagesavealpha($this->image, true);
$this->imageFunct = 'imagepng';
$this->compression = 9;
break;
case('image/jpeg'):
case('image/pjpeg'):
case('image/x-jps'):
$this->image = imagecreatefromjpeg($this->filepath);
$this->imageFunct = 'imagejpeg';
$this->compression = 100;
break;
case('image/gif'):
$this->image = imagecreatefromgif($this->filepath);
imagealphablending($this->image, false);
imagesavealpha($this->image, true);
$this->imageFunct = 'imagegif';
break;
default:
throw new Exception("Invalid image type. Only excepts PNG, JPG, and GIF. You entered a {$this->mime} type image.");
}
}
/**
* scales the image to cover the dimensions provided
* @param type $width (of canvas)
* @param type $height (of canvas)
*/
public function scale($width, $height, $cover='fill'){
// Get new dimensions
$imgRatio = $this->height/$this->width;
$canvasRatio = $height/$width;
if(
($canvasRatio > $imgRatio && $cover=='fill') ||
($canvasRatio <= $imgRatio && $cover!='fill')
){
$finalHeight = $height;
$scale = $finalHeight / $this->height;
$finalWidth = $this->width * $scale;
}else{
$finalWidth = $width;
$scale = $finalWidth / $this->width;
$finalHeight = $this->height * $scale;
}
// Resize the image
$thumb = imagecreatetruecolor($finalWidth, $finalHeight);
imagealphablending($thumb, false);
imagesavealpha($thumb, true);
imagecopyresampled($thumb, $this->image, 0, 0, 0, 0, $finalWidth, $finalHeight, $this->width, $this->height);
$this->resize($finalWidth, $finalHeight);
$this->width = $finalWidth;
$this->height = $finalHeight;
}
/**
* scales the image to cover the dimensions provided
* @param type $width (of canvas)
* @param type $height (of canvas)
*/
public function resize($width, $height){
// Resize the image
$thumb = imagecreatetruecolor($width, $height);
imagealphablending($thumb, false);
imagesavealpha($thumb, true);
imagecopyresampled($thumb, $this->image, 0, 0, 0, 0, $width, $height, $this->width, $this->height);
$this->image = $thumb;
$this->width = $width;
$this->height = $height;
}
/**
* tile the image to the provided dimensions
* @param type $width
* @param type $height
* @param type $output_mimetype
*/
public function tile($width, $height){
// Our output image to be created
$out = imagecreatetruecolor($width, $this->height);
imagealphablending($out, false);
imagesavealpha($out, true);
// Tile that shit horiz
$curr_x = 0;
while($curr_x < $width){
imagecopy($out, $this->image, $curr_x, 0, 0, 0, $this->width, $this->height);
$curr_x += $this->width;
}
// our final output image to be created
$thumb = imagecreatetruecolor($width, $height);
imagealphablending($thumb, false);
imagesavealpha($thumb, true);
// Tile that shit vert
$curr_y = 0;
while($curr_y < $height){
imagecopy($thumb, $out, 0, $curr_y, 0, 0, $width, $this->height);
$curr_y += $this->height;
}
imagedestroy($out);
$this->image = $thumb;
}
/**
* Reverse all colors of the image
*/
public function reverseColors(){
return imagefilter($this->image, IMG_FILTER_NEGATE);
}
/**
* Convert image to greyscale
*/
public function greyScale(){
return imagefilter($this->image, IMG_FILTER_GRAYSCALE);
}
/**
* Adjust brightness level. (between 255 and -255)
* @param type $brightness
*/
public function adjustBrightness($brightness){
if($brightness > 255) $brightness = 255;
if($brightness < -255) $brightness = -255;
return imagefilter($this->image, IMG_FILTER_BRIGHTNESS, $brightness);
}
/**
* Adjust the contrast level
* @param int $contrast
*/
public function adjustContrast($contrast){
return imagefilter($this->image, IMG_FILTER_CONTRAST, $contrast);
}
/**
* Turns on edgeDetect Filter
*/
public function edgeDetect(){
return imagefilter($this->image, IMG_FILTER_EDGEDETECT);
}
/**
* Turns on emboss Filter
*/
public function emboss(){
return imagefilter($this->image, IMG_FILTER_EMBOSS);
}
/**
* Turns on gaussianBlur Filter
*/
public function gaussianBlur(){
return imagefilter($this->image, IMG_FILTER_GAUSSIAN_BLUR);
}
/**
* Turns on selectiveBlur Filter
*/
public function selectiveBlur(){
return imagefilter($this->image, IMG_FILTER_SELECTIVE_BLUR);
}
/**
* Turns on sketch Filter
*/
public function sketch(){
return imagefilter($this->image, IMG_FILTER_MEAN_REMOVAL);
}
/**
* Adds a vignette
*/
function vignette(){
for($x = 0; $x < imagesx($this->image); ++$x){
for($y = 0; $y < imagesy($this->image); ++$y){
$index = imagecolorat($this->image, $x, $y);
$rgb = imagecolorsforindex($this->image, $index);
$sharp = 0.4; // 0 - 10 small is sharpnes,
$level = 0.7; // 0 - 1 small is brighter
$l = sin(M_PI / $this->width * $x) * sin(M_PI / $this->height * $y);
$l = pow($l, $sharp);
$l = 1 - $level * (1 - $l);
$rgb['red'] *= $l;
$rgb['green'] *= $l;
$rgb['blue'] *= $l;
$color = imagecolorallocate($this->image, $rgb['red'], $rgb['green'], $rgb['blue']);
imagesetpixel($this->image, $x, $y, $color);
}
}
return true;
}
/**
* Pixelate the image
* @param type $blocksize
* @param type $advanced
*/
public function pixelate($blocksize, $advanced=true){
return imagefilter($this->image, IMG_FILTER_PIXELATE, $blocksize, $advanced);
}
/**
* Adjust smoothness level
* @param type $level
*/
public function adjustSmoothness($level){
return imagefilter($this->image, IMG_FILTER_SMOOTH, $level);
}
/**
* Colorize an image
* @param type $hexColor
*/
public function colorize($hexColor, $alpha){
list($r, $g, $b) = self::convertHexColor($hexColor);
if($alpha < 0) $alpha = 0;
if($alpha > 127) $alpha = 127;
return imagefilter($this->image, IMG_FILTER_COLORIZE, $r, $g, $b, $alpha);
}
/**
* Outputs the image directly to the browser
* @param type $output_mimetype ("png", "jpg", or "gif")
* (defaults to the original image's mimtype)
*/
public function output($output_mimetype = null){
// Get output details
list($mimetype, $funct, $compression) = $this->getOutputDetails($output_mimetype);
// Output and clear memory
header('Content-Type: '.$mimetype);
// Get and call the image creation funtion
$funct($this->image, null, $compression);
}
/**
* Destroys the generated image to free up resources,
* Delete the file if it's a temporary file.
* should be the last method called as the object is unusable after this.
*/
public function destroy(){
imagedestroy($this->image);
if($this->isTemp) unlink($this->filepath);
}
/**
* Crops the image to the given dimensions, at the given starting point
* defaults to the top left
* @param type $width
* @param type $height
* @param type $x
* @param type $y
*/
public function crop($new_width, $new_height, $x = 0, $y = 0){
// Get dimensions
$width = imagesx($this->image);
$height = imagesy($this->image);
// Make the dummy image that will become the new image
$newImg = imagecreatetruecolor($new_width, $new_height);
// Fill with transparent background
imagealphablending($newImg, false);
imagesavealpha($newImg, true);
$transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
imagefilledrectangle($newImg, 0, 0, $new_width, $new_height, $transparent);
// Copy the pixels to the new image
imagecopy($newImg, $this->image, 0, 0, 0, 0, $width, $height);
$this->image = $newImg;
$this->width = $width;
$this->height = $height;
}
/**
* Create an image from a base64 string
* @param type $string
* @return \Image
*/
public static function createFromBase64($string){
// decode base64 string
$imgData = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $string));
// create the image resource
$formImage = imagecreatefromstring($imgData);
// Fill with transparent background
imagealphablending($formImage, false);
imagesavealpha($formImage, true);
$transparent = imagecolorallocatealpha($formImage, 255, 255, 255, 127);
imagefill($formImage, 0, 0, $transparent);
// Save the image to a temp png file to use in our constructor
$tmpname = tempnam('/tmp', 'IMG');
// Generate and save image
imagepng($formImage, $tmpname, 9);
// Return an instance of the class
$img = new Image($tmpname, true);
return $img;
}
/**
* Make an image of text
* @param type $text
* @param type $size
* @param type $color
* @param type $font
*/
public static function createTextImage($text, $font_size, $color, $font_file, $wrap_width = false){
// Make sure font file exists
//if(!file_exists($font_file)) throw new Exception("Font file does not exist: {$font_file}");
// Generate wrapping text
if(is_numeric($wrap_width) && $wrap_width != 0)
$text = self::wrapText($font_size, $font_file, $text, $wrap_width);
// Retrieve bounding box:
$type_space = imagettfbbox($font_size, 0, $font_file, $text);
// Determine image width and height, 10 pixels are added for 5 pixels padding:
$image_width = abs($type_space[4] - $type_space[0]) + 10;
$image_height = abs($type_space[5] - $type_space[1]) + 10;
$line_height = self::getLineHeight($font_size, $font_file) +10;
// Create image:
$image = imagecreatetruecolor($image_width, $image_height);
// Allocate text and background colors (RGB format):
$text_color = self::getColor($image, $color);
// Fill with transparent background
imagealphablending($image, false);
imagesavealpha($image, true);
$transparent = imagecolorallocatealpha($image, 255, 255, 255, 127);
imagefill($image, 0, 0, $transparent);
// Fix starting x and y coordinates for the text:
$x = 5; // Padding of 5 pixels.
$y = $line_height - 5; // So that the text is vertically centered.
// Add TrueType text to image:
imagettftext($image, $font_size, 0, $x, $y, $text_color, $font_file, $text);
// Save the image to a temp png file to use in our constructor
$tmpname = tempnam('/tmp', 'IMG');
// Generate and save image
imagepng($image, $tmpname, 9);
// Return an instance of the class
$img = new Image($tmpname, true);
$img->crop($image_width, $image_height);
return $img;
}
/**
* Get output information
* @param type $output_mimetype
* @return array($mimetype, $output_funct, $compression)
*/
private function getOutputDetails($output_mimetype){
switch(strtoupper($output_mimetype)){
case('JPG'):
case('JPEG'):
$mimetype = 'image/jpeg';
$funct = 'imagejpeg';
$compression = 100;
break;
case('PNG'):
$mimetype = 'image/png';
$funct = 'imagepng';
$compression = 9;
break;
case('GIF'):
$mimetype = 'image/gif';
$funct = 'imagegif';
$compression = null;
break;
default:
$mimetype = $this->mime;
$funct = $this->imageFunct;
$compression = $this->compression;
}
return array($mimetype, $funct, $compression);
}
private static function convertHexColor($hex){
// Remove the # if therre is one
$hex = str_replace("#", "", $hex);
// Convert the hex to rgb
if(strlen($hex) == 3){
$r = hexdec(substr($hex, 0, 1) . substr($hex, 0, 1));
$g = hexdec(substr($hex, 1, 1) . substr($hex, 1, 1));
$b = hexdec(substr($hex, 2, 1) . substr($hex, 2, 1));
}else{
$r = hexdec(substr($hex, 0, 2));
$g = hexdec(substr($hex, 2, 2));
$b = hexdec(substr($hex, 4, 2));
}
return array($r, $g, $b);
}
/**
* Convert Hex Colors To RGB
* @param type $image - image identifier
* @param type $hex - the hex color code
* @param type $alpha - 0 for solid - 127 for transparent
* @return type color identifier
* @throws Exception
*/
private static function getColor($image, $hex, $alpha=0){
list($r, $g, $b) = self::convertHexColor($hex);
// The alpha layer seems to make things gritty,
// so let's avoid it if there's no transparency
$return = ($alpha==0) ?
imagecolorallocatealpha($image, $r, $g, $b, $alpha) :
imagecolorallocate($image, $r, $g, $b) ;
// Make sure it worked
if($return === false) throw new Exception("Could not create color $hex.");
return $return;
}
/**
* Inserts linebreaks to wrap text
* @param type $fontSize
* @param type $fontFace
* @param type $string
* @param type $width
* @return string
*/
private static function wrapText($fontSize, $fontFace, $string, $width){
$ret = "";
$arr = explode(" ", $string);
foreach($arr as $word){
$testboxWord = imagettfbbox($fontSize, 0, $fontFace, $word);
// huge word larger than $width, we need to cut it internally until it fits the width
$len = strlen($word);
while($testboxWord[2] > $width && $len > 0){
$word = substr($word, 0, $len);
$len--;
$testboxWord = imagettfbbox($fontSize, 0, $fontFace, $word);
}
$teststring = $ret . ' ' . $word;
$testboxString = imagettfbbox($fontSize, 0, $fontFace, $teststring);
if($testboxString[2] > $width){
$ret.=($ret == "" ? "" : "\n") . $word;
}else{
$ret.=($ret == "" ? "" : ' ') . $word;
}
}
return $ret;
}
/**
* Returns the line height based on the font and font size
* @param type $fontSize
* @param type $fontFace
*/
private static function getLineHeight($fontSize, $fontFace){
// Arbitrary text is drawn, can't be blank or just a space
$type_space = imagettfbbox($fontSize, 0, $fontFace, "Robert is awesome!");
$line_height = abs($type_space[5] - $type_space[1]);
return $line_height;
}
}
$text = "This is a test";
$ttf_font_file = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/fonts/fontawesome-webfont.ttf";
$font_size = 50;
$color = "#000";
$img = Image::createTextImage($text, $font_size, $color, $ttf_font_file);
$img->pixelate($blocksize);
$img->output('png');
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).
Version System time (s) User time (s) Memory (MiB) 8.3.6 0.016 0.006 16.75 8.3.5 0.007 0.013 22.07 8.3.4 0.009 0.006 19.11 8.3.3 0.004 0.011 18.97 8.3.2 0.006 0.010 20.53 8.3.1 0.008 0.000 23.66 8.3.0 0.006 0.003 23.51 8.2.18 0.010 0.006 18.43 8.2.17 0.003 0.012 18.99 8.2.16 0.007 0.014 22.96 8.2.15 0.005 0.003 24.18 8.2.14 0.008 0.000 24.66 8.2.13 0.000 0.009 19.46 8.2.12 0.008 0.000 26.35 8.2.11 0.003 0.006 19.56 8.2.10 0.008 0.004 18.29 8.2.9 0.005 0.003 19.33 8.2.8 0.003 0.006 18.30 8.2.7 0.000 0.010 17.63 8.2.6 0.008 0.003 18.18 8.2.5 0.005 0.003 18.07 8.2.4 0.008 0.000 22.37 8.2.3 0.000 0.007 20.82 8.2.2 0.000 0.008 17.99 8.2.1 0.004 0.004 18.39 8.2.0 0.006 0.003 18.40 8.1.28 0.013 0.006 25.92 8.1.27 0.008 0.000 22.15 8.1.26 0.000 0.008 28.09 8.1.25 0.004 0.004 28.09 8.1.24 0.007 0.004 23.73 8.1.23 0.006 0.006 21.16 8.1.22 0.003 0.005 17.91 8.1.21 0.008 0.000 18.77 8.1.20 0.000 0.009 17.60 8.1.19 0.008 0.000 17.47 8.1.18 0.000 0.008 18.10 8.1.17 0.003 0.006 18.89 8.1.16 0.005 0.002 20.97 8.1.15 0.005 0.003 19.05 8.1.14 0.006 0.003 19.75 8.1.13 0.003 0.006 17.78 8.1.12 0.000 0.008 17.70 8.1.11 0.000 0.007 17.74 8.1.10 0.000 0.008 17.66 8.1.9 0.004 0.004 17.60 8.1.8 0.000 0.008 17.60 8.1.7 0.005 0.002 17.65 8.1.6 0.004 0.004 17.76 8.1.5 0.005 0.003 17.66 8.1.4 0.009 0.000 17.71 8.1.3 0.008 0.000 17.70 8.1.2 0.000 0.008 17.84 8.1.1 0.000 0.008 17.78 8.1.0 0.006 0.003 17.72 8.0.30 0.006 0.003 18.77 8.0.29 0.005 0.003 16.88 8.0.28 0.000 0.007 18.67 8.0.27 0.004 0.004 17.54 8.0.26 0.003 0.003 17.47 8.0.25 0.004 0.004 17.21 8.0.24 0.000 0.007 17.26 8.0.23 0.004 0.004 17.22 8.0.22 0.003 0.006 17.05 8.0.21 0.003 0.005 17.10 8.0.20 0.000 0.007 17.26 8.0.19 0.006 0.003 17.25 8.0.18 0.000 0.008 17.13 8.0.17 0.000 0.008 17.16 8.0.16 0.000 0.007 17.16 8.0.15 0.004 0.004 17.05 8.0.14 0.008 0.000 17.17 8.0.13 0.000 0.007 13.56 8.0.12 0.004 0.004 17.05 8.0.11 0.004 0.004 17.15 8.0.10 0.003 0.006 17.03 8.0.9 0.006 0.003 17.14 8.0.8 0.009 0.009 17.16 8.0.7 0.000 0.008 16.99 8.0.6 0.002 0.005 17.07 8.0.5 0.004 0.004 17.08 8.0.3 0.011 0.008 17.39 8.0.2 0.008 0.012 17.50 8.0.1 0.000 0.008 17.29 8.0.0 0.013 0.007 17.11 7.4.33 0.003 0.003 16.79 7.4.32 0.003 0.005 16.82 7.4.30 0.003 0.003 16.84 7.4.29 0.004 0.004 16.76 7.4.28 0.003 0.003 16.76 7.4.27 0.000 0.008 16.64 7.4.26 0.004 0.004 16.83 7.4.25 0.003 0.006 16.69 7.4.24 0.006 0.002 16.80 7.4.23 0.004 0.004 16.62 7.4.22 0.004 0.012 16.88 7.4.21 0.003 0.013 16.84 7.4.20 0.004 0.004 16.92 7.4.16 0.014 0.003 16.80 7.4.15 0.010 0.010 17.40 7.4.14 0.005 0.013 17.86 7.4.13 0.013 0.004 16.84 7.4.12 0.014 0.006 16.76 7.4.11 0.012 0.011 16.77 7.4.10 0.009 0.014 16.79 7.4.9 0.015 0.003 16.85 7.4.8 0.003 0.018 19.39 7.4.7 0.009 0.009 16.76 7.4.6 0.000 0.018 16.84 7.4.5 0.006 0.006 16.59 7.4.4 0.010 0.007 16.83 7.4.3 0.007 0.011 16.79 7.4.0 0.004 0.012 15.35 7.3.33 0.000 0.006 13.52 7.3.32 0.006 0.000 13.48 7.3.31 0.003 0.003 16.65 7.3.30 0.003 0.003 16.60 7.3.29 0.008 0.008 16.52 7.3.28 0.008 0.012 16.56 7.3.27 0.007 0.011 17.40 7.3.26 0.015 0.004 16.62 7.3.25 0.013 0.009 16.57 7.3.24 0.012 0.005 16.68 7.3.23 0.015 0.004 16.71 7.3.21 0.010 0.007 16.51 7.3.20 0.009 0.010 16.53 7.3.19 0.014 0.003 16.63 7.3.18 0.015 0.004 16.76 7.3.17 0.000 0.017 16.77 7.3.16 0.006 0.009 16.69 7.3.1 0.004 0.015 16.43 7.3.0 0.006 0.009 16.36 7.2.33 0.014 0.008 16.46 7.2.32 0.013 0.013 16.71 7.2.31 0.009 0.009 16.84 7.2.30 0.020 0.004 16.60 7.2.29 0.009 0.012 16.86 7.2.13 0.012 0.010 16.80 7.2.12 0.009 0.004 16.69 7.2.11 0.010 0.007 16.63 7.2.10 0.013 0.003 16.54 7.2.9 0.007 0.008 16.63 7.2.8 0.007 0.008 16.67 7.2.7 0.007 0.008 16.70 7.2.6 0.010 0.007 16.71 7.2.5 0.010 0.007 16.67 7.2.4 0.006 0.009 16.51 7.2.3 0.009 0.005 16.47 7.2.2 0.010 0.004 16.74 7.2.1 0.008 0.008 16.63 7.2.0 0.005 0.010 17.49 7.1.25 0.011 0.005 15.61 7.1.24 0.004 0.008 15.90 7.1.23 0.014 0.003 15.51 7.1.22 0.000 0.013 15.52 7.1.21 0.012 0.004 15.80 7.1.20 0.008 0.005 15.54 7.1.19 0.010 0.003 15.43 7.1.18 0.007 0.003 15.54 7.1.17 0.012 0.006 15.59 7.1.16 0.006 0.010 15.86 7.1.15 0.010 0.007 15.56 7.1.14 0.018 0.000 15.60 7.1.13 0.000 0.014 15.58 7.1.12 0.013 0.003 15.67 7.1.11 0.014 0.003 15.78 7.1.10 0.006 0.007 16.70 7.1.9 0.012 0.006 15.60 7.1.8 0.010 0.010 15.47 7.1.7 0.006 0.009 16.48 7.1.6 0.009 0.012 17.63 7.1.5 0.010 0.011 16.33 7.1.4 0.011 0.004 15.70 7.1.3 0.009 0.003 15.66 7.1.2 0.007 0.007 15.36 7.1.1 0.007 0.007 15.16 7.1.0 0.009 0.039 18.90 7.0.33 0.006 0.009 15.36 7.0.32 0.009 0.006 15.14 7.0.31 0.010 0.003 15.32 7.0.30 0.011 0.007 15.49 7.0.29 0.000 0.015 15.36 7.0.28 0.008 0.008 15.31 7.0.27 0.015 0.003 15.23 7.0.26 0.006 0.010 15.24 7.0.25 0.003 0.010 15.13 7.0.24 0.010 0.003 15.15 7.0.23 0.008 0.008 15.21 7.0.22 0.003 0.008 15.41 7.0.21 0.000 0.010 15.31 7.0.20 0.010 0.003 16.08 7.0.19 0.006 0.006 15.48 7.0.18 0.007 0.003 15.18 7.0.17 0.007 0.007 15.35 7.0.16 0.004 0.010 15.16 7.0.15 0.004 0.010 15.31 7.0.14 0.009 0.006 15.46 7.0.13 0.012 0.004 15.44 7.0.12 0.013 0.003 15.02 7.0.11 0.003 0.014 15.14 7.0.10 0.008 0.030 17.76 7.0.9 0.019 0.044 17.69 7.0.8 0.009 0.035 17.66 7.0.7 0.014 0.029 17.65 7.0.6 0.013 0.044 17.64 7.0.5 0.020 0.035 17.88 7.0.4 0.013 0.022 16.59 7.0.3 0.010 0.045 16.62 7.0.2 0.002 0.052 16.68 7.0.1 0.003 0.047 16.71 7.0.0 0.017 0.030 16.75 5.6.38 0.012 0.003 14.17 5.6.37 0.003 0.010 14.36 5.6.36 0.004 0.011 14.35 5.6.35 0.007 0.010 14.17 5.6.34 0.007 0.003 14.27 5.6.33 0.006 0.003 14.52 5.6.32 0.003 0.007 14.17 5.6.31 0.007 0.007 14.18 5.6.30 0.003 0.009 13.98 5.6.29 0.008 0.004 14.02 5.6.28 0.006 0.027 17.55 5.6.27 0.006 0.009 14.00 5.6.26 0.012 0.003 14.13 5.6.25 0.007 0.041 17.56 5.6.24 0.007 0.033 17.51 5.6.23 0.008 0.030 17.54 5.6.22 0.010 0.039 17.48 5.6.21 0.008 0.042 17.51 5.6.20 0.010 0.042 17.87 5.6.19 0.006 0.040 17.75 5.6.18 0.005 0.046 17.78 5.6.17 0.009 0.039 17.72 5.6.16 0.007 0.050 17.66 5.6.15 0.005 0.049 17.67 5.6.14 0.012 0.041 17.55 5.6.13 0.009 0.044 17.63 5.6.12 0.009 0.048 17.78 5.6.11 0.009 0.030 17.57 5.6.10 0.014 0.038 17.53 5.6.9 0.010 0.036 17.73 5.6.8 0.011 0.041 17.26 5.6.7 0.004 0.045 17.41 5.6.6 0.010 0.043 17.43 5.6.5 0.005 0.043 17.38 5.6.4 0.004 0.044 17.46 5.6.3 0.005 0.043 17.50 5.6.2 0.009 0.043 17.31 5.6.1 0.008 0.025 17.38 5.6.0 0.004 0.027 17.38 5.5.38 0.008 0.033 15.76 5.5.37 0.007 0.042 15.66 5.5.36 0.011 0.040 15.80 5.5.35 0.008 0.043 15.65 5.5.34 0.005 0.025 15.88 5.5.33 0.008 0.045 16.03 5.5.32 0.008 0.045 16.08 5.5.31 0.009 0.022 15.84 5.5.30 0.005 0.043 15.90 5.5.29 0.007 0.047 16.09 5.5.28 0.006 0.038 15.92 5.5.27 0.007 0.041 15.96 5.5.26 0.010 0.040 16.03 5.5.25 0.009 0.039 15.81 5.5.24 0.011 0.029 15.60 5.5.23 0.007 0.043 15.76 5.5.22 0.008 0.043 15.54 5.5.21 0.006 0.042 15.59 5.5.20 0.005 0.050 15.54 5.5.19 0.002 0.043 15.77 5.5.18 0.003 0.048 15.64 5.5.17 0.003 0.006 11.19 5.5.16 0.007 0.043 15.59 5.5.15 0.008 0.038 15.60 5.5.14 0.003 0.027 15.73 5.5.13 0.002 0.047 15.55 5.5.12 0.011 0.034 15.49 5.5.11 0.004 0.042 15.39 5.5.10 0.015 0.036 15.43 5.5.9 0.002 0.032 15.48 5.5.8 0.007 0.042 15.51 5.5.7 0.008 0.040 15.46 5.5.6 0.009 0.031 15.58 5.5.5 0.003 0.028 15.69 5.5.4 0.007 0.044 15.60 5.5.3 0.002 0.028 15.54 5.5.2 0.011 0.018 15.53 5.5.1 0.009 0.037 15.58 5.5.0 0.005 0.043 15.47
preferences:dark mode live preview
53.27 ms | 401 KiB | 5 Q