20#include "karbonaiparserbase.h"
22#include <core/vcolor.h>
23#include <core/vlayer.h>
24#include <core/vgroup.h>
25#include <core/vclipgroup.h>
26#include <core/vvisitor.h>
29#include <commands/vtransformcmd.h>
31#include <KoPageLayout.h>
33const void pottoa (PathOutputType &data);
36KarbonAIParserBase::KarbonAIParserBase() : m_pot(POT_Other), m_ptt (PTT_Output), m_bbox(0,0,612,792), m_emptyFill(), m_emptyStroke()
54 m_curKarbonPath =
new VPath( 0L );
56 m_document =
new VDocument();
60 m_emptyFill.setType (VFill::none);
61 m_emptyStroke.setType (VStroke::none);
67KarbonAIParserBase::~KarbonAIParserBase(){
69 delete m_curKarbonPath;
75void KarbonAIParserBase::parsingStarted(){
80void KarbonAIParserBase::parsingFinished(){
86 kdDebug() <<
"bbox 1 is " << m_bbox << endl;
88 if (m_bbox.width() > 0. )
89 m_document->setWidth (m_bbox.width());
90 if (m_bbox.height() > 0. )
91 m_document->setHeight (m_bbox.height());
98 VTranslateCmd cmd (0L, -m_bbox.x(), -m_bbox.y());
99 m_document->accept (cmd);
104TQString KarbonAIParserBase::getParamList(Parameters& params){
109 if (params.count() > 0)
112 for ( param=params.first(); param != 0; param=params.next() ) {
113 data +=
" " + param->first +
"=\"" + param->second +
"\"";
121void KarbonAIParserBase::gotStartTag (
const char *tagName, Parameters& params){
122 tqDebug (
"<%s%s>", tagName, getParamList (params).latin1() );
126void KarbonAIParserBase::gotEndTag (
const char *tagName){
127 tqDebug (
"</%s>", tagName );
131void KarbonAIParserBase::gotSimpleTag (
const char *tagName, Parameters& params){
132 tqDebug (
"<%s%s/>", tagName, getParamList (params).latin1() );
136void KarbonAIParserBase::gotPathElement (PathElement &element){
137 switch (element.petype)
140 m_curKarbonPath->moveTo (KoPoint (element.pevalue.pointdata.x,element.pevalue.pointdata.y));
143 m_curKarbonPath->lineTo (KoPoint (element.pevalue.pointdata.x,element.pevalue.pointdata.y));
146 m_curKarbonPath->curveTo (KoPoint (element.pevalue.bezierdata.x1,element.pevalue.bezierdata.y1),
147 KoPoint (element.pevalue.bezierdata.x2,element.pevalue.bezierdata.y2),
148 KoPoint (element.pevalue.bezierdata.x3,element.pevalue.bezierdata.y3));
150 case PET_CurveToOmitC1 :
151 m_curKarbonPath->curve1To (KoPoint (element.pevalue.bezierdata.x2,element.pevalue.bezierdata.y2),
152 KoPoint (element.pevalue.bezierdata.x3,element.pevalue.bezierdata.y3));
154 case PET_CurveToOmitC2 :
155 m_curKarbonPath->curve2To (KoPoint (element.pevalue.bezierdata.x1,element.pevalue.bezierdata.y1),
156 KoPoint (element.pevalue.bezierdata.x3,element.pevalue.bezierdata.y3));
162void KarbonAIParserBase::gotFillPath (
bool closed,
bool reset, FillMode ){
166 if (closed) m_curKarbonPath->close();
172 doOutputCurrentPath2 (POT_Filled);
178void KarbonAIParserBase::gotIgnorePath (
bool closed,
bool reset){
181 if (closed) m_curKarbonPath->close();
187 doOutputCurrentPath2 (POT_Ignore);
193void KarbonAIParserBase::gotStrokePath (
bool closed) {
196 if (closed) m_curKarbonPath->close();
198 PathOutputType pot = POT_Stroked;
199 if (m_pot != POT_Other)
201 pot = POT_FilledStroked;
204 doOutputCurrentPath2 (pot);
210void KarbonAIParserBase::gotClipPath (
bool ){
212 doOutputCurrentPath2 (POT_Clip);
216void KarbonAIParserBase::gotFillColor (
AIColor &color){
222 VColor karbonColor = toKarbonColor (color);
223 m_fill.setColor (karbonColor);
227void KarbonAIParserBase::gotStrokeColor (
AIColor &color){
233 VColor karbonColor = toKarbonColor (color);
234 m_stroke.setColor (karbonColor);
238void KarbonAIParserBase::gotBoundingBox (
int llx,
int lly,
int urx,
int ury){
243 m_bbox.setCoords(llx,lly,urx,ury);
246void KarbonAIParserBase::gotLineWidth (
double val){
248 m_stroke.setLineWidth (val);
251void KarbonAIParserBase::gotFlatness (
double )
257void KarbonAIParserBase::gotLineCaps (
int val)
260 VStroke::VLineCap lineCap = VStroke::capButt;
264 case 0 : lineCap = VStroke::capButt;
break;
265 case 1 : lineCap = VStroke::capRound;
break;
266 case 2 : lineCap = VStroke::capSquare;
break;
269 m_stroke.setLineCap (lineCap);
272void KarbonAIParserBase::gotLineJoin (
int val)
276 VStroke::VLineJoin lineJoin = VStroke::joinMiter;
280 case 0 : lineJoin = VStroke::joinMiter;
break;
281 case 1 : lineJoin = VStroke::joinRound;
break;
282 case 2 : lineJoin = VStroke::joinBevel;
break;
285 m_stroke.setLineJoin (lineJoin);
289void KarbonAIParserBase::gotMiterLimit (
double val)
292 m_stroke.setMiterLimit (val);
295void KarbonAIParserBase::gotWindingOrder (
int val)
297 m_windingOrder = val;
300void KarbonAIParserBase::gotBeginGroup (
bool clipping)
305 VClipGroup *group =
new VClipGroup( 0L );
306 m_groupStack.push (group);
310 VGroup *group =
new VGroup( 0L );
311 m_groupStack.push (group);
318void KarbonAIParserBase::gotEndGroup (
bool )
322 if (m_debug) tqDebug (
"got end group");
324 if (m_groupStack.isEmpty())
return;
326 if (m_debug) tqDebug (
"got end group 2");
328 VGroup *group = m_groupStack.pop();
330 if (m_debug) tqDebug (
"got end group 3");
334 if (!group) tqDebug (
"group is NULL");
337 if (m_groupStack.isEmpty())
339 if (m_debug) tqDebug (
"insert object");
341 m_layer->append (group);
342 if (m_debug) tqDebug (
"/insert object");
346 if (m_debug) tqDebug (
"insert object to group");
348 m_groupStack.top()->append (group);
349 if (m_debug) tqDebug (
"/insert object to group");
352 if (m_debug) tqDebug (
"/got end group");
357void KarbonAIParserBase::gotBeginCombination () {
361void KarbonAIParserBase::gotEndCombination () {
366 if (m_combination != NULL)
368 m_curKarbonPath = m_combination;
369 doOutputCurrentPath2 (POT_Leave);
372 m_combination = NULL;
376const VColor KarbonAIParserBase::toKarbonColor (
const AIColor &color)
381 double v1, v2, v3, v4;
382 temp.toCMYK (v1, v2, v3, v4);
389 value.setColorSpace (VColor::cmyk);
390 value.set (cv1, cv2, cv3, cv4);
395void KarbonAIParserBase::doOutputCurrentPath2(PathOutputType type)
399 if (type != POT_Leave)
403 m_curKarbonPath->setStroke(m_emptyStroke);
404 m_curKarbonPath->setFill(m_emptyFill);
406 if ((type != POT_Filled) && (type != POT_Stroked) && (type != POT_FilledStroked))
return;
407 if ((type == POT_Filled) || (type == POT_FilledStroked))
413 m_curKarbonPath->setFill(m_fill);
416 if ((type == POT_Stroked) || (type == POT_FilledStroked))
422 m_curKarbonPath->setStroke (m_stroke);
426 if (m_ptt == PTT_Combine)
429 if (m_combination == NULL)
430 m_combination = m_curKarbonPath;
432 m_combination->combine (*m_curKarbonPath);
434 m_curKarbonPath =
new VPath( 0L );
441 if (m_groupStack.isEmpty())
443 m_layer->append( m_curKarbonPath );
447 m_groupStack.top()->append( m_curKarbonPath );
450 m_curKarbonPath =
new VPath( 0L );
453bool KarbonAIParserBase::parse (TQIODevice& fin, TQDomDocument &doc)
456 bool res = AIParserBase::parse (fin);
461 tqDebug (
"before save document");
462 doc = m_document->saveXML();
464 TQDomElement paper = doc.createElement(
"PAPER" );
465 doc.documentElement().appendChild( paper );
466 paper.setAttribute(
"format", PG_CUSTOM );
467 paper.setAttribute(
"width", m_document->width() );
468 paper.setAttribute(
"height", m_document->height() );
470 tqDebug (
"after save document");
474 TQDomDocument tempDoc;
481void KarbonAIParserBase::ensureLayer ()
485 m_layer =
new VLayer( 0 );
486 m_document->insertLayer (m_layer);
491void KarbonAIParserBase::setupHandlers()
494 m_gstateHandler =
new KarbonGStateHandler(
this);
495 m_structureHandler =
new KarbonStructureHandler(
this);
496 m_pathHandler =
new KarbonPathHandler(
this);
497 m_documentHandler =
new KarbonDocumentHandler(
this);
499 m_textHandler =
new TextHandlerBase();
503void KarbonAIParserBase::teardownHandlers()
506 delete m_textHandler;
508 delete m_gstateHandler;
509 delete m_structureHandler;
510 delete m_pathHandler;
511 delete m_documentHandler;
515void KarbonDocumentHandler::gotBoundingBox (
int llx,
int lly,
int urx,
int ury)
517 delegate->gotBoundingBox(llx,lly,urx,ury);
520void KarbonDocumentHandler::gotCreationDate (
const char *,
const char *)
525void KarbonDocumentHandler::gotProcessColors (
int )
534void KarbonGStateHandler::gotFillColor (
AIColor &color)
536 delegate->gotFillColor (color);
539void KarbonGStateHandler::gotStrokeColor (
AIColor &color)
541 delegate->gotStrokeColor(color);
544void KarbonGStateHandler::gotFlatness (
double val)
546 delegate->gotFlatness(val);
549void KarbonGStateHandler::gotLineWidth (
double val)
551 delegate->gotLineWidth(val);
554void KarbonGStateHandler::gotLineCaps (
int val)
556 delegate->gotLineCaps(val);
559void KarbonGStateHandler::gotLineJoin (
int val)
561 delegate->gotLineJoin(val);
564void KarbonGStateHandler::gotMiterLimit (
double val)
566 delegate->gotMiterLimit(val);
569void KarbonGStateHandler::gotWindingOrder (
int val)
571 delegate->gotWindingOrder(val);
574void KarbonStructureHandler::gotBeginGroup (
bool clipping)
576 delegate->gotBeginGroup(clipping);
579void KarbonStructureHandler::gotEndGroup (
bool clipping)
581 delegate->gotEndGroup(clipping);
584void KarbonStructureHandler::gotBeginCombination ()
586 delegate->gotBeginCombination();
589void KarbonStructureHandler::gotEndCombination ()
591 delegate->gotEndCombination();
594void KarbonPathHandler::gotPathElement (PathElement &element)
596 delegate->gotPathElement (element);
599void KarbonPathHandler::gotFillPath (
bool closed,
bool reset)
601 delegate->gotFillPath(closed, reset, m_fm);
604void KarbonPathHandler::gotFillMode (FillMode fm)
609void KarbonPathHandler::gotStrokePath (
bool closed)
611 delegate->gotStrokePath(closed);
614void KarbonPathHandler::gotIgnorePath (
bool closed,
bool reset)
616 delegate->gotIgnorePath(closed, reset);
619void KarbonPathHandler::gotClipPath (
bool closed)
621 delegate->gotClipPath(closed);
624const void pottoa (PathOutputType &data)
628 case POT_Filled : tqDebug (
"filled");
break;
629 case POT_Stroked : tqDebug (
"stroked");
break;
630 case POT_FilledStroked : tqDebug (
"filled/stroked");
break;
631 case POT_Clip : tqDebug (
"clip");
break;
632 case POT_Ignore : tqDebug (
"ignore");
break;
633 case POT_Leave : tqDebug (
"leave");
break;
634 default : tqDebug (
"unknown");