Author: jghali
Date: Fri Feb  2 23:24:55 2018
New Revision: 22365

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22365
Log:
backport fix for #14840: Exporting embedded pdf file sometime produces 
incorrect result

Modified:
    branches/Version14x/Scribus/scribus/pdflib_core.cpp

Modified: branches/Version14x/Scribus/scribus/pdflib_core.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22365&path=/branches/Version14x/Scribus/scribus/pdflib_core.cpp
==============================================================================
--- branches/Version14x/Scribus/scribus/pdflib_core.cpp (original)
+++ branches/Version14x/Scribus/scribus/pdflib_core.cpp Fri Feb  2 23:24:55 2018
@@ -6607,32 +6607,33 @@
                        importedObjects[page->GetObject()->Reference()] = xObj;
                        StartObj(xObj);
                        PutDoc("<<\n/Type /XObject\n/Subtype /Form\n/FormType 
1");
-                       PoDoFo::PdfRect pagesize = page->GetPageSize();
+                       PoDoFo::PdfRect pageSize = page->GetPageSize();
                        int rotation = page->GetRotation();
+                       double imgWidth  = (rotation == 90 || rotation == 270) 
? pageSize.GetHeight() : pageSize.GetWidth();
+                       double imgHeight = (rotation == 90 || rotation == 270) 
? pageSize.GetWidth() : pageSize.GetHeight();
                        QMatrix pageM;
-                       pageM.scale(1.0/pagesize.GetWidth(), 
1.0/pagesize.GetHeight());
-                       pageM.rotate(-rotation);
-                       PutDoc("\n/BBox [" + 
QString::number(pagesize.GetLeft(), 'f'));
-                       PutDoc(" " + QString::number(pagesize.GetBottom(), 
'f'));
-                       PutDoc(" " + QString::number(pagesize.GetLeft() + 
pagesize.GetWidth(), 'f'));
-                       PutDoc(" " + QString::number(pagesize.GetBottom() + 
pagesize.GetHeight(), 'f'));
+                       pageM.translate(pageSize.GetLeft(), 
pageSize.GetBottom());
+                       pageM.rotate(rotation);
+                       if (rotation == 90)
+                               pageM.translate(0.0, -imgHeight);
+                       else if (rotation == 180)
+                               pageM.translate(-imgWidth, -imgHeight);
+                       else if (rotation == 270)
+                               pageM.translate(-imgWidth, 0.0);
+                       pageM.scale(imgWidth, imgHeight);
+                       pageM = pageM.inverted();
+                       PutDoc("\n/BBox [" + 
QString::number(pageSize.GetLeft(), 'f'));
+                       PutDoc(" " + QString::number(pageSize.GetBottom(), 
'f'));
+                       PutDoc(" " + QString::number(pageSize.GetLeft() + 
pageSize.GetWidth(), 'f'));
+                       PutDoc(" " + QString::number(pageSize.GetBottom() + 
pageSize.GetHeight(), 'f'));
                        PutDoc("]");
                        PutDoc("\n/Matrix [" + QString::number(pageM.m11(), 
'f') + " "
                                                                 + 
QString::number(pageM.m12(), 'f') + " "
                                                                 + 
QString::number(pageM.m21(), 'f') + " "
-                                                                + 
QString::number(pageM.m22(), 'f') + " ");
-                       if (rotation == 0)
-                               PutDoc("0 0");
-                       else if (rotation == 90)
-                               PutDoc("0 1");
-                       else if (rotation == 180)
-                               PutDoc("1 1");
-                       else if (rotation == 270)
-                               PutDoc("1 0");
-                       else
-                               PutDoc("0 0");
+                                                                + 
QString::number(pageM.m22(), 'f') + " "
+                                                                + 
QString::number(pageM.dx(), 'f')  + " "
+                                                                + 
QString::number(pageM.dy(), 'f')  + " ");
                        PutDoc("]");
-//                     PutDoc("\n/Matrix [" + 
QString::number(1.0/pagesize.GetWidth()) + " 0 0 " + 
QString::number(1.0/pagesize.GetHeight()) + " 0 0]");
                        PutDoc("\n/Resources " + QString::number(xResources) + 
" 0 R");
                        nextObj = page->GetObject()->GetIndirectKey("Group");
                        if (nextObj)
@@ -6705,14 +6706,14 @@
                        imgInfo.ResNum = ResCount;
                        ResCount++;
                        // Avoid a divide-by-zero if width/height are less than 
1 point:
-                       imgInfo.Width  = qMax(1, (int) pagesize.GetWidth());
-                       imgInfo.Height = qMax(1, (int) pagesize.GetHeight());
-                       imgInfo.xa  = sx * pagesize.GetWidth()/imgInfo.Width;
-                       imgInfo.ya  = sy * pagesize.GetHeight()/imgInfo.Height;
-                       // Width/Height are integers and may not exactly equal 
pagesize.GetWidth()/
-                       // pagesize.GetHeight(). Adjust scale factor to 
compensate for the difference.
-                       imgInfo.sxa = sx * pagesize.GetWidth()/imgInfo.Width;
-                       imgInfo.sya = sy * pagesize.GetHeight()/imgInfo.Height;
+                       imgInfo.Width  = qMax(1, (int) imgWidth);
+                       imgInfo.Height = qMax(1, (int) imgHeight);
+                       imgInfo.xa  = sx * imgWidth / imgInfo.Width;
+                       imgInfo.ya  = sy * imgHeight / imgInfo.Height;
+                       // Width/Height are integers and may not exactly equal 
pageSize.GetWidth()/
+                       // pageSize.GetHeight(). Adjust scale factor to 
compensate for the difference.
+                       imgInfo.sxa = sx * imgWidth / imgInfo.Width;
+                       imgInfo.sya = sy * imgHeight / imgInfo.Height;
                        
                        return true;
                }
