Author: jghali
Date: Sat Jul 13 21:05:38 2019
New Revision: 23072

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23072
Log:
#15736: Modifying character horizontal scale produces bad result on Malayalam 
text

Modified:
    trunk/Scribus/scribus/pdflib_core.cpp
    trunk/Scribus/scribus/plugins/export/svgexplugin/svgexplugin.cpp
    trunk/Scribus/scribus/plugins/export/xpsexport/xpsexplugin.cpp
    trunk/Scribus/scribus/pslib.cpp
    trunk/Scribus/scribus/scpageoutput.cpp
    trunk/Scribus/scribus/text/screenpainter.cpp

Modified: trunk/Scribus/scribus/pdflib_core.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23072&path=/trunk/Scribus/scribus/pdflib_core.cpp
==============================================================================
--- trunk/Scribus/scribus/pdflib_core.cpp       (original)
+++ trunk/Scribus/scribus/pdflib_core.cpp       Sat Jul 13 21:05:38 2019
@@ -154,7 +154,7 @@
                {
                        if (gl.glyph >= ScFace::CONTROL_GLYPHS)
                        {
-                               current_x += gl.xadvance;
+                               current_x += gl.xadvance * gl.scaleH;
                                continue;
                        }
 
@@ -175,10 +175,10 @@
 
                                m_pathBuffer += "q\n";
                                m_pathBuffer += transformToStr(transform) + " 
cm\n";
-                               m_pathBuffer += FToStr(fontSize()) + " 0 0 " + 
FToStr(fontSize()) + " " + FToStr(x() + gl.xoffset + current_x) + " " + 
FToStr((y() - fontSize() + gl.yoffset) * -1) + " cm\n";
+                               m_pathBuffer += FToStr(fontSize()) + " 0 0 " + 
FToStr(fontSize()) + " " + FToStr(x() + gl.xoffset + current_x) + " " + 
FToStr(-y() + fontSize() - gl.yoffset) + " cm\n";
 
                                if (gl.scaleV != 1.0)
-                                       m_pathBuffer += "1 0 0 1 0 " + 
FToStr(((fontSize() - fontSize() * gl.scaleV) / fontSize()) * -1) + " cm\n";
+                                       m_pathBuffer += "1 0 0 1 0 " + 
FToStr(gl.scaleV - 1.0) + " cm\n";
                                m_pathBuffer += FToStr(qMax(gl.scaleH, 0.1)) + 
" 0 0 " + FToStr(qMax(gl.scaleV, 0.1)) + " 0 0 cm\n";
 
                                if (!FillColor.isEmpty())
@@ -249,7 +249,7 @@
                                        }
                                }
                        }
-                       current_x += gl.xadvance;
+                       current_x += gl.xadvance * gl.scaleH;
                }
        }
 
