PluginProbe
PDF & Print by BestWebSoft – WordPress Posts and Pages PDF Generator Plugin / trunk
PDF & Print by BestWebSoft – WordPress Posts and Pages PDF Generator Plugin vtrunk
trunk 1.5 1.6 1.7 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 All 71 releases
pdf-print / mpdf / classes / wmf.php

wmf.php in PDF & Print by BestWebSoft – WordPress Posts and Pages PDF Generator Plugin trunk, at mpdf/classes/wmf.php

272 lines 6.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 class wmf
4 {
5
6 var $mpdf = null;
7
8 var $gdiObjectArray;
9
10 public function __construct(mPDF $mpdf)
11 {
12 $this->mpdf = $mpdf;
13 }
14
15 function _getWMFimage($data)
16 {
17 $k = _MPDFK;
18
19 $this->gdiObjectArray = array();
20 $a = unpack('stest', "\1\0");
21 if ($a['test'] != 1)
22 return array(0, 'Error parsing WMF image - Big-endian architecture not supported');
23 // check for Aldus placeable metafile header
24 $key = unpack('Lmagic', substr($data, 0, 4));
25 $p = 18; // WMF header
26 if ($key['magic'] == (int) 0x9AC6CDD7) {
27 $p +=22;
28 } // Aldus header
29 // define some state variables
30 $wo = null; // window origin
31 $we = null; // window extent
32 $polyFillMode = 0;
33 $nullPen = false;
34 $nullBrush = false;
35 $endRecord = false;
36 $wmfdata = '';
37 while ($p < strlen($data) && !$endRecord) {
38 $recordInfo = unpack('Lsize/Sfunc', substr($data, $p, 6));
39 $p += 6;
40 // size of record given in WORDs (= 2 bytes)
41 $size = $recordInfo['size'];
42 // func is number of GDI function
43 $func = $recordInfo['func'];
44 if ($size > 3) {
45 $parms = substr($data, $p, 2 * ($size - 3));
46 $p += 2 * ($size - 3);
47 }
48 switch ($func) {
49 case 0x020b: // SetWindowOrg
50 // do not allow window origin to be changed
51 // after drawing has begun
52 if (!$wmfdata)
53 $wo = array_reverse(unpack('s2', $parms));
54 break;
55 case 0x020c: // SetWindowExt
56 // do not allow window extent to be changed
57 // after drawing has begun
58 if (!$wmfdata)
59 $we = array_reverse(unpack('s2', $parms));
60 break;
61 case 0x02fc: // CreateBrushIndirect
62 $brush = unpack('sstyle/Cr/Cg/Cb/Ca/Shatch', $parms);
63 $brush['type'] = 'B';
64 $this->_AddGDIObject($brush);
65 break;
66 case 0x02fa: // CreatePenIndirect
67 $pen = unpack('Sstyle/swidth/sdummy/Cr/Cg/Cb/Ca', $parms);
68 // convert width from twips to user unit
69 $pen['width'] /= (20 * $k);
70 $pen['type'] = 'P';
71 $this->_AddGDIObject($pen);
72 break;
73
74 // MUST create other GDI objects even if we don't handle them
75 case 0x06fe: // CreateBitmap
76 case 0x02fd: // CreateBitmapIndirect
77 case 0x00f8: // CreateBrush
78 case 0x02fb: // CreateFontIndirect
79 case 0x00f7: // CreatePalette
80 case 0x01f9: // CreatePatternBrush
81 case 0x06ff: // CreateRegion
82 case 0x0142: // DibCreatePatternBrush
83 $dummyObject = array('type' => 'D');
84 $this->_AddGDIObject($dummyObject);
85 break;
86 case 0x0106: // SetPolyFillMode
87 $polyFillMode = unpack('smode', $parms);
88 $polyFillMode = $polyFillMode['mode'];
89 break;
90 case 0x01f0: // DeleteObject
91 $idx = unpack('Sidx', $parms);
92 $idx = $idx['idx'];
93 $this->_DeleteGDIObject($idx);
94 break;
95 case 0x012d: // SelectObject
96 $idx = unpack('Sidx', $parms);
97 $idx = $idx['idx'];
98 $obj = $this->_GetGDIObject($idx);
99 switch ($obj['type']) {
100 case 'B':
101 $nullBrush = false;
102 if ($obj['style'] == 1) {
103 $nullBrush = true;
104 } else {
105 $wmfdata .= $this->mpdf->SetFColor($this->mpdf->ConvertColor('rgb(' . $obj['r'] . ',' . $obj['g'] . ',' . $obj['b'] . ')'), true) . "\n";
106 }
107 break;
108 case 'P':
109 $nullPen = false;
110 $dashArray = array();
111 // dash parameters are custom
112 switch ($obj['style']) {
113 case 0: // PS_SOLID
114 break;
115 case 1: // PS_DASH
116 $dashArray = array(3, 1);
117 break;
118 case 2: // PS_DOT
119 $dashArray = array(0.5, 0.5);
120 break;
121 case 3: // PS_DASHDOT
122 $dashArray = array(2, 1, 0.5, 1);
123 break;
124 case 4: // PS_DASHDOTDOT
125 $dashArray = array(2, 1, 0.5, 1, 0.5, 1);
126 break;
127 case 5: // PS_NULL
128 $nullPen = true;
129 break;
130 }
131 if (!$nullPen) {
132 $wmfdata .= $this->mpdf->SetDColor($this->mpdf->ConvertColor('rgb(' . $obj['r'] . ',' . $obj['g'] . ',' . $obj['b'] . ')'), true) . "\n";
133 $wmfdata .= sprintf("%.3F w\n", $obj['width'] * $k);
134 }
135 if (!empty($dashArray)) {
136 $s = '[';
137 for ($i = 0; $i < count($dashArray); $i++) {
138 $s .= $dashArray[$i] * $k;
139 if ($i != count($dashArray) - 1) {
140 $s .= ' ';
141 }
142 }
143 $s .= '] 0 d';
144 $wmfdata .= $s . "\n";
145 }
146 break;
147 }
148 break;
149 case 0x0325: // Polyline
150 case 0x0324: // Polygon
151 $coords = unpack('s' . ($size - 3), $parms);
152 $numpoints = $coords[1];
153 for ($i = $numpoints; $i > 0; $i--) {
154 $px = $coords[2 * $i];
155 $py = $coords[2 * $i + 1];
156
157 if ($i < $numpoints) {
158 $wmfdata .= $this->_LineTo($px, $py);
159 } else {
160 $wmfdata .= $this->_MoveTo($px, $py);
161 }
162 }
163 if ($func == 0x0325) {
164 $op = 's';
165 } else if ($func == 0x0324) {
166 if ($nullPen) {
167 if ($nullBrush) {
168 $op = 'n';
169 } // no op
170 else {
171 $op = 'f';
172 } // fill
173 } else {
174 if ($nullBrush) {
175 $op = 's';
176 } // stroke
177 else {
178 $op = 'b';
179 } // stroke and fill
180 }
181 if ($polyFillMode == 1 && ($op == 'b' || $op == 'f')) {
182 $op .= '*';
183 } // use even-odd fill rule
184 }
185 $wmfdata .= $op . "\n";
186 break;
187 case 0x0538: // PolyPolygon
188 $coords = unpack('s' . ($size - 3), $parms);
189 $numpolygons = $coords[1];
190 $adjustment = $numpolygons;
191 for ($j = 1; $j <= $numpolygons; $j++) {
192 $numpoints = $coords[$j + 1];
193 for ($i = $numpoints; $i > 0; $i--) {
194 $px = $coords[2 * $i + $adjustment];
195 $py = $coords[2 * $i + 1 + $adjustment];
196 if ($i == $numpoints) {
197 $wmfdata .= $this->_MoveTo($px, $py);
198 } else {
199 $wmfdata .= $this->_LineTo($px, $py);
200 }
201 }
202 $adjustment += $numpoints * 2;
203 }
204
205 if ($nullPen) {
206 if ($nullBrush) {
207 $op = 'n';
208 } // no op
209 else {
210 $op = 'f';
211 } // fill
212 } else {
213 if ($nullBrush) {
214 $op = 's';
215 } // stroke
216 else {
217 $op = 'b';
218 } // stroke and fill
219 }
220 if ($polyFillMode == 1 && ($op == 'b' || $op == 'f')) {
221 $op .= '*';
222 } // use even-odd fill rule
223 $wmfdata .= $op . "\n";
224 break;
225 case 0x0000:
226 $endRecord = true;
227 break;
228 }
229 }
230
231 return array(1, $wmfdata, $wo, $we);
232 }
233
234 function _MoveTo($x, $y)
235 {
236 return "$x $y m\n";
237 }
238
239 // a line must have been started using _MoveTo() first
240 function _LineTo($x, $y)
241 {
242 return "$x $y l\n";
243 }
244
245 function _AddGDIObject($obj)
246 {
247 // find next available slot
248 $idx = 0;
249 if (!empty($this->gdiObjectArray)) {
250 $empty = false;
251 $i = 0;
252 while (!$empty) {
253 $empty = !isset($this->gdiObjectArray[$i]);
254 $i++;
255 }
256 $idx = $i - 1;
257 }
258 $this->gdiObjectArray[$idx] = $obj;
259 }
260
261 function _GetGDIObject($idx)
262 {
263 return $this->gdiObjectArray[$idx];
264 }
265
266 function _DeleteGDIObject($idx)
267 {
268 unset($this->gdiObjectArray[$idx]);
269 }
270
271 }
272