filters

ai88handler.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2002, Dirk Schönberger <dirk.schoenberger@sz-online.de>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#include <tdeglobal.h>
21#include "ai88handler.h"
22
23AI88Handler::AI88Handler(AIParserBase *delegate){
24 m_delegate = delegate;
25}
26AI88Handler::~AI88Handler(){
27}
28
29bool AI88Handler::handleAIOperation (AIOperation op) {
30 PathElement pathElement;
31 double fval;
32 int ival;
33
34 switch (op) {
35 case AIO_SetFillColorCMYK :
36 _handleSetFillColorCMYK();
37 return true;
38 break;
39 case AIO_SetStrokeColorCMYK :
40 _handleSetStrokeColorCMYK();
41 return true;
42 break;
43 case AIO_SetFillColorGray :
44 _handleSetFillColorGray();
45 return true;
46 break;
47 case AIO_SetStrokeColorGray :
48 _handleSetStrokeColorGray();
49 return true;
50 break;
51 case AIO_SetFillColorCustom :
52 _handleSetFillColorCustom();
53 return true;
54 break;
55 case AIO_SetStrokeColorCustom :
56 _handleSetStrokeColorCustom();
57 return true;
58 break;
59 case AIO_SetFillPattern :
60 _handleSetFillPattern();
61 return true;
62 break;
63 case AIO_SetStrokePattern :
64 _handleSetStrokePattern();
65 return true;
66 break;
67 case AIO_SetFillOverprinting :
68 if (m_delegate->m_miscGStateHandler) m_delegate->m_miscGStateHandler->gotFillOverprinting (m_delegate->getBoolValue());
69 return true;
70 break;
71 case AIO_SetStrokeOverprinting :
72 if (m_delegate->m_miscGStateHandler) m_delegate->m_miscGStateHandler->gotStrokeOverprinting (m_delegate->getBoolValue());
73 return true;
74 break;
75 case AIO_LockElement :
76 if (m_delegate->m_miscGStateHandler) m_delegate->m_miscGStateHandler->gotLockNextObject (m_delegate->getBoolValue());
77 return true;
78 break;
79 case AIO_SetFlatness :
80 fval = m_delegate->getDoubleValue();
81 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotFlatness (fval);
82 return true;
83 break;
84 case AIO_SetLineCap :
85 ival = m_delegate->getIntValue();
86 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotLineCaps (ival);
87 return true;
88 break;
89 case AIO_SetLineJoin :
90 ival = m_delegate->getIntValue();
91 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotLineJoin (ival);
92 return true;
93 break;
94 case AIO_SetLineWidth :
95 fval = kMax(0.2, m_delegate->getDoubleValue()); // Use thinnest pen stroke possible for 0 (Rob)
96 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotLineWidth (fval);
97 return true;
98 break;
99 case AIO_SetMiterLimit :
100 fval = m_delegate->getDoubleValue();
101 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotMiterLimit (fval);
102 return true;
103 break;
104 case AIO_SetDash :
105 _handleSetDash();
106 return true;
107 break;
108 case AIO_BeginGroupClip :
109 if (m_delegate->m_structureHandler) m_delegate->m_structureHandler->gotBeginGroup (true);
110 return true;
111 break;
112 case AIO_EndGroupClip :
113 if (m_delegate->m_debug) tqDebug ("got end group clip");
114 if (m_delegate->m_structureHandler) m_delegate->m_structureHandler->gotEndGroup (true);
115 if (m_delegate->m_debug) tqDebug ("/got end group clip");
116 return true;
117
118 break;
119 case AIO_MoveTo :
120 pathElement.petype = PET_MoveTo;
121 pathElement.pttype = PT_Corner;
122 pathElement.pevalue.pointdata.y = m_delegate->getDoubleValue();
123 pathElement.pevalue.pointdata.x = m_delegate->getDoubleValue();
124 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
125 return true;
126 break;
127 case AIO_LineToCorner :
128 pathElement.petype = PET_LineTo;
129 pathElement.pttype = PT_Corner;
130 pathElement.pevalue.pointdata.y = m_delegate->getDoubleValue();
131 pathElement.pevalue.pointdata.x = m_delegate->getDoubleValue();
132 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
133 return true;
134 break;
135 case AIO_LineToSmooth :
136 pathElement.petype = PET_LineTo;
137 pathElement.pttype = PT_Smooth;
138 pathElement.pevalue.pointdata.y = m_delegate->getDoubleValue();
139 pathElement.pevalue.pointdata.x = m_delegate->getDoubleValue();
140 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
141 return true;
142 break;
143 case AIO_CurveToCorner :
144 pathElement.petype = PET_CurveTo;
145 pathElement.pttype = PT_Corner;
146 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
147 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
148 pathElement.pevalue.bezierdata.y2 = m_delegate->getDoubleValue();
149 pathElement.pevalue.bezierdata.x2 = m_delegate->getDoubleValue();
150 pathElement.pevalue.bezierdata.y1 = m_delegate->getDoubleValue();
151 pathElement.pevalue.bezierdata.x1 = m_delegate->getDoubleValue();
152 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
153 return true;
154 break;
155 case AIO_CurveToSmooth :
156 pathElement.petype = PET_CurveTo;
157 pathElement.pttype = PT_Smooth;
158 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
159 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
160 pathElement.pevalue.bezierdata.y2 = m_delegate->getDoubleValue();
161 pathElement.pevalue.bezierdata.x2 = m_delegate->getDoubleValue();
162 pathElement.pevalue.bezierdata.y1 = m_delegate->getDoubleValue();
163 pathElement.pevalue.bezierdata.x1 = m_delegate->getDoubleValue();
164 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
165 return true;
166 break;
167 case AIO_CurveToOmitC1Corner :
168 pathElement.petype = PET_CurveTo;
169 pathElement.pttype = PT_Corner;
170 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
171 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
172 pathElement.pevalue.bezierdata.y2 = m_delegate->getDoubleValue();
173 pathElement.pevalue.bezierdata.x2 = m_delegate->getDoubleValue();
174 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
175 return true;
176 break;
177 case AIO_CurveToOmitC1Smooth :
178 pathElement.petype = PET_CurveTo;
179 pathElement.pttype = PT_Smooth;
180 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
181 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
182 pathElement.pevalue.bezierdata.y2 = m_delegate->getDoubleValue();
183 pathElement.pevalue.bezierdata.x2 = m_delegate->getDoubleValue();
184 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
185 return true;
186 break;
187 case AIO_CurveToOmitC2Corner :
188 pathElement.petype = PET_CurveTo;
189 pathElement.pttype = PT_Corner;
190 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
191 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
192 pathElement.pevalue.bezierdata.y1 = m_delegate->getDoubleValue();
193 pathElement.pevalue.bezierdata.x1 = m_delegate->getDoubleValue();
194 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
195 return true;
196 break;
197 case AIO_CurveToOmitC2Smooth :
198 pathElement.petype = PET_CurveTo;
199 pathElement.pttype = PT_Smooth;
200 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
201 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
202 pathElement.pevalue.bezierdata.y1 = m_delegate->getDoubleValue();
203 pathElement.pevalue.bezierdata.x1 = m_delegate->getDoubleValue();
204 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
205 return true;
206 break;
207
208 case AIO_PathIgnoreReset :
209 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotIgnorePath(false, true);
210 return true;
211 break;
212 case AIO_PathIgnoreResetClose :
213 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotIgnorePath(true, true);
214 return true;
215 break;
216 case AIO_PathIgnoreNoReset :
217 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotIgnorePath(false, false);
218 return true;
219 break;
220 case AIO_PathIgnoreNoResetClose :
221 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotIgnorePath(true, false);
222 return true;
223 break;
224 case AIO_PathClipPath :
225 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotClipPath(false);
226 return true;
227 break;
228 case AIO_PathFillNonZero :
229 if (m_delegate->m_pathHandler)
230 {
231 m_delegate->m_pathHandler->gotFillMode (FM_NonZero);
232 m_delegate->m_pathHandler->gotFillPath(false, true);
233 }
234 return true;
235 break;
236 case AIO_PathFillNonZeroClose :
237 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotFillPath(true, true);
238 return true;
239 break;
240 case AIO_PathFillNoReset :
241 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotFillPath(false, false);
242 return true;
243 break;
244 case AIO_PathFillNoResetClose :
245 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotFillPath(true, false);
246 return true;
247 break;
248 case AIO_PathStroke :
249 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotStrokePath(false);
250 return true;
251 break;
252 case AIO_PathStrokeClose :
253 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotStrokePath(true);
254 return true;
255 break;
256 case AIO_PatternDefinition :
257 _handlePatternDefinition();
258 return true;
259 break;
260 case AIO_GsaveIncludeDocument :
261 _handleGsaveIncludeDocument();
262 return true;
263 break;
264 case AIO_Grestore :
265 if (m_delegate->m_embeddedHandler) m_delegate->m_embeddedHandler->gotGrestore();
266 return true;
267 break;
268 case AIO_FontEncoding :
269 _handleFontEncoding();
270 return true;
271 break;
272 case AIO_SetCurrentText :
273 _handleSetCurrentText();
274 return true;
275 break;
276 case AIO_TextBlockFillStroke :
277 _handleTextBlock (TO_FillStroke);
278 return true;
279 break;
280 case AIO_TextBlockFill :
281 _handleTextBlock (TO_Fill);
282 return true;
283 break;
284 case AIO_TextBlockAppend :
285 _handleTextBlock (TO_Append);
286 return true;
287 break;
288 case AIO_TextBlockIgnore :
289 _handleTextBlock (TO_Ignore);
290 return true;
291 break;
292 case AIO_TextBlockStroke :
293 _handleTextBlock (TO_Stroke);
294 return true;
295 break;
296 case AIO_TextOutput :
297 _handleTextOutput ();
298 return true;
299 break;
300 case AIO_TextBlockEnd :
301 if (m_delegate->m_textHandler) m_delegate->m_textHandler->gotTextBlockEnd();
302 return true;
303 break;
304 default :
305 return false;
306 }
307 return false;
308}
309
310
311void AI88Handler::_handleSetFillColorCMYK()
312{
313 double k = m_delegate->getDoubleValue();
314 double y = m_delegate->getDoubleValue();
315 double m = m_delegate->getDoubleValue();
316 double c = m_delegate->getDoubleValue();
317
318 if (m_delegate->m_debug) tqDebug ("values 1 are %f %f %f %f",c,m,y,k);
319 AIColor color (c,m,y,k);
320
321 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotFillColor (color);
322}
323
324void AI88Handler::_handleSetFillPattern()
325{
326 AIElement elem (m_delegate->m_stack.top());
327 m_delegate->m_stack.pop();
328
329 const TQValueVector<AIElement> aval = elem.toElementArray();
330
331 double ka = m_delegate->getDoubleValue();
332 double k = m_delegate->getDoubleValue();
333 double r = m_delegate->getDoubleValue();
334 double rf = m_delegate->getDoubleValue();
335 double angle = m_delegate->getDoubleValue();
336 double sy = m_delegate->getDoubleValue();
337 double sx = m_delegate->getDoubleValue();
338 double py = m_delegate->getDoubleValue();
339 double px = m_delegate->getDoubleValue();
340
341 AIElement elem2 (m_delegate->m_stack.top());
342 m_delegate->m_stack.pop();
343
344 const TQString &name = elem2.toString();
345 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotFillPattern (name.latin1(), px, py, sx, sy, angle, rf, r, k, ka, aval);
346}
347
348void AI88Handler::_handleSetStrokePattern()
349{
350 AIElement elem (m_delegate->m_stack.top());
351 m_delegate->m_stack.pop();
352
353 const TQValueVector<AIElement> aval = elem.toElementArray();
354
355 double ka = m_delegate->getDoubleValue();
356 double k = m_delegate->getDoubleValue();
357 double r = m_delegate->getDoubleValue();
358 double rf = m_delegate->getDoubleValue();
359 double angle = m_delegate->getDoubleValue();
360 double sy = m_delegate->getDoubleValue();
361 double sx = m_delegate->getDoubleValue();
362 double py = m_delegate->getDoubleValue();
363 double px = m_delegate->getDoubleValue();
364
365 AIElement elem2 (m_delegate->m_stack.top());
366 m_delegate->m_stack.pop();
367
368 const TQString &name = elem2.toString();
369 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotStrokePattern (name.latin1(), px, py, sx, sy, angle, rf, r, k, ka, aval);
370}
371
372
373void AI88Handler::_handleSetStrokeColorCMYK()
374{
375 double k = m_delegate->getDoubleValue();
376 double y = m_delegate->getDoubleValue();
377 double m = m_delegate->getDoubleValue();
378 double c = m_delegate->getDoubleValue();
379 if (m_delegate->m_debug) tqDebug ("values 2 are %f %f %f %f",c,m,y,k);
380
381 AIColor color (c,m,y,k);
382
383 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotStrokeColor (color);
384}
385
386void AI88Handler::_handleSetFillColorGray()
387{
388 double g = m_delegate->getDoubleValue();
389 if (m_delegate->m_debug) tqDebug ("values 3 are %f",g);
390
391 AIColor color (g);
392
393 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotFillColor (color);
394}
395
396void AI88Handler::_handleSetStrokeColorGray()
397{
398 double g = m_delegate->getDoubleValue();
399 if (m_delegate->m_debug) tqDebug ("values 4 are %f",g);
400
401 AIColor color (g);
402
403 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotStrokeColor (color);
404}
405
406void AI88Handler::_handleSetFillColorCustom()
407{
408 double g = m_delegate->getDoubleValue();
409 const TQString name = m_delegate->getStringValue();
410 double k = m_delegate->getDoubleValue();
411 double y = m_delegate->getDoubleValue();
412 double m = m_delegate->getDoubleValue();
413 double c = m_delegate->getDoubleValue();
414 if (m_delegate->m_debug) tqDebug ("values 5 are %f %f %f %f",c,m,y,k);
415
416 AIColor color (c,m,y,k,name.latin1(),g);
417
418 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotFillColor (color);
419}
420
421void AI88Handler::_handleSetDash()
422{
423// tqDebug ("found dash operation");
424 double fval = m_delegate->getDoubleValue();
425
426 AIElement elem (m_delegate->m_stack.top());
427 m_delegate->m_stack.pop();
428
429 const TQValueVector<AIElement> aval = elem.toElementArray();
430 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotDash (aval, fval);
431// tqDebug ("dash operation finished");
432}
433
434void AI88Handler::_handlePatternDefinition()
435{
436 AIElement elem (m_delegate->m_stack.top());
437 m_delegate->m_stack.pop();
438
439 const TQValueVector<AIElement> aval = elem.toElementArray();
440
441 double ury = m_delegate->getDoubleValue();
442 double urx = m_delegate->getDoubleValue();
443 double lly = m_delegate->getDoubleValue();
444 double llx = m_delegate->getDoubleValue();
445
446 AIElement elem2 (m_delegate->m_stack.top());
447 m_delegate->m_stack.pop();
448
449 const TQString &name = elem2.toString();
450
451 if (m_delegate->m_documentHandler) m_delegate->m_documentHandler->gotPatternDefinition (name.latin1(), aval, llx, lly, urx, ury);
452}
453
454void AI88Handler::_handleGsaveIncludeDocument() {
455 AIElement elem2 (m_delegate->m_stack.top());
456 m_delegate->m_stack.pop();
457
458 const TQString &name = elem2.toString();
459
460 int ury = m_delegate->getIntValue();
461 int urx = m_delegate->getIntValue();
462 int lly = m_delegate->getIntValue();
463 int llx = m_delegate->getIntValue();
464
465 AIElement elem (m_delegate->m_stack.top());
466 m_delegate->m_stack.pop();
467
468 const TQValueVector<AIElement> aval = elem.toElementArray();
469
470 if (m_delegate->m_embeddedHandler) m_delegate->m_embeddedHandler->gotGsaveIncludeDocument (aval, llx,lly,urx,ury,name.latin1());
471}
472
473void AI88Handler::_handleSetCurrentText() {
474 int iAlign = m_delegate->getIntValue();
475 TextAlign ta = TA_HLeft;
476
477 switch (iAlign)
478 {
479 case 0 : ta = TA_HLeft; break;
480 case 1 : ta = TA_HCenter; break;
481 case 2 : ta = TA_HRight; break;
482 case 3: ta = TA_VTop; break;
483 case 4 : ta = TA_VCenter; break;
484 case 5 : ta = TA_VBottom; break;
485 }
486
487 double kerning = m_delegate->getDoubleValue();
488 double leading = m_delegate->getDoubleValue();
489 double size = m_delegate->getDoubleValue();
490
491 AIElement elem2 (m_delegate->m_stack.top());
492 m_delegate->m_stack.pop();
493
494 const TQString &fontname = elem2.toReference();
495
496 if (m_delegate->m_textHandler) m_delegate->m_textHandler->gotFontDefinition (fontname.latin1(), size, leading, kerning, ta);
497
498}
499
500void AI88Handler::_handleTextBlock (TextOperation to) {
501 AIElement elem (m_delegate->m_stack.top());
502 tqDebug ("to element is (%s)",elem.typeName());
503 m_delegate->m_stack.pop();
504
505 const TQValueVector<AIElement> aval = elem.toElementArray();
506
507 if (m_delegate->m_textHandler) m_delegate->m_textHandler->gotTextBlockBegin (aval, to);
508}
509
510void AI88Handler::_handleTextOutput () {
511 AIElement elem (m_delegate->m_stack.top());
512 m_delegate->m_stack.pop();
513
514 const TQString &text = elem.toString();
515
516 int length = -1;
517
518 if (m_delegate->m_stack.empty())
519 {
520 AIElement elem2 (m_delegate->m_stack.top());
521 if (elem2.type() == AIElement::Int)
522 {
523 length = elem2.asInt();
524 m_delegate->m_stack.pop();
525 }
526 }
527 if (m_delegate->m_textHandler) m_delegate->m_textHandler->gotTextOutput (text.latin1(), length);
528}
529
530void AI88Handler::_handleFontEncoding()
531{
532 while (m_delegate->m_stack.top().type() != AIElement::Reference) {
533 m_delegate->m_stack.pop();
534 }
535
536 AIElement elem (m_delegate->m_stack.top());
537 m_delegate->m_stack.pop();
538 const TQString &oldFont = elem.toReference();
539
540 AIElement elem2 (m_delegate->m_stack.top());
541 m_delegate->m_stack.pop();
542 const TQString &newFont = elem2.toReference();
543
544 AIElement elem3 (m_delegate->m_stack.top());
545 m_delegate->m_stack.pop();
546 const TQValueVector<AIElement> encodingData = elem3.toElementArray();
547
548 if (m_delegate->m_textHandler) m_delegate->m_textHandler->gotFontEncoding (encodingData, oldFont.latin1(), newFont.latin1());
549}
550
551void AI88Handler::_handleSetStrokeColorCustom()
552{
553 double g = m_delegate->getDoubleValue();
554 const TQString name = m_delegate->getStringValue();
555 double k = m_delegate->getDoubleValue();
556 double y = m_delegate->getDoubleValue();
557 double m = m_delegate->getDoubleValue();
558 double c = m_delegate->getDoubleValue();
559 if (m_delegate->m_debug) tqDebug ("values 6 are %f %f %f %f",c,m,y,k);
560
561 AIColor color (c,m,y,k,name.latin1(),g);
562
563 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotStrokeColor (color);
564}