From b484a095c83179674407614b09de6354962e46da Mon Sep 17 00:00:00 2001
From: Ivan Ilin <ilin@scand.com>
Date: Tue, 8 Nov 2011 15:40:49 +0200
Subject: [PATCH] viewbox dimentions created for svg and images

---
 src/adaptors/UBCFFSubsetAdaptor.cpp | 83 +++++++++++++++++++++++++----
 src/adaptors/UBCFFSubsetAdaptor.h   |  5 ++
 2 files changed, 78 insertions(+), 10 deletions(-)

diff --git a/src/adaptors/UBCFFSubsetAdaptor.cpp b/src/adaptors/UBCFFSubsetAdaptor.cpp
index 40a20ba1..2c1e6fb8 100644
--- a/src/adaptors/UBCFFSubsetAdaptor.cpp
+++ b/src/adaptors/UBCFFSubsetAdaptor.cpp
@@ -182,7 +182,7 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgRect(const QDomElement &elem
     int strokeWidth = !textStrokeWidth.isNull() ? textStrokeWidth.toInt() : 0;
 
     //init svg generator with temp file
-    QSvgGenerator *generator = createSvgGenerator(width + 10, height + 10);
+    QSvgGenerator *generator = createSvgGenerator(width, height);
 
     //init painter to paint to svg
     QPainter painter;
@@ -192,7 +192,7 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgRect(const QDomElement &elem
     //fill rect
     if (fillColor.isValid()) {
         painter.setBrush(QBrush(fillColor));
-        painter.fillRect(5, 5, width, height, fillColor);
+        painter.fillRect(0, 0, width, height, fillColor);
     }
     QPen pen;
     if (strokeColor.isValid()) {
@@ -201,7 +201,7 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgRect(const QDomElement &elem
     if (strokeWidth)
         pen.setWidth(strokeWidth);
     painter.setPen(pen);
-    painter.drawRect(5, 5, width, height);
+    painter.drawRect(0, 0, width, height);
 
     painter.end();
 
@@ -213,7 +213,7 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgRect(const QDomElement &elem
         transform = transformFromString(textTransform);
         hastransform = true;
     }
-    repositionSvgItem(svgItem, width + 10, height + 10, x1 - 5, y1 - 5, hastransform, transform);
+    repositionSvgItem(svgItem, width, height, x1, y1, hastransform, transform);
     delete generator;
 
     return true;
@@ -663,7 +663,7 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgTextarea(const QDomElement &
 
     //add resulting svg file to scene
     UBGraphicsSvgItem *svgItem = mCurrentScene->addSvg(QUrl::fromLocalFile(generator->fileName()));
-    repositionSvgItem(svgItem, width, height, x, y, hasTransform, transform);
+    repositionSvgItem(svgItem, width, height, x + 5, y + 5, hasTransform, transform);
     delete generator;
 
     return true;
@@ -700,7 +700,8 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgImage(const QDomElement &ele
        transform = transformFromString(textTransform);
        hastransform = true;
    }
-   repositionSvgItem(pixItem, width, height, x - 5, y - 5, hastransform, transform);
+   repositionSvgItem(pixItem, width, height, x, y, hastransform, transform);
+//   experimentalReposition(pixItem, width, height, x, y, hastransform, transform);
    hashSceneItem(element, pixItem);
 
    return true;
@@ -741,7 +742,7 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgFlash(const QDomElement &ele
         transform = transformFromString(textTransform);
         hastransform = true;
     }
-    repositionSvgItem(flashItem, width, height, x - 5, y - 5, true, transform);
+    repositionSvgItem(flashItem, width, height, x, y, true, transform);
     hashSceneItem(element, flashItem);
 
     return true;
@@ -961,23 +962,80 @@ void UBCFFSubsetAdaptor::UBCFFSubsetReader::repositionSvgItem(QGraphicsItem *ite
     qreal hScale = itemBounds.width() / width * curTrans.m11();
     qreal vScale = itemBounds.height() / height * curTrans.m22();
     
+    qreal xScale = width  / itemBounds.width();
+    qreal yScale = height / itemBounds.height();
+
     if (useTransform)
     {
         QPointF oldVector((x - transform.dx()), (y - transform.dy()));
         QTransform rTransform(transform.m11(), transform.m12(), transform.m21(), transform.m22(), 0, 0);
         QPointF newVector = rTransform.map(oldVector);
         rTransform.scale(curTrans.m11(), curTrans.m22());
-        item->setTransform(QTransform(rTransform.m11(), rTransform.m12(), rTransform.m21(), rTransform.m22(), 0, 0));
-        item->setPos((x - mViewBoxCenter.x() + (newVector - oldVector).x()) * hScale, (y - mViewBoxCenter.y() + (newVector - oldVector).y()) * vScale );
+        item->setTransform(QTransform(rTransform.m11() * mVBTransFactor,
+                                      rTransform.m12() * mVBTransFactor,
+                                      rTransform.m21(), rTransform.m22(), 0, 0));
+        item->setPos((x - mViewBoxCenter.x() + (newVector - oldVector).x()) * xScale * mVBTransFactor,
+                     (y - mViewBoxCenter.y() + (newVector - oldVector).y()) * yScale * mVBTransFactor);
     }
     else
     {
-        item->setPos((x - mViewBoxCenter.x()) * hScale, (y  - mViewBoxCenter.y()) * vScale);
+        qreal fullScaleX = mVBTransFactor * xScale;
+        qreal fullScaleY = mVBTransFactor * yScale;
+        item->setTransform(QTransform(fullScaleX, 0, 0, fullScaleY, 0, 0));
+        itemBounds = item->boundingRect();
+        item->setPos((int)((x - mViewBoxCenter.x()) * mVBTransFactor),
+                     (int)((y - mViewBoxCenter.y()) * mVBTransFactor));
+        QPointF newPos = item->pos();
+        qDebug();
     }
 
     QTransform newTrans = item->transform();
 //    qWarning() << QString("Item new transform = %3 0 0 %4 %1 %2, position %5, %6").arg(newTrans.dx()).arg(newTrans.dy()).arg(newTrans.m11()).arg(newTrans.m22()).arg(item->x()).arg(item->y());
 
+}
+void UBCFFSubsetAdaptor::UBCFFSubsetReader::experimentalReposition(QGraphicsItem *item, qreal width, qreal height,
+                                                                   qreal x, qreal y,
+                                                                   bool useTransform, QTransform &transform)
+{
+    Q_UNUSED(useTransform)
+    Q_UNUSED(transform)
+
+    QRectF itemBounds = item->boundingRect();
+
+    qreal xScale = width  / itemBounds.width();
+    qreal yScale = height / itemBounds.height();
+
+    qreal newX = (x - mViewBox.center().x()) * xScale * mVBTransFactor;
+    qreal newY = (y - mViewBox.center().y()) * yScale * mVBTransFactor;
+
+//    qDebug() << item->transform();
+//    QTransform transform1(1, 0, 0, 1, mCurrentSceneRect.center().x(), mCurrentSceneRect.center().y());
+//    QPointF newPos = QTransform(xScale * mVBTransFactor, 0, 0, yScale * mVBTransFactor,
+//                                mCurrentSceneRect.center().x(), mCurrentSceneRect.center().y()).map(QPointF(x, y));
+
+    QPointF newPos(newX, newY);
+
+    item->setTransform(QTransform(xScale * mVBTransFactor, 0, 0, yScale * mVBTransFactor, 0, 0));
+    item->setPos(newPos);
+
+    item->setPos(newPos);
+
+    qDebug();
+
+
+
+    //    QTransform transform;
+
+//    QTransform newTransform(mVBTransFactor, 0, 0,
+//                            mVBTransFactor, mViewPort.center().x(), mViewPort.center().y());
+//    QRectF newItemRect = newTransform.mapRect(itemRect);
+//    item->setPos(newItemRect.topLeft());
+//    item->setBou
+
+
+//    QTransform translateTransform(width * mVBTransFactor, 0, 0, height * mVBTransFactor,
+//                                  mViewPort.center().x(), mViewPort.center().y());
+//    item->setTransform(translateTransform);
 }
 
 //bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseText()
@@ -1146,6 +1204,8 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::createNewScene()
 {
     mCurrentScene = UBPersistenceManager::persistenceManager()->createDocumentSceneAt(mProxy, mProxy->pageCount());
     mCurrentSceneRect = mCurrentScene->normalizedSceneRect();
+    mVBTransFactor = qMin(mCurrentSceneRect.width()  / mViewPort.width(),
+                          mCurrentSceneRect.height() / mViewPort.height());
     return true;
 }
 
@@ -1228,8 +1288,11 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::getViewBoxDimenstions(const QString&
         if (capturesCount == 5 && regexp.capturedTexts().at(0).length() == viewBox.length())
         {
             mViewBox = QRectF(0, 0, regexp.capturedTexts().at(3).toDouble(), regexp.capturedTexts().at(4).toDouble());
+            mViewPort = mViewBox;
+            mViewPort.translate(- mViewPort.center());
             mViewBoxCenter.setX(mViewBox.width() / 2);
             mViewBoxCenter.setY(mViewBox.height() / 2);
+
             return true;
         }
     }
diff --git a/src/adaptors/UBCFFSubsetAdaptor.h b/src/adaptors/UBCFFSubsetAdaptor.h
index 106a0ec6..45ba431b 100644
--- a/src/adaptors/UBCFFSubsetAdaptor.h
+++ b/src/adaptors/UBCFFSubsetAdaptor.h
@@ -58,6 +58,8 @@ private:
         QRectF mCurrentSceneRect;
         QString mIndent;
         QRectF mViewBox;
+        QRectF mViewPort;
+        qreal mVBTransFactor;
         QPointF mViewBoxCenter;
         QSize mSize;
 
@@ -111,6 +113,9 @@ private:
         void repositionSvgItem(QGraphicsItem *item, qreal width, qreal height,
                                qreal x, qreal y,
                                bool useTransform, QTransform &transform);
+        void experimentalReposition(QGraphicsItem *item, qreal width, qreal height,
+                                    qreal x, qreal y,
+                                    bool useTransform, QTransform &transform);
         QColor colorFromString(const QString& clrString);
         QTransform transformFromString(const QString trString);
         bool getViewBoxDimenstions(const QString& viewBox);
-- 
2.18.1