Added #39 a new feature the imports custom code during compilation. We also improved the compiler.

This commit is contained in:
Llewellyn van der Merwe 2017-02-01 15:17:04 +02:00
parent ea2b2ea4c4
commit 1a79b92b07
No known key found for this signature in database
GPG Key ID: CAD7B16D27AF28C5
458 changed files with 7127 additions and 6251 deletions

View File

@ -1,4 +1,4 @@
# Component Builder (2.2.6)
# Component Builder (2.2.9)
This is a [Joomla 3.x](http://www.joomla.org/) component.
@ -8,7 +8,7 @@ The Component Builder for [Joomla](http://www.joomla.org/) that is highly advanc
Whether you're a seasoned [Joomla](http://www.joomla.org/) developer, or have just started, Component Builder will safe you lots of time and money. A real must have!
You can install it quite easily and with no limitations. On [github](https://github.com/vdm-io/Joomla-Component-Builder/releases) is the latest release (2.2.6) with **ALL** its features and **ALL** concepts totally open-source and free!
You can install it quite easily and with no limitations. On [github](https://github.com/vdm-io/Joomla-Component-Builder/releases) is the latest release (2.2.9) with **ALL** its features and **ALL** concepts totally open-source and free!
Once installed upgrades are quick and easy via the default Joomla upgrade area.
@ -104,13 +104,13 @@ Component Builder is mapped as a component in itself on my local development env
+ *Author*: [Llewellyn van der Merwe](mailto:info@vdm.io)
+ *Name*: [Component Builder](http://vdm.bz/component-builder)
+ *First Build*: 30th April, 2015
+ *Last Build*: 20th January, 2017
+ *Version*: 2.2.6
+ *Last Build*: 1st February, 2017
+ *Version*: 2.2.9
+ *Copyright*: Copyright (C) 2015. All Rights Reserved
+ *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
+ *Line count*: **86216**
+ *File count*: **549**
+ *Folder count*: **100**
+ *Line count*: **90719**
+ *File count*: **583**
+ *Folder count*: **104**
> This **component** was build with a Joomla [Automated Component Builder](http://vdm.bz/component-builder).
> Developed by [Llewellyn van der Merwe](mailto:joomla@vdm.io)

View File

@ -1,4 +1,4 @@
# Component Builder (2.2.6)
# Component Builder (2.2.9)
This is a [Joomla 3.x](http://www.joomla.org/) component.
@ -8,7 +8,7 @@ The Component Builder for [Joomla](http://www.joomla.org/) that is highly advanc
Whether you're a seasoned [Joomla](http://www.joomla.org/) developer, or have just started, Component Builder will safe you lots of time and money. A real must have!
You can install it quite easily and with no limitations. On [github](https://github.com/vdm-io/Joomla-Component-Builder/releases) is the latest release (2.2.6) with **ALL** its features and **ALL** concepts totally open-source and free!
You can install it quite easily and with no limitations. On [github](https://github.com/vdm-io/Joomla-Component-Builder/releases) is the latest release (2.2.9) with **ALL** its features and **ALL** concepts totally open-source and free!
Once installed upgrades are quick and easy via the default Joomla upgrade area.
@ -104,13 +104,13 @@ Component Builder is mapped as a component in itself on my local development env
+ *Author*: [Llewellyn van der Merwe](mailto:info@vdm.io)
+ *Name*: [Component Builder](http://vdm.bz/component-builder)
+ *First Build*: 30th April, 2015
+ *Last Build*: 20th January, 2017
+ *Version*: 2.2.6
+ *Last Build*: 1st February, 2017
+ *Version*: 2.2.9
+ *Copyright*: Copyright (C) 2015. All Rights Reserved
+ *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
+ *Line count*: **86216**
+ *File count*: **549**
+ *Folder count*: **100**
+ *Line count*: **90719**
+ *File count*: **583**
+ *Folder count*: **104**
> This **component** was build with a Joomla [Automated Component Builder](http://vdm.bz/component-builder).
> Developed by [Llewellyn van der Merwe](mailto:joomla@vdm.io)

View File

@ -31,6 +31,20 @@
<action name="custom_admin_view.export" title="COM_COMPONENTBUILDER_CUSTOM_ADMIN_VIEWS_EXPORT" description="COM_COMPONENTBUILDER_CUSTOM_ADMIN_VIEWS_EXPORT_DESC" />
<action name="custom_admin_view.import" title="COM_COMPONENTBUILDER_CUSTOM_ADMIN_VIEWS_IMPORT" description="COM_COMPONENTBUILDER_CUSTOM_ADMIN_VIEWS_IMPORT_DESC" />
<action name="custom_admin_view.submenu" title="COM_COMPONENTBUILDER_CUSTOM_ADMIN_VIEWS_SUBMENU" description="COM_COMPONENTBUILDER_CUSTOM_ADMIN_VIEWS_SUBMENU_DESC" />
<action name="custom_code.access" title="COM_COMPONENTBUILDER_CUSTOM_CODES_ACCESS" description="COM_COMPONENTBUILDER_CUSTOM_CODES_ACCESS_DESC" />
<action name="custom_code.batch" title="COM_COMPONENTBUILDER_CUSTOM_CODES_BATCH_USE" description="COM_COMPONENTBUILDER_CUSTOM_CODES_BATCH_USE_DESC" />
<action name="custom_code.create" title="COM_COMPONENTBUILDER_CUSTOM_CODES_CREATE" description="COM_COMPONENTBUILDER_CUSTOM_CODES_CREATE_DESC" />
<action name="custom_code.dashboard_list" title="COM_COMPONENTBUILDER_CUSTOM_CODES_DASHBOARD_LIST" description="COM_COMPONENTBUILDER_CUSTOM_CODES_DASHBOARD_LIST_DESC" />
<action name="custom_code.delete" title="COM_COMPONENTBUILDER_CUSTOM_CODES_DELETE" description="COM_COMPONENTBUILDER_CUSTOM_CODES_DELETE_DESC" />
<action name="custom_code.edit" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_DESC" />
<action name="custom_code.edit.created_by" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_CREATED_BY" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_CREATED_BY_DESC" />
<action name="custom_code.edit.created" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_CREATED_DATE" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_CREATED_DATE_DESC" />
<action name="custom_code.edit.own" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_OWN" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_OWN_DESC" />
<action name="custom_code.edit.state" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_STATE" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_STATE_DESC" />
<action name="custom_code.version" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_VERSION" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_VERSION_DESC" />
<action name="custom_code.export" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EXPORT" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EXPORT_DESC" />
<action name="custom_code.import" title="COM_COMPONENTBUILDER_CUSTOM_CODES_IMPORT" description="COM_COMPONENTBUILDER_CUSTOM_CODES_IMPORT_DESC" />
<action name="custom_code.submenu" title="COM_COMPONENTBUILDER_CUSTOM_CODES_SUBMENU" description="COM_COMPONENTBUILDER_CUSTOM_CODES_SUBMENU_DESC" />
<action name="dynamic_get.access" title="COM_COMPONENTBUILDER_DYNAMIC_GETS_ACCESS" description="COM_COMPONENTBUILDER_DYNAMIC_GETS_ACCESS_DESC" />
<action name="dynamic_get.batch" title="COM_COMPONENTBUILDER_DYNAMIC_GETS_BATCH_USE" description="COM_COMPONENTBUILDER_DYNAMIC_GETS_BATCH_USE_DESC" />
<action name="dynamic_get.create" title="COM_COMPONENTBUILDER_DYNAMIC_GETS_CREATE" description="COM_COMPONENTBUILDER_DYNAMIC_GETS_CREATE_DESC" />
@ -170,6 +184,17 @@
<action name="dynamic_get.access" title="COM_COMPONENTBUILDER_DYNAMIC_GETS_ACCESS" description="COM_COMPONENTBUILDER_DYNAMIC_GETS_ACCESS_DESC" />
<action name="dynamic_get.version" title="COM_COMPONENTBUILDER_DYNAMIC_GETS_EDIT_VERSION" description="COM_COMPONENTBUILDER_DYNAMIC_GETS_EDIT_VERSION_DESC" />
</section>
<section name="custom_code">
<action name="custom_code.edit" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_DESC" />
<action name="custom_code.edit.own" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_OWN" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_OWN_DESC" />
<action name="custom_code.edit.state" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_STATE" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_STATE_DESC" />
<action name="custom_code.edit.created_by" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_CREATED_BY" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_CREATED_BY_DESC" />
<action name="custom_code.edit.created" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_CREATED_DATE" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_CREATED_DATE_DESC" />
<action name="custom_code.create" title="COM_COMPONENTBUILDER_CUSTOM_CODES_CREATE" description="COM_COMPONENTBUILDER_CUSTOM_CODES_CREATE_DESC" />
<action name="custom_code.delete" title="COM_COMPONENTBUILDER_CUSTOM_CODES_DELETE" description="COM_COMPONENTBUILDER_CUSTOM_CODES_DELETE_DESC" />
<action name="custom_code.access" title="COM_COMPONENTBUILDER_CUSTOM_CODES_ACCESS" description="COM_COMPONENTBUILDER_CUSTOM_CODES_ACCESS_DESC" />
<action name="custom_code.version" title="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_VERSION" description="COM_COMPONENTBUILDER_CUSTOM_CODES_EDIT_VERSION_DESC" />
</section>
<section name="snippet">
<action name="core.edit" title="COM_COMPONENTBUILDER_SNIPPETS_EDIT" description="COM_COMPONENTBUILDER_SNIPPETS_EDIT_DESC" />
<action name="core.edit.state" title="COM_COMPONENTBUILDER_SNIPPETS_EDIT_STATE" description="COM_COMPONENTBUILDER_SNIPPETS_EDIT_STATE_DESC" />

View File

@ -9,8 +9,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version 2.2.9
@build 1st February, 2017
@created 30th April, 2015
@package Component Builder
@subpackage admin.css

View File

@ -9,8 +9,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 94 of this MVC
@build 13th January, 2017
@created 30th April, 2015
@package Component Builder
@subpackage admin_view.css

View File

@ -9,8 +9,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 94 of this MVC
@build 13th January, 2017
@created 30th April, 2015
@package Component Builder
@subpackage admin_views.css

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 77 of this MVC
@build 26th December, 2016
@created 6th May, 2015
@package Component Builder
@subpackage component.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 77 of this MVC
@build 26th December, 2016
@created 6th May, 2015
@package Component Builder
@subpackage components.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 18 of this MVC
@build 13th January, 2017
@created 13th August, 2015
@package Component Builder
@subpackage custom_admin_view.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 18 of this MVC
@build 13th January, 2017
@created 13th August, 2015
@package Component Builder
@subpackage custom_admin_views.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -0,0 +1,27 @@
/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/
__ __ _ _____ _ _ __ __ _ _ _
\ \ / / | | | __ \ | | | | | \/ | | | | | | |
\ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| |
\ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` |
\ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| |
\/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_|
| |
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version @update number 14 of this MVC
@build 31st January, 2017
@created 11th October, 2016
@package Component Builder
@subpackage custom_code.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>
@copyright Copyright (C) 2015. All Rights Reserved
@license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
Builds Complex Joomla Components
/-----------------------------------------------------------------------------------------------------------------------------*/
/* CSS Document */

View File

@ -0,0 +1,27 @@
/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/
__ __ _ _____ _ _ __ __ _ _ _
\ \ / / | | | __ \ | | | | | \/ | | | | | | |
\ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| |
\ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` |
\ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| |
\/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_|
| |
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version @update number 14 of this MVC
@build 31st January, 2017
@created 11th October, 2016
@package Component Builder
@subpackage custom_codes.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>
@copyright Copyright (C) 2015. All Rights Reserved
@license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
Builds Complex Joomla Components
/-----------------------------------------------------------------------------------------------------------------------------*/
/* CSS Document */

View File

@ -9,8 +9,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version 2.2.9
@build 1st February, 2017
@created 30th April, 2015
@package Component Builder
@subpackage dashboard.css

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 81 of this MVC
@build 15th January, 2017
@created 21st May, 2015
@package Component Builder
@subpackage dynamic_get.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 81 of this MVC
@build 15th January, 2017
@created 21st May, 2015
@package Component Builder
@subpackage dynamic_gets.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,8 +9,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 36 of this MVC
@build 12th January, 2017
@created 30th April, 2015
@package Component Builder
@subpackage field.css

View File

@ -9,8 +9,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 36 of this MVC
@build 12th January, 2017
@created 30th April, 2015
@package Component Builder
@subpackage fields.css

View File

@ -9,8 +9,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 12 of this MVC
@build 20th October, 2016
@created 30th April, 2015
@package Component Builder
@subpackage fieldtype.css

View File

@ -9,8 +9,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 12 of this MVC
@build 20th October, 2016
@created 30th April, 2015
@package Component Builder
@subpackage fieldtypes.css

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 6 of this MVC
@build 17th October, 2016
@created 4th March, 2016
@package Component Builder
@subpackage help_document.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 6 of this MVC
@build 17th October, 2016
@created 4th March, 2016
@package Component Builder
@subpackage help_documents.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 65 of this MVC
@build 18th October, 2016
@created 18th May, 2015
@package Component Builder
@subpackage layout.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 65 of this MVC
@build 18th October, 2016
@created 18th May, 2015
@package Component Builder
@subpackage layouts.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 44 of this MVC
@build 29th January, 2017
@created 29th May, 2015
@package Component Builder
@subpackage site_view.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 44 of this MVC
@build 29th January, 2017
@created 29th May, 2015
@package Component Builder
@subpackage site_views.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 16 of this MVC
@build 20th October, 2016
@created 19th May, 2015
@package Component Builder
@subpackage snippet.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 16 of this MVC
@build 20th October, 2016
@created 19th May, 2015
@package Component Builder
@subpackage snippets.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 39 of this MVC
@build 18th October, 2016
@created 26th May, 2015
@package Component Builder
@subpackage template.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -9,9 +9,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 39 of this MVC
@build 18th October, 2016
@created 26th May, 2015
@package Component Builder
@subpackage templates.css
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,167 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package WideImage
**/
/**
* @package Exceptions
*/
class WideImage_NoFontException extends WideImage_Exception {}
/**
* @package Exceptions
*/
class WideImage_InvalidFontFileException extends WideImage_Exception {}
/**
* @package Exceptions
*/
class WideImage_InvalidCanvasMethodException extends WideImage_Exception {}
/**
* @package WideImage
*/
class WideImage_Canvas
{
protected $handle = 0;
protected $image = null;
protected $font = null;
/**
* Creates a canvas object that writes to the image passed as a parameter
*
* Shouldn't be used directly, use WideImage_Image::getCanvas() instead.
*
* @param WideImage_Image $img Image object
*/
function __construct($img)
{
$this->handle = $img->getHandle();
$this->image = $img;
}
/**
* Sets the active font. Can be an instance of
* WideImage_Font_TTF, WideImage_Font_PS, or WideImage_Font_GDF.
*
*
*
*
* @param object $font Font object to set for writeText()
*/
function setFont($font)
{
$this->font = $font;
}
/**
* Creates and sets the current font
*
* The supported font types are: TTF/OTF, PS, and GDF.
* Font type is detected from the extension. If the $file parameter doesn't have an extension, TTF font is presumed.
*
* Note: not all parameters are supported by all fonts.
*
* @param string $file Font file name (string)
* @param int $size Font size (supported for TTF/OTF and PS fonts, ignored for GDF)
* @param int $color Text color
* @param int $bgcolor Background color (supported only for PS font, ignored for TTF and PS)
* @return mixed One of the WideImage_Font_* objects
*/
function useFont($file, $size = 12, $color = 0, $bgcolor = null)
{
$p = strrpos($file, '.');
if ($p === false || $p < strlen($file) - 4)
$ext = 'ttf';
else
$ext = strtolower(substr($file, $p + 1));
if ($ext == 'ttf' || $ext == 'otf')
$font = new WideImage_Font_TTF($file, $size, $color);
elseif ($ext == 'ps')
$font = new WideImage_Font_PS($file, $size, $color, $bgcolor);
elseif ($ext == 'gdf')
$font = new WideImage_Font_GDF($file, $color);
else
throw new WideImage_InvalidFontFileException("'$file' appears to be an invalid font file.");
$this->setFont($font);
return $font;
}
/**
* Write text on the image at specified position
*
* You must set a font with a call to WideImage_Canvas::setFont() prior to writing text to the image.
*
* Smart coordinates are supported for $x and $y arguments, but currently only for TTF/OTF fonts.
*
* Example:
* <code>
* $img = WideImage::load('pic.jpg');
* $canvas = $img->getCanvas();
* $canvas->useFont('Verdana.ttf', 16, $img->allocateColor(255, 0, 0));
* $canvas->writeText('right', 'bottom', 'www.website.com');
* </code>
*
* @param int $x Left
* @param int $y Top
* @param string $text Text to write
* @param int $angle The angle, defaults to 0
*/
function writeText($x, $y, $text, $angle = 0)
{
if ($this->font === null)
throw new WideImage_NoFontException("Can't write text without a font.");
$angle = - floatval($angle);
if ($angle < 0)
$angle = 360 + $angle;
$angle = $angle % 360;
$this->font->writeText($this->image, $x, $y, $text, $angle);
}
/**
* A magic method that allows you to call any PHP function that starts with "image".
*
* This is a shortcut to call custom functions on the image handle.
*
* Example:
* <code>
* $img = WideImage::load('pic.jpg');
* $canvas = $img->getCanvas();
* $canvas->filledRect(10, 10, 20, 30, $img->allocateColor(0, 0, 0));
* $canvas->line(60, 80, 30, 100, $img->allocateColor(255, 0, 0));
* </code>
*/
function __call($method, $params)
{
if (function_exists('image' . $method))
{
array_unshift($params, $this->handle);
call_user_func_array('image' . $method, $params);
}
else
throw new WideImage_InvalidCanvasMethodException("Function doesn't exist: image{$method}.");
}
}

View File

@ -1,208 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internals
**/
/**
* @package Exceptions
*/
class WideImage_InvalidCoordinateException extends WideImage_Exception {}
/**
* A utility class for smart coordinates
*
* @package Internals
**/
class WideImage_Coordinate
{
static protected $coord_align = array("left", "center", "right", "top", "middle", "bottom");
static protected $coord_numeric = array("[0-9]+", "[0-9]+\.[0-9]+", "[0-9]+%", "[0-9]+\.[0-9]+%");
/**
* Parses a numeric or string representation of a corrdinate into a structure
*
* @param string $coord Smart coordinate
* @return array Parsed smart coordinate
*/
static function parse($c)
{
$tokens = array();
$operators = array('+', '-');
$flush_operand = false;
$flush_operator = false;
$current_operand = '';
$current_operator = '';
$coordinate = strval($c);
$expr_len = strlen($coordinate);
for ($i = 0; $i < $expr_len; $i++)
{
$char = $coordinate[$i];
if (in_array($char, $operators))
{
$flush_operand = true;
$flush_operator = true;
$current_operator = $char;
}
else
{
$current_operand .= $char;
if ($i == $expr_len - 1)
$flush_operand = true;
}
if ($flush_operand)
{
if (trim($current_operand) != '')
$tokens[] = array('type' => 'operand', 'value' => trim($current_operand));
$current_operand = '';
$flush_operand = false;
}
if ($flush_operator)
{
$tokens[] = array('type' => 'operator', 'value' => $char);
$flush_operator = false;
}
}
return $tokens;
}
/**
* Evaluates the $coord relatively to $dim
*
* @param string $coord A numeric value or percent string
* @param int $dim Dimension
* @param int $sec_dim Secondary dimension (for align)
* @return int Calculated value
*/
static function evaluate($coord, $dim, $sec_dim = null)
{
$comp_regex = implode('|', self::$coord_align) . '|' . implode('|', self::$coord_numeric);
if (preg_match("/^([+-])?({$comp_regex})$/", $coord, $matches))
{
$sign = intval($matches[1] . "1");
$val = $matches[2];
if (in_array($val, self::$coord_align))
{
if ($sec_dim === null)
{
switch ($val)
{
case 'left':
case 'top':
return 0;
break;
case 'center':
case 'middle':
return $sign * intval($dim / 2);
break;
case 'right':
case 'bottom':
return $sign * $dim;
break;
default:
return null;
}
}
else
{
switch ($val)
{
case 'left':
case 'top':
return 0;
break;
case 'center':
case 'middle':
return $sign * intval($dim / 2 - $sec_dim / 2);
break;
case 'right':
case 'bottom':
return $sign * ($dim - $sec_dim);
break;
default:
return null;
}
}
}
elseif (substr($val, -1) === '%')
return intval(round($sign * $dim * floatval(str_replace('%', '', $val)) / 100));
else
return $sign * intval(round($val));
}
}
/**
* Calculates and fixes a smart coordinate into a numeric value
*
* @param mixed $value Smart coordinate, relative to $dim
* @param int $dim Coordinate to which $value is relative
* @param int $sec_dim Secondary dimension (for align)
* @return int Calculated value
*/
static function fix($value, $dim, $sec_dim = null)
{
$coord_tokens = self::parse($value);
if (count($coord_tokens) == 0 || $coord_tokens[count($coord_tokens) - 1]['type'] != 'operand')
throw new WideImage_InvalidCoordinateException("Couldn't parse coordinate '$value' properly.");
$value = 0;
$operation = 1;
foreach ($coord_tokens as $token)
{
if ($token['type'] == 'operand')
{
$operand_value = self::evaluate($token['value'], $dim, $sec_dim);
if ($operation == 1)
$value = $value + $operand_value;
elseif ($operation == -1)
$value = $value - $operand_value;
else
throw new WideImage_InvalidCoordinateException("Invalid coordinate syntax.");
$operation = 0;
}
elseif ($token['type'] == 'operator')
{
if ($token['value'] == '-')
{
if ($operation == 0)
$operation = -1;
else
$operation = $operation * -1;
}
elseif ($token['value'] == '+')
{
if ($operation == 0)
$operation = '1';
}
}
}
return $value;
}
}

View File

@ -1,31 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package WideImage
**/
/**
* Base Exception class
*
* @package Exceptions
**/
class WideImage_Exception extends RuntimeException {}

View File

@ -1,48 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package WideImage
**/
/**
* GDF font support class
*
* @package WideImage
*/
class WideImage_Font_GDF
{
protected $font;
protected $color;
function __construct($face, $color)
{
if (is_int($face) && $face >= 1 && $face <= 5)
$this->font = $face;
else
$this->font = imageloadfont($face);
$this->color = $color;
}
function writeText($image, $x, $y, $text)
{
imagestring($image->getHandle(), $this->font, $x, $y, $text, $this->color);
}
}

View File

@ -1,60 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package WideImage
**/
/**
* PS font support class
*
* @package WideImage
*/
class WideImage_Font_PS
{
public $size;
public $color;
public $handle;
function __construct($file, $size, $color, $bgcolor = null)
{
$this->handle = imagepsloadfont($file);
$this->size = $size;
$this->color = $color;
if ($bgcolor === null)
$this->bgcolor = $color;
else
$this->color = $color;
}
function writeText($image, $x, $y, $text, $angle = 0)
{
if ($image->isTrueColor())
$image->alphaBlending(true);
imagepstext($image->getHandle(), $text, $this->handle, $this->size, $this->color, $this->bgcolor, $x, $y, 0, 0, $angle, 4);
}
function __destruct()
{
imagepsfreefont($this->handle);
$this->handle = null;
}
}

View File

@ -1,75 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package WideImage
**/
/**
* TTF font support class
*
* @package WideImage
*/
class WideImage_Font_TTF
{
public $face;
public $size;
public $color;
function __construct($face, $size, $color)
{
$this->face = $face;
$this->size = $size;
$this->color = $color;
}
/**
* Writes text onto an image
*
* @param WideImage_Image $image
* @param mixed $x smart coordinate
* @param mixed $y smart coordinate
* @param string $text
* @param int $angle Angle in degrees clockwise
*/
function writeText($image, $x, $y, $text, $angle = 0)
{
if ($image->isTrueColor())
$image->alphaBlending(true);
$box = imageftbbox($this->size, $angle, $this->face, $text);
$obox = array(
'left' => min($box[0], $box[2], $box[4], $box[6]),
'top' => min($box[1], $box[3], $box[5], $box[7]),
'right' => max($box[0], $box[2], $box[4], $box[6]) - 1,
'bottom' => max($box[1], $box[3], $box[5], $box[7]) - 1
);
$obox['width'] = abs($obox['left']) + abs($obox['right']);
$obox['height'] = abs($obox['top']) + abs($obox['bottom']);
$x = WideImage_Coordinate::fix($x, $image->getWidth(), $obox['width']);
$y = WideImage_Coordinate::fix($y, $image->getHeight(), $obox['height']);
$fixed_x = $x - $obox['left'];
$fixed_y = $y - $obox['top'];
imagettftext($image->getHandle(), $this->size, $angle, $fixed_x, $fixed_y, $this->color, $this->face, $text);
}
}

View File

@ -1,964 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package WideImage
**/
/**
* Thrown when an invalid dimension is passed for some operations
*
* @package Exceptions
*/
class WideImage_InvalidImageDimensionException extends WideImage_Exception {}
/**
* Thrown when an image can't be saved (returns false by the mapper)
*
* @package Exceptions
*/
class WideImage_UnknownErrorWhileMappingException extends WideImage_Exception {}
/**
* Base class for images
*
* @package WideImage
*/
abstract class WideImage_Image
{
/**
* Holds the image resource
* @var resource
*/
protected $handle = null;
/**
* Flag that determines if WideImage should call imagedestroy() upon object destruction
* @var bool
*/
protected $handleReleased = false;
/**
* Canvas object
* @var WideImage_Canvas
*/
protected $canvas = null;
/**
* @var string
*/
protected $sdata = null;
/**
* The base class constructor
*
* @param resource $handle Image handle (GD2 resource)
*/
function __construct($handle)
{
WideImage::assertValidImageHandle($handle);
$this->handle = $handle;
}
/**
* Cleanup
*
* Destroys the handle via WideImage_Image::destroy() when called by the GC.
*/
function __destruct()
{
$this->destroy();
}
/**
* This method destroy the image handle, and releases the image resource.
*
* After this is called, the object doesn't hold a valid image any more.
* No operation should be called after that.
*/
function destroy()
{
if ($this->isValid() && !$this->handleReleased)
imagedestroy($this->handle);
$this->handle = null;
}
/**
* Returns the GD image resource
*
* @return resource GD image resource
*/
function getHandle()
{
return $this->handle;
}
/**
* @return bool True, if the image object holds a valid GD image, false otherwise
*/
function isValid()
{
return WideImage::isValidImageHandle($this->handle);
}
/**
* Releases the handle
*/
function releaseHandle()
{
$this->handleReleased = true;
}
/**
* Saves an image to a file
*
* The file type is recognized from the $uri. If you save to a GIF8, truecolor images
* are automatically converted to palette.
*
* This method supports additional parameters: quality (for jpeg images) and
* compression quality and filters (for png images). See http://www.php.net/imagejpeg and
* http://www.php.net/imagepng for details.
*
* Examples:
* <code>
* // save to a GIF
* $image->saveToFile('image.gif');
*
* // save to a PNG with compression=7 and no filters
* $image->saveToFile('image.png', 7, PNG_NO_FILTER);
*
* // save to a JPEG with quality=80
* $image->saveToFile('image.jpg', 80);
*
* // save to a JPEG with default quality=100
* $image->saveToFile('image.jpg');
* </code>
*
* @param string $uri File location
*/
function saveToFile($uri)
{
$mapper = WideImage_MapperFactory::selectMapper($uri, null);
$args = func_get_args();
array_unshift($args, $this->getHandle());
$res = call_user_func_array(array($mapper, 'save'), $args);
if (!$res)
throw new WideImage_UnknownErrorWhileMappingException(get_class($mapper) . " returned an invalid result while saving to $uri");
}
/**
* Returns binary string with image data in format specified by $format
*
* Additional parameters may be passed to the function. See WideImage_Image::saveToFile() for more details.
*
* @param string $format The format of the image
* @return string The binary image data in specified format
*/
function asString($format)
{
ob_start();
$args = func_get_args();
$args[0] = null;
array_unshift($args, $this->getHandle());
$mapper = WideImage_MapperFactory::selectMapper(null, $format);
$res = call_user_func_array(array($mapper, 'save'), $args);
if (!$res)
throw new WideImage_UnknownErrorWhileMappingException(get_class($mapper) . " returned an invalid result while writing the image data");
return ob_get_clean();
}
/**
* Output a header to browser.
*
* @param $name Name of the header
* @param $data Data
*/
protected function writeHeader($name, $data)
{
header($name . ": " . $data);
}
/**
* Outputs the image to browser
*
* Sets headers Content-length and Content-type, and echoes the image in the specified format.
* All other headers (such as Content-disposition) must be added manually.
*
* Example:
* <code>
* WideImage::load('image1.png')->resize(100, 100)->output('gif');
* </code>
*
* @param string $format Image format
*/
function output($format)
{
$args = func_get_args();
$data = call_user_func_array(array($this, 'asString'), $args);
$this->writeHeader('Content-length', strlen($data));
$this->writeHeader('Content-type', WideImage_MapperFactory::mimeType($format));
echo $data;
}
/**
* @return int Image width
*/
function getWidth()
{
return imagesx($this->handle);
}
/**
* @return int Image height
*/
function getHeight()
{
return imagesy($this->handle);
}
/**
* Allocate a color by RGB values.
*
* @param mixed $R Red-component value or an RGB array (with red, green, blue keys)
* @param int $G If $R is int, this is the green component
* @param int $B If $R is int, this is the blue component
* @return int Image color index
*/
function allocateColor($R, $G = null, $B = null)
{
if (is_array($R))
return imageColorAllocate($this->handle, $R['red'], $R['green'], $R['blue']);
else
return imageColorAllocate($this->handle, $R, $G, $B);
}
/**
* @return bool True if the image is transparent, false otherwise
*/
function isTransparent()
{
return $this->getTransparentColor() >= 0;
}
/**
* @return int Transparent color index
*/
function getTransparentColor()
{
return imagecolortransparent($this->handle);
}
/**
* Sets the current transparent color index. Only makes sense for palette images (8-bit).
*
* @param int $color Transparent color index
*/
function setTransparentColor($color)
{
return imagecolortransparent($this->handle, $color);
}
/**
* Returns a RGB array of the transparent color or null if none.
*
* @return mixed Transparent color RGBA array
*/
function getTransparentColorRGB()
{
$total = imagecolorstotal($this->handle);
$tc = $this->getTransparentColor();
if ($tc >= $total && $total > 0)
return null;
else
return $this->getColorRGB($tc);
}
/**
* Returns a RGBA array for pixel at $x, $y
*
* @param int $x
* @param int $y
* @return array RGB array
*/
function getRGBAt($x, $y)
{
return $this->getColorRGB($this->getColorAt($x, $y));
}
/**
* Writes a pixel at the designated coordinates
*
* Takes an associative array of colours and uses getExactColor() to
* retrieve the exact index color to write to the image with.
*
* @param int $x
* @param int $y
* @param array $color
*/
function setRGBAt($x, $y, $color)
{
$this->setColorAt($x, $y, $this->getExactColor($color));
}
/**
* Returns a color's RGB
*
* @param int $colorIndex Color index
* @return mixed RGBA array for a color with index $colorIndex
*/
function getColorRGB($colorIndex)
{
return imageColorsForIndex($this->handle, $colorIndex);
}
/**
* Returns an index of the color at $x, $y
*
* @param int $x
* @param int $y
* @return int Color index for a pixel at $x, $y
*/
function getColorAt($x, $y)
{
return imagecolorat($this->handle, $x, $y);
}
/**
* Set the color index $color to a pixel at $x, $y
*
* @param int $x
* @param int $y
* @param int $color Color index
*/
function setColorAt($x, $y, $color)
{
return imagesetpixel($this->handle, $x, $y, $color);
}
/**
* Returns closest color index that matches the given RGB value. Uses
* PHP's imagecolorclosest()
*
* @param mixed $R Red or RGBA array
* @param int $G Green component (or null if $R is an RGB array)
* @param int $B Blue component (or null if $R is an RGB array)
* @return int Color index
*/
function getClosestColor($R, $G = null, $B = null)
{
if (is_array($R))
return imagecolorclosest($this->handle, $R['red'], $R['green'], $R['blue']);
else
return imagecolorclosest($this->handle, $R, $G, $B);
}
/**
* Returns the color index that exactly matches the given RGB value. Uses
* PHP's imagecolorexact()
*
* @param mixed $R Red or RGBA array
* @param int $G Green component (or null if $R is an RGB array)
* @param int $B Blue component (or null if $R is an RGB array)
* @return int Color index
*/
function getExactColor($R, $G = null, $B = null)
{
if (is_array($R))
return imagecolorexact($this->handle, $R['red'], $R['green'], $R['blue']);
else
return imagecolorexact($this->handle, $R, $G, $B);
}
/**
* Copies transparency information from $sourceImage. Optionally fills
* the image with the transparent color at (0, 0).
*
* @param object $sourceImage
* @param bool $fill True if you want to fill the image with transparent color
*/
function copyTransparencyFrom($sourceImage, $fill = true)
{
if ($sourceImage->isTransparent())
{
$rgba = $sourceImage->getTransparentColorRGB();
if ($rgba === null)
return;
if ($this->isTrueColor())
{
$rgba['alpha'] = 127;
$color = $this->allocateColorAlpha($rgba);
}
else
$color = $this->allocateColor($rgba);
$this->setTransparentColor($color);
if ($fill)
$this->fill(0, 0, $color);
}
}
/**
* Fill the image at ($x, $y) with color index $color
*
* @param int $x
* @param int $y
* @param int $color
*/
function fill($x, $y, $color)
{
return imagefill($this->handle, $x, $y, $color);
}
/**
* Used internally to create Operation objects
*
* @param string $name
* @return object
*/
protected function getOperation($name)
{
return WideImage_OperationFactory::get($name);
}
/**
* Returns the image's mask
*
* Mask is a greyscale image where the shade defines the alpha channel (black = transparent, white = opaque).
*
* For opaque images (JPEG), the result will be white. For images with single-color transparency (GIF, 8-bit PNG),
* the areas with the transparent color will be black. For images with alpha channel transparenct,
* the result will be alpha channel.
*
* @return WideImage_Image An image mask
**/
function getMask()
{
return $this->getOperation('GetMask')->execute($this);
}
/**
* Resize the image to given dimensions.
*
* $width and $height are both smart coordinates. This means that you can pass any of these values in:
* - positive or negative integer (100, -20, ...)
* - positive or negative percent string (30%, -15%, ...)
* - complex coordinate (50% - 20, 15 + 30%, ...)
*
* If $width is null, it's calculated proportionally from $height, and vice versa.
*
* Example (resize to half-size):
* <code>
* $smaller = $image->resize('50%');
*
* $smaller = $image->resize('100', '100', 'inside', 'down');
* is the same as
* $smaller = $image->resizeDown(100, 100, 'inside');
* </code>
*
* @param mixed $width The new width (smart coordinate), or null.
* @param mixed $height The new height (smart coordinate), or null.
* @param string $fit 'inside', 'outside', 'fill'
* @param string $scale 'down', 'up', 'any'
* @return WideImage_Image The resized image
*/
function resize($width = null, $height = null, $fit = 'inside', $scale = 'any')
{
return $this->getOperation('Resize')->execute($this, $width, $height, $fit, $scale);
}
/**
* Same as WideImage_Image::resize(), but the image is only applied if it is larger then the given dimensions.
* Otherwise, the resulting image retains the source's dimensions.
*
* @param int $width New width, smart coordinate
* @param int $height New height, smart coordinate
* @param string $fit 'inside', 'outside', 'fill'
* @return WideImage_Image resized image
*/
function resizeDown($width = null, $height = null, $fit = 'inside')
{
return $this->resize($width, $height, $fit, 'down');
}
/**
* Same as WideImage_Image::resize(), but the image is only applied if it is smaller then the given dimensions.
* Otherwise, the resulting image retains the source's dimensions.
*
* @param int $width New width, smart coordinate
* @param int $height New height, smart coordinate
* @param string $fit 'inside', 'outside', 'fill'
* @return WideImage_Image resized image
*/
function resizeUp($width = null, $height = null, $fit = 'inside')
{
return $this->resize($width, $height, $fit, 'up');
}
/**
* Rotate the image for angle $angle clockwise.
*
* Preserves transparency. Has issues when saving to a BMP.
*
* @param int $angle Angle in degrees, clock-wise
* @param int $bgColor color of the new background
* @param bool $ignoreTransparent
* @return WideImage_Image The rotated image
*/
function rotate($angle, $bgColor = null, $ignoreTransparent = true)
{
return $this->getOperation('Rotate')->execute($this, $angle, $bgColor, $ignoreTransparent);
}
/**
* This method lays the overlay (watermark) on the image.
*
* Hint: if the overlay is a truecolor image with alpha channel, you should leave $pct at 100.
*
* This operation supports alignment notation in coordinates:
* <code>
* $watermark = WideImage::load('logo.gif');
* $base = WideImage::load('picture.jpg');
* $result = $base->merge($watermark, "right - 10", "bottom - 10", 50);
* // applies a logo aligned to bottom-right corner with a 10 pixel margin
* </code>
*
* @param WideImage_Image $overlay The overlay image
* @param mixed $left Left position of the overlay, smart coordinate
* @param mixed $top Top position of the overlay, smart coordinate
* @param int $pct The opacity of the overlay
* @return WideImage_Image The merged image
*/
function merge($overlay, $left = 0, $top = 0, $pct = 100)
{
return $this->getOperation('Merge')->execute($this, $overlay, $left, $top, $pct);
}
/**
* Resizes the canvas of the image, but doesn't scale the content of the image
*
* This operation creates an empty canvas with dimensions $width x $height, filled with
* background color $bg_color and draws the original image onto it at position [$pos_x, $pos_y].
*
* Arguments $width, $height, $pos_x and $pos_y are all smart coordinates. $width and $height are
* relative to the current image size, $pos_x and $pos_y are relative to the newly calculated
* canvas size. This can be confusing, but it makes sense. See the example below.
*
* The example below loads a 100x150 image and then resizes its canvas to 200% x 100%+20
* (which evaluates to 200x170). The image is placed at position [10, center+20], which evaluates to [10, 30].
* <code>
* $image = WideImage::load('someimage.jpg'); // 100x150
* $white = $image->allocateColor(255, 255, 255);
* $image->resizeCanvas('200%', '100% + 20', 10, 'center+20', $white);
* </code>
*
* The parameter $merge defines whether the original image should be merged onto the new canvas.
* This means it blends transparent color and alpha colors into the background color. If set to false,
* the original image is just copied over, preserving the transparency/alpha information.
*
* You can set the $scale parameter to limit when to resize the canvas. For example, if you want
* to resize the canvas only if the image is smaller than the new size, but leave the image intact
* if it's larger, set it to 'up'. Likewise, if you want to shrink the canvas, but don't want to
* change images that are already smaller, set it to 'down'.
*
* @param mixed $width Width of the new canvas (smart coordinate, relative to current image width)
* @param mixed $height Height of the new canvas (smart coordinate, relative to current image height)
* @param mixed $pos_x x-position of the image (smart coordinate, relative to the new width)
* @param mixed $pos_y y-position of the image (smart coordinate, relative to the new height)
* @param int $bg_color Background color (created with allocateColor or allocateColorAlpha), defaults to null (tries to use a transparent color)
* @param string $scale Possible values: 'up' (enlarge only), 'down' (downsize only), 'any' (resize precisely to $width x $height). Defaults to 'any'.
* @param bool $merge Merge the original image (flatten alpha channel and transparency) or copy it over (preserve). Defaults to false.
* @return WideImage_Image The resulting image with resized canvas
*/
function resizeCanvas($width, $height, $pos_x, $pos_y, $bg_color = null, $scale = 'any', $merge = false)
{
return $this->getOperation('ResizeCanvas')->execute($this, $width, $height, $pos_x, $pos_y, $bg_color, $scale, $merge);
}
/**
* Returns an image with round corners
*
* You can either set the corners' color or set them transparent.
*
* Note on $smoothness: 1 means jagged edges, 2 is much better, more than 4 doesn't noticeably improve the quality.
* Rendering becomes increasingly slower if you increase smoothness.
*
* Example:
* <code>
* $nice = $ugly->roundCorners(20, $ugly->allocateColor(255, 0, 0), 2);
* </code>
*
* Use $corners parameter to specify which corners to draw rounded. Possible values are
* WideImage::SIDE_TOP_LEFT, WideImage::SIDE_TOP,
* WideImage::SIDE_TOP_RIGHT, WideImage::SIDE_RIGHT,
* WideImage::SIDE_BOTTOM_RIGHT, WideImage::SIDE_BOTTOM,
* WideImage::SIDE_BOTTOM_LEFT, WideImage::SIDE_LEFT, and WideImage::SIDE_ALL.
* You can specify any combination of corners with a + operation, see example below.
*
* Example:
* <code>
* $white = $image->allocateColor(255, 255, 255);
* $diagonal_corners = $image->roundCorners(15, $white, 2, WideImage::SIDE_TOP_LEFT + WideImage::SIDE_BOTTOM_RIGHT);
* $right_corners = $image->roundCorners(15, $white, 2, WideImage::SIDE_RIGHT);
* </code>
*
* @param int $radius Radius of the corners
* @param int $color The color of corners. If null, corners are rendered transparent (slower than using a solid color).
* @param int $smoothness Specify the level of smoothness. Suggested values from 1 to 4.
* @param int $corners Specify which corners to draw (defaults to WideImage::SIDE_ALL = all corners)
* @return WideImage_Image The resulting image with round corners
*/
function roundCorners($radius, $color = null, $smoothness = 2, $corners = 255)
{
return $this->getOperation('RoundCorners')->execute($this, $radius, $color, $smoothness, $corners);
}
/**
* Returns an image with applied mask
*
* A mask is a grayscale image, where the shade determines the alpha channel. Black is fully transparent
* and white is fully opaque.
*
* @param WideImage_Image $mask The mask image, greyscale
* @param mixed $left Left coordinate, smart coordinate
* @param mixed $top Top coordinate, smart coordinate
* @return WideImage_Image The resulting image
**/
function applyMask($mask, $left = 0, $top = 0)
{
return $this->getOperation('ApplyMask')->execute($this, $mask, $left, $top);
}
/**
* Applies a filter
*
* @param int $filter One of the IMG_FILTER_* constants
* @param int $arg1
* @param int $arg2
* @param int $arg3
* @param int $arg4
* @return WideImage_Image
*/
function applyFilter($filter, $arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null)
{
return $this->getOperation('ApplyFilter')->execute($this, $filter, $arg1, $arg2, $arg3, $arg4);
}
/**
* Applies convolution matrix with imageconvolution()
*
* @param array $matrix
* @param float $div
* @param float $offset
* @return WideImage_Image
*/
function applyConvolution($matrix, $div, $offset)
{
return $this->getOperation('ApplyConvolution')->execute($this, $matrix, $div, $offset);
}
/**
* Returns a cropped rectangular portion of the image
*
* If the rectangle specifies area that is out of bounds, it's limited to the current image bounds.
*
* Examples:
* <code>
* $cropped = $img->crop(10, 10, 150, 200); // crops a 150x200 rect at (10, 10)
* $cropped = $img->crop(-100, -50, 100, 50); // crops a 100x50 rect at the right-bottom of the image
* $cropped = $img->crop('25%', '25%', '50%', '50%'); // crops a 50%x50% rect from the center of the image
* </code>
*
* This operation supports alignment notation in left/top coordinates.
* Example:
* <code>
* $cropped = $img->crop("right", "bottom", 100, 200); // crops a 100x200 rect from right bottom
* $cropped = $img->crop("center", "middle", 50, 30); // crops a 50x30 from the center of the image
* </code>
*
* @param mixed $left Left-coordinate of the crop rect, smart coordinate
* @param mixed $top Top-coordinate of the crop rect, smart coordinate
* @param mixed $width Width of the crop rect, smart coordinate
* @param mixed $height Height of the crop rect, smart coordinate
* @return WideImage_Image The cropped image
**/
function crop($left = 0, $top = 0, $width = '100%', $height = '100%')
{
return $this->getOperation('Crop')->execute($this, $left, $top, $width, $height);
}
/**
* Performs an auto-crop on the image
*
* The image is auto-cropped from each of four sides. All sides are
* scanned for pixels that differ from $base_color for more than
* $rgb_threshold in absolute RGB difference. If more than $pixel_cutoff
* differentiating pixels are found, that line is considered to be the crop line for the side.
* If the line isn't different enough, the algorithm procedes to the next line
* towards the other edge of the image.
*
* When the crop rectangle is found, it's enlarged by the $margin value on each of the four sides.
*
* @param int $margin Margin for the crop rectangle, can be negative.
* @param int $rgb_threshold RGB difference which still counts as "same color".
* @param int $pixel_cutoff How many pixels need to be different to mark a cut line.
* @param int $base_color The base color index. If none specified (or null given), left-top pixel is used.
* @return WideImage_Image The cropped image
*/
function autoCrop($margin = 0, $rgb_threshold = 0, $pixel_cutoff = 1, $base_color = null)
{
return $this->getOperation('AutoCrop')->execute($this, $margin, $rgb_threshold, $pixel_cutoff, $base_color);
}
/**
* Returns a negative of the image
*
* This operation differs from calling WideImage_Image::applyFilter(IMG_FILTER_NEGATIVE), because it's 8-bit and transparency safe.
* This means it will return an 8-bit image, if the source image is 8-bit. If that 8-bit image has a palette transparency,
* the resulting image will keep transparency.
*
* @return WideImage_Image negative of the image
*/
function asNegative()
{
return $this->getOperation('AsNegative')->execute($this);
}
/**
* Returns a grayscale copy of the image
*
* @return WideImage_Image grayscale copy
**/
function asGrayscale()
{
return $this->getOperation('AsGrayscale')->execute($this);
}
/**
* Returns a mirrored copy of the image
*
* @return WideImage_Image Mirrored copy
**/
function mirror()
{
return $this->getOperation('Mirror')->execute($this);
}
/**
* Applies the unsharp filter
*
* @param float $amount
* @param float $radius
* @param float $threshold
* @return WideImage_Image Unsharpened copy of the image
**/
function unsharp($amount, $radius, $threshold)
{
return $this->getOperation('Unsharp')->execute($this, $amount, $radius, $threshold);
}
/**
* Returns a flipped (mirrored over horizontal line) copy of the image
*
* @return WideImage_Image Flipped copy
**/
function flip()
{
return $this->getOperation('Flip')->execute($this);
}
/**
* Corrects gamma on the image
*
* @param float $inputGamma
* @param float $outputGamma
* @return WideImage_Image Image with corrected gamma
**/
function correctGamma($inputGamma, $outputGamma)
{
return $this->getOperation('CorrectGamma')->execute($this, $inputGamma, $outputGamma);
}
/**
* Adds noise to the image
*
* @author Tomasz Kapusta
*
* @param int $amount Number of noise pixels to add
* @param string $type Type of noise 'salt&pepper', 'color' or 'mono'
* @return WideImage_Image Image with noise added
**/
function addNoise($amount, $type)
{
return $this->getOperation('AddNoise')->execute($this, $amount, $type);
}
/**
* Used internally to execute operations
*
* @param string $name
* @param array $args
* @return WideImage_Image
*/
function __call($name, $args)
{
$op = $this->getOperation($name);
array_unshift($args, $this);
return call_user_func_array(array($op, 'execute'), $args);
}
/**
* Returns an image in GIF or PNG format
*
* @return string
*/
function __toString()
{
if ($this->isTransparent())
return $this->asString('gif');
else
return $this->asString('png');
}
/**
* Returns a copy of the image object
*
* @return WideImage_Image The copy
**/
function copy()
{
$dest = $this->doCreate($this->getWidth(), $this->getHeight());
$dest->copyTransparencyFrom($this, true);
$this->copyTo($dest, 0, 0);
return $dest;
}
/**
* Copies this image onto another image
*
* @param WideImage_Image $dest
* @param int $left
* @param int $top
**/
function copyTo($dest, $left = 0, $top = 0)
{
if (!imagecopy($dest->getHandle(), $this->handle, $left, $top, 0, 0, $this->getWidth(), $this->getHeight()))
throw new WideImage_GDFunctionResultException("imagecopy() returned false");
}
/**
* Returns the canvas object
*
* The Canvas object can be used to draw text and shapes on the image
*
* Examples:
* <code>
* $img = WideImage::load('pic.jpg);
* $canvas = $img->getCanvas();
* $canvas->useFont('arial.ttf', 15, $img->allocateColor(200, 220, 255));
* $canvas->writeText(10, 50, "Hello world!");
*
* $canvas->filledRectangle(10, 10, 80, 40, $img->allocateColor(255, 127, 255));
* $canvas->line(60, 80, 30, 100, $img->allocateColor(255, 0, 0));
* $img->saveToFile('new.png');
* </code>
*
* @return WideImage_Canvas The Canvas object
**/
function getCanvas()
{
if ($this->canvas == null)
$this->canvas = new WideImage_Canvas($this);
return $this->canvas;
}
/**
* Returns true if the image is true-color, false otherwise
*
* @return bool
**/
abstract function isTrueColor();
/**
* Returns a true-color copy of the image
*
* @return WideImage_TrueColorImage
**/
abstract function asTrueColor();
/**
* Returns a palette copy (8bit) of the image
*
* @param int $nColors Number of colors in the resulting image, more than 0, less or equal to 255
* @param bool $dither Use dithering or not
* @param bool $matchPalette Set to true to use imagecolormatch() to match the resulting palette more closely to the original image
* @return WideImage_Image
**/
abstract function asPalette($nColors = 255, $dither = null, $matchPalette = true);
/**
* Retrieve an image with selected channels
*
* Examples:
* <code>
* $channels = $img->getChannels('red', 'blue');
* $channels = $img->getChannels('alpha', 'green');
* $channels = $img->getChannels(array('green', 'blue'));
* </code>
*
* @return WideImage_Image
**/
abstract function getChannels();
/**
* Returns an image without an alpha channel
*
* @return WideImage_Image
**/
abstract function copyNoAlpha();
/**
* Returns an array of serializable protected variables. Called automatically upon serialize().
*
* @return array
*/
function __sleep()
{
$this->sdata = $this->asString('png');
return array('sdata', 'handleReleased');
}
/**
* Restores an image from serialization. Called automatically upon unserialize().
*/
function __wakeup()
{
$temp_image = WideImage::loadFromString($this->sdata);
$temp_image->releaseHandle();
$this->handle = $temp_image->handle;
$temp_image = null;
$this->sdata = null;
}
}

View File

@ -1,51 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Mappers
**/
include_once WideImage::path() . '/vendor/de77/BMP.php';
/**
* Mapper support for BMP
*
* @package Internal/Mappers
*/
class WideImage_Mapper_BMP
{
function load($uri)
{
return WideImage_vendor_de77_BMP::imagecreatefrombmp($uri);
}
function loadFromString($data)
{
return WideImage_vendor_de77_BMP::imagecreatefromstring($data);
}
function save($handle, $uri = null)
{
if ($uri == null)
return WideImage_vendor_de77_BMP::imagebmp($handle);
else
return WideImage_vendor_de77_BMP::imagebmp($handle, $uri);
}
}

View File

@ -1,44 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Mappers
**/
/**
* Mapper class for GD files
*
* @package Internal/Mappers
*/
class WideImage_Mapper_GD
{
function load($uri)
{
return @imagecreatefromgd($uri);
}
function save($handle, $uri = null)
{
if ($uri == null)
return imagegd($handle);
else
return imagegd($handle, $uri);
}
}

View File

@ -1,41 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Mappers
**/
/**
* Mapper class for GD2 files
*
* @package Internal/Mappers
*/
class WideImage_Mapper_GD2
{
function load($uri)
{
return @imagecreatefromgd2($uri);
}
function save($handle, $uri = null, $chunk_size = null, $type = null)
{
return imagegd2($handle, $uri, $chunk_size, $type);
}
}

View File

@ -1,50 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Mappers
**/
/**
* Mapper class for GIF files
*
* @package Internal/Mappers
*/
class WideImage_Mapper_GIF
{
function load($uri)
{
return @imagecreatefromgif($uri);
}
function save($handle, $uri = null)
{
// This is a workaround for a bug, for which PHP devs claim it's not
// really a bug. Well, it IS.
// You can't pass null as the second parameter, because php is
// then trying to save an image to a '' location (which results in an
// error, of course). And the same thing works fine for imagepng() and
// imagejpeg(). It's a bug! ;)
if ($uri)
return imagegif($handle, $uri);
else
return imagegif($handle);
}
}

View File

@ -1,41 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Mappers
**/
/**
* Mapper class for JPEG files
*
* @package Internal/Mappers
*/
class WideImage_Mapper_JPEG
{
function load($uri)
{
return @imagecreatefromjpeg($uri);
}
function save($handle, $uri = null, $quality = 100)
{
return imagejpeg($handle, $uri, $quality);
}
}

View File

@ -1,41 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Mappers
**/
/**
* Mapper class for PNG files
*
* @package Internal/Mappers
*/
class WideImage_Mapper_PNG
{
function load($uri)
{
return @imagecreatefrompng($uri);
}
function save($handle, $uri = null, $compression = 9, $filters = PNG_ALL_FILTERS)
{
return imagepng($handle, $uri, $compression, $filters);
}
}

View File

@ -1,48 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Mappers
**/
include_once WideImage::path() . '/vendor/de77/TGA.php';
/**
* Mapper support for TGA
*
* @package Internal/Mappers
*/
class WideImage_Mapper_TGA
{
function load($uri)
{
return WideImage_vendor_de77_TGA::imagecreatefromtga($uri);
}
function loadFromString($data)
{
return WideImage_vendor_de77_TGA::imagecreatefromstring($data);
}
function save($handle, $uri = null)
{
throw new WideImage_Exception("Saving to TGA isn't supported.");
}
}

View File

@ -1,126 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package WideImage
**/
/**
* Thrown when image format isn't supported
*
* @package Exceptions
*/
class WideImage_UnsupportedFormatException extends WideImage_Exception {}
/**
* Mapper factory
*
* @package Internals
**/
abstract class WideImage_MapperFactory
{
static protected $mappers = array();
static protected $customMappers = array();
static protected $mimeTable = array(
'image/jpg' => 'JPEG',
'image/jpeg' => 'JPEG',
'image/pjpeg' => 'JPEG',
'image/gif' => 'GIF',
'image/png' => 'PNG'
);
/**
* Returns a mapper, based on the $uri and $format
*
* @param string $uri File URI
* @param string $format File format (extension or mime-type) or null
* @return WideImage_Mapper
**/
static function selectMapper($uri, $format = null)
{
$format = self::determineFormat($uri, $format);
if (array_key_exists($format, self::$mappers))
return self::$mappers[$format];
$mapperClassName = 'WideImage_Mapper_' . $format;
if (!class_exists($mapperClassName, false))
{
$mapperFileName = WideImage::path() . 'Mapper/' . $format . '.php';
if (file_exists($mapperFileName))
require_once $mapperFileName;
}
if (class_exists($mapperClassName))
{
self::$mappers[$format] = new $mapperClassName();
return self::$mappers[$format];
}
throw new WideImage_UnsupportedFormatException("Format '{$format}' is not supported.");
}
static function registerMapper($mapper_class_name, $mime_type, $extension)
{
self::$customMappers[$mime_type] = $mapper_class_name;
self::$mimeTable[$mime_type] = $extension;
}
static function getCustomMappers()
{
return self::$customMappers;
}
static function determineFormat($uri, $format = null)
{
if ($format == null)
$format = self::extractExtension($uri);
// mime-type match
if (preg_match('~[a-z]*/[a-z-]*~i', $format))
if (isset(self::$mimeTable[strtolower($format)]))
{
return self::$mimeTable[strtolower($format)];
}
// clean the string
$format = strtoupper(preg_replace('/[^a-z0-9_-]/i', '', $format));
if ($format == 'JPG')
$format = 'JPEG';
return $format;
}
static function mimeType($format)
{
return array_search(strtoupper($format), self::$mimeTable);
}
static function extractExtension($uri)
{
$p = strrpos($uri, '.');
if ($p === false)
return '';
else
return substr($uri, $p + 1);
}
}

View File

@ -1,153 +0,0 @@
<?php
/**
* @author Tomasz Kapusta
* @copyright 2010
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* Noise filter
*
* @package Internal/Operations
*/
class WideImage_Operation_AddNoise {
/**
* Returns image with noise added
*
* @param WideImage_Image $image
* @param float $amount
* @param const $type
* @param float $threshold
* @return WideImage_Image
*/
function execute($image, $amount, $type) {
switch ($type)
{
case 'salt&pepper' : $fun = 'saltPepperNoise_fun';
break;
case 'color' : $fun = 'colorNoise_fun';
break;
default : $fun = 'monoNoise_fun';
break;
}
return self::filter($image->asTrueColor(), $fun, $amount);
}
/**
* Returns image with every pixel changed by specififed function
*
* @param WideImage_Image $image
* @param str $function
* @param int $value
* @return WideImage_Image
*/
function filter($image, $function, $value)
{
for ($y = 0; $y < $image->getHeight(); $y++)
{
for ($x = 0; $x< $image->getWidth(); $x++)
{
$rgb = imagecolorat($image->getHandle(), $x, $y);
$a = ($rgb >> 24) & 0xFF;
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
self::$function($r, $g, $b, $value);
$color = imagecolorallocatealpha($image->getHandle(), $r, $g, $b, $a);
imagesetpixel($image->getHandle(), $x, $y, $color);
}
}
return $image;
}
/**
* Adds color noise by altering given R,G,B values using specififed amount
*
* @param int $r
* @param int $g
* @param int $b
* @param int $value
* @return void
*/
function colorNoise_fun(&$r, &$g, &$b, $amount)
{
$r = self::byte($r + mt_rand(0, $amount) - ($amount >> 1) );
$g = self::byte($g + mt_rand(0, $amount) - ($amount >> 1) );
$b = self::byte($b + mt_rand(0, $amount) - ($amount >> 1) );
}
/**
* Adds mono noise by altering given R,G,B values using specififed amount
*
* @param int $r
* @param int $g
* @param int $b
* @param int $value
* @return void
*/
function monoNoise_fun(&$r, &$g, &$b, $amount)
{
$rand = mt_rand(0, $amount) - ($amount >> 1);
$r = self::byte($r + $rand);
$g = self::byte($g + $rand);
$b = self::byte($b + $rand);
}
/**
* Adds salt&pepper noise by altering given R,G,B values using specififed amount
*
* @param int $r
* @param int $g
* @param int $b
* @param int $value
* @return void
*/
function saltPepperNoise_fun(&$r, &$g, &$b, $amount)
{
if (mt_rand(0, 255 - $amount) != 0) return;
$rand = mt_rand(0, 1);
switch ($rand)
{
case 0 : $r = $g = $b = 0;
break;
case 1 : $r = $g = $b = 255;
break;
}
}
/**
* Returns value within (0,255)
*
* @param int $b
* @return int
*/
function byte($b)
{
if ($b > 255) return 255;
if ($b < 0) return 0;
return (int) $b;
}
}

View File

@ -1,48 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* ApplyConvolution operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_ApplyConvolution
{
/**
* Executes imageconvolution() filter
*
* @param WideImage_Image $image
* @param array $matrix
* @param numeric $div
* @param numeric $offset
* @return WideImage_Image
*/
function execute($image, $matrix, $div, $offset)
{
$new = $image->asTrueColor();
if (!imageconvolution($new->getHandle(), $matrix, $div, $offset))
throw new WideImage_GDFunctionResultException("imageconvolution() returned false");
return $new;
}
}

View File

@ -1,67 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* ApplyFilter operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_ApplyFilter
{
/**
* A list of filters that only accept one arguments for imagefilter()
*
* @var array
*/
static protected $one_arg_filters = array(IMG_FILTER_SMOOTH, IMG_FILTER_CONTRAST, IMG_FILTER_BRIGHTNESS);
/**
* Executes imagefilter
*
* @param WideImage_Image $image
* @param int $filter
* @param numeric $arg1
* @param numeric $arg2
* @param numeric $arg3
* @return WideImage_TrueColorImage
*/
function execute($image, $filter, $arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null)
{
$new = $image->asTrueColor();
if (in_array($filter, self::$one_arg_filters))
$res = imagefilter($new->getHandle(), $filter, $arg1);
elseif (defined('IMG_FILTER_PIXELATE') && $filter == IMG_FILTER_PIXELATE)
$res = imagefilter($new->getHandle(), $filter, $arg1, $arg2);
elseif ($filter == IMG_FILTER_COLORIZE)
$res = imagefilter($new->getHandle(), $filter, $arg1, $arg2, $arg3, $arg4);
else
$res = imagefilter($new->getHandle(), $filter);
if (!$res)
throw new WideImage_GDFunctionResultException("imagefilter() returned false");
return $new;
}
}

View File

@ -1,105 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* ApplyMask operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_ApplyMask
{
/**
* Applies a mask on the copy of source image
*
* @param WideImage_Image $image
* @param WideImage_Image $mask
* @param smart_coordinate $left
* @param smart_coordinate $top
* @return WideImage_Image
*/
function execute($image, $mask, $left = 0, $top = 0)
{
$left = WideImage_Coordinate::fix($left, $image->getWidth(), $mask->getWidth());
$top = WideImage_Coordinate::fix($top, $image->getHeight(), $mask->getHeight());
$width = $image->getWidth();
$mask_width = $mask->getWidth();
$height = $image->getHeight();
$mask_height = $mask->getHeight();
$result = $image->asTrueColor();
$result->alphaBlending(false);
$result->saveAlpha(true);
$srcTransparentColor = $result->getTransparentColor();
if ($srcTransparentColor >= 0)
{
# this was here. works without.
#$trgb = $image->getColorRGB($srcTransparentColor);
#$trgb['alpha'] = 127;
#$destTransparentColor = $result->allocateColorAlpha($trgb);
#$result->setTransparentColor($destTransparentColor);
$destTransparentColor = $srcTransparentColor;
}
else
{
$destTransparentColor = $result->allocateColorAlpha(255, 255, 255, 127);
}
for ($x = 0; $x < $width; $x++)
for ($y = 0; $y < $height; $y++)
{
$mx = $x - $left;
$my = $y - $top;
if ($mx >= 0 && $mx < $mask_width && $my >= 0 && $my < $mask_height)
{
$srcColor = $image->getColorAt($x, $y);
if ($srcColor == $srcTransparentColor)
$destColor = $destTransparentColor;
else
{
$maskRGB = $mask->getRGBAt($mx, $my);
if ($maskRGB['red'] == 0)
$destColor = $destTransparentColor;
elseif ($srcColor >= 0)
{
$imageRGB = $image->getRGBAt($x, $y);
$level = ($maskRGB['red'] / 255) * (1 - $imageRGB['alpha'] / 127);
$imageRGB['alpha'] = 127 - round($level * 127);
if ($imageRGB['alpha'] == 127)
$destColor = $destTransparentColor;
else
$destColor = $result->allocateColorAlpha($imageRGB);
}
else
$destColor = $destTransparentColor;
}
$result->setColorAt($x, $y, $destColor);
}
}
return $result;
}
}

View File

@ -1,49 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* AsGrayscale operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_AsGrayscale
{
/**
* Returns a greyscale copy of an image
*
* @param WideImage_Image $image
* @return WideImage_Image
*/
function execute($image)
{
$new = $image->asTrueColor();
if (!imagefilter($new->getHandle(), IMG_FILTER_GRAYSCALE))
throw new WideImage_GDFunctionResultException("imagefilter() returned false");
if (!$image->isTrueColor())
$new = $new->asPalette();
return $new;
}
}

View File

@ -1,63 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* AsNegative operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_AsNegative
{
/**
* Returns a greyscale copy of an image
*
* @param WideImage_Image $image
* @return WideImage_Image
*/
function execute($image)
{
$palette = !$image->isTrueColor();
$transparent = $image->isTransparent();
if ($palette && $transparent)
$tcrgb = $image->getTransparentColorRGB();
$new = $image->asTrueColor();
if (!imagefilter($new->getHandle(), IMG_FILTER_NEGATE))
throw new WideImage_GDFunctionResultException("imagefilter() returned false");
if ($palette)
{
$new = $new->asPalette();
if ($transparent)
{
$irgb = array('red' => 255 - $tcrgb['red'], 'green' => 255 - $tcrgb['green'], 'blue' => 255 - $tcrgb['blue'], 'alpha' => 127);
// needs imagecolorexactalpha instead of imagecolorexact, otherwise doesn't work on some transparent GIF images
$new_tci = imagecolorexactalpha($new->getHandle(), $irgb['red'], $irgb['green'], $irgb['blue'], 127);
$new->setTransparentColor($new_tci);
}
}
return $new;
}
}

View File

@ -1,162 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* AutoCrop operation
*
* @package Internal/Operations
*/
class WideImage_Operation_AutoCrop
{
/**
* Executes the auto-crop operation on the $img
*
* @param WideImage_Image $img
* @param int $rgb_threshold The difference in RGB from $base_color
* @param int $pixel_cutoff The number of pixels on each border that must be over $rgb_threshold
* @param int $base_color The color that will get cropped
* @return WideImage_Image resulting auto-cropped image
*/
function execute($img, $margin, $rgb_threshold, $pixel_cutoff, $base_color)
{
$margin = intval($margin);
$rgb_threshold = intval($rgb_threshold);
if ($rgb_threshold < 0)
$rgb_threshold = 0;
$pixel_cutoff = intval($pixel_cutoff);
if ($pixel_cutoff <= 1)
$pixel_cutoff = 1;
if ($base_color === null)
$rgb_base = $img->getRGBAt(0, 0);
else
{
if ($base_color < 0)
return $img->copy();
$rgb_base = $img->getColorRGB($base_color);
}
$cut_rect = array('left' => 0, 'top' => 0, 'right' => $img->getWidth() - 1, 'bottom' => $img->getHeight() - 1);
for ($y = 0; $y <= $cut_rect['bottom']; $y++)
{
$count = 0;
for ($x = 0; $x <= $cut_rect['right']; $x++)
{
$rgb = $img->getRGBAt($x, $y);
$diff = abs($rgb['red'] - $rgb_base['red']) + abs($rgb['green'] - $rgb_base['green']) + abs($rgb['blue'] - $rgb_base['blue']);
if ($diff > $rgb_threshold)
{
$count++;
if ($count >= $pixel_cutoff)
{
$cut_rect['top'] = $y;
break 2;
}
}
}
}
for ($y = $img->getHeight() - 1; $y >= $cut_rect['top']; $y--)
{
$count = 0;
for ($x = 0; $x <= $cut_rect['right']; $x++)
{
$rgb = $img->getRGBAt($x, $y);
$diff = abs($rgb['red'] - $rgb_base['red']) + abs($rgb['green'] - $rgb_base['green']) + abs($rgb['blue'] - $rgb_base['blue']);
if ($diff > $rgb_threshold)
{
$count++;
if ($count >= $pixel_cutoff)
{
$cut_rect['bottom'] = $y;
break 2;
}
}
}
}
for ($x = 0; $x <= $cut_rect['right']; $x++)
{
$count = 0;
for ($y = $cut_rect['top']; $y <= $cut_rect['bottom']; $y++)
{
$rgb = $img->getRGBAt($x, $y);
$diff = abs($rgb['red'] - $rgb_base['red']) + abs($rgb['green'] - $rgb_base['green']) + abs($rgb['blue'] - $rgb_base['blue']);
if ($diff > $rgb_threshold)
{
$count++;
if ($count >= $pixel_cutoff)
{
$cut_rect['left'] = $x;
break 2;
}
}
}
}
for ($x = $cut_rect['right']; $x >= $cut_rect['left']; $x--)
{
$count = 0;
for ($y = $cut_rect['top']; $y <= $cut_rect['bottom']; $y++)
{
$rgb = $img->getRGBAt($x, $y);
$diff = abs($rgb['red'] - $rgb_base['red']) + abs($rgb['green'] - $rgb_base['green']) + abs($rgb['blue'] - $rgb_base['blue']);
if ($diff > $rgb_threshold)
{
$count++;
if ($count >= $pixel_cutoff)
{
$cut_rect['right'] = $x;
break 2;
}
}
}
}
$cut_rect = array(
'left' => $cut_rect['left'] - $margin,
'top' => $cut_rect['top'] - $margin,
'right' => $cut_rect['right'] + $margin,
'bottom' => $cut_rect['bottom'] + $margin
);
if ($cut_rect['left'] < 0)
$cut_rect['left'] = 0;
if ($cut_rect['top'] < 0)
$cut_rect['top'] = 0;
if ($cut_rect['right'] >= $img->getWidth())
$cut_rect['right'] = $img->getWidth() - 1;
if ($cut_rect['bottom'] >= $img->getHeight())
$cut_rect['bottom'] = $img->getHeight() - 1;
return $img->crop($cut_rect['left'], $cut_rect['top'], $cut_rect['right'] - $cut_rect['left'] + 1, $cut_rect['bottom'] - $cut_rect['top'] + 1);
}
}

View File

@ -1,90 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* CopyChannelsPalette operation class
*
* This operation is intended to be used on palette images
*
* @package Internal/Operations
*/
class WideImage_Operation_CopyChannelsPalette
{
/**
* Returns an image with only specified channels copied
*
* @param WideImage_PaletteImage $img
* @param array $channels
* @return WideImage_PaletteImage
*/
function execute($img, $channels)
{
$blank = array('red' => 0, 'green' => 0, 'blue' => 0);
if (isset($channels['alpha']))
unset($channels['alpha']);
$width = $img->getWidth();
$height = $img->getHeight();
$copy = WideImage_PaletteImage::create($width, $height);
if ($img->isTransparent())
{
$otci = $img->getTransparentColor();
$TRGB = $img->getColorRGB($otci);
$tci = $copy->allocateColor($TRGB);
}
else
{
$otci = null;
$tci = null;
}
for ($x = 0; $x < $width; $x++)
for ($y = 0; $y < $height; $y++)
{
$ci = $img->getColorAt($x, $y);
if ($ci === $otci)
{
$copy->setColorAt($x, $y, $tci);
continue;
}
$RGB = $img->getColorRGB($ci);
$newRGB = $blank;
foreach ($channels as $channel)
$newRGB[$channel] = $RGB[$channel];
$color = $copy->getExactColor($newRGB);
if ($color == -1)
$color = $copy->allocateColor($newRGB);
$copy->setColorAt($x, $y, $color);
}
if ($img->isTransparent())
$copy->setTransparentColor($tci);
return $copy;
}
}

View File

@ -1,67 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* CopyChannelsTrueColor operation class
*
* Used to perform CopyChannels operation on truecolor images
*
* @package Internal/Operations
*/
class WideImage_Operation_CopyChannelsTrueColor
{
/**
* Returns an image with only specified channels copied
*
* @param WideImage_Image $img
* @param array $channels
* @return WideImage_Image
*/
function execute($img, $channels)
{
$blank = array('red' => 0, 'green' => 0, 'blue' => 0, 'alpha' => 0);
$width = $img->getWidth();
$height = $img->getHeight();
$copy = WideImage_TrueColorImage::create($width, $height);
if (count($channels) > 0)
for ($x = 0; $x < $width; $x++)
for ($y = 0; $y < $height; $y++)
{
$RGBA = $img->getRGBAt($x, $y);
$newRGBA = $blank;
foreach ($channels as $channel)
$newRGBA[$channel] = $RGBA[$channel];
$color = $copy->getExactColorAlpha($newRGBA);
if ($color == -1)
$color = $copy->allocateColorAlpha($newRGBA);
$copy->setColorAt($x, $y, $color);
}
return $copy;
}
}

View File

@ -1,48 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* CorrectGamma operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_CorrectGamma
{
/**
* Executes imagegammacorrect()
*
* @param WideImage_Image $image
* @param numeric $input_gamma
* @param numeric $output_gamma
* @return WideImage_TrueColorImage
*/
function execute($image, $input_gamma, $output_gamma)
{
$new = $image->copy();
if (!imagegammacorrect($new->getHandle(), $input_gamma, $output_gamma))
throw new WideImage_GDFunctionResultException("imagegammacorrect() returned false");
return $new;
}
}

View File

@ -1,86 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* Crop operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_Crop
{
/**
* Returns a cropped image
*
* @param WideImage_Image $img
* @param smart_coordinate $left
* @param smart_coordinate $top
* @param smart_coordinate $width
* @param smart_coordinate $height
* @return WideImage_Image
*/
function execute($img, $left, $top, $width, $height)
{
$width = WideImage_Coordinate::fix($width, $img->getWidth(), $width);
$height = WideImage_Coordinate::fix($height, $img->getHeight(), $height);
$left = WideImage_Coordinate::fix($left, $img->getWidth(), $width);
$top = WideImage_Coordinate::fix($top, $img->getHeight(), $height);
if ($left < 0)
{
$width = $left + $width;
$left = 0;
}
if ($width > $img->getWidth() - $left)
$width = $img->getWidth() - $left;
if ($top < 0)
{
$height = $top + $height;
$top = 0;
}
if ($height > $img->getHeight() - $top)
$height = $img->getHeight() - $top;
if ($width <= 0 || $height <= 0)
throw new WideImage_Exception("Can't crop outside of an image.");
$new = $img->doCreate($width, $height);
if ($img->isTransparent() || $img instanceof WideImage_PaletteImage)
{
$new->copyTransparencyFrom($img);
if (!imagecopyresized($new->getHandle(), $img->getHandle(), 0, 0, $left, $top, $width, $height, $width, $height))
throw new WideImage_GDFunctionResultException("imagecopyresized() returned false");
}
else
{
$new->alphaBlending(false);
$new->saveAlpha(true);
if (!imagecopyresampled($new->getHandle(), $img->getHandle(), 0, 0, $left, $top, $width, $height, $width, $height))
throw new WideImage_GDFunctionResultException("imagecopyresampled() returned false");
}
return $new;
}
}

View File

@ -1,54 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* Flip operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_Flip
{
/**
* Returns a flipped image
*
* @param WideImage_Image $image
* @return WideImage_Image
*/
function execute($image)
{
$new = $image->copy();
$width = $image->getWidth();
$height = $image->getHeight();
if ($new->isTransparent())
imagefilledrectangle($new->getHandle(), 0, 0, $width, $height, $new->getTransparentColor());
for ($y = 0; $y < $height; $y++)
if (!imagecopy($new->getHandle(), $image->getHandle(), 0, $y, 0, $height - $y - 1, $width, 1))
throw new WideImage_GDFunctionResultException("imagecopy() returned false");
return $new;
}
}

View File

@ -1,67 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* GetMask operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_GetMask
{
/**
* Returns a mask
*
* @param WideImage_Image $image
* @return WideImage_Image
*/
function execute($image)
{
$width = $image->getWidth();
$height = $image->getHeight();
$mask = WideImage_TrueColorImage::create($width, $height);
$mask->setTransparentColor(-1);
$mask->alphaBlending(false);
$mask->saveAlpha(false);
for ($i = 0; $i <= 255; $i++)
$greyscale[$i] = ImageColorAllocate($mask->getHandle(), $i, $i, $i);
imagefilledrectangle($mask->getHandle(), 0, 0, $width, $height, $greyscale[255]);
$transparentColor = $image->getTransparentColor();
$alphaToGreyRatio = 255 / 127;
for ($x = 0; $x < $width; $x++)
for ($y = 0; $y < $height; $y++)
{
$color = $image->getColorAt($x, $y);
if ($color == $transparentColor)
$rgba['alpha'] = 127;
else
$rgba = $image->getColorRGB($color);
imagesetpixel($mask->getHandle(), $x, $y, $greyscale[255 - round($rgba['alpha'] * $alphaToGreyRatio)]);
}
return $mask;
}
}

View File

@ -1,78 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* Merge operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_Merge
{
/**
* Returns a merged image
*
* @param WideImage_Image $base
* @param WideImage_Image $overlay
* @param smart_coordinate $left
* @param smart_coordinate $top
* @param numeric $pct
* @return WideImage_Image
*/
function execute($base, $overlay, $left, $top, $pct)
{
$x = WideImage_Coordinate::fix($left, $base->getWidth(), $overlay->getWidth());
$y = WideImage_Coordinate::fix($top, $base->getHeight(), $overlay->getHeight());
$result = $base->asTrueColor();
$result->alphaBlending(true);
$result->saveAlpha(true);
if ($pct <= 0)
return $result;
if ($pct < 100)
{
if (!imagecopymerge(
$result->getHandle(),
$overlay->getHandle(),
$x, $y, 0, 0,
$overlay->getWidth(),
$overlay->getHeight(),
$pct))
throw new WideImage_GDFunctionResultException("imagecopymerge() returned false");
}
else
{
if (!imagecopy(
$result->getHandle(),
$overlay->getHandle(),
$x, $y, 0, 0,
$overlay->getWidth(),
$overlay->getHeight()))
throw new WideImage_GDFunctionResultException("imagecopy() returned false");
}
return $result;
}
}

View File

@ -1,55 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* Mirror operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_Mirror
{
/**
* Returns a mirrored image
*
* @param WideImage_Image $image
* @return WideImage_Image
*/
function execute($image)
{
$new = $image->copy();
$width = $image->getWidth();
$height = $image->getHeight();
if ($new->isTransparent())
imagefilledrectangle($new->getHandle(), 0, 0, $width, $height, $new->getTransparentColor());
for ($x = 0; $x < $width; $x++)
{
if (!imagecopy($new->getHandle(), $image->getHandle(), $x, 0, $width - $x - 1, 0, 1, $height))
throw new WideImage_GDFunctionResultException("imagecopy() returned false");
}
return $new;
}
}

View File

@ -1,157 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* An Exception for when an invalid fit method is passed
*
* @package Internal/Operations
*/
class WideImage_Operation_InvalidFitMethodException extends WideImage_Exception {}
/**
* An Exception for when an invalid resize dimensions are passed
*
* @package Internal/Operations
*/
class WideImage_Operation_InvalidResizeDimensionException extends WideImage_Exception {}
/**
* Resize operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_Resize
{
/**
* Prepares and corrects smart coordinates
*
* @param WideImage_Image $img
* @param smart_coordinate $width
* @param smart_coordinate $height
* @param string $fit
* @return array
*/
protected function prepareDimensions($img, $width, $height, $fit)
{
if ($width === null && $height === null)
{
$width = $img->getWidth();
$height = $img->getHeight();
}
if ($width !== null)
$width = WideImage_Coordinate::fix($width, $img->getWidth());
if ($height !== null)
$height = WideImage_Coordinate::fix($height, $img->getHeight());
if ($width === null)
$width = floor($img->getWidth() * $height / $img->getHeight());
if ($height === null)
$height = floor($img->getHeight() * $width / $img->getWidth());
if ($width === 0 || $height === 0)
return array('width' => 0, 'height' => 0);
if ($fit == null)
$fit = 'inside';
$dim = array();
if ($fit == 'fill')
{
$dim['width'] = $width;
$dim['height'] = $height;
}
elseif ($fit == 'inside' || $fit == 'outside')
{
$rx = $img->getWidth() / $width;
$ry = $img->getHeight() / $height;
if ($fit == 'inside')
$ratio = ($rx > $ry) ? $rx : $ry;
else
$ratio = ($rx < $ry) ? $rx : $ry;
$dim['width'] = round($img->getWidth() / $ratio);
$dim['height'] = round($img->getHeight() / $ratio);
}
else
throw new WideImage_Operation_InvalidFitMethodException("{$fit} is not a valid resize-fit method.");
return $dim;
}
/**
* Returns a resized image
*
* @param WideImage_Image $img
* @param smart_coordinate $width
* @param smart_coordinate $height
* @param string $fit
* @param string $scale
* @return WideImage_Image
*/
function execute($img, $width, $height, $fit, $scale)
{
$dim = $this->prepareDimensions($img, $width, $height, $fit);
if (($scale === 'down' && ($dim['width'] >= $img->getWidth() && $dim['height'] >= $img->getHeight())) ||
($scale === 'up' && ($dim['width'] <= $img->getWidth() && $dim['height'] <= $img->getHeight())))
$dim = array('width' => $img->getWidth(), 'height' => $img->getHeight());
if ($dim['width'] <= 0 || $dim['height'] <= 0)
throw new WideImage_Operation_InvalidResizeDimensionException("Both dimensions must be larger than 0.");
if ($img->isTransparent() || $img instanceof WideImage_PaletteImage)
{
$new = WideImage_PaletteImage::create($dim['width'], $dim['height']);
$new->copyTransparencyFrom($img);
if (!imagecopyresized(
$new->getHandle(),
$img->getHandle(),
0, 0, 0, 0,
$new->getWidth(),
$new->getHeight(),
$img->getWidth(),
$img->getHeight()))
throw new WideImage_GDFunctionResultException("imagecopyresized() returned false");
}
else
{
$new = WideImage_TrueColorImage::create($dim['width'], $dim['height']);
$new->alphaBlending(false);
$new->saveAlpha(true);
if (!imagecopyresampled(
$new->getHandle(),
$img->getHandle(),
0, 0, 0, 0,
$new->getWidth(),
$new->getHeight(),
$img->getWidth(),
$img->getHeight()))
throw new WideImage_GDFunctionResultException("imagecopyresampled() returned false");
$new->alphaBlending(true);
}
return $new;
}
}

View File

@ -1,107 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* ResizeCanvas operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_ResizeCanvas
{
/**
* Returns an image with a resized canvas
*
* The image is filled with $color. Use $scale to determine, when to resize.
*
* @param WideImage_Image $img
* @param smart_coordinate $width
* @param smart_coordinate $height
* @param smart_coordinate $left
* @param smart_coordinate $top
* @param int $color
* @param string $scale 'up', 'down', 'any'
* @param boolean $merge
* @return WideImage_Image
*/
function execute($img, $width, $height, $left, $top, $color, $scale, $merge)
{
$new_width = WideImage_Coordinate::fix($width, $img->getWidth());
$new_height = WideImage_Coordinate::fix($height, $img->getHeight());
if ($scale == 'down')
{
$new_width = min($new_width, $img->getWidth());
$new_height = min($new_height, $img->getHeight());
}
elseif ($scale == 'up')
{
$new_width = max($new_width, $img->getWidth());
$new_height = max($new_height, $img->getHeight());
}
$new = WideImage::createTrueColorImage($new_width, $new_height);
if ($img->isTrueColor())
{
if ($color === null)
$color = $new->allocateColorAlpha(0, 0, 0, 127);
}
else
{
imagepalettecopy($new->getHandle(), $img->getHandle());
if ($img->isTransparent())
{
$new->copyTransparencyFrom($img);
$tc_rgb = $img->getTransparentColorRGB();
$t_color = $new->allocateColorAlpha($tc_rgb);
}
if ($color === null)
{
if ($img->isTransparent())
$color = $t_color;
else
$color = $new->allocateColorAlpha(255, 0, 127, 127);
imagecolortransparent($new->getHandle(), $color);
}
}
$new->fill(0, 0, $color);
$x = WideImage_Coordinate::fix($left, $new->getWidth(), $img->getWidth());
$y = WideImage_Coordinate::fix($top, $new->getHeight(), $img->getHeight());
// blending for truecolor images
if ($img->isTrueColor())
$new->alphaBlending($merge);
// not-blending for palette images
if (!$merge && !$img->isTrueColor() && isset($t_color))
$new->getCanvas()->filledRectangle($x, $y, $x + $img->getWidth(), $y + $img->getHeight(), $t_color);
$img->copyTo($new, $x, $y);
return $new;
}
}

View File

@ -1,64 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* Rotate operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_Rotate
{
/**
* Returns rotated image
*
* @param WideImage_Image $image
* @param numeric $angle
* @param int $bgColor
* @param bool $ignoreTransparent
* @return WideImage_Image
*/
function execute($image, $angle, $bgColor, $ignoreTransparent)
{
$angle = -floatval($angle);
if ($angle < 0)
$angle = 360 + $angle;
$angle = $angle % 360;
if ($angle == 0)
return $image->copy();
$image = $image->asTrueColor();
if ($bgColor === null)
{
$bgColor = $image->getTransparentColor();
if ($bgColor == -1)
{
$bgColor = $image->allocateColorAlpha(255, 255, 255, 127);
imagecolortransparent($image->getHandle(), $bgColor);
}
}
return new WideImage_TrueColorImage(imagerotate($image->getHandle(), $angle, $bgColor, $ignoreTransparent));
}
}

View File

@ -1,114 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* ApplyMask operation class
*
* @package Internal/Operations
*/
class WideImage_Operation_RoundCorners
{
/**
* @param WideImage_Image $image
* @param int $radius
* @param int $color
* @param int $smoothness
* @return WideImage_Image
*/
function execute($image, $radius, $color, $smoothness, $corners)
{
if ($smoothness < 1)
$sample_ratio = 1;
elseif ($smoothness > 16)
$sample_ratio = 16;
else
$sample_ratio = $smoothness;
$corner = WideImage::createTrueColorImage($radius * $sample_ratio, $radius * $sample_ratio);
if ($color === null)
{
imagepalettecopy($corner->getHandle(), $image->getHandle());
$bg_color = $corner->allocateColor(0, 0, 0);
$corner->fill(0, 0, $bg_color);
$fg_color = $corner->allocateColor(255, 255, 255);
$corner->getCanvas()->filledEllipse($radius * $sample_ratio, $radius * $sample_ratio, $radius * 2 * $sample_ratio, $radius * 2 * $sample_ratio, $fg_color);
$corner = $corner->resize($radius, $radius);
$result = $image->asTrueColor();
$tc = $result->getTransparentColor();
if ($tc == -1)
{
$tc = $result->allocateColorAlpha(255, 255, 255, 127);
imagecolortransparent($result->getHandle(), $tc);
$result->setTransparentColor($tc);
}
if ($corners & WideImage::SIDE_TOP_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_TOP)
$result = $result->applyMask($corner, -1, -1);
$corner = $corner->rotate(90);
if ($corners & WideImage::SIDE_TOP_RIGHT || $corners & WideImage::SIDE_TOP || $corners & WideImage::SIDE_RIGHT)
$result = $result->applyMask($corner, $result->getWidth() - $corner->getWidth() + 1, -1, 100);
$corner = $corner->rotate(90);
if ($corners & WideImage::SIDE_BOTTOM_RIGHT || $corners & WideImage::SIDE_RIGHT || $corners & WideImage::SIDE_BOTTOM)
$result = $result->applyMask($corner, $result->getWidth() - $corner->getWidth() + 1, $result->getHeight() - $corner->getHeight() + 1, 100);
$corner = $corner->rotate(90);
if ($corners & WideImage::SIDE_BOTTOM_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_BOTTOM)
$result = $result->applyMask($corner, -1, $result->getHeight() - $corner->getHeight() + 1, 100);
return $result;
}
else
{
$bg_color = $color;
$corner->fill(0, 0, $bg_color);
$fg_color = $corner->allocateColorAlpha(127, 127, 127, 127);
$corner->getCanvas()->filledEllipse($radius * $sample_ratio, $radius * $sample_ratio, $radius * 2 * $sample_ratio, $radius * 2 * $sample_ratio, $fg_color);
$corner = $corner->resize($radius, $radius);
$result = $image->copy();
if ($corners & WideImage::SIDE_TOP_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_TOP)
$result = $result->merge($corner, -1, -1, 100);
$corner = $corner->rotate(90);
if ($corners & WideImage::SIDE_TOP_RIGHT || $corners & WideImage::SIDE_TOP || $corners & WideImage::SIDE_RIGHT)
$result = $result->merge($corner, $result->getWidth() - $corner->getWidth() + 1, -1, 100);
$corner = $corner->rotate(90);
if ($corners & WideImage::SIDE_BOTTOM_RIGHT || $corners & WideImage::SIDE_RIGHT || $corners & WideImage::SIDE_BOTTOM)
$result = $result->merge($corner, $result->getWidth() - $corner->getWidth() + 1, $result->getHeight() - $corner->getHeight() + 1, 100);
$corner = $corner->rotate(90);
if ($corners & WideImage::SIDE_BOTTOM_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_BOTTOM)
$result = $result->merge($corner, -1, $result->getHeight() - $corner->getHeight() + 1, 100);
return $result;
}
}
}

View File

@ -1,135 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internal/Operations
**/
/**
* Unsharp filter
*
* This filter was taken from http://vikjavev.no/computing/ump.php,
* the original author Torstein Hønsi. Adapted to fit better within
* the Wideimage package.
*
* @package Internal/Operations
*/
class WideImage_Operation_Unsharp {
/**
* Returns sharpened image
*
* @param WideImage_Image $image
* @param float $amount
* @param int $radius
* @param float $threshold
* @return WideImage_Image
*/
function execute($image, $amount, $radius, $threshold) {
// Attempt to calibrate the parameters to Photoshop:
if ($amount > 500) $amount = 500;
$amount = $amount * 0.016;
if ($radius > 50) $radius = 50;
$radius = $radius * 2;
if ($threshold > 255) $threshold = 255;
$radius = abs(round($radius)); // Only integers make sense.
if ($radius == 0) {
return $image;
}
// Gaussian blur matrix
$matrix = array(
array(1, 2, 1),
array(2, 4, 2),
array(1, 2, 1)
);
$blurred = $image->applyConvolution($matrix, 16, 0);
if($threshold > 0) {
// Calculate the difference between the blurred pixels and the original
// and set the pixels
for ($x = 0; $x < $image->getWidth(); $x++) {
for ($y = 0; $y < $image->getHeight(); $y++) {
$rgbOrig = $image->getRGBAt($x, $y);
$rOrig = $rgbOrig["red"];
$gOrig = $rgbOrig["green"];
$bOrig = $rgbOrig["blue"];
$rgbBlur = $blurred->getRGBAt($x, $y);
$rBlur = $rgbBlur["red"];
$gBlur = $rgbBlur["green"];
$bBlur = $rgbBlur["blue"];
// When the masked pixels differ less from the original
// than the threshold specifies, they are set to their original value.
$rNew = (abs($rOrig - $rBlur) >= $threshold)
? max(0, min(255, ($amount * ($rOrig - $rBlur)) + $rOrig))
: $rOrig;
$gNew = (abs($gOrig - $gBlur) >= $threshold)
? max(0, min(255, ($amount * ($gOrig - $gBlur)) + $gOrig))
: $gOrig;
$bNew = (abs($bOrig - $bBlur) >= $threshold)
? max(0, min(255, ($amount * ($bOrig - $bBlur)) + $bOrig))
: $bOrig;
$rgbNew = array("red" => $rNew, "green" => $gNew, "blue" => $bNew, "alpha" => 0);
if (($rOrig != $rNew) || ($gOrig != $gNew) || ($bOrig != $bNew)) {
$image->setRGBAt($x, $y, $rgbNew);
}
}
}
}
else {
$w = $image->getWidth();
$h = $image->getHeight();
for ($x = 0; $x < $w; $x++) {
for ($y = 0; $y < $h; $y++) {
$rgbOrig = $image->getRGBAt($x, $y);
$rOrig = $rgbOrig["red"];
$gOrig = $rgbOrig["green"];
$bOrig = $rgbOrig["blue"];
$rgbBlur = $blurred->getRGBAt($x, $y);
$rBlur = $rgbBlur["red"];
$gBlur = $rgbBlur["green"];
$bBlur = $rgbBlur["blue"];
$rNew = ($amount * ($rOrig - $rBlur)) + $rOrig;
if($rNew>255){$rNew=255;}
elseif($rNew<0){$rNew=0;}
$gNew = ($amount * ($gOrig - $gBlur)) + $gOrig;
if($gNew>255){$gNew=255;}
elseif($gNew<0){$gNew=0;}
$bNew = ($amount * ($bOrig - $bBlur)) + $bOrig;
if($bNew>255){$bNew=255;}
elseif($bNew<0){$bNew=0;}
$rgbNew = array("red" => $rNew, "green" => $gNew, "blue" => $bNew, "alpha" => 0);
$image->setRGBAt($x, $y, $rgbNew);
}
}
}
return $image;
}
}

View File

@ -1,57 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package Internals
**/
/**
* @package Exceptions
*/
class WideImage_UnknownImageOperationException extends WideImage_Exception {}
/**
* Operation factory
*
* @package Internals
**/
class WideImage_OperationFactory
{
static protected $cache = array();
static function get($operationName)
{
$lcname = strtolower($operationName);
if (!isset(self::$cache[$lcname]))
{
$opClassName = "WideImage_Operation_" . ucfirst($operationName);
if (!class_exists($opClassName, false))
{
$fileName = WideImage::path() . 'Operation/' . ucfirst($operationName) . '.php';
if (file_exists($fileName))
require_once $fileName;
elseif (!class_exists($opClassName))
throw new WideImage_UnknownImageOperationException("Can't load '{$operationName}' operation.");
}
self::$cache[$lcname] = new $opClassName();
}
return self::$cache[$lcname];
}
}

View File

@ -1,136 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package WideImage
**/
/**
* @package WideImage
*/
class WideImage_PaletteImage extends WideImage_Image
{
/**
* Create a palette image
*
* @param int $width
* @param int $height
* @return WideImage_PaletteImage
*/
static function create($width, $height)
{
if ($width * $height <= 0 || $width < 0)
throw new WideImage_InvalidImageDimensionException("Can't create an image with dimensions [$width, $height].");
return new WideImage_PaletteImage(imagecreate($width, $height));
}
function doCreate($width, $height)
{
return self::create($width, $height);
}
/**
* (non-PHPdoc)
* @see WideImage_Image#isTrueColor()
*/
function isTrueColor()
{
return false;
}
/**
* (non-PHPdoc)
* @see WideImage_Image#asPalette($nColors, $dither, $matchPalette)
*/
function asPalette($nColors = 255, $dither = null, $matchPalette = true)
{
return $this->copy();
}
/**
* Returns a copy of the image
*
* @param $trueColor True if the new image should be truecolor
* @return WideImage_Image
*/
protected function copyAsNew($trueColor = false)
{
$width = $this->getWidth();
$height = $this->getHeight();
if ($trueColor)
$new = WideImage_TrueColorImage::create($width, $height);
else
$new = WideImage_PaletteImage::create($width, $height);
// copy transparency of source to target
if ($this->isTransparent())
{
$rgb = $this->getTransparentColorRGB();
if (is_array($rgb))
{
$tci = $new->allocateColor($rgb['red'], $rgb['green'], $rgb['blue']);
$new->fill(0, 0, $tci);
$new->setTransparentColor($tci);
}
}
imageCopy($new->getHandle(), $this->handle, 0, 0, 0, 0, $width, $height);
return $new;
}
/**
* (non-PHPdoc)
* @see WideImage_Image#asTrueColor()
*/
function asTrueColor()
{
$width = $this->getWidth();
$height = $this->getHeight();
$new = WideImage::createTrueColorImage($width, $height);
if ($this->isTransparent())
$new->copyTransparencyFrom($this);
if (!imageCopy($new->getHandle(), $this->handle, 0, 0, 0, 0, $width, $height))
throw new WideImage_GDFunctionResultException("imagecopy() returned false");
return $new;
}
/**
* (non-PHPdoc)
* @see WideImage_Image#getChannels()
*/
function getChannels()
{
$args = func_get_args();
if (count($args) == 1 && is_array($args[0]))
$args = $args[0];
return WideImage_OperationFactory::get('CopyChannelsPalette')->execute($this, $args);
}
/**
* (non-PHPdoc)
* @see WideImage_Image#copyNoAlpha()
*/
function copyNoAlpha()
{
return WideImage_Image::loadFromString($this->asString('png'));
}
}

View File

@ -1,218 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
**/
/**
* A class for truecolor image objects
*
* @package WideImage
*/
class WideImage_TrueColorImage extends WideImage_Image
{
/**
* Creates the object
*
* @param resource $handle
*/
function __construct($handle)
{
parent::__construct($handle);
$this->alphaBlending(false);
$this->saveAlpha(true);
}
/**
* Factory method that creates a true-color image object
*
* @param int $width
* @param int $height
* @return WideImage_TrueColorImage
*/
static function create($width, $height)
{
if ($width * $height <= 0 || $width < 0)
throw new WideImage_InvalidImageDimensionException("Can't create an image with dimensions [$width, $height].");
return new WideImage_TrueColorImage(imagecreatetruecolor($width, $height));
}
function doCreate($width, $height)
{
return self::create($width, $height);
}
function isTrueColor()
{
return true;
}
/**
* Sets alpha blending mode via imagealphablending()
*
* @param bool $mode
* @return bool
*/
function alphaBlending($mode)
{
return imagealphablending($this->handle, $mode);
}
/**
* Toggle if alpha channel should be saved with the image via imagesavealpha()
*
* @param bool $on
* @return bool
*/
function saveAlpha($on)
{
return imagesavealpha($this->handle, $on);
}
/**
* Allocates a color and returns its index
*
* This method accepts either each component as an integer value,
* or an associative array that holds the color's components in keys
* 'red', 'green', 'blue', 'alpha'.
*
* @param mixed $R
* @param int $G
* @param int $B
* @param int $A
* @return int
*/
function allocateColorAlpha($R, $G = null, $B = null, $A = null)
{
if (is_array($R))
return imageColorAllocateAlpha($this->handle, $R['red'], $R['green'], $R['blue'], $R['alpha']);
else
return imageColorAllocateAlpha($this->handle, $R, $G, $B, $A);
}
/**
* @see WideImage_Image#asPalette($nColors, $dither, $matchPalette)
*/
function asPalette($nColors = 255, $dither = null, $matchPalette = true)
{
$nColors = intval($nColors);
if ($nColors < 1)
$nColors = 1;
elseif ($nColors > 255)
$nColors = 255;
if ($dither === null)
$dither = $this->isTransparent();
$temp = $this->copy();
imagetruecolortopalette($temp->handle, $dither, $nColors);
if ($matchPalette == true && function_exists('imagecolormatch'))
imagecolormatch($this->handle, $temp->handle);
// The code below isn't working properly; it corrupts transparency on some palette->tc->palette conversions.
// Why is this code here?
/*
if ($this->isTransparent())
{
$trgb = $this->getTransparentColorRGB();
$tci = $temp->getClosestColor($trgb);
$temp->setTransparentColor($tci);
}
/**/
$temp->releaseHandle();
return new WideImage_PaletteImage($temp->handle);
}
/**
* Returns the index of the color that best match the given color components
*
* This method accepts either each component as an integer value,
* or an associative array that holds the color's components in keys
* 'red', 'green', 'blue', 'alpha'.
*
* @param mixed $R Red component value or an associative array
* @param int $G Green component
* @param int $B Blue component
* @param int $A Alpha component
* @return int The color index
*/
function getClosestColorAlpha($R, $G = null, $B = null, $A = null)
{
if (is_array($R))
return imagecolorclosestalpha($this->handle, $R['red'], $R['green'], $R['blue'], $R['alpha']);
else
return imagecolorclosestalpha($this->handle, $R, $G, $B, $A);
}
/**
* Returns the index of the color that exactly match the given color components
*
* This method accepts either each component as an integer value,
* or an associative array that holds the color's components in keys
* 'red', 'green', 'blue', 'alpha'.
*
* @param mixed $R Red component value or an associative array
* @param int $G Green component
* @param int $B Blue component
* @param int $A Alpha component
* @return int The color index
*/
function getExactColorAlpha($R, $G = null, $B = null, $A = null)
{
if (is_array($R))
return imagecolorexactalpha($this->handle, $R['red'], $R['green'], $R['blue'], $R['alpha']);
else
return imagecolorexactalpha($this->handle, $R, $G, $B, $A);
}
/**
* @see WideImage_Image#getChannels()
*/
function getChannels()
{
$args = func_get_args();
if (count($args) == 1 && is_array($args[0]))
$args = $args[0];
return WideImage_OperationFactory::get('CopyChannelsTrueColor')->execute($this, $args);
}
/**
* (non-PHPdoc)
* @see WideImage_Image#copyNoAlpha()
*/
function copyNoAlpha()
{
$prev = $this->saveAlpha(false);
$result = WideImage_Image::loadFromString($this->asString('png'));
$this->saveAlpha($prev);
//$result->releaseHandle();
return $result;
}
/**
* (non-PHPdoc)
* @see WideImage_Image#asTrueColor()
*/
function asTrueColor()
{
return $this->copy();
}
}

View File

@ -1,377 +0,0 @@
<?php
/**
* @author Gasper Kozak
* @copyright 2007-2011
This file is part of WideImage.
WideImage is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
WideImage is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with WideImage; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* @package WideImage
**/
require_once WideImage::path() . 'Exception.php';
require_once WideImage::path() . 'Image.php';
require_once WideImage::path() . 'TrueColorImage.php';
require_once WideImage::path() . 'PaletteImage.php';
require_once WideImage::path() . 'Coordinate.php';
require_once WideImage::path() . 'Canvas.php';
require_once WideImage::path() . 'MapperFactory.php';
require_once WideImage::path() . 'OperationFactory.php';
require_once WideImage::path() . 'Font/TTF.php';
require_once WideImage::path() . 'Font/GDF.php';
require_once WideImage::path() . 'Font/PS.php';
/**
* @package Exceptions
*/
class WideImage_InvalidImageHandleException extends WideImage_Exception {}
/**
* @package Exceptions
*/
class WideImage_InvalidImageSourceException extends WideImage_Exception {}
/**
* @package Exceptions
*
* Class for invalid GD function calls result (for example those that return bool)
*/
class WideImage_GDFunctionResultException extends WideImage_Exception {}
/**
* The gateway class for loading images and core library functions
*
* @package WideImage
*/
class WideImage
{
const SIDE_TOP_LEFT = 1;
const SIDE_TOP = 2;
const SIDE_TOP_RIGHT = 4;
const SIDE_RIGHT = 8;
const SIDE_BOTTOM_RIGHT = 16;
const SIDE_BOTTOM = 32;
const SIDE_BOTTOM_LEFT = 64;
const SIDE_LEFT = 128;
const SIDE_ALL = 255;
/**
* @var string Path to the library base directory
*/
protected static $path = null;
/**
* Returns the library version
* @return string The library version
*/
static function version()
{
return '11.02.19';
}
/**
* Returns the path to the library
* @return string
*/
static function path()
{
if (self::$path === null)
self::$path = dirname(__FILE__) . DIRECTORY_SEPARATOR;
return self::$path;
}
/**
* Checks whether the gd library is loaded, and throws an exception otherwise
*/
static function checkGD()
{
if (!extension_loaded('gd'))
throw new WideImage_Exception("WideImage requires the GD extension, but it's apparently not loaded.");
}
/**
* Registers a custom mapper for image loading and saving
*
* Example:
* <code>
* WideImage::registerCustomMapper('WideImage_Mapper_TGA', 'image/tga', 'tga');
* </code>
*
* @param string $mapper_class_name
* @param string $mime_type
* @param string $extension
*/
static function registerCustomMapper($mapper_class_name, $mime_type, $extension)
{
WideImage_MapperFactory::registerMapper($mapper_class_name, $mime_type, strtoupper($extension));
}
/**
* Loads an image from a file, URL, HTML input file field, binary string, or a valid image handle.
* The image format is auto-detected.
*
* Currently supported formats: PNG, GIF, JPG, BMP, TGA, GD, GD2.
*
* This function analyzes the input and decides whether to use WideImage::loadFromHandle(),
* WideImage::loadFromFile(), WideImage::loadFromUpload() or WideImage::loadFromString(),
* all of which you can also call directly to spare WideImage some guessing.
*
* Arrays are supported for upload fields; it returns an array of loaded images.
* To load only a single image from an array field, use WideImage::loadFromUpload('img', $i),
* where $i is the index of the image you want to load.
*
* <code>
* $img = WideImage::load('http://url/image.png'); // image URL
* $img = WideImage::load('/path/to/image.png'); // local file path
* $img = WideImage::load('img'); // upload field name
* $img = WideImage::load(imagecreatetruecolor(10, 10)); // a GD resource
* $img = WideImage::load($image_data); // binary string containing image data
* </code>
*
* @param mixed $source File name, url, HTML file input field name, binary string, or a GD image resource
* @return WideImage_Image WideImage_PaletteImage or WideImage_TrueColorImage instance
*/
static function load($source)
{
$predictedSourceType = '';
if ($source == '')
$predictedSourceType = 'String';
// Creating image via a valid resource
if (!$predictedSourceType && self::isValidImageHandle($source))
$predictedSourceType = 'Handle';
// Check for binary string
if (!$predictedSourceType)
{
// search first $binLength bytes (at a maximum) for ord<32 characters (binary image data)
$binLength = 64;
$sourceLength = strlen($source);
$maxlen = ($sourceLength > $binLength) ? $binLength : $sourceLength;
for ($i = 0; $i < $maxlen; $i++)
if (ord($source[$i]) < 32)
{
$predictedSourceType = 'String';
break;
}
}
// Uploaded image (array uploads not supported)
if (isset($_FILES[$source]) && isset($_FILES[$source]['tmp_name']))
$predictedSourceType = 'Upload';
// Otherwise, must be a file or an URL
if (!$predictedSourceType)
$predictedSourceType = 'File';
return call_user_func(array('WideImage', 'loadFrom' . $predictedSourceType), $source);
}
/**
* Create and load an image from a file or URL. The image format is auto-detected.
*
* @param string $uri File or url
* @return WideImage_Image WideImage_PaletteImage or WideImage_TrueColorImage instance
*/
static function loadFromFile($uri)
{
$data = file_get_contents($uri);
$handle = @imagecreatefromstring($data);
if (!self::isValidImageHandle($handle))
{
try
{
// try to find a mapper first
$mapper = WideImage_MapperFactory::selectMapper($uri);
if ($mapper)
$handle = $mapper->load($uri);
}
catch (WideImage_UnsupportedFormatException $e)
{
// mapper not found
}
// try all custom mappers
if (!self::isValidImageHandle($handle))
{
$custom_mappers = WideImage_MapperFactory::getCustomMappers();
foreach ($custom_mappers as $mime_type => $mapper_class)
{
$mapper = WideImage_MapperFactory::selectMapper(null, $mime_type);
$handle = $mapper->loadFromString($data);
if (self::isValidImageHandle($handle))
break;
}
}
}
if (!self::isValidImageHandle($handle))
throw new WideImage_InvalidImageSourceException("File '{$uri}' appears to be an invalid image source.");
return self::loadFromHandle($handle);
}
/**
* Create and load an image from a string. Format is auto-detected.
*
* @param string $string Binary data, i.e. from BLOB field in the database
* @return WideImage_Image WideImage_PaletteImage or WideImage_TrueColorImage instance
*/
static function loadFromString($string)
{
if (strlen($string) < 128)
throw new WideImage_InvalidImageSourceException("String doesn't contain image data.");
$handle = @imagecreatefromstring($string);
if (!self::isValidImageHandle($handle))
{
$custom_mappers = WideImage_MapperFactory::getCustomMappers();
foreach ($custom_mappers as $mime_type => $mapper_class)
{
$mapper = WideImage_MapperFactory::selectMapper(null, $mime_type);
$handle = $mapper->loadFromString($string);
if (self::isValidImageHandle($handle))
break;
}
}
if (!self::isValidImageHandle($handle))
throw new WideImage_InvalidImageSourceException("String doesn't contain valid image data.");
return self::loadFromHandle($handle);
}
/**
* Create and load an image from an image handle.
*
* <b>Note:</b> the resulting image object takes ownership of the passed
* handle. When the newly-created image object is destroyed, the handle is
* destroyed too, so it's not a valid image handle anymore. In order to
* preserve the handle for use after object destruction, you have to call
* WideImage_Image::releaseHandle() on the created image instance prior to its
* destruction.
*
* <code>
* $handle = imagecreatefrompng('file.png');
* $image = WideImage::loadFromHandle($handle);
* </code>
*
* @param resource $handle A valid GD image resource
* @return WideImage_Image WideImage_PaletteImage or WideImage_TrueColorImage instance
*/
static function loadFromHandle($handle)
{
if (!self::isValidImageHandle($handle))
throw new WideImage_InvalidImageSourceException("Handle is not a valid GD image resource.");
if (imageistruecolor($handle))
return new WideImage_TrueColorImage($handle);
else
return new WideImage_PaletteImage($handle);
}
/**
* This method loads a file from the $_FILES array. The image format is auto-detected.
*
* You only have to pass the field name as the parameter. For array fields, this function will
* return an array of image objects, unless you specify the $index parameter, which will
* load the desired image.
*
* @param $field_name Name of the key in $_FILES array
* @param int $index The index of the file to load (if the input field is an array)
* @return WideImage_Image The loaded image
*/
static function loadFromUpload($field_name, $index = null)
{
if (!array_key_exists($field_name, $_FILES))
throw new WideImage_InvalidImageSourceException("Upload field '{$field_name}' doesn't exist.");
if (is_array($_FILES[$field_name]['tmp_name']))
{
if (isset($_FILES[$field_name]['tmp_name'][$index]))
$filename = $_FILES[$field_name]['tmp_name'][$index];
else
{
$result = array();
foreach ($_FILES[$field_name]['tmp_name'] as $idx => $tmp_name)
$result[$idx] = self::loadFromFile($tmp_name);
return $result;
}
}
else
$filename = $_FILES[$field_name]['tmp_name'];
if (!file_exists($filename))
throw new WideImage_InvalidImageSourceException("Uploaded file doesn't exist.");
return self::loadFromFile($filename);
}
/**
* Factory method for creating a palette image
*
* @param int $width
* @param int $height
* @return WideImage_PaletteImage
*/
static function createPaletteImage($width, $height)
{
return WideImage_PaletteImage::create($width, $height);
}
/**
* Factory method for creating a true-color image
*
* @param int $width
* @param int $height
* @return WideImage_TrueColorImage
*/
static function createTrueColorImage($width, $height)
{
return WideImage_TrueColorImage::create($width, $height);
}
/**
* Check whether the given handle is a valid GD resource
*
* @param mixed $handle The variable to check
* @return bool
*/
static function isValidImageHandle($handle)
{
return (is_resource($handle) && get_resource_type($handle) == 'gd');
}
/**
* Throws exception if the handle isn't a valid GD resource
*
* @param mixed $handle The variable to check
*/
static function assertValidImageHandle($handle)
{
if (!self::isValidImageHandle($handle))
throw new WideImage_InvalidImageHandleException("{$handle} is not a valid image handle.");
}
}
WideImage::checkGD();
WideImage::registerCustomMapper('WideImage_Mapper_BMP', 'image/bmp', 'bmp');
WideImage::registerCustomMapper('WideImage_Mapper_TGA', 'image/tga', 'tga');

View File

@ -1 +0,0 @@
<html><body bgcolor="#FFFFFF"></body></html>

View File

@ -1 +0,0 @@
<html><body bgcolor="#FFFFFF"></body></html>

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version 2.2.9
@build 1st February, 2017
@created 30th April, 2015
@package Component Builder
@subpackage componentbuilder.php

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version 2.2.9
@build 1st February, 2017
@created 30th April, 2015
@package Component Builder
@subpackage controller.php
@ -95,6 +95,7 @@ class ComponentbuilderController extends JControllerLegacy
'template' => 'templates',
'layout' => 'layouts',
'dynamic_get' => 'dynamic_gets',
'custom_code' => 'custom_codes',
'snippet' => 'snippets',
'field' => 'fields',
'fieldtype' => 'fieldtypes',

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 94 of this MVC
@build 13th January, 2017
@created 30th April, 2015
@package Component Builder
@subpackage admin_view.php

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 94 of this MVC
@build 13th January, 2017
@created 30th April, 2015
@package Component Builder
@subpackage admin_views.php

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version 2.2.9
@build 1st February, 2017
@created 30th April, 2015
@package Component Builder
@subpackage ajax.json.php

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version 2.2.9
@build 1st February, 2017
@created 30th April, 2015
@package Component Builder
@subpackage compiler.php

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 77 of this MVC
@build 26th December, 2016
@created 6th May, 2015
@package Component Builder
@subpackage component.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version 2.2.9
@build 1st February, 2017
@created 30th April, 2015
@package Component Builder
@subpackage componentbuilder.php

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 77 of this MVC
@build 26th December, 2016
@created 6th May, 2015
@package Component Builder
@subpackage components.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 18 of this MVC
@build 13th January, 2017
@created 13th August, 2015
@package Component Builder
@subpackage custom_admin_view.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 18 of this MVC
@build 13th January, 2017
@created 13th August, 2015
@package Component Builder
@subpackage custom_admin_views.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -0,0 +1,326 @@
<?php
/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/
__ __ _ _____ _ _ __ __ _ _ _
\ \ / / | | | __ \ | | | | | \/ | | | | | | |
\ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| |
\ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` |
\ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| |
\/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_|
| |
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version @update number 14 of this MVC
@build 31st January, 2017
@created 11th October, 2016
@package Component Builder
@subpackage custom_code.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>
@copyright Copyright (C) 2015. All Rights Reserved
@license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
Builds Complex Joomla Components
/-----------------------------------------------------------------------------------------------------------------------------*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla controllerform library
jimport('joomla.application.component.controllerform');
/**
* Custom_code Controller
*/
class ComponentbuilderControllerCustom_code extends JControllerForm
{
/**
* Current or most recently performed task.
*
* @var string
* @since 12.2
* @note Replaces _task.
*/
protected $task;
public function __construct($config = array())
{
$this->view_list = 'Custom_codes'; // safeguard for setting the return view listing to the main view.
parent::__construct($config);
}
/**
* Method override to check if you can add a new record.
*
* @param array $data An array of input data.
*
* @return boolean
*
* @since 1.6
*/
protected function allowAdd($data = array())
{
// Access check.
$access = JFactory::getUser()->authorise('custom_code.access', 'com_componentbuilder');
if (!$access)
{
return false;
}
// In the absense of better information, revert to the component permissions.
return JFactory::getUser()->authorise('custom_code.create', $this->option);
}
/**
* Method override to check if you can edit an existing record.
*
* @param array $data An array of input data.
* @param string $key The name of the key for the primary key.
*
* @return boolean
*
* @since 1.6
*/
protected function allowEdit($data = array(), $key = 'id')
{
// get user object.
$user = JFactory::getUser();
// get record id.
$recordId = (int) isset($data[$key]) ? $data[$key] : 0;
// Access check.
$access = ($user->authorise('custom_code.access', 'com_componentbuilder.custom_code.' . (int) $recordId) && $user->authorise('custom_code.access', 'com_componentbuilder'));
if (!$access)
{
return false;
}
if ($recordId)
{
// The record has been set. Check the record permissions.
$permission = $user->authorise('custom_code.edit', 'com_componentbuilder.custom_code.' . (int) $recordId);
if (!$permission)
{
if ($user->authorise('custom_code.edit.own', 'com_componentbuilder.custom_code.' . $recordId))
{
// Now test the owner is the user.
$ownerId = (int) isset($data['created_by']) ? $data['created_by'] : 0;
if (empty($ownerId))
{
// Need to do a lookup from the model.
$record = $this->getModel()->getItem($recordId);
if (empty($record))
{
return false;
}
$ownerId = $record->created_by;
}
// If the owner matches 'me' then allow.
if ($ownerId == $user->id)
{
if ($user->authorise('custom_code.edit.own', 'com_componentbuilder'))
{
return true;
}
}
}
return false;
}
}
// Since there is no permission, revert to the component permissions.
return $user->authorise('custom_code.edit', $this->option);
}
/**
* Gets the URL arguments to append to an item redirect.
*
* @param integer $recordId The primary key id for the item.
* @param string $urlVar The name of the URL variable for the id.
*
* @return string The arguments to append to the redirect URL.
*
* @since 12.2
*/
protected function getRedirectToItemAppend($recordId = null, $urlVar = 'id')
{
$tmpl = $this->input->get('tmpl');
$layout = $this->input->get('layout', 'edit', 'string');
$ref = $this->input->get('ref', 0, 'string');
$refid = $this->input->get('refid', 0, 'int');
// Setup redirect info.
$append = '';
if ($refid)
{
$append .= '&ref='.(string)$ref.'&refid='.(int)$refid;
}
elseif ($ref)
{
$append .= '&ref='.(string)$ref;
}
if ($tmpl)
{
$append .= '&tmpl=' . $tmpl;
}
if ($layout)
{
$append .= '&layout=' . $layout;
}
if ($recordId)
{
$append .= '&' . $urlVar . '=' . $recordId;
}
return $append;
}
/**
* Method to run batch operations.
*
* @param object $model The model.
*
* @return boolean True if successful, false otherwise and internal error is set.
*
* @since 2.5
*/
public function batch($model = null)
{
JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
// Set the model
$model = $this->getModel('Custom_code', '', array());
// Preset the redirect
$this->setRedirect(JRoute::_('index.php?option=com_componentbuilder&view=custom_codes' . $this->getRedirectToListAppend(), false));
return parent::batch($model);
}
/**
* Method to cancel an edit.
*
* @param string $key The name of the primary key of the URL variable.
*
* @return boolean True if access level checks pass, false otherwise.
*
* @since 12.2
*/
public function cancel($key = null)
{
// get the referal details
$this->ref = $this->input->get('ref', 0, 'word');
$this->refid = $this->input->get('refid', 0, 'int');
$cancel = parent::cancel($key);
if ($cancel)
{
if ($this->refid)
{
$redirect = '&view='.(string)$this->ref.'&layout=edit&id='.(int)$this->refid;
// Redirect to the item screen.
$this->setRedirect(
JRoute::_(
'index.php?option=' . $this->option . $redirect, false
)
);
}
elseif ($this->ref)
{
$redirect = '&view='.(string)$this->ref;
// Redirect to the list screen.
$this->setRedirect(
JRoute::_(
'index.php?option=' . $this->option . $redirect, false
)
);
}
}
else
{
// Redirect to the items screen.
$this->setRedirect(
JRoute::_(
'index.php?option=' . $this->option . '&view=' . $this->view_list, false
)
);
}
return $cancel;
}
/**
* Method to save a record.
*
* @param string $key The name of the primary key of the URL variable.
* @param string $urlVar The name of the URL variable if different from the primary key (sometimes required to avoid router collisions).
*
* @return boolean True if successful, false otherwise.
*
* @since 12.2
*/
public function save($key = null, $urlVar = null)
{
// get the referal details
$this->ref = $this->input->get('ref', 0, 'word');
$this->refid = $this->input->get('refid', 0, 'int');
if ($this->ref || $this->refid)
{
// to make sure the item is checkedin on redirect
$this->task = 'save';
}
$saved = parent::save($key, $urlVar);
if ($this->refid && $saved)
{
$redirect = '&view='.(string)$this->ref.'&layout=edit&id='.(int)$this->refid;
// Redirect to the item screen.
$this->setRedirect(
JRoute::_(
'index.php?option=' . $this->option . $redirect, false
)
);
}
elseif ($this->ref && $saved)
{
$redirect = '&view='.(string)$this->ref;
// Redirect to the list screen.
$this->setRedirect(
JRoute::_(
'index.php?option=' . $this->option . $redirect, false
)
);
}
return $saved;
}
/**
* Function that allows child controller access to model data
* after the data has been saved.
*
* @param JModel &$model The data model object.
* @param array $validData The validated data.
*
* @return void
*
* @since 11.1
*/
protected function postSaveHook(JModelLegacy $model, $validData = array())
{
return;
}
}

View File

@ -0,0 +1,111 @@
<?php
/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/
__ __ _ _____ _ _ __ __ _ _ _
\ \ / / | | | __ \ | | | | | \/ | | | | | | |
\ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| |
\ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` |
\ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| |
\/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_|
| |
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version @update number 14 of this MVC
@build 31st January, 2017
@created 11th October, 2016
@package Component Builder
@subpackage custom_codes.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>
@copyright Copyright (C) 2015. All Rights Reserved
@license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
Builds Complex Joomla Components
/-----------------------------------------------------------------------------------------------------------------------------*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla controlleradmin library
jimport('joomla.application.component.controlleradmin');
/**
* Custom_codes Controller
*/
class ComponentbuilderControllerCustom_codes extends JControllerAdmin
{
protected $text_prefix = 'COM_COMPONENTBUILDER_CUSTOM_CODES';
/**
* Proxy for getModel.
* @since 2.5
*/
public function getModel($name = 'Custom_code', $prefix = 'ComponentbuilderModel', $config = array())
{
$model = parent::getModel($name, $prefix, array('ignore_request' => true));
return $model;
}
public function exportData()
{
// Check for request forgeries
JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
// check if export is allowed for this user.
$user = JFactory::getUser();
if ($user->authorise('custom_code.export', 'com_componentbuilder') && $user->authorise('core.export', 'com_componentbuilder'))
{
// Get the input
$input = JFactory::getApplication()->input;
$pks = $input->post->get('cid', array(), 'array');
// Sanitize the input
JArrayHelper::toInteger($pks);
// Get the model
$model = $this->getModel('Custom_codes');
// get the data to export
$data = $model->getExportData($pks);
if (ComponentbuilderHelper::checkArray($data))
{
// now set the data to the spreadsheet
$date = JFactory::getDate();
ComponentbuilderHelper::xls($data,'Custom_codes_'.$date->format('jS_F_Y'),'Custom codes exported ('.$date->format('jS F, Y').')','custom codes');
}
}
// Redirect to the list screen with error.
$message = JText::_('COM_COMPONENTBUILDER_EXPORT_FAILED');
$this->setRedirect(JRoute::_('index.php?option=com_componentbuilder&view=custom_codes', false), $message, 'error');
return;
}
public function importData()
{
// Check for request forgeries
JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));
// check if import is allowed for this user.
$user = JFactory::getUser();
if ($user->authorise('custom_code.import', 'com_componentbuilder') && $user->authorise('core.import', 'com_componentbuilder'))
{
// Get the import model
$model = $this->getModel('Custom_codes');
// get the headers to import
$headers = $model->getExImPortHeaders();
if (ComponentbuilderHelper::checkObject($headers))
{
// Load headers to session.
$session = JFactory::getSession();
$headers = json_encode($headers);
$session->set('custom_code_VDM_IMPORTHEADERS', $headers);
$session->set('backto_VDM_IMPORT', 'custom_codes');
$session->set('dataType_VDM_IMPORTINTO', 'custom_code');
// Redirect to import view.
$message = JText::_('COM_COMPONENTBUILDER_IMPORT_SELECT_FILE_FOR_CUSTOM_CODES');
$this->setRedirect(JRoute::_('index.php?option=com_componentbuilder&view=import', false), $message);
return;
}
}
// Redirect to the list screen with error.
$message = JText::_('COM_COMPONENTBUILDER_IMPORT_FAILED');
$this->setRedirect(JRoute::_('index.php?option=com_componentbuilder&view=custom_codes', false), $message, 'error');
return;
}
}

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 81 of this MVC
@build 15th January, 2017
@created 21st May, 2015
@package Component Builder
@subpackage dynamic_get.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 81 of this MVC
@build 15th January, 2017
@created 21st May, 2015
@package Component Builder
@subpackage dynamic_gets.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 36 of this MVC
@build 12th January, 2017
@created 30th April, 2015
@package Component Builder
@subpackage field.php

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 36 of this MVC
@build 12th January, 2017
@created 30th April, 2015
@package Component Builder
@subpackage fields.php

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 12 of this MVC
@build 20th October, 2016
@created 30th April, 2015
@package Component Builder
@subpackage fieldtype.php

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version @update number 12 of this MVC
@build 20th October, 2016
@created 30th April, 2015
@package Component Builder
@subpackage fieldtypes.php

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version 2.2.9
@build 1st February, 2017
@created 30th April, 2015
@package Component Builder
@subpackage help.php

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 6 of this MVC
@build 17th October, 2016
@created 4th March, 2016
@package Component Builder
@subpackage help_document.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 6 of this MVC
@build 17th October, 2016
@created 4th March, 2016
@package Component Builder
@subpackage help_documents.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,8 +10,8 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@version 2.2.9
@build 1st February, 2017
@created 30th April, 2015
@package Component Builder
@subpackage import.php

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 65 of this MVC
@build 18th October, 2016
@created 18th May, 2015
@package Component Builder
@subpackage layout.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 65 of this MVC
@build 18th October, 2016
@created 18th May, 2015
@package Component Builder
@subpackage layouts.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 44 of this MVC
@build 29th January, 2017
@created 29th May, 2015
@package Component Builder
@subpackage site_view.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 44 of this MVC
@build 29th January, 2017
@created 29th May, 2015
@package Component Builder
@subpackage site_views.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 16 of this MVC
@build 20th October, 2016
@created 19th May, 2015
@package Component Builder
@subpackage snippet.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

View File

@ -10,9 +10,9 @@
|_|
/-------------------------------------------------------------------------------------------------------------------------------/
@version 2.2.6
@build 20th January, 2017
@created 30th April, 2015
@version @update number 16 of this MVC
@build 20th October, 2016
@created 19th May, 2015
@package Component Builder
@subpackage snippets.php
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>

Some files were not shown because too many files have changed in this diff Show More