[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kwrite-devel
Subject:    Fwd: QTextLayout patch
From:       Hamish Rodda <rodda () kde ! org>
Date:       2005-05-30 12:09:26
Message-ID: 200505302209.28893.rodda () kde ! org
[Download RAW message or body]

[Attachment #2 (multipart/signed)]

[Attachment #4 (multipart/mixed)]


Hi,

Tronical has kindly fixed setAdditionalFormats function of QTextLayout in the 
attached message/patch.  Try it out if you're running KDE4 - you should get 
highlighting back :)

Cheers,
Hamish

["forwarded message" (message/rfc822)]



Hi,

I finished the patch for QTextEngine/Layout that should fix the bug of 
non-working additional formats. Unfortunately it's too late for inclusion 
into 4.0.0. But if you still want to play around with it, I attached it to 
this mail.

Simon

["textengine_patch.txt" (text/plain)]

==== //depot/qt/4.0/src/gui/text/qtextengine.cpp#10 - \
                /home/shausman/dev/qt-4.0/src/gui/text/qtextengine.cpp ====
--- /tmp/tmp.12870.1	2005-05-29 13:39:43.000000000 +0200
+++ /home/shausman/dev/qt-4.0/src/gui/text/qtextengine.cpp	2005-05-29 \
13:38:13.000000000 +0200 @@ -801,24 +801,19 @@ static void init(QTextEngine *e)
 }
 
 QTextEngine::QTextEngine()
-    : fnt(0)
 {
     init(this);
 }
 
-QTextEngine::QTextEngine(const QString &str, QFontPrivate *f)
+QTextEngine::QTextEngine(const QString &str, const QFont &f)
     : fnt(f)
 {
     init(this);
     text = str;
-    if (fnt)
-        fnt->ref.ref();
 }
 
 QTextEngine::~QTextEngine()
 {
-    if (fnt && !fnt->ref.deref())
-        delete fnt;
     delete layoutData;
     delete specialData;
 }
@@ -1050,43 +1045,27 @@ glyph_metrics_t QTextEngine::boundingBox
 
 QFont QTextEngine::font(const QScriptItem &si) const
 {
-    if (block.docHandle()) {
-        QTextFormat f = format(&si);
-        Q_ASSERT(f.isCharFormat());
-        QTextCharFormat chf = f.toCharFormat();
-        QFont fnt = chf.font();
-        fnt = fnt.resolve(block.docHandle()->defaultFont);
+    QTextCharFormat f = format(&si);
+    QFont font = f.font().resolve(fnt);
 
+    if (block.docHandle()) {
+        font = font.resolve(block.docHandle()->defaultFont);
         // Make sure we get the right dpi on printers
         QPaintDevice *pdev = block.docHandle()->layout()->paintDevice();
         if (pdev)
-            fnt = QFont(fnt, pdev);
-
-        if (chf.verticalAlignment() != QTextCharFormat::AlignNormal)
-            fnt.setPointSize((fnt.pointSize() * 2) / 3);
-
-        return fnt;
+            font = QFont(font, pdev);
     }
 
-    if (fnt)
-        return QFont(fnt);    
-    return QFont();
-}
+    if (f.verticalAlignment() != QTextCharFormat::AlignNormal)
+        font.setPointSize((font.pointSize() * 2) / 3);
 
-QFont QTextEngine::font() const
-{
-    if (fnt)
-        return QFont(fnt);
-    return QFont();
+    return font;
 }
 
 QFontEngine *QTextEngine::fontEngine(const QScriptItem &si) const
 {
-    if (!fnt) {
-        QFont font = this->font(si);
-        return font.d->engineForScript(si.analysis.script);
-    }
-    return fnt->engineForScript(si.analysis.script);
+    QFont font = this->font(si);
+    return font.d->engineForScript(si.analysis.script);
 }
 
 struct JustificationPoint {
@@ -1297,12 +1276,12 @@ void QScriptLine::setDefaultHeight(QText
     QFont f;
     QFontEngine *e;
 
-    if (eng->fnt) {
-        e = eng->fnt->engineForScript(QUnicodeTables::Common);
-    } else {
+    if (eng->block.docHandle()) {
         f = eng->block.charFormat().font();
         f = f.resolve(eng->block.docHandle()->defaultFont);
         e = f.d->engineForScript(QUnicodeTables::Common);
+    } else {
+        e = eng->fnt.d->engineForScript(QUnicodeTables::Common);
     }
 
     ascent = e->ascent();
@@ -1355,9 +1334,11 @@ int QTextEngine::formatIndex(const QScri
 }
 
 
-QTextFormat QTextEngine::format(const QScriptItem *si) const
+QTextCharFormat QTextEngine::format(const QScriptItem *si) const
 {
-    QTextFormat format = formats()->format(formatIndex(si));
+    QTextCharFormat format;
+    if (block.docHandle())
+        format = formats()->charFormat(formatIndex(si));
     if (specialData) {
         int end = si->position + length(si);
         for (int i = 0; i < specialData->addFormats.size(); ++i) {
==== //depot/qt/4.0/src/gui/text/qtextengine_p.h#5 - \
                /home/shausman/dev/qt-4.0/src/gui/text/qtextengine_p.h ====
--- /tmp/tmp.12870.2	2005-05-29 13:39:43.000000000 +0200
+++ /home/shausman/dev/qt-4.0/src/gui/text/qtextengine_p.h	2005-05-28 \
16:42:48.000000000 +0200 @@ -267,7 +267,7 @@ class QTextFormatCollection;
 class Q_GUI_EXPORT QTextEngine {
 public:
     QTextEngine();
-    QTextEngine(const QString &str, QFontPrivate *f);
+    QTextEngine(const QString &str, const QFont &f);
     ~QTextEngine();
 
     enum Mode {
@@ -314,7 +314,7 @@ public:
 
     QFontEngine *fontEngine(const QScriptItem &si) const;
     QFont font(const QScriptItem &si) const;
-    QFont font() const;
+    inline QFont font() const { return fnt; }
 
     unsigned short *logClustersPtr;
     QGlyphLayout *glyphPtr;
@@ -336,7 +336,7 @@ public:
     inline QTextFormatCollection *formats() const {
         return block.docHandle()->formatCollection();
     }
-    QTextFormat format(const QScriptItem *si) const;
+    QTextCharFormat format(const QScriptItem *si) const;
     inline QAbstractTextDocumentLayout *docLayout() const {
         return block.docHandle()->document()->documentLayout();
     }
@@ -347,7 +347,7 @@ public:
     mutable QScriptLineArray lines;
 
     QString text;
-    QFontPrivate *fnt;
+    QFont fnt;
     QTextBlock block;
 
     QTextOption option;
==== //depot/qt/4.0/src/gui/text/qtextlayout.cpp#25 - \
                /home/shausman/dev/qt-4.0/src/gui/text/qtextlayout.cpp ====
--- /tmp/tmp.12870.3	2005-05-29 13:39:43.000000000 +0200
+++ /home/shausman/dev/qt-4.0/src/gui/text/qtextlayout.cpp	2005-05-29 \
13:34:49.000000000 +0200 @@ -335,10 +335,7 @@ QTextLayout::~QTextLayout()
 */
 void QTextLayout::setFont(const QFont &font)
 {
-    if (d->fnt && !d->fnt->ref.deref())
-        delete d->fnt;
-    d->fnt = font.d;
-    d->fnt->ref.ref();
+    d->fnt = font;
 }
 
 /*!
@@ -347,7 +344,7 @@ void QTextLayout::setFont(const QFont &f
 */
 QFont QTextLayout::font() const
 {
-    return d->fnt ? QFont(d->fnt) : QFont();
+    return d->font();
 }
 
 /*!
@@ -1369,7 +1366,6 @@ void QTextLine::draw(QPainter *p, const 
             outlinePen = qVariantValue<QPen>(outline);
     }
 
-    QFont f = eng->font();
     for (int i = 0; i < nItems; ++i) {
         int item = visualOrder[i]+firstItem;
         QScriptItem &si = eng->layoutData->items[item];
@@ -1382,7 +1378,7 @@ void QTextLine::draw(QPainter *p, const 
                 (!selection || (si.position < selection->start + selection->length
                                 && si.position + si_len > selection->start))) {
                 p->save();
-                QTextCharFormat format = eng->format(&si).toCharFormat();
+                QTextCharFormat format = eng->format(&si);
                 if (selection)
                     format.merge(selection->format);
                 qreal width = si.width;
@@ -1479,24 +1475,19 @@ void QTextLine::draw(QPainter *p, const 
         }
 
 
-        if (eng->block.docHandle() || selection) {
-            QTextCharFormat chf;
-            if (eng->block.docHandle())
-                chf = eng->format(&si).toCharFormat();
-            if (selection)
-                chf.merge(selection->format);
-
-            setPenAndDrawBackground(p, pen, chf, QRectF(x, y - line.ascent, \
                gf.width, line.height()));
-
-            QTextCharFormat::VerticalAlignment valign = chf.verticalAlignment();
-            if (valign == QTextCharFormat::AlignSubScript)
-                itemBaseLine += (si.ascent + si.descent + 1) / 6;
-            else if (valign == QTextCharFormat::AlignSuperScript)
-                itemBaseLine -= (si.ascent + si.descent + 1) / 2;
+        QTextCharFormat chf = eng->format(&si);
+        if (selection)
+            chf.merge(selection->format);
 
-            f = eng->font(si);
-        }
+        setPenAndDrawBackground(p, pen, chf, QRectF(x, y - line.ascent, gf.width, \
line.height())); +
+        QTextCharFormat::VerticalAlignment valign = chf.verticalAlignment();
+        if (valign == QTextCharFormat::AlignSubScript)
+            itemBaseLine += (si.ascent + si.descent + 1) / 6;
+        else if (valign == QTextCharFormat::AlignSuperScript)
+            itemBaseLine -= (si.ascent + si.descent + 1) / 2;
 
+        QFont f = eng->font(si);
         gf.fontEngine = f.d->engineForScript(si.analysis.script);
         gf.f = &f;
         if (f.d->underline)


[Attachment #11 (application/pgp-signature)]

_______________________________________________
KWrite-Devel mailing list
KWrite-Devel@kde.org
https://mail.kde.org/mailman/listinfo/kwrite-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic