New patches: [unrevert anonymous**20090106212613] { hunk ./actions/profilesettings.php 57 return; } +v v v v v v v if ($this->arg('save')) { $this->save_profile(); } else if ($this->arg('upload')) { hunk ./actions/profilesettings.php 62 $this->upload_avatar(); + } else if ($this->arg('crop')) { + $this->crop_avatar(); } else if ($this->arg('changepass')) { $this->change_password(); hunk ./actions/profilesettings.php 66 + } else { + $this->show_form(_('Unexpected form submission.')); } hunk ./actions/profilesettings.php 69 +************* + if ($this->arg('save')) { + $this->save_profile(); + } else if ($this->arg('upload')) { + $this->upload_avatar(); + } else if ($this->arg('changepass')) { + $this->change_password(); + } +^ ^ ^ ^ ^ ^ ^ } hunk ./actions/profilesettings.php 164 $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); +v v v v v v v if ($avatar) { hunk ./actions/profilesettings.php 166 - common_element('img', array('src' => $avatar->url, + common_element_start('div', array('id'=>'avatar_preview', 'class'=>'avatar_view')); + common_element('h3', null, _("Preview:")); + common_element_start('div', array('id'=>'avatar_preview_view')); + common_element('img', array('src' => $original->url,//$avatar->url, 'class' => 'avatar profile', 'width' => AVATAR_PROFILE_SIZE, 'height' => AVATAR_PROFILE_SIZE, hunk ./actions/profilesettings.php 174 'alt' => $user->nickname)); + common_element_end('div'); + common_element_end('div'); + + foreach(array('avatar_crop_x', 'avatar_crop_y', 'avatar_crop_w', 'avatar_crop_h') as $crop_info) { + common_element('input', array('name' => $crop_info, + 'type' => 'hidden', + 'id' => $crop_info)); + } + common_submit('crop', _('Crop')); } hunk ./actions/profilesettings.php 184 +************* + if ($avatar) { + common_element('img', array('src' => $avatar->url, + 'class' => 'avatar profile', + 'width' => AVATAR_PROFILE_SIZE, + 'height' => AVATAR_PROFILE_SIZE, + 'alt' => $user->nickname)); + } +^ ^ ^ ^ ^ ^ ^ common_element('input', array('name' => 'MAX_FILE_SIZE', hunk ./actions/profilesettings.php 429 $this->show_form(_('Failed updating avatar.')); } +v v v v v v v @unlink($_FILES['avatarfile']['tmp_name']); } hunk ./actions/profilesettings.php 433 + function crop_avatar() { + + $user = common_current_user(); + $profile = $user->getProfile(); + + $x = $this->arg('avatar_crop_x'); + $y = $this->arg('avatar_crop_y'); + $w = $this->arg('avatar_crop_w'); + $h = $this->arg('avatar_crop_h'); + + if ($profile->crop_avatars($x, $y, $w, $h)) { + $this->show_form(_('Avatar updated.'), true); + } else { + $this->show_form(_('Failed updating avatar.')); + } + } +************* + @unlink($_FILES['avatarfile']['tmp_name']); + } +^ ^ ^ ^ ^ ^ ^ + function nickname_exists($nickname) { $user = common_current_user(); hunk ./classes/Avatar.php 82 } } +v v v v v v v + function scale_and_crop($size, $x, $y, $w, $h) { + + $image_s = imagecreatetruecolor($size, $size); + $image_a = $this->to_image(); + + # Retain alpha channel info if possible for .pngs + $background = imagecolorallocate($image_s, 0, 0, 0); + ImageColorTransparent($image_s, $background); + imagealphablending($image_s, false); + + imagecopyresized($image_s, $image_a, 0, 0, $x, $y, $size, $size, $w, $h); + + $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png"; + + $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp()); + + if ($this->mediatype == 'image/jpeg') { + imagejpeg($image_s, common_avatar_path($filename)); + } else { + imagepng($image_s, common_avatar_path($filename)); + } + + $cropped = DB_DataObject::factory('avatar'); + $cropped->profile_id = $this->profile_id; + $cropped->width = $size; + $cropped->height = $size; + $cropped->original = false; + $cropped->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png'; + $cropped->filename = $filename; + $cropped->url = common_avatar_url($filename); + $cropped->created = DB_DataObject_Cast::dateTime(); # current time + + if ($cropped->insert()) { + return $cropped; + } else { + return NULL; + } + } + function to_image() { $filepath = common_avatar_path($this->filename); if ($this->mediatype == 'image/gif') { hunk ./classes/Avatar.php 138 function &pkeyGet($kv) { return Memcached_DataObject::pkeyGet('Avatar', $kv); } +************* + function to_image() + { + $filepath = common_avatar_path($this->filename); + if ($this->mediatype == 'image/gif') { + return imagecreatefromgif($filepath); + } else if ($this->mediatype == 'image/jpeg') { + return imagecreatefromjpeg($filepath); + } else if ($this->mediatype == 'image/png') { + return imagecreatefrompng($filepath); + } else { + return null; + } + } + + function &pkeyGet($kv) + { + return Memcached_DataObject::pkeyGet('Avatar', $kv); + } +^ ^ ^ ^ ^ ^ ^ } hunk ./classes/Profile.php 124 return $avatar; } - function delete_avatars() { +v v v v v v v + function crop_avatars($x, $y, $w, $h) { + + $avatar = $this->getOriginalAvatar(); + $this->delete_avatars(false); # don't delete original + + foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) { + # We don't do a scaled one if original is our scaled size + if (!($avatar->width == $size && $avatar->height == $size)) { + $s = $avatar->scale_and_crop($size, $x, $y, $w, $h); + if (!$s) { + return NULL; + } + } + } + return true; + } + + function delete_avatars($original=true) { $avatar = new Avatar(); $avatar->profile_id = $this->id; $avatar->find(); hunk ./classes/Profile.php 147 while ($avatar->fetch()) { + if ($avatar->original) { + if ($original == false) { + continue; + } + } $avatar->delete(); } return true; hunk ./classes/Profile.php 156 } +************* + function delete_avatars() + { + $avatar = new Avatar(); + $avatar->profile_id = $this->id; + $avatar->find(); + while ($avatar->fetch()) { + $avatar->delete(); + } + return true; + } +^ ^ ^ ^ ^ ^ ^ function getBestName() { } Context: [Actually crop your avatar when hitting 'crop' button on profile Zach Copley **20081212043018] [Jcrop CSS updates to original/preview views csarven@controlyourself.ca**20081210025922] [Jcrop v2 (POST cropping to be completed) csarven@controlyourself.ca**20081210021607] [trac750 added some output to the facebook_update.php script Zach Copley **20090105045603] [trac750 configurable sync flags for Facebook app (noticesync, replysync) Zach Copley **20090105040212] [trac750 Automatically update linked Facebook users' statuses Zach Copley **20090105010407] [wrapper element for config.xml Evan Prodromou **20081230212202] [better serialization of arrays and booleans in config output Evan Prodromou **20081230211957] [implement the api/laconica/config method Evan Prodromou **20081230211444] [add some breaks so that switch statement works Evan Prodromou **20081230210114] [implement api/laconica/version method Evan Prodromou **20081230205939] [add laconica methods to unauthed ones Evan Prodromou **20081230203747] [add laconica-specific methods to htaccess.sample Evan Prodromou **20081230202513] [Laconica-specific extensions for Twitter API Evan Prodromou **20081230202019] [whitespace changes in actions/register.php after global search-and-replace Evan Prodromou **20081223195722] [Twitter-bridge: fix for Twitter's new strict policy of rejecting HTTP POSTs with invalid "expect" headers Zach Copley **20081225152207] [move opening brace of class declaration to next line Evan Prodromou **20081223194923 Another gigantor PEAR coding standards patch. Here, I've moved the opening curly bracket on a class statement to the following line. ] [TRUE => true, FALSE => false Evan Prodromou **20081223194428 More PEAR coding standards global changes. Here, I've changed all instances of TRUE to true and FALSE to false. ] [change function headers to K&R style Evan Prodromou **20081223193323 Another huge change, for PEAR code standards compliance. Function headers have to be in K&R style (opening brace on its own line), instead of having the opening brace on the same line as the function and parameters. So, a little perl magic found all the function definitions and move the opening brace to the next line (properly indented... usually). ] [replace NULL with null Evan Prodromou **20081223192129 Another global search-and-replace update. Here, I've replaced the PHP keyword 'NULL' with its lowercase version. This is another PEAR code standards change. ] [replace all tabs with four spaces Evan Prodromou **20081223191907 The PEAR coding standards decree: no tabs, but indent by four spaces. I've done a global search-and-replace on all tabs, replacing them by four spaces. This is a huge change, but it will go a long way to getting us towards phpcs-compliance. And that means better code readability, and that means more participation. ] [incorrect label on notice list file comment Evan Prodromou **20081223191430] [bring lib/noticelist.php into line with PEAR code standards Evan Prodromou **20081223190851] [reformat and document lib/mail.php for phpcs conformance Evan Prodromou **20081223173330] [bring messaging section (inbox, outbox, mailbox) into PEAR Code Standards compliance Evan Prodromou **20081222201304 Actually refactored the method names on these classes to come into complete compliance with the code standards. Untested; maybe there are some bad method names now. ] [bring mailbox.php into line with PEAR Coding Standards (mostly) Evan Prodromou **20081222195041] [reformat lib/language.php for PEAR Coding Standards Evan Prodromou **20081222193029] [reformat lib/jabber.php for phpcs, including doc comments Evan Prodromou **20081222173249] [reformat for phpcs Evan Prodromou **20081221005837] [reformat lib/daemon.php for phpcs Evan Prodromou **20081221004607] [some modifications to assuage phpcs Evan Prodromou **20081221003955] [reformatting for phpcs in lib/util.php Evan Prodromou **20081221003016] [first step of phpcs-cleanup of index.php Evan Prodromou **20081221002332] [more information in subscription notices Evan Prodromou **20081212171135] [identica badge by Kent Brewster. For more information see: Sarven Capadisli **20081218003302 http://kentbrewster.com/identica-badge/ Copy and paste the following wherever you want the badge to show up: Substitute your own ID in the user parameter. ] [TAG 0.6.4.1 Evan Prodromou **20081220204906] Patch bundle hash: 316173068f974bea2f9537d45d347f45c12050bc