mirror of
https://bitbucket.org/smil3y/katie.git
synced 2025-02-25 11:22:58 +00:00
replace internal QPainter::drawText() with its body
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
parent
0461998834
commit
d97e9f7760
2 changed files with 49 additions and 70 deletions
|
@ -4774,7 +4774,55 @@ void QPainter::drawImage(const QRectF &targetRect, const QImage &image, const QR
|
|||
|
||||
void QPainter::drawText(const QPointF &p, const QString &str)
|
||||
{
|
||||
drawText(p, str, 0, 0);
|
||||
#ifdef QT_DEBUG_DRAW
|
||||
printf("QPainter::drawText(), pos=[%.2f,%.2f], str='%s'\n", p.x(), p.y(), str.toLatin1().constData());
|
||||
#endif
|
||||
|
||||
Q_D(QPainter);
|
||||
|
||||
if (!d->engine || str.isEmpty() || pen().style() == Qt::NoPen)
|
||||
return;
|
||||
|
||||
QStackTextEngine engine(str, d->state->font);
|
||||
engine.option.setTextDirection(d->state->layoutDirection);
|
||||
engine.itemize();
|
||||
QScriptLine line;
|
||||
line.length = str.length();
|
||||
engine.shapeLine(line);
|
||||
|
||||
int nItems = engine.layoutData->items.size();
|
||||
QVarLengthArray<int> visualOrder(nItems);
|
||||
QVarLengthArray<uchar> levels(nItems);
|
||||
for (int i = 0; i < nItems; ++i)
|
||||
levels[i] = engine.layoutData->items[i].analysis.bidiLevel;
|
||||
QTextEngine::bidiReorder(nItems, levels.data(), visualOrder.data());
|
||||
|
||||
QFixed x = QFixed::fromReal(p.x());
|
||||
|
||||
for (int i = 0; i < nItems; ++i) {
|
||||
int item = visualOrder[i];
|
||||
const QScriptItem &si = engine.layoutData->items.at(item);
|
||||
if (si.analysis.flags >= QScriptAnalysis::TabOrObject) {
|
||||
x += si.width;
|
||||
continue;
|
||||
}
|
||||
QFont f = engine.font(si);
|
||||
QTextItemInt gf(si, &f);
|
||||
gf.glyphs = engine.shapedGlyphs(&si);
|
||||
gf.chars = engine.layoutData->string.unicode() + si.position;
|
||||
gf.num_chars = engine.length(item);
|
||||
if (engine.forceJustification) {
|
||||
for (int j=0; j<gf.glyphs.numGlyphs; ++j)
|
||||
gf.width += gf.glyphs.effectiveAdvance(j);
|
||||
} else {
|
||||
gf.width = si.width;
|
||||
}
|
||||
gf.logClusters = engine.logClusters(&si);
|
||||
|
||||
drawTextItem(QPointF(x.toReal(), p.y()), gf);
|
||||
|
||||
x += gf.width;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -4902,73 +4950,6 @@ void QPainter::drawStaticText(const QPointF &topLeftPosition, const QStaticText
|
|||
d->state->matrix = oldMatrix;
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
void QPainter::drawText(const QPointF &p, const QString &str, int tf, int justificationPadding)
|
||||
{
|
||||
#ifdef QT_DEBUG_DRAW
|
||||
printf("QPainter::drawText(), pos=[%.2f,%.2f], str='%s'\n", p.x(), p.y(), str.toLatin1().constData());
|
||||
#endif
|
||||
|
||||
Q_D(QPainter);
|
||||
|
||||
if (!d->engine || str.isEmpty() || pen().style() == Qt::NoPen)
|
||||
return;
|
||||
|
||||
QStackTextEngine engine(str, d->state->font);
|
||||
engine.option.setTextDirection(d->state->layoutDirection);
|
||||
if (tf & (Qt::TextForceLeftToRight|Qt::TextForceRightToLeft)) {
|
||||
engine.ignoreBidi = true;
|
||||
engine.option.setTextDirection((tf & Qt::TextForceLeftToRight) ? Qt::LeftToRight : Qt::RightToLeft);
|
||||
}
|
||||
engine.itemize();
|
||||
QScriptLine line;
|
||||
line.length = str.length();
|
||||
engine.shapeLine(line);
|
||||
|
||||
int nItems = engine.layoutData->items.size();
|
||||
QVarLengthArray<int> visualOrder(nItems);
|
||||
QVarLengthArray<uchar> levels(nItems);
|
||||
for (int i = 0; i < nItems; ++i)
|
||||
levels[i] = engine.layoutData->items[i].analysis.bidiLevel;
|
||||
QTextEngine::bidiReorder(nItems, levels.data(), visualOrder.data());
|
||||
|
||||
if (justificationPadding > 0) {
|
||||
engine.option.setAlignment(Qt::AlignJustify);
|
||||
engine.forceJustification = true;
|
||||
// this works because justify() is only interested in the difference between width and textWidth
|
||||
line.width = justificationPadding;
|
||||
engine.justify(line);
|
||||
}
|
||||
QFixed x = QFixed::fromReal(p.x());
|
||||
|
||||
for (int i = 0; i < nItems; ++i) {
|
||||
int item = visualOrder[i];
|
||||
const QScriptItem &si = engine.layoutData->items.at(item);
|
||||
if (si.analysis.flags >= QScriptAnalysis::TabOrObject) {
|
||||
x += si.width;
|
||||
continue;
|
||||
}
|
||||
QFont f = engine.font(si);
|
||||
QTextItemInt gf(si, &f);
|
||||
gf.glyphs = engine.shapedGlyphs(&si);
|
||||
gf.chars = engine.layoutData->string.unicode() + si.position;
|
||||
gf.num_chars = engine.length(item);
|
||||
if (engine.forceJustification) {
|
||||
for (int j=0; j<gf.glyphs.numGlyphs; ++j)
|
||||
gf.width += gf.glyphs.effectiveAdvance(j);
|
||||
} else {
|
||||
gf.width = si.width;
|
||||
}
|
||||
gf.logClusters = engine.logClusters(&si);
|
||||
|
||||
drawTextItem(QPointF(x.toReal(), p.y()), gf);
|
||||
|
||||
x += gf.width;
|
||||
}
|
||||
}
|
||||
|
||||
void QPainter::drawText(const QRect &r, int flags, const QString &str, QRect *br)
|
||||
{
|
||||
#ifdef QT_DEBUG_DRAW
|
||||
|
|
|
@ -329,8 +329,6 @@ public:
|
|||
inline void drawText(const QPoint &p, const QString &s);
|
||||
inline void drawText(int x, int y, const QString &s);
|
||||
|
||||
void drawText(const QPointF &p, const QString &str, int tf, int justificationPadding);
|
||||
|
||||
void drawText(const QRectF &r, int flags, const QString &text, QRectF *br = nullptr);
|
||||
void drawText(const QRect &r, int flags, const QString &text, QRect *br = nullptr);
|
||||
inline void drawText(int x, int y, int w, int h, int flags, const QString &text, QRect *br = nullptr);
|
||||
|
|
Loading…
Add table
Reference in a new issue