Subversion Repositories eFlore/Applications.cel

Rev

Rev 2388 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2388 jpm 1
<?php
2
/**
3
 * PHPExcel
4
 *
5
 * Copyright (c) 2006 - 2013 PHPExcel
6
 *
7
 * This library is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * This library is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20
 *
21
 * @category   PHPExcel
22
 * @package    PHPExcel_Shared
23
 * @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)
24
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
25
 * @version    ##VERSION##, ##DATE##
26
 */
27
 
28
 
29
/**
30
 * PHPExcel_Shared_Drawing
31
 *
32
 * @category   PHPExcel
33
 * @package    PHPExcel_Shared
34
 * @copyright  Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)
35
 */
36
class PHPExcel_Shared_Drawing
37
{
38
	/**
39
	 * Convert pixels to EMU
40
	 *
41
	 * @param 	int $pValue	Value in pixels
42
	 * @return 	int			Value in EMU
43
	 */
44
	public static function pixelsToEMU($pValue = 0) {
45
		return round($pValue * 9525);
46
	}
47
 
48
	/**
49
	 * Convert EMU to pixels
50
	 *
51
	 * @param 	int $pValue	Value in EMU
52
	 * @return 	int			Value in pixels
53
	 */
54
	public static function EMUToPixels($pValue = 0) {
55
		if ($pValue != 0) {
56
			return round($pValue / 9525);
57
		} else {
58
			return 0;
59
		}
60
	}
61
 
62
	/**
63
	 * Convert pixels to column width. Exact algorithm not known.
64
	 * By inspection of a real Excel file using Calibri 11, one finds 1000px ~ 142.85546875
65
	 * This gives a conversion factor of 7. Also, we assume that pixels and font size are proportional.
66
	 *
67
	 * @param 	int $pValue	Value in pixels
68
	 * @param 	PHPExcel_Style_Font $pDefaultFont	Default font of the workbook
69
	 * @return 	int			Value in cell dimension
70
	 */
71
	public static function pixelsToCellDimension($pValue = 0, PHPExcel_Style_Font $pDefaultFont) {
72
		// Font name and size
73
		$name = $pDefaultFont->getName();
74
		$size = $pDefaultFont->getSize();
75
 
76
		if (isset(PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size])) {
77
			// Exact width can be determined
78
			$colWidth = $pValue
79
				* PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['width']
80
				/ PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['px'];
81
		} else {
82
			// We don't have data for this particular font and size, use approximation by
83
			// extrapolating from Calibri 11
84
			$colWidth = $pValue * 11
85
				* PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['width']
86
				/ PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['px'] / $size;
87
		}
88
 
89
		return $colWidth;
90
	}
91
 
92
	/**
93
	 * Convert column width from (intrinsic) Excel units to pixels
94
	 *
95
	 * @param 	float	$pValue		Value in cell dimension
96
	 * @param 	PHPExcel_Style_Font $pDefaultFont	Default font of the workbook
97
	 * @return 	int		Value in pixels
98
	 */
99
	public static function cellDimensionToPixels($pValue = 0, PHPExcel_Style_Font $pDefaultFont) {
100
		// Font name and size
101
		$name = $pDefaultFont->getName();
102
		$size = $pDefaultFont->getSize();
103
 
104
		if (isset(PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size])) {
105
			// Exact width can be determined
106
			$colWidth = $pValue
107
				* PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['px']
108
				/ PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['width'];
109
 
110
		} else {
111
			// We don't have data for this particular font and size, use approximation by
112
			// extrapolating from Calibri 11
113
			$colWidth = $pValue * $size
114
				* PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['px']
115
				/ PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['width'] / 11;
116
		}
117
 
118
		// Round pixels to closest integer
119
		$colWidth = (int) round($colWidth);
120
 
121
		return $colWidth;
122
	}
123
 
124
	/**
125
	 * Convert pixels to points
126
	 *
127
	 * @param 	int $pValue	Value in pixels
128
	 * @return 	int			Value in points
129
	 */
130
	public static function pixelsToPoints($pValue = 0) {
131
		return $pValue * 0.67777777;
132
	}
133
 
134
	/**
135
	 * Convert points to pixels
136
	 *
137
	 * @param 	int $pValue	Value in points
138
	 * @return 	int			Value in pixels
139
	 */
