From 33d9f44bc6118f165d9b8d97f8d1fef070150575 Mon Sep 17 00:00:00 2001 From: Petr Skoda Date: Sun, 13 May 2012 17:12:30 +0200 Subject: [PATCH] MDL-18763 add 512x512px user avatar support --- lib/filelib.php | 30 +++++++++++++++++++----------- lib/gdlib.php | 20 ++++++++++++++++++++ lib/outputcomponents.php | 3 +++ pix/u/f3.png | Bin 0 -> 21588 bytes theme/upgrade.txt | 5 +++++ 5 files changed, 47 insertions(+), 11 deletions(-) create mode 100644 pix/u/f3.png diff --git a/lib/filelib.php b/lib/filelib.php index f10d8ca5d63ea..81fef8a60e4bc 100644 --- a/lib/filelib.php +++ b/lib/filelib.php @@ -3413,7 +3413,7 @@ function file_pluginfile($relativepath, $forcedownload, $preview = null) { } // fix file name automatically - if ($filename !== 'f1' and $filename !== 'f2') { + if ($filename !== 'f1' and $filename !== 'f2' and $filename !== 'f3') { $filename = 'f1'; } @@ -3426,20 +3426,28 @@ function file_pluginfile($relativepath, $forcedownload, $preview = null) { redirect($theme->pix_url('u/'.$filename, 'moodle')); // intentionally not cached } - if (!$file = $fs->get_file($context->id, 'user', 'icon', 0, '/', $filename.'/.png')) { - if (!$file = $fs->get_file($context->id, 'user', 'icon', 0, '/', $filename.'/.jpg')) { - // bad reference - try to prevent future retries as hard as possible! - if ($user = $DB->get_record('user', array('id'=>$context->instanceid), 'id, picture')) { - if ($user->picture == 1 or $user->picture > 10) { - $DB->set_field('user', 'picture', 0, array('id'=>$user->id)); + if (!$file = $fs->get_file($context->id, 'user', 'icon', 0, '/', $filename.'.png')) { + if (!$file = $fs->get_file($context->id, 'user', 'icon', 0, '/', $filename.'.jpg')) { + if ($filename === 'f3') { + // f3 400x400px was introduced in 2.3, there might be only the smaller version. + if (!$file = $fs->get_file($context->id, 'user', 'icon', 0, '/', 'f1.png')) { + $file = $fs->get_file($context->id, 'user', 'icon', 0, '/', 'f1.jpg'); } } - // no redirect here because it is not cached - $theme = theme_config::load($themename); - $imagefile = $theme->resolve_image_location('u/'.$filename, 'moodle'); - send_file($imagefile, basename($imagefile), 60*60*24*14); } } + if (!$file) { + // bad reference - try to prevent future retries as hard as possible! + if ($user = $DB->get_record('user', array('id'=>$context->instanceid), 'id, picture')) { + if ($user->picture > 0) { + $DB->set_field('user', 'picture', 0, array('id'=>$user->id)); + } + } + // no redirect here because it is not cached + $theme = theme_config::load($themename); + $imagefile = $theme->resolve_image_location('u/'.$filename, 'moodle'); + send_file($imagefile, basename($imagefile), 60*60*24*14); + } send_stored_file($file, 60*60*24*365, 0, false, array('preview' => $preview)); // enable long caching, there are many images on each page diff --git a/lib/gdlib.php b/lib/gdlib.php index 68d891aac8169..65e6d5ebd7b4a 100644 --- a/lib/gdlib.php +++ b/lib/gdlib.php @@ -166,19 +166,27 @@ function process_new_icon($context, $component, $filearea, $itemid, $originalfil if (function_exists('imagecreatetruecolor') and $CFG->gdversion >= 2) { $im1 = imagecreatetruecolor(100, 100); $im2 = imagecreatetruecolor(35, 35); + $im3 = imagecreatetruecolor(512, 512); if ($image->type == IMAGETYPE_PNG and $imagefnc === 'imagepng') { imagealphablending($im1, false); $color = imagecolorallocatealpha($im1, 0, 0, 0, 127); imagefill($im1, 0, 0, $color); imagesavealpha($im1, true); + imagealphablending($im2, false); $color = imagecolorallocatealpha($im2, 0, 0, 0, 127); imagefill($im2, 0, 0, $color); imagesavealpha($im2, true); + + imagealphablending($im3, false); + $color = imagecolorallocatealpha($im3, 0, 0, 0, 127); + imagefill($im3, 0, 0, $color); + imagesavealpha($im3, true); } } else { $im1 = imagecreate(100, 100); $im2 = imagecreate(35, 35); + $im3 = imagecreate(512, 512); } $cx = $image->width / 2; @@ -192,6 +200,7 @@ function process_new_icon($context, $component, $filearea, $itemid, $originalfil imagecopybicubic($im1, $im, 0, 0, $cx - $half, $cy - $half, 100, 100, $half * 2, $half * 2); imagecopybicubic($im2, $im, 0, 0, $cx - $half, $cy - $half, 35, 35, $half * 2, $half * 2); + imagecopybicubic($im3, $im, 0, 0, $cx - $half, $cy - $half, 512, 512, $half * 2, $half * 2); $fs = get_file_storage(); @@ -220,6 +229,17 @@ function process_new_icon($context, $component, $filearea, $itemid, $originalfil $icon['filename'] = 'f2'.$imageext; $fs->create_file_from_string($icon, $data); + ob_start(); + if (!$imagefnc($im3, NULL, $quality, $filters)) { + ob_end_clean(); + $fs->delete_area_files($context->id, $component, $filearea, $itemid); + return false; + } + $data = ob_get_clean(); + imagedestroy($im3); + $icon['filename'] = 'f3'.$imageext; + $fs->create_file_from_string($icon, $data); + return $file1->get_id(); } diff --git a/lib/outputcomponents.php b/lib/outputcomponents.php index 514eac9b0550a..4bd0673dc2b5a 100644 --- a/lib/outputcomponents.php +++ b/lib/outputcomponents.php @@ -321,6 +321,9 @@ public function get_url(moodle_page $page, renderer_base $renderer = null) { } else if ($this->size === true or $this->size == 1) { $filename = 'f1'; $size = 100; + } else if ($this->size > 100) { + $filename = 'f3'; + $size = (int)$this->size; } else if ($this->size >= 50) { $filename = 'f1'; $size = (int)$this->size; diff --git a/pix/u/f3.png b/pix/u/f3.png new file mode 100644 index 0000000000000000000000000000000000000000..27e351620465e08c711741df1230df71cc74a4c0 GIT binary patch literal 21588 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 sdsJ9^?Hvtv;XApnh9yr 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 psbD