File Source for Drawing.php

PHPExcel_Shared

# Source for file Drawing.php

Documentation is available at Drawing.php

1. <?php
2. /**
3. * PHPExcel
4. *
5. * Copyright (c) 2006 - 2011 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 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel)
24. * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25. * @version 1.7.6, 2011-02-27
26. */
29. /**
30. * PHPExcel_Shared_Drawing
31. *
32. * @category PHPExcel
33. * @package PHPExcel_Shared
34. * @copyright Copyright (c) 2006 - 2011 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. }
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. }
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();
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. }
89. return $colWidth;
90. }
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();
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'];
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. }
118. // Round pixels to closest integer
119. $colWidth = (int) round($colWidth);
121. return $colWidth;
122. }
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. }
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. }
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. }
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. }
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);
187. $temp = unpack("H*",$read);
188. $hex = $temp[1];
189. $header = substr($hex,0,108);
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);
198. // Get the width 4 bytes
199. $width = hexdec($header_parts[19].$header_parts[18]);
201. // Get the height 4 bytes
202. $height = hexdec($header_parts[23].$header_parts[22]);
204. // Unset the header params
205. unset($header_parts);
206. }
208. // Define starting X and Y
209. $x = 0;
210. $y = 1;
212. // Create newimage
213. $image = imagecreatetruecolor($width,$height);
215. // Grab the body from the image
216. $body = substr($hex,108);
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);
224. // Use end-line padding? Only when needed
225. $usePadding = ($body_size>($header_size*3)+4);
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;
239. // Reset horizontal position
240. $x = 0;
242. // Raise the height-position (bottom-up)
243. $y++;
245. // Reached the image-height? Break the for-loop
246. if ($y>$height)
247. break;
248. }
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]);
257. // Calculate and draw the pixel
258. $color = imagecolorallocate($image,$r,$g,$b);
259. imagesetpixel($image,$x,$height-$y,$color);
261. // Raise the horizontal position
262. $x++;
263. }
265. // Unset the body / free the memory
266. unset($body);
268. // Return image-object
269. return $image;
270. }
272. }

Documentation generated on Sun, 27 Feb 2011 16:30:19 -0800 by phpDocumentor 1.4.3