@@ -263,7 +263,7 @@
                {
                        if (gl.glyph >= ScFace::CONTROL_GLYPHS)
                        {
-                               current_x += gl.xadvance;
+                               current_x += gl.xadvance * gl.scaleH;
                                continue;
                        }
 
@@ -279,30 +279,32 @@
 
                        if (pdfFont.method == Use_XForm)
                        {
+                               m_pathBuffer += "q\n";
                                if (!StrokeColor.isEmpty())
                                {
-                                       m_pathBuffer += FToStr(strokeWidth() / 
fontSize()) + " w\n[] 0 d\n0 J\n0 j\n";
+                                       m_pathBuffer += FToStr(strokeWidth()) + 
" w\n[] 0 d\n0 J\n0 j\n";
                                        m_pathBuffer += StrokeColor;
                                }
+                               m_pathBuffer += transformToStr(transform) + " 
cm\n";
 
                                if (!FillColor.isEmpty())
+                               {
+                                       m_pathBuffer += "q\n";
                                        m_pathBuffer += FillColor;
-
-                               m_pathBuffer += "q\n";
-                               m_pathBuffer += transformToStr(transform) + " 
cm\n";
-                               m_pathBuffer += FToStr(fontSize()) + " 0 0 " + 
FToStr(fontSize()) + " " + FToStr(x() + gl.xoffset) + " " + FToStr((y() - 
fontSize() + gl.yoffset) * -1) + " cm\n";
-
-                               if (gc.scaleV() != 1.0)
-                                       m_pathBuffer += "1 0 0 1 0 " + 
FToStr(((fontSize() - fontSize() * (gc.scaleV())) / fontSize()) * -1) + " cm\n";
-
-                               m_pathBuffer += FToStr(qMax(gc.scaleH(), 0.1)) 
+ " 0 0 " + FToStr(qMax(gc.scaleV(), 0.1)) + " 0 0 cm\n";
-
-                               if (!FillColor.isEmpty())
+                                       m_pathBuffer += FToStr(fontSize()) + " 
0 0 " + FToStr(fontSize()) + " " + FToStr(x() + gl.xoffset + current_x) + " " + 
FToStr(-y() + fontSize() - gl.yoffset) + " cm\n";
+                                       if (gc.scaleV() != 1.0)
+                                               m_pathBuffer += "1 0 0 1 0 " + 
FToStr(gl.scaleV - 1.0) + " cm\n";
+                                       m_pathBuffer += 
FToStr(qMax(gc.scaleH(), 0.1)) + " 0 0 " + FToStr(qMax(gc.scaleV(), 0.1)) + " 0 
0 cm\n";
                                        m_pathBuffer += pdfFont.name + "_gl" + 
Pdf::toPdf(gl.glyph) + " Do\n";
+                                       m_pathBuffer += "Q\n";
+                               }
+
+                               m_pathBuffer += "1.0 0 0 1.0 " + FToStr(x()) + 
" " + FToStr(fontSize() - y()) + " cm\n";
+                               m_pathBuffer += "1.0 0 0 1.0 " + 
FToStr(gl.xoffset + current_x) + " " + FToStr(gc.scaleV() * fontSize() - 
fontSize() - gl.yoffset) + " cm\n";
 
                                FPointArray outline = 
font().glyphOutline(gl.glyph);
                                QTransform mat;
-                               mat.scale(0.1, 0.1);
+                               mat.scale((fontSize() * gc.scaleH()) / 10.0, 
(fontSize() * gc.scaleV()) / 10.0);
                                outline.map(mat);
                                bool nPath = true;
                                FPoint np;
@@ -385,17 +387,14 @@
                                        m_pathBuffer += "q\n";
                                        m_pathBuffer += FToStr(strokeWidth()) + 
" w\n[] 0 d\n0 J\n0 j\n";
 
-                                       transform.scale(fontSize(), fontSize());
-                                       transform.translate(x() + gl.xoffset + 
current_x, y() + gl.yoffset);
-                                       if (gc.scaleV() != 1.0)
-                                               transform.translate(0, 
((fontSize() - fontSize() * gc.scaleV()) / fontSize()) * -1);
-                                       transform.scale(qMax(gc.scaleH(), 0.1), 
qMax(gc.scaleV(), 0.1));
                                        m_pathBuffer += 
transformToStr(transform) + " cm\n";
+                                       m_pathBuffer += "1.0 0 0 1.0 " + 
FToStr(x()) + " " + FToStr(fontSize() - y()) + " cm\n";
+                                       m_pathBuffer += "1.0 0 0 1.0 " + 
FToStr(gl.xoffset + current_x) + " " + FToStr(gc.scaleV() * fontSize() - 
fontSize() - gl.yoffset) + " cm\n";
 
                                        /* paint outline */
                                        FPointArray outline = 
font().glyphOutline(gl.glyph);
                                        QTransform mat;
-                                       mat.scale(0.1, 0.1);
+                                       mat.scale((fontSize() * gc.scaleH()) / 
10.0, (fontSize() * gc.scaleV()) / 10.0);
                                        outline.map(mat);
                                        bool nPath = true;
                                        FPoint np;
@@ -456,7 +455,7 @@
                                        }
                                }
                        }
-                       current_x += gl.xadvance;
+                       current_x += gl.xadvance * gl.scaleH;
                }
        }
 

Modified: trunk/Scribus/scribus/plugins/export/svgexplugin/svgexplugin.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23072&path=/trunk/Scribus/scribus/plugins/export/svgexplugin/svgexplugin.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/export/svgexplugin/svgexplugin.cpp    
(original)
+++ trunk/Scribus/scribus/plugins/export/svgexplugin/svgexplugin.cpp    Sat Jul 
13 21:05:38 2019
@@ -1163,7 +1163,7 @@
                {
                        if (gl.glyph >= ScFace::CONTROL_GLYPHS)
                        {
-                               current_x += gl.xadvance;
+                               current_x += gl.xadvance * gl.scaleH;
                                continue;
                        }
 
@@ -1178,7 +1178,7 @@
                        glyph.setAttribute("style", fill + stroke);
                        m_elem.appendChild(glyph);
 
-                       current_x += gl.xadvance;
+                       current_x += gl.xadvance * gl.scaleH;
                }
        }
 
