Author: jghali
Date: Wed Jul 12 22:50:49 2017
New Revision: 22107

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22107
Log:
fix several issues with text underlining or strikethrough used in combination 
with subscript, superscript or text vertical offset

Modified:
    trunk/Scribus/scribus/pslib.cpp
    trunk/Scribus/scribus/text/boxes.cpp

Modified: trunk/Scribus/scribus/pslib.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22107&path=/trunk/Scribus/scribus/pslib.cpp
==============================================================================
--- trunk/Scribus/scribus/pslib.cpp     (original)
+++ trunk/Scribus/scribus/pslib.cpp     Wed Jul 12 22:50:49 2017
@@ -111,13 +111,9 @@
        double current_x = 0.0;
        foreach (const GlyphLayout& gl, gc.glyphs()) {
                m_ps->PS_save();
-               if (gc.scaleH() != 1.0)
-                       m_ps->PS_scale(gc.scaleH(), 1);
-               if (gc.scaleV() != 1.0)
-               {
-                       m_ps->PS_scale(1, gc.scaleV());
-               }
-               m_ps->PS_translate(gl.xoffset + current_x, -(fontSize() - 
fontSize() * gc.scaleV()) - gl.yoffset);
+               m_ps->PS_translate(gl.xoffset + current_x, -(fontSize() - 
fontSize() * gl.scaleV) - gl.yoffset);
+               if (gl.scaleH != 1.0 || (gl.scaleV != 1.0))
+                       m_ps->PS_scale(gl.scaleH, gl.scaleV);
 
                if (fillColor().color != CommonStrings::None)
                        m_ps->putColorNoDraw(fillColor().color, 
fillColor().shade);

Modified: trunk/Scribus/scribus/text/boxes.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22107&path=/trunk/Scribus/scribus/text/boxes.cpp
==============================================================================
--- trunk/Scribus/scribus/text/boxes.cpp        (original)
+++ trunk/Scribus/scribus/text/boxes.cpp        Wed Jul 12 22:50:49 2017
@@ -149,7 +149,7 @@
 {
        if ((style.alignment() != ParagraphStyle::Justified) && 
(style.alignment() != ParagraphStyle::Extended))
                return;
-       for(int i = 0; i < m_boxes.count(); i++)
+       for (int i = 0; i < m_boxes.count(); i++)
        {
                m_boxes[i]->justify(style);
        }
@@ -361,7 +361,7 @@
                {
                        glyphNatural += run.width();
                }
-               else if (!run.hasFlag(ScLayout_SuppressSpace) )
+               else if (!run.hasFlag(ScLayout_SuppressSpace))
                {
                        spaceNatural += run.width();
                        if (imSpace < 0.0 || imSpace > run.width())
@@ -381,13 +381,13 @@
                        style.minGlyphExtension() && spaceNatural > 0)
        {
                glyphExtension = style.minGlyphExtension() - 1;
-               spaceExtension = (width() - glyphNatural * (1+glyphExtension) ) 
/ spaceNatural  - 1;
+               spaceExtension = (width() - glyphNatural * (1 + 
glyphExtension)) / spaceNatural - 1;
                imSpace = 0;
        }
        else if (width() < spaceNatural + glyphNatural * 
style.maxGlyphExtension() && glyphNatural > 0)
        {
                spaceExtension = 0;
-               glyphExtension = (width() - spaceNatural) / glyphNatural  - 1;
+               glyphExtension = (width() - spaceNatural) / glyphNatural - 1;
                imSpace = 0;
        }
        else
@@ -409,7 +409,7 @@
                        }
                } else {
                        if (spaceNatural > 0)
-                               spaceExtension = (width() - glyphNatural * 
(1+glyphExtension) ) / spaceNatural  - 1;
+                               spaceExtension = (width() - glyphNatural * (1 + 
glyphExtension)) / spaceNatural - 1;
                        else
                                spaceExtension = 0;
                }
@@ -637,17 +637,25 @@
                        lw = qMax(font.strokeWidth(fontSize), 1.0);
                }
                if (charStyle.baselineOffset() != 0)
-                       st += fontSize * m_glyphRun.scaleV() * 
(charStyle.baselineOffset() / 1000.0);
+                       st += fontSize * (charStyle.baselineOffset() / 1000.0);
 
                double sw = p->strokeWidth();
                TextLayoutColor sc = p->strokeColor();
 
                p->setStrokeColor(p->fillColor());
                p->setStrokeWidth(lw);
+
+               double xoffs(0.0), yoffs(0.0);
+               if (m_glyphRun.glyphs().count() > 0)
+               {
+                       const GlyphLayout& gl = m_glyphRun.glyphs().first();
+                       xoffs = gl.xoffset;
+                       yoffs = gl.yoffset;
+               }
                if (charStyle.effects() & ScStyle_Subscript)
