|
Server : Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8e-fips-rhel5 DAV/2 PHP/5.2.17 System : Linux localhost 2.6.18-419.el5 #1 SMP Fri Feb 24 22:47:42 UTC 2017 x86_64 User : nobody ( 99) PHP Version : 5.2.17 Disable Function : NONE Directory : /home/queenjbs/www/FusionChart/Code/PHP/ExportHandler/Resources/ |
Upload File : |
<?php
/**
*
* FusionCharts Exporter - 'Image Resource' handles
* FusionCharts (since v3.1) Server Side Export feature that
* helps FusionCharts exported as Image files in various formats.
*
*
* @author FusionCharts
* @description FusionCharts Exporter (Server-Side - PHP)
* @version 2.0 [ 12 February 2009 ]
*
*/
/**
* ChangeLog / Version History:
* ----------------------------
*
*
* 1.1 [ 18 July 2009 ]
* background color was turning black in a few linux distro - fixed . The original code is kept commneted. Line 277
*
*
*
* 1.0 [ 12 February 2009 ]
*
* FEATURES:
* - Integrated with new Export feature of FusionCharts 3.1 & FusionCharts Exporter v 2.0
* - can save to server side directory
* - can provide download or open in browser window/frame other than _self
* - can save in various image formats viz. jpeg, png and gif.
*
*
*/
/**
* Copyright (c) 2012 Infosoft Global Private Limited
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/**
* GENERAL NOTES
* -------------
*
* Chart would POST export data (which consists of encoded image data stream,
* width, height, background color and various other export parameters like
* exportFormat, exportFileName, exportAction, exportTargetWindow) to this script.
*
* The script would process this data using appropriate resource files build
* export binary (PDF/image)
*
* It either saves the binary as file to a server side directory or push it as
* Download or open in a new browser window/frame.
*
*
*/
/**
* @requires FCExporter.php A file that includes this resource
*
*
* Details
* -------
*
* The resource files would have these things as common:
*
* a) a constant - MIMETYPES that would have a string
* containing semicolon separated key value pairs.
* Each key can be a format name specified in the
* HANDLERASSOCIATIONS constant. The associated value
* would be the mimetype for the specified format.
*
* e.g. define("MIMETYPES","jpg=image/jpeg;jpeg=image/jpeg;png=image/png;gif=image/gif");
*
*
* b) a constant - EXTENSIONS that again contain a string of
* semicolon separated key value pair. Each key would again be the
* format name and the extension would be the file extension.
*
* e.g. define("EXTENSIONS","jpg=jpg;jpeg=jpg;png=png;gif=gif");
*
*
* c) a function - exportProcessor ( $stream , $meta )
* It would take the FusionCharts exncoded image string as $stream &
* an associative array $meta containging width, height and bgColor keys.
*
* The function would return an object of mixed type which would contain
* the processed binary/relevant export object.
*
*
* d) a function - exportOutput ( $exportObj, $exportSettings, $quality=1 )
* It would take the processed export object and other export setting as parameter.
* Moreover, it would take an optional parameter - $quality (in scale of 0 to 1).
* By Default, the $quality is passed as 1 (best quality)
*
* The function would return the file path on success or return false on failure.
*
* [ The other code in the resource file can be anything that support this architecture ]
*
*/
// =============================================================================
// == Constants and Variables ==
// =============================================================================
// **** Users are recommended NOT to perform any editing beyond this point. ****
/* ------------------------- EXPORT RESOURCES -------------------------------- */
// This constant lists the mime types related to each export format this resource handles
// The value is semicolon separated key value pair for each format
// Each key is the format and value is the mime type
define( "MIMETYPES", "jpg=image/jpeg;jpeg=image/jpeg;gif=image/gif;png=image/png" );
// This constant lists all the file extensions for the export formats
// The value is semicolon separated key value pair for each format
// Each key is the format and value is the file extension
define( "EXTENSIONS", "jpg=jpg;jpeg=jpg;gif=gif;png=png" );
// =============================================================================
// == Public Functions ==
// =============================================================================
/**
* Gets Export data from FCExporter - main module and build the export binary/objct.
* @param $stream (string) export image data in FusionCharts compressed format
* $meta {array) Image meta data in keys "width", "heigth" and "bgColor"
* $exportParams {array} Export related parameters
* @return image object/binary
*/
function exportProcessor( $stream, $meta, $exportParams )
{
// create a new export object
// here it is an image generator class that handles jpg, png, gif export
// pass all reqiured parameters
$FCExporter = new FCIMGGenerator ( $stream, $meta['width'], $meta['height'], $meta['bgColor'] );
// return export ready image object
return $FCExporter->getImageObject();
}
/**
* exports (save/download) FusinoCharts exported image.
* @param $exportObj (mixed) binary/objct exported by exportProcessor
* @param $exportSettings (array) various server-side export settings stored in keys like
* "type", "ready" "filepath" etc. Required for 'save' expotAction.
* For 'download' action "filepath" is blank (this is checked to find
* whether the action is "download" or not.
* @param $quality (integer) quality factor 0-1 (1 being the best quality). As of now we always pass 1.
*
* @return false is fails. {filepath} if succeeds. Only returned when action is 'save'.
*/
function exportOutput ( $exportObj, $exportSettings , $quality = 1 )
{
// decides image encoding and saving php(GD) function as per export type
switch( strtolower( $exportSettings['type' ]) )
{
// in case of PNG check if 'imagepng' function exists.
// save the image as png
// store saving status in $doneExport which receives false if fails and true on success
case "png" :
if( function_exists ( "imagepng" ) ) {
$doneExport = imagepng ( $exportObj, @$exportSettings ['filepath' ], $quality*9 );
}
break;
// in case of GIF check if 'imagegif' function exists.
// save the image as gif
// store saving status in $doneExport which receives false if fails and true on success
case "gif" :
if( function_exists ( "imagegif" ) ) {
// This is done as a fix to some PHP versions running on IIS
if( trim(@$exportSettings ['filepath']) )
$doneExport = imagegif ( $exportObj, @$exportSettings ['filepath'] );
else
$doneExport = imagegif ( $exportObj );
}
break;
// in case of JPG/JPEG check if 'imagejpeg' function exists.
// save the image as jpg
// store saving status in $doneExport which receives false if fails and true on success
case "jpg" :
case "jpeg":
if( function_exists ( "imagejpeg" ) ) {
$doneExport = imagejpeg ( $exportObj, @$exportSettings ['filepath' ], $quality*100 );
}
break;
default :
raise_error( "Invalid Export Format." , true);
break;
}
// clear memory after saving
imagedestroy( $exportObj );
// check 'filepath'. If it is null - the action is 'download' and hence terminate execution
if ( !@$exportSettings [ 'filepath' ] ) exit();
// check $doneEport and if true sets status to {filepath}'s value
// set false if fails
$status =( @$doneExport ? basename ( @$exportSettings ['filepath'] ) : false );
// return status
return $status;
}
#################################################################################
## ##
## EXPORT CLASS ##
## ##
#################################################################################
class FCIMGGenerator
{
//Array - Stores multiple chart export data
var $arrExportData;
//stores number of pages = length of $arrExportData array
var $numPages=0;
//Constructor - By default the chart export data can be passed to this
function FCIMGGenerator($imageData_FCFormat="", $width="", $height="", $bgcolor="ffffff"){
if($imageData_FCFormat && $width && $height){
$this->setBitmapData($imageData_FCFormat, $width, $height, $bgcolor);
}
}
// Add chart export data
function setBitmapData($imageData_FCFormat, $width, $height, $bgcolor="ffffff"){
$this->arrExportData[$this->numPages]["width"]=$width;
$this->arrExportData[$this->numPages]["height"]=$height;
$this->arrExportData[$this->numPages]["bgcolor"]=$bgcolor;
$this->arrExportData[$this->numPages]["imageData"]=$imageData_FCFormat;
$this->numPages++;
}
function getImageObject($id=0){
//create image
$image = imagecreatetruecolor($this->arrExportData[$id]["width"], $this->arrExportData[$id]["height"]);
// Detect the background color
if (!$this->arrExportData[$id]["bgcolor"]){
$this->arrExportData[$id]["bgcolor"] = "ffffff";
}
//set Background color
// Some linux distro have issues with imagefill
// Hence, using imagefilledrectangle() instead
//imagefill($image, 0, 0, $this->composeColor($image,$this->arrExportData[$id]["bgcolor"]));
imagefilledrectangle($image, 0, 0,($this->arrExportData[$id]["width"]+0)-1, ($this->arrExportData[$id]["height"]+0)-1,$this->composeColor($image,$this->arrExportData[$id]["bgcolor"]));
// Split the data into rows using ; as separator
$rows = explode(";", $this->arrExportData[$id]["imageData"]);
// Iterate through all the rows
for($i= 0; $i<count($rows); $i++){
$x=0;
// Parse all the pixels in this row
$pixels = explode(",", $rows[$i]);
// Iterate through the pixels
for($j=0; $j<count($pixels); $j++){
// Split the pixel into color and repeat value
$thispix = explode("_", $pixels[$j]);
// Reference to color
$c = $thispix[0];
// Reference to repeat factor
$r = (int)$thispix[1];
//If color is empty (i.e., background pixel) skip
if ($c==""){
$x+=$r;
continue;
//$c=$this->arrExportData[$id]["bgcolor"];
}
// get color
$color=$this->composeColor($image,$c);
//draw line
imageline($image, $x, $i, ($x+$r)-1, $i, $color);
//set next x pixel position
$x+=$r;
}
}
return $image;
}
// build color object for GD image object
// Parsee 6 Byte Hex Color string to 3 Byte RGB color
function composeColor($imgObj,$strHexColor){
if (strlen($strHexColor)<6){
//If the hexadecimal code is less than 6 characters, pad with 0
$strHexColor = str_pad($strHexColor, 6, '0', STR_PAD_LEFT);
}
//Convert value from HEX to RRGGBB (3 bytes)
$rr = hexdec(substr($strHexColor, 0, 2));
$gg = hexdec(substr($strHexColor, 2, 2));
$bb = hexdec(substr($strHexColor, 4, 2));
// Allocate the color
return imagecolorallocate($imgObj, $rr, $gg, $bb);
}
}
//needed to validate inclusion of this resource file in main file - FCExporter.php
return 'true';
?>