@@ -1192,7 +1192,7 @@
                {
                        if (gl.glyph >= ScFace::CONTROL_GLYPHS)
                        {
-                               current_x += gl.xadvance;
+                               current_x += gl.xadvance * gl.scaleH;
                                continue;
                        }
 
@@ -1210,7 +1210,7 @@
                        glyph.setAttribute("style", fill + stroke);
                        m_elem.appendChild(glyph);
 
-                       current_x += gl.xadvance;
+                       current_x += gl.xadvance * gl.scaleH;
                }
        }
 

Modified: trunk/Scribus/scribus/plugins/export/xpsexport/xpsexplugin.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23072&path=/trunk/Scribus/scribus/plugins/export/xpsexport/xpsexplugin.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/export/xpsexport/xpsexplugin.cpp      
(original)
+++ trunk/Scribus/scribus/plugins/export/xpsexport/xpsexplugin.cpp      Sat Jul 
13 21:05:38 2019
@@ -803,6 +803,15 @@
        QMap<QString, QString> &m_fontMap;
        QDomElement &m_relRoot;
 
+       bool    m_restart { true };
+       double  m_current_x { 0.0 };
+       double  m_current_y { 0.0 };
+       double  m_fontSize { 0.0 };
+       QString m_fontUri;
+       TextLayoutColor m_fillColor;
+       QTransform  m_transform;
+       QDomElement m_glyphElem;
+
 public:
        XPSPainter(PageItem *item, QDomElement &group, XPSExPlug *xps, 
QMap<QString, QString> &XPSfontMap, QDomElement &rel_root):
 //             m_item(item),
@@ -820,37 +829,61 @@
                if (!m_fontMap.contains(font().replacementName()))
                        m_fontMap.insert(font().replacementName(), 
m_xps->embedFont(font(), m_relRoot));
                QTransform transform = matrix();
-               QDomElement glyph = m_xps->p_docu.createElement("Glyphs");
                double size = fontSize() * qMax(gc.scaleV(), gc.scaleH()) * 
m_xps->conversionFactor;
-               glyph.setAttribute("RenderTransform", 
m_xps->MatrixToStr(transform, m_xps->conversionFactor));
-               glyph.setAttribute("BidiLevel", "0");
-               glyph.setAttribute("StyleSimulations", "None");
-               glyph.setAttribute("FontRenderingEmSize", m_xps->FToStr(size));
-               glyph.setAttribute("FontUri", 
m_fontMap[font().replacementName()]);
-               glyph.setAttribute("Fill", 
m_xps->SetColor(fillColor().color,fillColor().shade, 0));
-               glyph.setAttribute("OriginX", m_xps->FToStr(x() * 
m_xps->conversionFactor));
-               glyph.setAttribute("OriginY", m_xps->FToStr(y() * 
m_xps->conversionFactor));
-               glyph.setAttribute("UnicodeString", gc.getText());
+               QString fontUri = m_fontMap[font().replacementName()];
+
+               if (m_restart || (size != m_fontSize) || (m_fillColor != 
fillColor()) || (m_fontUri != fontUri) ||
+                       (qAbs(m_current_x - x()) > 1e-6) || (m_current_y != 
y()) || (m_transform != transform))
+               {
+                       m_glyphElem = m_xps->p_docu.createElement("Glyphs");
+                       m_glyphElem.setAttribute("RenderTransform", 
m_xps->MatrixToStr(transform, m_xps->conversionFactor));
+                       m_glyphElem.setAttribute("BidiLevel", "0");
+                       m_glyphElem.setAttribute("StyleSimulations", "None");
+                       m_glyphElem.setAttribute("FontRenderingEmSize", 
m_xps->FToStr(size));
+                       m_glyphElem.setAttribute("FontUri", fontUri);
+                       m_glyphElem.setAttribute("Fill", 
m_xps->SetColor(fillColor().color,fillColor().shade, 0));
+                       m_glyphElem.setAttribute("OriginX", m_xps->FToStr(x() * 
m_xps->conversionFactor));
+                       m_glyphElem.setAttribute("OriginY", m_xps->FToStr(y() * 
m_xps->conversionFactor));
+                       m_glyphElem.setAttribute("UnicodeString", QString());
+                       m_group.appendChild(m_glyphElem);
+               }
+
+               QString unicodeString = m_glyphElem.attribute("UnicodeString");
+               unicodeString += gc.getText();
+               m_glyphElem.setAttribute("UnicodeString", unicodeString);
+
+               QString indices, allIndices = m_glyphElem.attribute("Indices");
                QString gcMap = 
QString("(%1:%2)").arg(gc.getText().size()).arg(gc.glyphs().size());
-               QString indices;
+
                double current_x = 0.0;
                for (const GlyphLayout& gl : gc.glyphs()) 
                {
                        if (gl.glyph >= ScFace::CONTROL_GLYPHS)
                        {
-                               current_x += gl.xadvance;
+                               current_x += gl.xadvance * gl.scaleH;
                                continue;
                        }
 
                        indices += QString("%1,%2,%3,%4;").arg(gl.glyph)
-                                       .arg(((gl.xadvance + current_x) * 
m_xps->conversionFactor) / size * 100)
+                                       .arg(((gl.xadvance  * gl.scaleH) * 
m_xps->conversionFactor) / size * 100)
                                        .arg((-gl.xoffset * 
m_xps->conversionFactor) / size * 100)
                                        .arg((-gl.yoffset * 
m_xps->conversionFactor) / size * 100);
-                       current_x += gl.xadvance;
+                       current_x += gl.xadvance * gl.scaleH;
                }
                indices.chop(1);
-               glyph.setAttribute("Indices", QString("%1%2").arg(gcMap, 
indices));
-               m_group.appendChild(glyph);
+               
+               if (!allIndices.isEmpty())
+                       allIndices += ";";
+               allIndices += QString("%1%2").arg(gcMap, indices);
+               m_glyphElem.setAttribute("Indices", allIndices);
+
+               m_restart = false;
+               m_current_x = x() + current_x;
+               m_current_y = y();
+               m_fontSize = size;
+               m_fontUri = fontUri;
+               m_fillColor = fillColor();
+               m_transform = transform;
        }
 
        void drawGlyphOutline(const GlyphCluster& gc, bool fill)
@@ -863,7 +896,7 @@
                {
                        if (gl.glyph >= ScFace::CONTROL_GLYPHS)
                        {
-                               current_x += gl.xadvance;
+                               current_x += gl.xadvance * gl.scaleH;
                                continue;
                        }
 
@@ -886,10 +919,12 @@
                                glyph.setAttribute("StrokeThickness", 
m_xps->FToStr(strokeWidth() * m_xps->conversionFactor));
                                glyph.setAttribute("Stroke", 
m_xps->SetColor(strokeColor().color, strokeColor().shade, 0));
                                m_group.appendChild(glyph);
-                               qDebug() << "StrokeWidth XPS" << strokeWidth();
-                       }
-                       current_x += gl.xadvance;
-               }
+                               //qDebug() << "StrokeWidth XPS" << 
strokeWidth();
+                       }
+                       current_x += gl.xadvance * gl.scaleH;
+               }
+
+               m_restart = true;
        }
 
        void drawLine(QPointF start, QPointF end)
@@ -901,6 +936,7 @@
                path.setAttribute("Stroke", 
m_xps->SetColor(strokeColor().color, strokeColor().shade, 0));
                path.setAttribute("StrokeThickness", 
m_xps->FToStr(strokeWidth() * m_xps->conversionFactor));
                m_group.appendChild(path);
+               m_restart = true;
        }
 
        void drawRect(QRectF rect)
@@ -922,6 +958,7 @@
                path.setAttribute("StrokeThickness", 
m_xps->FToStr(strokeWidth() * m_xps->conversionFactor));
                path.setAttribute("Stroke", 
m_xps->SetColor(strokeColor().color, strokeColor().shade, 0));
                m_group.appendChild(path);
+               m_restart = true;
        }
 
        void drawObject(PageItem* item)
