00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <kglobal.h>
00021 #include "ai88handler.h"
00022
00023 AI88Handler::AI88Handler(AIParserBase *delegate){
00024 m_delegate = delegate;
00025 }
00026 AI88Handler::~AI88Handler(){
00027 }
00028
00029 bool AI88Handler::handleAIOperation (AIOperation op) {
00030 PathElement pathElement;
00031 double fval;
00032 int ival;
00033
00034 switch (op) {
00035 case AIO_SetFillColorCMYK :
00036 _handleSetFillColorCMYK();
00037 return true;
00038 break;
00039 case AIO_SetStrokeColorCMYK :
00040 _handleSetStrokeColorCMYK();
00041 return true;
00042 break;
00043 case AIO_SetFillColorGray :
00044 _handleSetFillColorGray();
00045 return true;
00046 break;
00047 case AIO_SetStrokeColorGray :
00048 _handleSetStrokeColorGray();
00049 return true;
00050 break;
00051 case AIO_SetFillColorCustom :
00052 _handleSetFillColorCustom();
00053 return true;
00054 break;
00055 case AIO_SetStrokeColorCustom :
00056 _handleSetStrokeColorCustom();
00057 return true;
00058 break;
00059 case AIO_SetFillPattern :
00060 _handleSetFillPattern();
00061 return true;
00062 break;
00063 case AIO_SetStrokePattern :
00064 _handleSetStrokePattern();
00065 return true;
00066 break;
00067 case AIO_SetFillOverprinting :
00068 if (m_delegate->m_miscGStateHandler) m_delegate->m_miscGStateHandler->gotFillOverprinting (m_delegate->getBoolValue());
00069 return true;
00070 break;
00071 case AIO_SetStrokeOverprinting :
00072 if (m_delegate->m_miscGStateHandler) m_delegate->m_miscGStateHandler->gotStrokeOverprinting (m_delegate->getBoolValue());
00073 return true;
00074 break;
00075 case AIO_LockElement :
00076 if (m_delegate->m_miscGStateHandler) m_delegate->m_miscGStateHandler->gotLockNextObject (m_delegate->getBoolValue());
00077 return true;
00078 break;
00079 case AIO_SetFlatness :
00080 fval = m_delegate->getDoubleValue();
00081 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotFlatness (fval);
00082 return true;
00083 break;
00084 case AIO_SetLineCap :
00085 ival = m_delegate->getIntValue();
00086 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotLineCaps (ival);
00087 return true;
00088 break;
00089 case AIO_SetLineJoin :
00090 ival = m_delegate->getIntValue();
00091 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotLineJoin (ival);
00092 return true;
00093 break;
00094 case AIO_SetLineWidth :
00095 fval = kMax(0.2, m_delegate->getDoubleValue());
00096 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotLineWidth (fval);
00097 return true;
00098 break;
00099 case AIO_SetMiterLimit :
00100 fval = m_delegate->getDoubleValue();
00101 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotMiterLimit (fval);
00102 return true;
00103 break;
00104 case AIO_SetDash :
00105 _handleSetDash();
00106 return true;
00107 break;
00108 case AIO_BeginGroupClip :
00109 if (m_delegate->m_structureHandler) m_delegate->m_structureHandler->gotBeginGroup (true);
00110 return true;
00111 break;
00112 case AIO_EndGroupClip :
00113 if (m_delegate->m_debug) qDebug ("got end group clip");
00114 if (m_delegate->m_structureHandler) m_delegate->m_structureHandler->gotEndGroup (true);
00115 if (m_delegate->m_debug) qDebug ("/got end group clip");
00116 return true;
00117
00118 break;
00119 case AIO_MoveTo :
00120 pathElement.petype = PET_MoveTo;
00121 pathElement.pttype = PT_Corner;
00122 pathElement.pevalue.pointdata.y = m_delegate->getDoubleValue();
00123 pathElement.pevalue.pointdata.x = m_delegate->getDoubleValue();
00124 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
00125 return true;
00126 break;
00127 case AIO_LineToCorner :
00128 pathElement.petype = PET_LineTo;
00129 pathElement.pttype = PT_Corner;
00130 pathElement.pevalue.pointdata.y = m_delegate->getDoubleValue();
00131 pathElement.pevalue.pointdata.x = m_delegate->getDoubleValue();
00132 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
00133 return true;
00134 break;
00135 case AIO_LineToSmooth :
00136 pathElement.petype = PET_LineTo;
00137 pathElement.pttype = PT_Smooth;
00138 pathElement.pevalue.pointdata.y = m_delegate->getDoubleValue();
00139 pathElement.pevalue.pointdata.x = m_delegate->getDoubleValue();
00140 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
00141 return true;
00142 break;
00143 case AIO_CurveToCorner :
00144 pathElement.petype = PET_CurveTo;
00145 pathElement.pttype = PT_Corner;
00146 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
00147 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
00148 pathElement.pevalue.bezierdata.y2 = m_delegate->getDoubleValue();
00149 pathElement.pevalue.bezierdata.x2 = m_delegate->getDoubleValue();
00150 pathElement.pevalue.bezierdata.y1 = m_delegate->getDoubleValue();
00151 pathElement.pevalue.bezierdata.x1 = m_delegate->getDoubleValue();
00152 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
00153 return true;
00154 break;
00155 case AIO_CurveToSmooth :
00156 pathElement.petype = PET_CurveTo;
00157 pathElement.pttype = PT_Smooth;
00158 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
00159 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
00160 pathElement.pevalue.bezierdata.y2 = m_delegate->getDoubleValue();
00161 pathElement.pevalue.bezierdata.x2 = m_delegate->getDoubleValue();
00162 pathElement.pevalue.bezierdata.y1 = m_delegate->getDoubleValue();
00163 pathElement.pevalue.bezierdata.x1 = m_delegate->getDoubleValue();
00164 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
00165 return true;
00166 break;
00167 case AIO_CurveToOmitC1Corner :
00168 pathElement.petype = PET_CurveTo;
00169 pathElement.pttype = PT_Corner;
00170 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
00171 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
00172 pathElement.pevalue.bezierdata.y2 = m_delegate->getDoubleValue();
00173 pathElement.pevalue.bezierdata.x2 = m_delegate->getDoubleValue();
00174 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
00175 return true;
00176 break;
00177 case AIO_CurveToOmitC1Smooth :
00178 pathElement.petype = PET_CurveTo;
00179 pathElement.pttype = PT_Smooth;
00180 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
00181 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
00182 pathElement.pevalue.bezierdata.y2 = m_delegate->getDoubleValue();
00183 pathElement.pevalue.bezierdata.x2 = m_delegate->getDoubleValue();
00184 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
00185 return true;
00186 break;
00187 case AIO_CurveToOmitC2Corner :
00188 pathElement.petype = PET_CurveTo;
00189 pathElement.pttype = PT_Corner;
00190 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
00191 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
00192 pathElement.pevalue.bezierdata.y1 = m_delegate->getDoubleValue();
00193 pathElement.pevalue.bezierdata.x1 = m_delegate->getDoubleValue();
00194 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
00195 return true;
00196 break;
00197 case AIO_CurveToOmitC2Smooth :
00198 pathElement.petype = PET_CurveTo;
00199 pathElement.pttype = PT_Smooth;
00200 pathElement.pevalue.bezierdata.y3 = m_delegate->getDoubleValue();
00201 pathElement.pevalue.bezierdata.x3 = m_delegate->getDoubleValue();
00202 pathElement.pevalue.bezierdata.y1 = m_delegate->getDoubleValue();
00203 pathElement.pevalue.bezierdata.x1 = m_delegate->getDoubleValue();
00204 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotPathElement (pathElement);
00205 return true;
00206 break;
00207
00208 case AIO_PathIgnoreReset :
00209 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotIgnorePath(false, true);
00210 return true;
00211 break;
00212 case AIO_PathIgnoreResetClose :
00213 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotIgnorePath(true, true);
00214 return true;
00215 break;
00216 case AIO_PathIgnoreNoReset :
00217 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotIgnorePath(false, false);
00218 return true;
00219 break;
00220 case AIO_PathIgnoreNoResetClose :
00221 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotIgnorePath(true, false);
00222 return true;
00223 break;
00224 case AIO_PathClipPath :
00225 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotClipPath(false);
00226 return true;
00227 break;
00228 case AIO_PathFillNonZero :
00229 if (m_delegate->m_pathHandler)
00230 {
00231 m_delegate->m_pathHandler->gotFillMode (FM_NonZero);
00232 m_delegate->m_pathHandler->gotFillPath(false, true);
00233 }
00234 return true;
00235 break;
00236 case AIO_PathFillNonZeroClose :
00237 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotFillPath(true, true);
00238 return true;
00239 break;
00240 case AIO_PathFillNoReset :
00241 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotFillPath(false, false);
00242 return true;
00243 break;
00244 case AIO_PathFillNoResetClose :
00245 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotFillPath(true, false);
00246 return true;
00247 break;
00248 case AIO_PathStroke :
00249 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotStrokePath(false);
00250 return true;
00251 break;
00252 case AIO_PathStrokeClose :
00253 if (m_delegate->m_pathHandler) m_delegate->m_pathHandler->gotStrokePath(true);
00254 return true;
00255 break;
00256 case AIO_PatternDefinition :
00257 _handlePatternDefinition();
00258 return true;
00259 break;
00260 case AIO_GsaveIncludeDocument :
00261 _handleGsaveIncludeDocument();
00262 return true;
00263 break;
00264 case AIO_Grestore :
00265 if (m_delegate->m_embeddedHandler) m_delegate->m_embeddedHandler->gotGrestore();
00266 return true;
00267 break;
00268 case AIO_FontEncoding :
00269 _handleFontEncoding();
00270 return true;
00271 break;
00272 case AIO_SetCurrentText :
00273 _handleSetCurrentText();
00274 return true;
00275 break;
00276 case AIO_TextBlockFillStroke :
00277 _handleTextBlock (TO_FillStroke);
00278 return true;
00279 break;
00280 case AIO_TextBlockFill :
00281 _handleTextBlock (TO_Fill);
00282 return true;
00283 break;
00284 case AIO_TextBlockAppend :
00285 _handleTextBlock (TO_Append);
00286 return true;
00287 break;
00288 case AIO_TextBlockIgnore :
00289 _handleTextBlock (TO_Ignore);
00290 return true;
00291 break;
00292 case AIO_TextBlockStroke :
00293 _handleTextBlock (TO_Stroke);
00294 return true;
00295 break;
00296 case AIO_TextOutput :
00297 _handleTextOutput ();
00298 return true;
00299 break;
00300 case AIO_TextBlockEnd :
00301 if (m_delegate->m_textHandler) m_delegate->m_textHandler->gotTextBlockEnd();
00302 return true;
00303 break;
00304 default :
00305 return false;
00306 }
00307 return false;
00308 }
00309
00310
00311 void AI88Handler::_handleSetFillColorCMYK()
00312 {
00313 double k = m_delegate->getDoubleValue();
00314 double y = m_delegate->getDoubleValue();
00315 double m = m_delegate->getDoubleValue();
00316 double c = m_delegate->getDoubleValue();
00317
00318 if (m_delegate->m_debug) qDebug ("values 1 are %f %f %f %f",c,m,y,k);
00319 AIColor color (c,m,y,k);
00320
00321 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotFillColor (color);
00322 }
00323
00324 void AI88Handler::_handleSetFillPattern()
00325 {
00326 AIElement elem (m_delegate->m_stack.top());
00327 m_delegate->m_stack.pop();
00328
00329 const QValueVector<AIElement> aval = elem.toElementArray();
00330
00331 double ka = m_delegate->getDoubleValue();
00332 double k = m_delegate->getDoubleValue();
00333 double r = m_delegate->getDoubleValue();
00334 double rf = m_delegate->getDoubleValue();
00335 double angle = m_delegate->getDoubleValue();
00336 double sy = m_delegate->getDoubleValue();
00337 double sx = m_delegate->getDoubleValue();
00338 double py = m_delegate->getDoubleValue();
00339 double px = m_delegate->getDoubleValue();
00340
00341 AIElement elem2 (m_delegate->m_stack.top());
00342 m_delegate->m_stack.pop();
00343
00344 const QString &name = elem2.toString();
00345 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotFillPattern (name.latin1(), px, py, sx, sy, angle, rf, r, k, ka, aval);
00346 }
00347
00348 void AI88Handler::_handleSetStrokePattern()
00349 {
00350 AIElement elem (m_delegate->m_stack.top());
00351 m_delegate->m_stack.pop();
00352
00353 const QValueVector<AIElement> aval = elem.toElementArray();
00354
00355 double ka = m_delegate->getDoubleValue();
00356 double k = m_delegate->getDoubleValue();
00357 double r = m_delegate->getDoubleValue();
00358 double rf = m_delegate->getDoubleValue();
00359 double angle = m_delegate->getDoubleValue();
00360 double sy = m_delegate->getDoubleValue();
00361 double sx = m_delegate->getDoubleValue();
00362 double py = m_delegate->getDoubleValue();
00363 double px = m_delegate->getDoubleValue();
00364
00365 AIElement elem2 (m_delegate->m_stack.top());
00366 m_delegate->m_stack.pop();
00367
00368 const QString &name = elem2.toString();
00369 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotStrokePattern (name.latin1(), px, py, sx, sy, angle, rf, r, k, ka, aval);
00370 }
00371
00372
00373 void AI88Handler::_handleSetStrokeColorCMYK()
00374 {
00375 double k = m_delegate->getDoubleValue();
00376 double y = m_delegate->getDoubleValue();
00377 double m = m_delegate->getDoubleValue();
00378 double c = m_delegate->getDoubleValue();
00379 if (m_delegate->m_debug) qDebug ("values 2 are %f %f %f %f",c,m,y,k);
00380
00381 AIColor color (c,m,y,k);
00382
00383 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotStrokeColor (color);
00384 }
00385
00386 void AI88Handler::_handleSetFillColorGray()
00387 {
00388 double g = m_delegate->getDoubleValue();
00389 if (m_delegate->m_debug) qDebug ("values 3 are %f",g);
00390
00391 AIColor color (g);
00392
00393 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotFillColor (color);
00394 }
00395
00396 void AI88Handler::_handleSetStrokeColorGray()
00397 {
00398 double g = m_delegate->getDoubleValue();
00399 if (m_delegate->m_debug) qDebug ("values 4 are %f",g);
00400
00401 AIColor color (g);
00402
00403 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotStrokeColor (color);
00404 }
00405
00406 void AI88Handler::_handleSetFillColorCustom()
00407 {
00408 double g = m_delegate->getDoubleValue();
00409 const QString name = m_delegate->getStringValue();
00410 double k = m_delegate->getDoubleValue();
00411 double y = m_delegate->getDoubleValue();
00412 double m = m_delegate->getDoubleValue();
00413 double c = m_delegate->getDoubleValue();
00414 if (m_delegate->m_debug) qDebug ("values 5 are %f %f %f %f",c,m,y,k);
00415
00416 AIColor color (c,m,y,k,name.latin1(),g);
00417
00418 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotFillColor (color);
00419 }
00420
00421 void AI88Handler::_handleSetDash()
00422 {
00423
00424 double fval = m_delegate->getDoubleValue();
00425
00426 AIElement elem (m_delegate->m_stack.top());
00427 m_delegate->m_stack.pop();
00428
00429 const QValueVector<AIElement> aval = elem.toElementArray();
00430 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotDash (aval, fval);
00431
00432 }
00433
00434 void AI88Handler::_handlePatternDefinition()
00435 {
00436 AIElement elem (m_delegate->m_stack.top());
00437 m_delegate->m_stack.pop();
00438
00439 const QValueVector<AIElement> aval = elem.toElementArray();
00440
00441 double ury = m_delegate->getDoubleValue();
00442 double urx = m_delegate->getDoubleValue();
00443 double lly = m_delegate->getDoubleValue();
00444 double llx = m_delegate->getDoubleValue();
00445
00446 AIElement elem2 (m_delegate->m_stack.top());
00447 m_delegate->m_stack.pop();
00448
00449 const QString &name = elem2.toString();
00450
00451 if (m_delegate->m_documentHandler) m_delegate->m_documentHandler->gotPatternDefinition (name.latin1(), aval, llx, lly, urx, ury);
00452 }
00453
00454 void AI88Handler::_handleGsaveIncludeDocument() {
00455 AIElement elem2 (m_delegate->m_stack.top());
00456 m_delegate->m_stack.pop();
00457
00458 const QString &name = elem2.toString();
00459
00460 int ury = m_delegate->getIntValue();
00461 int urx = m_delegate->getIntValue();
00462 int lly = m_delegate->getIntValue();
00463 int llx = m_delegate->getIntValue();
00464
00465 AIElement elem (m_delegate->m_stack.top());
00466 m_delegate->m_stack.pop();
00467
00468 const QValueVector<AIElement> aval = elem.toElementArray();
00469
00470 if (m_delegate->m_embeddedHandler) m_delegate->m_embeddedHandler->gotGsaveIncludeDocument (aval, llx,lly,urx,ury,name.latin1());
00471 }
00472
00473 void AI88Handler::_handleSetCurrentText() {
00474 int iAlign = m_delegate->getIntValue();
00475 TextAlign ta = TA_HLeft;
00476
00477 switch (iAlign)
00478 {
00479 case 0 : ta = TA_HLeft; break;
00480 case 1 : ta = TA_HCenter; break;
00481 case 2 : ta = TA_HRight; break;
00482 case 3: ta = TA_VTop; break;
00483 case 4 : ta = TA_VCenter; break;
00484 case 5 : ta = TA_VBottom; break;
00485 }
00486
00487 double kerning = m_delegate->getDoubleValue();
00488 double leading = m_delegate->getDoubleValue();
00489 double size = m_delegate->getDoubleValue();
00490
00491 AIElement elem2 (m_delegate->m_stack.top());
00492 m_delegate->m_stack.pop();
00493
00494 const QString &fontname = elem2.toReference();
00495
00496 if (m_delegate->m_textHandler) m_delegate->m_textHandler->gotFontDefinition (fontname.latin1(), size, leading, kerning, ta);
00497
00498 }
00499
00500 void AI88Handler::_handleTextBlock (TextOperation to) {
00501 AIElement elem (m_delegate->m_stack.top());
00502 qDebug ("to element is (%s)",elem.typeName());
00503 m_delegate->m_stack.pop();
00504
00505 const QValueVector<AIElement> aval = elem.toElementArray();
00506
00507 if (m_delegate->m_textHandler) m_delegate->m_textHandler->gotTextBlockBegin (aval, to);
00508 }
00509
00510 void AI88Handler::_handleTextOutput () {
00511 AIElement elem (m_delegate->m_stack.top());
00512 m_delegate->m_stack.pop();
00513
00514 const QString &text = elem.toString();
00515
00516 int length = -1;
00517
00518 if (m_delegate->m_stack.empty())
00519 {
00520 AIElement elem2 (m_delegate->m_stack.top());
00521 if (elem2.type() == AIElement::Int)
00522 {
00523 length = elem2.asInt();
00524 m_delegate->m_stack.pop();
00525 }
00526 }
00527 if (m_delegate->m_textHandler) m_delegate->m_textHandler->gotTextOutput (text.latin1(), length);
00528 }
00529
00530 void AI88Handler::_handleFontEncoding()
00531 {
00532 while (m_delegate->m_stack.top().type() != AIElement::Reference) {
00533 m_delegate->m_stack.pop();
00534 }
00535
00536 AIElement elem (m_delegate->m_stack.top());
00537 m_delegate->m_stack.pop();
00538 const QString &oldFont = elem.toReference();
00539
00540 AIElement elem2 (m_delegate->m_stack.top());
00541 m_delegate->m_stack.pop();
00542 const QString &newFont = elem2.toReference();
00543
00544 AIElement elem3 (m_delegate->m_stack.top());
00545 m_delegate->m_stack.pop();
00546 const QValueVector<AIElement> encodingData = elem3.toElementArray();
00547
00548 if (m_delegate->m_textHandler) m_delegate->m_textHandler->gotFontEncoding (encodingData, oldFont.latin1(), newFont.latin1());
00549 }
00550
00551 void AI88Handler::_handleSetStrokeColorCustom()
00552 {
00553 double g = m_delegate->getDoubleValue();
00554 const QString name = m_delegate->getStringValue();
00555 double k = m_delegate->getDoubleValue();
00556 double y = m_delegate->getDoubleValue();
00557 double m = m_delegate->getDoubleValue();
00558 double c = m_delegate->getDoubleValue();
00559 if (m_delegate->m_debug) qDebug ("values 6 are %f %f %f %f",c,m,y,k);
00560
00561 AIColor color (c,m,y,k,name.latin1(),g);
00562
00563 if (m_delegate->m_gstateHandler) m_delegate->m_gstateHandler->gotStrokeColor (color);
00564 }