[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