@@ -936,6 +973,7 @@
                canvas.setAttribute("RenderTransform", 
m_xps->MatrixToStr(matrix));
                m_xps->writeItemOnPage(item->gXpos, item->gYpos, item, canvas, 
m_relRoot);
                m_group.appendChild(canvas);
+               m_restart = true;
        }
 };
 
@@ -1059,9 +1097,6 @@
 //     parentElem.appendChild(grp);
        if (Item->itemText.length() != 0)
        {
-               XPSPainter p(Item, grp, this, xps_fontMap, rel_root);
-               Item->textLayout.renderBackground(&p);
-               Item->textLayout.render(&p);
                QDomElement grp2 = p_docu.createElement("Canvas");
                if (grp.hasAttribute("RenderTransform"))
                        grp2.setAttribute("RenderTransform", 
grp.attribute("RenderTransform"));
@@ -1069,95 +1104,9 @@
                        grp2.setAttribute("Name", grp.attribute("Name"));
                if (grp.hasAttribute("Opacity"))
                        grp2.setAttribute("Opacity", grp.attribute("Opacity"));
-               bool first = true;
-               QString RenderTransform = "";
-               QString FontRenderingEmSize = "";
-               QString FontUri = "";
-               QString Fill = "";
-               QString OriginX = "";
-               QString OriginY = "";
-               QString Indices = "";
-               QString UnicodeString = "";
-               QDomElement glyph;
-               for (QDomElement txtGrp = grp.firstChildElement(); 
!txtGrp.isNull(); txtGrp = txtGrp.nextSiblingElement())
-               {
-                       if (txtGrp.tagName() != "Glyphs")
-                       {
-                               if (!first)
-                               {
-                                       glyph.setAttribute("Indices", Indices);
-                                       glyph.setAttribute("UnicodeString", 
UnicodeString);
-                                       first = true;
-                               }
-                               grp2.appendChild(txtGrp.cloneNode(true));
-                       }
-                       else
-                       {
-                               if (first)
-                               {
-                                       RenderTransform = 
txtGrp.attribute("RenderTransform");
-                                       FontRenderingEmSize = 
txtGrp.attribute("FontRenderingEmSize");
-                                       FontUri = txtGrp.attribute("FontUri");
-                                       Fill = txtGrp.attribute("Fill");
-                                       OriginX = txtGrp.attribute("OriginX");
-                                       OriginY = txtGrp.attribute("OriginY");
-                                       Indices = txtGrp.attribute("Indices");
-                                       UnicodeString = 
txtGrp.attribute("UnicodeString");
-                                       glyph = p_docu.createElement("Glyphs");
-                                       glyph.setAttribute("RenderTransform", 
RenderTransform);
-                                       glyph.setAttribute("BidiLevel", "0");
-                                       glyph.setAttribute("StyleSimulations", 
"None");
-                                       
glyph.setAttribute("FontRenderingEmSize", FontRenderingEmSize);
-                                       glyph.setAttribute("FontUri", FontUri);
-                                       glyph.setAttribute("Fill", Fill);
-                                       glyph.setAttribute("OriginX", OriginX);
-                                       glyph.setAttribute("OriginY", OriginY);
-                                       glyph.setAttribute("Indices", Indices);
-                                       glyph.setAttribute("UnicodeString", 
UnicodeString);
-                                       grp2.appendChild(glyph);
-                                       first = false;
-                               }
-                               else
-                               {
-                                       if ((RenderTransform == 
txtGrp.attribute("RenderTransform")) && (FontRenderingEmSize == 
txtGrp.attribute("FontRenderingEmSize")) && (FontUri == 
txtGrp.attribute("FontUri")) && (OriginY == txtGrp.attribute("OriginY")) && 
(Fill == txtGrp.attribute("Fill")))
-                                       {
-                                               Indices.append(";" + 
txtGrp.attribute("Indices"));
-                                               
UnicodeString.append(txtGrp.attribute("UnicodeString"));
-                                       }
-                                       else
-                                       {
-                                               glyph.setAttribute("Indices", 
Indices);
-                                               
glyph.setAttribute("UnicodeString", UnicodeString);
-                                               RenderTransform = 
txtGrp.attribute("RenderTransform");
-                                               FontRenderingEmSize = 
txtGrp.attribute("FontRenderingEmSize");
-                                               FontUri = 
txtGrp.attribute("FontUri");
-                                               Fill = txtGrp.attribute("Fill");
-                                               OriginX = 
txtGrp.attribute("OriginX");
-                                               OriginY = 
txtGrp.attribute("OriginY");
-                                               Indices = 
txtGrp.attribute("Indices");
-                                               UnicodeString = 
txtGrp.attribute("UnicodeString");
-                                               glyph = 
p_docu.createElement("Glyphs");
-                                               
glyph.setAttribute("RenderTransform", RenderTransform);
-                                               glyph.setAttribute("BidiLevel", 
"0");
-                                               
glyph.setAttribute("StyleSimulations", "None");
-                                               
glyph.setAttribute("FontRenderingEmSize", FontRenderingEmSize);
-                                               glyph.setAttribute("FontUri", 
FontUri);
-                                               glyph.setAttribute("Fill", 
Fill);
-                                               glyph.setAttribute("OriginX", 
OriginX);
-                                               glyph.setAttribute("OriginY", 
OriginY);
-                                               glyph.setAttribute("Indices", 
Indices);
-                                               
glyph.setAttribute("UnicodeString", UnicodeString);
-                                               grp2.appendChild(glyph);
-                                               first = false;
-                                       }
-                               }
-                               if (txtGrp == grp.lastChildElement())
-                               {
-                                       glyph.setAttribute("Indices", Indices);
-                                       glyph.setAttribute("UnicodeString", 
UnicodeString);
-                               }
-                       }
-               }
+               XPSPainter p(Item, grp2, this, xps_fontMap, rel_root);
+               Item->textLayout.renderBackground(&p);
+               Item->textLayout.render(&p);
                parentElem.appendChild(grp2);
        }
        if (Item->isTextFrame())