@@ -6727,30 +6728,32 @@
                        importedObjects[page->GetObject()->Reference()] = xObj;
                        StartObj(xObj);
                        PutDoc("<<\n/Type /XObject\n/Subtype /Form\n/FormType 
1");
-                       PoDoFo::PdfRect pagesize = page->GetPageSize();
+                       PoDoFo::PdfRect pageSize = page->GetPageSize();
                        int rotation = page->GetRotation();
+                       double imgWidth  = (rotation == 90 || rotation == 270) 
? pageSize.GetHeight() : pageSize.GetWidth();
+                       double imgHeight = (rotation == 90 || rotation == 270) 
? pageSize.GetWidth() : pageSize.GetHeight();
                        QMatrix pageM;
-                       pageM.scale(1.0/pagesize.GetWidth(), 
1.0/pagesize.GetHeight());
-                       pageM.rotate(-rotation);
-                       PutDoc("\n/BBox [" + 
QString::number(pagesize.GetLeft(), 'f'));
-                       PutDoc(" " + QString::number(pagesize.GetBottom(), 
'f'));
-                       PutDoc(" " + QString::number(pagesize.GetLeft() + 
pagesize.GetWidth(), 'f'));
-                       PutDoc(" " + QString::number(pagesize.GetBottom() + 
pagesize.GetHeight(), 'f'));
+                       pageM.translate(pageSize.GetLeft(), 
pageSize.GetBottom());
+                       pageM.rotate(rotation);
+                       if (rotation == 90)
+                               pageM.translate(0.0, -imgHeight);
+                       else if (rotation == 180)
+                               pageM.translate(-imgWidth, -imgHeight);
+                       else if (rotation == 270)
+                               pageM.translate(-imgWidth, 0.0);
+                       pageM.scale(imgWidth, imgHeight);
+                       pageM = pageM.inverted();
+                       PutDoc("\n/BBox [" + 
QString::number(pageSize.GetLeft(), 'f'));
+                       PutDoc(" " + QString::number(pageSize.GetBottom(), 
'f'));
+                       PutDoc(" " + QString::number(pageSize.GetLeft() + 
pageSize.GetWidth(), 'f'));
+                       PutDoc(" " + QString::number(pageSize.GetBottom() + 
pageSize.GetHeight(), 'f'));
                        PutDoc("]");
                        PutDoc("\n/Matrix [" + QString::number(pageM.m11(), 
'f') + " "
                                                                 + 
QString::number(pageM.m12(), 'f') + " "
                                                                 + 
QString::number(pageM.m21(), 'f') + " "
-                                                                + 
QString::number(pageM.m22(), 'f') + " ");
-                       if (rotation == 0)
-                               PutDoc("0 0");
-                       else if (rotation == 90)
-                               PutDoc("0 1");
-                       else if (rotation == 180)
-                               PutDoc("1 1");
-                       else if (rotation == 270)
-                               PutDoc("1 0");
-                       else
-                               PutDoc("0 0");
+                                                                + 
QString::number(pageM.m22(), 'f') + " "
+                                                                + 
QString::number(pageM.dx(), 'f')  + " "
+                                                                + 
QString::number(pageM.dy(), 'f')  + " ");
                        PutDoc("]");
                        PutDoc("\n/Resources " + QString::number(xResources) + 
" 0 R");
                        nextObj = page->GetObject()->GetIndirectKey("Group");
@@ -6847,14 +6850,14 @@
                        imgInfo.ResNum = ResCount;
                        ResCount++;
                        // Avoid a divide-by-zero if width/height are less than 
1 point:
-                       imgInfo.Width  = qMax(1, (int) pagesize.GetWidth());
-                       imgInfo.Height = qMax(1, (int) pagesize.GetHeight());
-                       imgInfo.xa  = sx * pagesize.GetWidth()/imgInfo.Width;
-                       imgInfo.ya  = sy * pagesize.GetHeight()/imgInfo.Height;
-                       // Width/Height are integers and may not exactly equal 
pagesize.GetWidth()/
-                       // pagesize.GetHeight(). Adjust scale factor to 
compensate for the difference.
-                       imgInfo.sxa = sx * pagesize.GetWidth()/imgInfo.Width;
-                       imgInfo.sya = sy * pagesize.GetHeight()/imgInfo.Height;
+                       imgInfo.Width  = qMax(1, (int) imgWidth);
+                       imgInfo.Height = qMax(1, (int) imgHeight);
+                       imgInfo.xa  = sx * imgWidth / imgInfo.Width;
+                       imgInfo.ya  = sy * imgHeight / imgInfo.Height;
+                       // Width/Height are integers and may not exactly equal 
pageSize.GetWidth()/
+                       // pageSize.GetHeight(). Adjust scale factor to 
compensate for the difference.
+                       imgInfo.sxa = sx * imgWidth / imgInfo.Width;
+                       imgInfo.sya = sy * imgHeight / imgInfo.Height;
                        
                        return true;
                }


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to