diff --git a/src/adaptors/UBSvgSubsetAdaptor.cpp b/src/adaptors/UBSvgSubsetAdaptor.cpp index a653a098..2b65af19 100644 --- a/src/adaptors/UBSvgSubsetAdaptor.cpp +++ b/src/adaptors/UBSvgSubsetAdaptor.cpp @@ -1181,9 +1181,20 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(int pageIndex) // Get the items from the scene QList items = mScene->items(); + int strokes = 0; int polygons = 0; + foreach(QGraphicsItem *item, items) { + if (item->type() == UBGraphicsPolygonItem::Type) { + polygons++; + } else if (item->type() == UBGraphicsStrokesGroup::Type) { + strokes++; + } + } + qDebug() << "---Strokes count" << strokes << "Polygons count" << polygons; + qSort(items.begin(), items.end(), itemZIndexComp); UBGraphicsStroke *openStroke = 0; + int nextStroke = 0; bool groupHoldsInfo = false; @@ -1192,18 +1203,35 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(int pageIndex) QGraphicsItem *item = items.takeFirst(); // Is the item a strokes group? - UBGraphicsStrokesGroup* strokesGroupItem = qgraphicsitem_cast(item); if(strokesGroupItem && strokesGroupItem->isVisible()){ // Add the polygons - foreach(QGraphicsItem* item, strokesGroupItem->childItems()){ + //parsing number of polygons into one polygon + qDebug() << "parsing stroke number" << nextStroke++; + UBGraphicsPolygonItem *resultPoly = 0; + foreach(QGraphicsItem* item, strokesGroupItem->childItems()) { UBGraphicsPolygonItem* poly = qgraphicsitem_cast(item); - if(NULL != poly){ - polygonItemToSvgPolygon(poly, true); - items.removeOne(poly); + if (!poly) { + continue; + } else if (!resultPoly) { + resultPoly = poly; + continue; } + QPolygonF newPolygon = poly->sceneTransform().map(poly->polygon()); + QPainterPath strokePainterPath; + strokePainterPath.addPolygon(resultPoly->sceneTransform().map(resultPoly->polygon())); + QPolygonF oldPolygons = strokePainterPath.simplified().toFillPolygon(resultPoly->sceneTransform().inverted()); + newPolygon = oldPolygons.united(newPolygon); + resultPoly->setPolygon(newPolygon); + + // + items.removeOne(poly); + } + if (resultPoly) { + polygonItemToSvgPolygon(resultPoly, true); + items.removeOne(resultPoly); } } diff --git a/src/domain/UBGraphicsPolygonItem.cpp b/src/domain/UBGraphicsPolygonItem.cpp index 789daff3..b210786f 100644 --- a/src/domain/UBGraphicsPolygonItem.cpp +++ b/src/domain/UBGraphicsPolygonItem.cpp @@ -208,6 +208,8 @@ void UBGraphicsPolygonItem::paint ( QPainter * painter, const QStyleOptionGraphi if(mHasAlpha && scene() && scene()->isLightBackground()) painter->setCompositionMode(QPainter::CompositionMode_Darken); + painter->setRenderHints(QPainter::Antialiasing); + QGraphicsPolygonItem::paint(painter, option, widget); } diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index 522c35af..2e0f44c9 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -286,6 +286,7 @@ UBGraphicsScene::UBGraphicsScene(UBDocumentProxy* parent, bool enableUndoRedoSta , magniferDisplayViewWidget(0) , mZLayerController(new UBZLayerController(this)) , mpLastPolygon(NULL) + , mCurrentPolygon(0) { UBCoreGraphicsScene::setObjectName("BoardScene"); #ifdef __ppc__ @@ -597,6 +598,7 @@ bool UBGraphicsScene::inputDeviceRelease() delete mCurrentStroke; mCurrentStroke = 0; } + mCurrentPolygon = 0; } } @@ -707,7 +709,7 @@ void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth, if (mPreviousWidth == -1.0) mPreviousWidth = pWidth; -// UBGraphicsPolygonItem *polygonItem = lineToPolygonItem(QLineF(mPreviousPoint, pEndPoint), pWidth); + // UBGraphicsPolygonItem *polygonItem = lineToPolygonItem(QLineF(mPreviousPoint, pEndPoint), pWidth); UBGraphicsPolygonItem *polygonItem = lineToPolygonItem(QLineF(mPreviousPoint, pEndPoint), mPreviousWidth,pWidth); @@ -723,6 +725,7 @@ void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth, } } + if (bLineStyle) { QSetIterator itItems(mAddedItems); @@ -735,18 +738,45 @@ void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth, mAddedItems.clear(); } - mpLastPolygon = polygonItem; - mAddedItems.insert(polygonItem); - - // Here we add the item to the scene - addItem(polygonItem); - if (!mCurrentStroke) mCurrentStroke = new UBGraphicsStroke(); - polygonItem->setStroke(mCurrentStroke); - mPreviousPolygonItems.append(polygonItem); + QPolygonF newPolygon = UBGeometryUtils::lineToPolygon(QLineF(mPreviousPoint, pEndPoint), pWidth); + + if (!mCurrentPolygon) + { + mCurrentPolygon = new UBGraphicsPolygonItem(); + mCurrentPolygon->setPolygon(newPolygon); + initPolygonItem(mCurrentPolygon); + addItem(mCurrentPolygon); + mAddedItems.insert(mCurrentPolygon); + mCurrentPolygon->setStroke(mCurrentStroke); + mpLastPolygon = mCurrentPolygon; + } + + + //newPolygon = newPolygon.united(mCurrentPolygon->polygon()); + + QPainterPath strokePainterPath; + + + strokePainterPath.addPolygon(mCurrentPolygon->sceneTransform().map(mCurrentPolygon->polygon())); + + //QList + QPolygonF oldPolygons = strokePainterPath.simplified().toFillPolygon(mCurrentPolygon->sceneTransform().inverted()); + newPolygon = oldPolygons.united(newPolygon); + + /* foreach(QPolygonF polygon, oldPolygons) + { + newPolygon = polygon.united(newPolygon); + } + */ + + mpLastPolygon = mCurrentPolygon; + + mCurrentPolygon->setPolygon(newPolygon); + if (!bLineStyle) { diff --git a/src/domain/UBGraphicsScene.h b/src/domain/UBGraphicsScene.h index b97b136b..f0a38752 100644 --- a/src/domain/UBGraphicsScene.h +++ b/src/domain/UBGraphicsScene.h @@ -426,7 +426,7 @@ public slots: UBGraphicsPolygonItem* mpLastPolygon; bool mDrawWithCompass; - + UBGraphicsPolygonItem *mCurrentPolygon; };