Modified: trunk/Scribus/scribus/pslib.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23072&path=/trunk/Scribus/scribus/pslib.cpp
==============================================================================
--- trunk/Scribus/scribus/pslib.cpp     (original)
+++ trunk/Scribus/scribus/pslib.cpp     Sat Jul 13 21:05:38 2019
@@ -115,7 +115,7 @@
        {
                if (gl.glyph >= ScFace::CONTROL_GLYPHS)
                {
-                       current_x += gl.xadvance;
+                       current_x += gl.xadvance * gl.scaleH;
                        continue;
                }
 
@@ -129,7 +129,7 @@
                m_ps->PS_showSub(gl.glyph, 
m_ps->FontSubsetMap[font().scName()], fontSize(), false);
                m_ps->PS_restore();
 
-               current_x += gl.xadvance;
+               current_x += gl.xadvance * gl.scaleH;
        }
        m_ps->PS_restore();
 }
@@ -156,7 +156,7 @@
        {
                if (gl.glyph >= ScFace::CONTROL_GLYPHS)
                {
-                       current_x += gl.xadvance;
+                       current_x += gl.xadvance * gl.scaleH;
                        continue;
                }
 
@@ -166,11 +166,17 @@
                chma.scale((fontSize() * gc.scaleH()) / 10.0, (fontSize() * 
gc.scaleV()) / 10.0);
                gly.map(chma);
                m_ps->PS_translate(gl.xoffset + current_x, -(fontSize() - 
fontSize() * gc.scaleV()) - gl.yoffset);
-               if (gc.scaleH() != 1.0 || gc.scaleV() != 1.0)
-                       m_ps->PS_scale(gc.scaleH(), gc.scaleV());
+
                if (fill)
+               {
+                       m_ps->PS_save();
+                       if (gc.scaleH() != 1.0 || gc.scaleV() != 1.0)
+                               m_ps->PS_scale(gc.scaleH(), gc.scaleV());
                        m_ps->putColorNoDraw(fillColor().color, 
fillColor().shade);
-               m_ps->PS_showSub(gl.glyph, 
m_ps->FontSubsetMap[font().scName()], fontSize(), false);
+                       m_ps->PS_showSub(gl.glyph, 
m_ps->FontSubsetMap[font().scName()], fontSize(), false);
+                       m_ps->PS_restore();
+               }
+
                m_ps->SetColor(strokeColor().color, strokeColor().shade, &h, 
&s, &v, &k);
                m_ps->PS_setcmykcolor_stroke(h, s, v, k);
                m_ps->SetClipPath(gly, true);
@@ -178,7 +184,7 @@
                m_ps->putColor(strokeColor().color, strokeColor().shade, false);
                m_ps->PS_restore();
 
-               current_x += gl.xadvance;
+               current_x += gl.xadvance * gl.scaleH;
        }
 
        m_ps->PS_restore();