-                       p->drawLine(QPointF(m_glyphRun.xoffset, 
m_glyphRun.yoffset - st), QPointF(m_glyphRun.xoffset + m_glyphRun.width(), 
m_glyphRun.yoffset - st));
+                       p->drawLine(QPointF(xoffs, yoffs - st), QPointF(xoffs + 
m_glyphRun.width(), yoffs - st));
                else
-                       p->drawLine(QPointF(m_glyphRun.xoffset, -st), 
QPointF(m_glyphRun.xoffset + m_glyphRun.width(), -st));
+                       p->drawLine(QPointF(xoffs, -st), QPointF(xoffs + 
m_glyphRun.width(), -st));
 
                p->setStrokeWidth(sw);
                p->setStrokeColor(sc);
@@ -692,6 +700,9 @@
                        p->drawGlyph(m_glyphRun);
        }
 
+       if (charStyle.baselineOffset() != 0)
+               p->translate(0, fontSize * (charStyle.baselineOffset() / 
1000.0));
+
        if (m_effects & ScStyle_Strikethrough && hasStrokeColor)
        {
                double st, lw;
@@ -700,7 +711,7 @@
                        if (charStyle.strikethruOffset() != -1)
                                st = (charStyle.strikethruOffset() / 1000.0) * 
font.ascent(fontSize);
                        else
-                               st = font.strikeoutPos(fontSize);
+                               st = font.strikeoutPos(fontSize) * 
m_glyphRun.scaleV();
                        if (charStyle.strikethruWidth() != -1)
                                lw = (charStyle.strikethruWidth() / 1000.0) * 
fontSize;
                        else
@@ -708,18 +719,26 @@
                }
                else
                {
-                       st = font.strikeoutPos(fontSize);
+                       st = font.strikeoutPos(fontSize) * m_glyphRun.scaleV();
                        lw = qMax(font.strokeWidth(fontSize), 1.0);
                }
                if (charStyle.baselineOffset() != 0)
-                       st += fontSize * m_glyphRun.scaleV() * 
(charStyle.baselineOffset() / 1000.0);
+                       st += fontSize * (charStyle.baselineOffset() / 1000.0);
 
                double sw = p->strokeWidth();
                TextLayoutColor sc = p->strokeColor();
 
                p->setStrokeColor(p->fillColor());
                p->setStrokeWidth(lw);
-               p->drawLine(QPointF(m_glyphRun.xoffset, m_glyphRun.yoffset - 
st), QPointF(m_glyphRun.xoffset + m_glyphRun.width(), m_glyphRun.yoffset - st));
+
+               double xoffs(0.0), yoffs(0.0);
+               if (m_glyphRun.glyphs().count() > 0)
+               {
+                       const GlyphLayout& gl = m_glyphRun.glyphs().first();
+                       xoffs = gl.xoffset;
+                       yoffs = gl.yoffset;
+               }
+               p->drawLine(QPointF(xoffs, yoffs - st), QPointF(xoffs + 
m_glyphRun.width(), yoffs - st));
 
                p->setStrokeWidth(sw);
                p->setStrokeColor(sc);
@@ -730,14 +749,14 @@
        p->restore();
 }
 
-int GlyphBox::pointToPosition(QPointF coord,  const StoryText& story) const
+int GlyphBox::pointToPosition(QPointF coord, const StoryText& story) const
 {
        if (firstChar() != lastChar())
        {
                int count = 0;
                BreakIterator *it = StoryText::getGraphemeIterator();
                QString text = story.text(firstChar(), lastChar() - firstChar() 
+ 1);
-               it->setText((const UChar*) text.utf16());
+               it->setText((const UChar*)text.utf16());
                while (it->next() != BreakIterator::DONE)
                        count++;
                bool rtlLayout = m_glyphRun.hasFlag(ScLayout_RightToLeft);
@@ -782,7 +801,7 @@
                int index = 0;
                BreakIterator *it = StoryText::getGraphemeIterator();
                QString text = story.text(firstChar(), lastChar() - firstChar() 
+ 1);
-               it->setText((const UChar*) text.utf16());
+               it->setText((const UChar*)text.utf16());
                while (it->next() != BreakIterator::DONE)
                {
                        count++;
@@ -823,7 +842,7 @@
 
        m_object->setXPos(m_object->gXpos, true);
        m_object->setYPos(m_object->gYpos, true);
-//     m_item->setYPos((m_object->gHeight * (charStyle.scaleV() / 1000.0)) + 
m_object->gYpos, true);
+       //      m_item->setYPos((m_object->gHeight * (charStyle.scaleV() / 
1000.0)) + m_object->gYpos, true);
 
        if (charStyle.baselineOffset() != 0)
        {


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

Reply via email to