140
	public static function pointsToPixels($pValue = 0) {
141
		if ($pValue != 0) {
142
			return (int) ceil($pValue * 1.333333333);
143
		} else {
144
			return 0;
145
		}
146
	}
147
 
148
	/**
149
	 * Convert degrees to angle
150
	 *
151
	 * @param 	int $pValue	Degrees
152
	 * @return 	int			Angle
153
	 */
154
	public static function degreesToAngle($pValue = 0) {
155
		return (int)round($pValue * 60000);
156
	}
157
 
158
	/**
159
	 * Convert angle to degrees
160
	 *
161
	 * @param 	int $pValue	Angle
162
	 * @return 	int			Degrees
163
	 */
164
	public static function angleToDegrees($pValue = 0) {
165
		if ($pValue != 0) {
166
			return round($pValue / 60000);
167
		} else {
168
			return 0;
169
		}
170
	}
171
 
172
	/**
173
	 * Create a new image from file. By alexander at alexauto dot nl
174
	 *
175
	 * @link http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214
176
	 * @param string $filename Path to Windows DIB (BMP) image
177
	 * @return resource
178
	 */
179
	public static function imagecreatefrombmp($p_sFile)
180
	{
181
        //    Load the image into a string
182
        $file    =    fopen($p_sFile,"rb");
183
        $read    =    fread($file,10);
184
        while(!feof($file)&&($read<>""))
185
            $read    .=    fread($file,1024);
186
 
187
        $temp    =    unpack("H*",$read);
188
        $hex    =    $temp[1];
189
        $header    =    substr($hex,0,108);
190
 
191
        //    Process the header
192
        //    Structure: http://www.fastgraph.com/help/bmp_header_format.html
193
        if (substr($header,0,4)=="424d")
194
        {
195
            //    Cut it in parts of 2 bytes
196
            $header_parts    =    str_split($header,2);
197
 
198
            //    Get the width        4 bytes
199
            $width            =    hexdec($header_parts[19].$header_parts[18]);
200
 
201
            //    Get the height        4 bytes
202
            $height            =    hexdec($header_parts[23].$header_parts[22]);
203
 
204
            //    Unset the header params
205
            unset($header_parts);
206
        }
207
 
208
        //    Define starting X and Y
209
        $x                =    0;
210
        $y                =    1;
211
 
212
        //    Create newimage
213
        $image            =    imagecreatetruecolor($width,$height);
214
 
215
        //    Grab the body from the image
216
        $body            =    substr($hex,108);
217
 
218
        //    Calculate if padding at the end-line is needed
219
        //    Divided by two to keep overview.
220
        //    1 byte = 2 HEX-chars
221
        $body_size        =    (strlen($body)/2);
222
        $header_size    =    ($width*$height);
223
 
224
        //    Use end-line padding? Only when needed
225
        $usePadding        =    ($body_size>($header_size*3)+4);
226
 
227
        //    Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption
228
        //    Calculate the next DWORD-position in the body
229
        for ($i=0;$i<$body_size;$i+=3)
230
        {
231
            //    Calculate line-ending and padding
232
            if ($x>=$width)
233
            {
234
                //    If padding needed, ignore image-padding
235
                //    Shift i to the ending of the current 32-bit-block
236
                if ($usePadding)
237
                    $i    +=    $width%4;
238
 
239
                //    Reset horizontal position
240
                $x    =    0;
241
 
242
                //    Raise the height-position (bottom-up)
243
                $y++;
244
 
245
                //    Reached the image-height? Break the for-loop
246
                if ($y>$height)
247
                    break;
248
            }
249
 
250
            //    Calculation of the RGB-pixel (defined as BGR in image-data)
251
            //    Define $i_pos as absolute position in the body
252
            $i_pos    =    $i*2;
253
            $r        =    hexdec($body[$i_pos+4].$body[$i_pos+5]);
254
            $g        =    hexdec($body[$i_pos+2].$body[$i_pos+3]);
255
            $b        =    hexdec($body[$i_pos].$body[$i_pos+1]);
256
 
257
            //    Calculate and draw the pixel
258
            $color    =    imagecolorallocate($image,$r,$g,$b);
259
            imagesetpixel($image,$x,$height-$y,$color);
260
 
261
            //    Raise the horizontal position
262
            $x++;
263
        }
264
 
265
        //    Unset the body / free the memory
266
        unset($body);
267
 
268
        //    Return image-object
269
        return $image;
270
	}
271
 
272
}