Modified: trunk/Scribus/scribus/scpageoutput.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23072&path=/trunk/Scribus/scribus/scpageoutput.cpp
==============================================================================
--- trunk/Scribus/scribus/scpageoutput.cpp      (original)
+++ trunk/Scribus/scribus/scpageoutput.cpp      Sat Jul 13 21:05:38 2019
@@ -1002,7 +1002,7 @@
                        if (outline.size() > 3)
                                m_painter->fillPath();
                        m_painter->restore();
-                       m_painter->translate(gl.xadvance, 0.0);
+                       m_painter->translate(gl.xadvance * gl.scaleH, 0.0);
                }
 
                m_painter->setFillMode(fm);
@@ -1030,9 +1030,11 @@
                        m_painter->translate(gl.xoffset + current_x, 
-(fontSize() * gc.scaleV()) + gl.yoffset);
 
                        FPointArray outline = font().glyphOutline(gl.glyph);
-                       double scaleH = gc.scaleH() * fontSize() / 10.0;
-                       double scaleV = gc.scaleV() * fontSize() / 10.0;
-                       m_painter->scale(scaleH, scaleV);
+                       double scaleH = gl.scaleH * fontSize() / 10.0;
+                       double scaleV = gl.scaleV * fontSize() / 10.0;
+                       QTransform trans;
+                       trans.scale(scaleH, scaleV);
+                       outline.map(trans);
                        m_painter->setupPolygon(&outline, true);
                        if (outline.size() > 3)
                        {
@@ -1040,7 +1042,7 @@
                                m_painter->strokePath();
                        }
                        m_painter->restore();
-                       current_x += gl.xadvance;
+                       current_x += gl.xadvance * gl.scaleH;
                }
 
                m_painter->setFillRule(fr);

Modified: trunk/Scribus/scribus/text/screenpainter.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23072&path=/trunk/Scribus/scribus/text/screenpainter.cpp
==============================================================================
--- trunk/Scribus/scribus/text/screenpainter.cpp        (original)
+++ trunk/Scribus/scribus/text/screenpainter.cpp        Sat Jul 13 21:05:38 2019
@@ -82,8 +82,8 @@
                cairo_set_font_size(cr, fontSize());
 
                double current_x = 0.0;
+               cairo_scale(cr, gc.scaleH(), gc.scaleV());
                for (const GlyphLayout& gl : gc.glyphs()) {
-                       cairo_scale(cr, gl.scaleH, gl.scaleV);
                        cairo_glyph_t glyph = { gl.glyph, gl.xoffset + 
current_x, gl.yoffset };
                        cairo_show_glyphs(cr, &glyph, 1);
                        current_x += gl.xadvance;
@@ -227,7 +227,7 @@
                        if (outline.size() > 3)
                                m_painter->fillPath();
                        m_painter->restore();
-                       m_painter->translate(gl.xadvance, 0.0);
+                       m_painter->translate(gl.xadvance * gl.scaleH, 0.0);
                }
        }
        m_painter->setFillRule(fr);
@@ -239,6 +239,7 @@
 {
        if (fill)
                drawGlyph(gc);
+
        m_painter->save();
        bool fr = m_painter->fillRule();
        m_painter->setFillRule(false);
@@ -249,6 +250,7 @@
        {
                m_painter->save();
                m_painter->translate(gl.xoffset + current_x, - (fontSize() * 
gl.scaleV) + gl.yoffset );
+
                FPointArray outline = font().glyphOutline(gl.glyph);
                double scaleHv = gl.scaleH * fontSize() / 10.0;
                double scaleVv = gl.scaleV * fontSize() / 10.0;
@@ -262,12 +264,11 @@
                        m_painter->strokePath();
                }
                m_painter->restore();
-               current_x += gl.xadvance;
+               current_x += gl.xadvance * gl.scaleH;
        }
 
        m_painter->setFillRule(fr);
        m_painter->restore();
-
 }
 
 void ScreenPainter::drawLine(QPointF start, QPointF end)


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

Reply via email to