Merge branch 'master' of git://scm.dev.nokia.troll.no/qt/qtbase-staging

* 'master' of git://scm.dev.nokia.troll.no/qt/qtbase-staging:
  Enablers for TextInput
This commit is contained in:
Qt Continuous Integration System 2011-05-23 21:47:55 +10:00
commit 60cea67af0
8 changed files with 127 additions and 24 deletions

View File

@ -319,6 +319,35 @@ void QGlyphRun::setStrikeOut(bool strikeOut)
d->strikeOut = strikeOut; d->strikeOut = strikeOut;
} }
/*!
Returns the smallest rectangle that contains all glyphs in this QGlyphRun.
\since 5.0
*/
QRectF QGlyphRun::boundingRect() const
{
qreal minX, minY, maxX, maxY;
for (int i=0; i<qMin(d->glyphPositions.size(), d->glyphIndexes.size()); ++i) {
QRectF glyphRect = d->rawFont.boundingRect(d->glyphIndexes.at(i));
glyphRect.translate(d->glyphPositions.at(i));
if (i == 0) {
minX = glyphRect.left();
minY = glyphRect.top();
maxX = glyphRect.right();
maxY = glyphRect.bottom();
} else {
minX = qMin(glyphRect.left(), minX);
minY = qMin(glyphRect.top(), minY);
maxX = qMax(glyphRect.right(),maxX);
maxY = qMax(glyphRect.bottom(), maxY);
}
}
return QRectF(QPointF(minX, minY), QPointF(maxX, maxY));
}
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // QT_NO_RAWFONT #endif // QT_NO_RAWFONT

View File

@ -87,6 +87,8 @@ public:
void setStrikeOut(bool strikeOut); void setStrikeOut(bool strikeOut);
bool strikeOut() const; bool strikeOut() const;
QRectF boundingRect() const;
private: private:
friend class QGlyphRunPrivate; friend class QGlyphRunPrivate;
friend class QTextLine; friend class QTextLine;

View File

@ -718,6 +718,20 @@ void QRawFontPrivate::cleanUp()
hintingPreference = QFont::PreferDefaultHinting; hintingPreference = QFont::PreferDefaultHinting;
} }
/*!
Returns the smallest rectangle containing the glyph with the given \a glyphIndex.
\since 5.0
*/
QRectF QRawFont::boundingRect(quint32 glyphIndex) const
{
if (!isValid())
return QRectF();
glyph_metrics_t gm = d->fontEngine->boundingBox(glyphIndex);
return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());
}
#endif // QT_NO_RAWFONT #endif // QT_NO_RAWFONT
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -97,6 +97,7 @@ public:
AntialiasingType antialiasingType = SubPixelAntialiasing, AntialiasingType antialiasingType = SubPixelAntialiasing,
const QTransform &transform = QTransform()) const; const QTransform &transform = QTransform()) const;
QPainterPath pathForGlyph(quint32 glyphIndex) const; QPainterPath pathForGlyph(quint32 glyphIndex) const;
QRectF boundingRect(quint32 glyphIndex) const;
void setPixelSize(qreal pixelSize); void setPixelSize(qreal pixelSize);
qreal pixelSize() const; qreal pixelSize() const;

View File

@ -997,11 +997,20 @@ static inline QRectF clipIfValid(const QRectF &rect, const QRectF &clip)
\sa draw(), QPainter::drawGlyphRun() \sa draw(), QPainter::drawGlyphRun()
*/ */
#if !defined(QT_NO_RAWFONT) #if !defined(QT_NO_RAWFONT)
QList<QGlyphRun> QTextLayout::glyphRuns() const QList<QGlyphRun> QTextLayout::glyphRuns(int from, int length) const
{ {
if (from < 0)
from = 0;
if (length < 0)
length = text().length();
QList<QGlyphRun> glyphs; QList<QGlyphRun> glyphs;
for (int i=0; i<d->lines.size(); ++i) for (int i=0; i<d->lines.size(); ++i) {
glyphs += QTextLine(i, d).glyphs(-1, -1); if (d->lines[i].from > from + length)
break;
else if (d->lines[i].from + d->lines[i].length >= from)
glyphs += QTextLine(i, d).glyphRuns(from, length);
}
return glyphs; return glyphs;
} }
@ -2084,25 +2093,32 @@ namespace {
} }
/*! /*!
\internal Returns the glyph indexes and positions for all glyphs in this QTextLine for characters
in the range defined by \a from and \a length. The \a from index is relative to the beginning
of the text in the containing QTextLayout, and the range must be within the range of QTextLine
as given by functions textStart() and textLength().
Returns the glyph indexes and positions for all glyphs in this QTextLine which reside in If \a from is negative, it will default to textStart(), and if \a length is negative it will
QScriptItems that overlap with the range defined by \a from and \a length. The arguments default to the return value of textLength().
specify characters, relative to the text in the layout. Note that it is not possible to
use this function to retrieve a subset of the glyphs in a QScriptItem.
\since 4.8 \since 5.0
\sa QTextLayout::glyphRuns() \sa QTextLayout::glyphRuns()
*/ */
#if !defined(QT_NO_RAWFONT) #if !defined(QT_NO_RAWFONT)
QList<QGlyphRun> QTextLine::glyphs(int from, int length) const QList<QGlyphRun> QTextLine::glyphRuns(int from, int length) const
{ {
const QScriptLine &line = eng->lines[i]; const QScriptLine &line = eng->lines[i];
if (line.length == 0) if (line.length == 0)
return QList<QGlyphRun>(); return QList<QGlyphRun>();
if (from < 0)
from = textStart();
if (length < 0)
length = textLength();
QHash<QFontEngine *, GlyphInfo> glyphLayoutHash; QHash<QFontEngine *, GlyphInfo> glyphLayoutHash;
QTextLineItemIterator iterator(eng, i); QTextLineItemIterator iterator(eng, i);
@ -2114,8 +2130,9 @@ QList<QGlyphRun> QTextLine::glyphs(int from, int length) const
QPointF pos(iterator.x.toReal(), y); QPointF pos(iterator.x.toReal(), y);
if (from >= 0 && length >= 0 && if (from >= 0 && length >= 0 &&
(from >= si.position + eng->length(&si) || from + length <= si.position)) (from >= si.position + eng->length(&si) || from + length <= si.position)) {
continue; continue;
}
QFont font = eng->font(si); QFont font = eng->font(si);
@ -2126,11 +2143,42 @@ QList<QGlyphRun> QTextLine::glyphs(int from, int length) const
flags |= QTextItem::Underline; flags |= QTextItem::Underline;
if (font.strikeOut()) if (font.strikeOut())
flags |= QTextItem::StrikeOut; flags |= QTextItem::StrikeOut;
if (si.analysis.bidiLevel % 2)
flags |= QTextItem::RightToLeft;
QGlyphLayout glyphLayout = eng->shapedGlyphs(&si).mid(iterator.glyphsStart, bool rtl = false;
iterator.glyphsEnd - iterator.glyphsStart); if (si.analysis.bidiLevel % 2) {
flags |= QTextItem::RightToLeft;
rtl = true;
}
int relativeFrom = qMax(iterator.itemStart, from) - si.position;
int relativeTo = qMin(iterator.itemEnd, from + length - 1) - si.position;
unsigned short *logClusters = eng->logClusters(&si);
int glyphsStart = logClusters[relativeFrom];
int glyphsEnd = (relativeTo == eng->length(&si))
? si.num_glyphs - 1
: logClusters[relativeTo];
QGlyphLayout glyphLayout = eng->shapedGlyphs(&si);
// Calculate new x position of glyph layout for a subset. This becomes somewhat complex
// when we're breaking a RTL script item, since the expected position passed into
// getGlyphPositions() is the left-most edge of the left-most glyph in an RTL run.
if (relativeFrom != (iterator.itemStart - si.position) && !rtl) {
for (int i=0; i<glyphsStart; ++i) {
QFixed justification = QFixed::fromFixed(glyphLayout.justifications[i].space_18d6);
pos += QPointF((glyphLayout.advances_x[i] + justification).toReal(),
glyphLayout.advances_y[i].toReal());
}
} else if (relativeTo != (iterator.itemEnd - si.position) && rtl) {
for (int i=glyphLayout.numGlyphs - 1; i>glyphsEnd; --i) {
QFixed justification = QFixed::fromFixed(glyphLayout.justifications[i].space_18d6);
pos += QPointF((glyphLayout.advances_x[i] + justification).toReal(),
glyphLayout.advances_y[i].toReal());
}
}
glyphLayout = glyphLayout.mid(glyphsStart, glyphsEnd - glyphsStart + 1);
if (glyphLayout.numGlyphs > 0) { if (glyphLayout.numGlyphs > 0) {
QFontEngine *mainFontEngine = font.d->engineForScript(si.analysis.script); QFontEngine *mainFontEngine = font.d->engineForScript(si.analysis.script);
@ -2147,9 +2195,10 @@ QList<QGlyphRun> QTextLine::glyphs(int from, int length) const
QGlyphLayout subLayout = glyphLayout.mid(start, end - start); QGlyphLayout subLayout = glyphLayout.mid(start, end - start);
glyphLayoutHash.insertMulti(multiFontEngine->engine(which), glyphLayoutHash.insertMulti(multiFontEngine->engine(which),
GlyphInfo(subLayout, pos, flags)); GlyphInfo(subLayout, pos, flags));
for (int i = 0; i < subLayout.numGlyphs; i++) for (int i = 0; i < subLayout.numGlyphs; i++) {
pos += QPointF(subLayout.advances_x[i].toReal(), pos += QPointF(subLayout.advances_x[i].toReal(),
subLayout.advances_y[i].toReal()); subLayout.advances_y[i].toReal());
}
start = end; start = end;
which = e; which = e;
@ -2501,8 +2550,9 @@ qreal QTextLine::cursorToX(int *cursorPos, Edge edge) const
pos = 0; pos = 0;
int glyph_pos = pos == l ? si->num_glyphs : logClusters[pos]; int glyph_pos = pos == l ? si->num_glyphs : logClusters[pos];
if (edge == Trailing) { if (edge == Trailing && glyph_pos < si->num_glyphs) {
// trailing edge is leading edge of next cluster // trailing edge is leading edge of next cluster
glyph_pos++;
while (glyph_pos < si->num_glyphs && !glyphs.attributes[glyph_pos].clusterStart) while (glyph_pos < si->num_glyphs && !glyphs.attributes[glyph_pos].clusterStart)
glyph_pos++; glyph_pos++;
} }

View File

@ -174,7 +174,7 @@ public:
qreal maximumWidth() const; qreal maximumWidth() const;
#if !defined(QT_NO_RAWFONT) #if !defined(QT_NO_RAWFONT)
QList<QGlyphRun> glyphRuns() const; QList<QGlyphRun> glyphRuns(int from = -1, int length = -1) const;
#endif #endif
QTextEngine *engine() const { return d; } QTextEngine *engine() const { return d; }
@ -244,14 +244,14 @@ public:
void draw(QPainter *p, const QPointF &point, const QTextLayout::FormatRange *selection = 0) const; void draw(QPainter *p, const QPointF &point, const QTextLayout::FormatRange *selection = 0) const;
#if !defined(QT_NO_RAWFONT)
QList<QGlyphRun> glyphRuns(int from = -1, int length = -1) const;
#endif
private: private:
QTextLine(int line, QTextEngine *e) : i(line), eng(e) {} QTextLine(int line, QTextEngine *e) : i(line), eng(e) {}
void layout_helper(int numGlyphs); void layout_helper(int numGlyphs);
#if !defined(QT_NO_RAWFONT)
QList<QGlyphRun> glyphs(int from, int length) const;
#endif
friend class QTextLayout; friend class QTextLayout;
friend class QTextFragment; friend class QTextFragment;
int i; int i;

View File

@ -1685,7 +1685,7 @@ QList<QGlyphRun> QTextFragment::glyphRuns() const
QList<QGlyphRun> ret; QList<QGlyphRun> ret;
for (int i=0; i<layout->lineCount(); ++i) { for (int i=0; i<layout->lineCount(); ++i) {
QTextLine textLine = layout->lineAt(i); QTextLine textLine = layout->lineAt(i);
ret += textLine.glyphs(pos, len); ret += textLine.glyphRuns(pos, len);
} }
return ret; return ret;

View File

@ -302,6 +302,8 @@ public:
void setCursorBlinkPeriod(int msec); void setCursorBlinkPeriod(int msec);
void resetCursorBlinkTimer(); void resetCursorBlinkTimer();
bool cursorBlinkStatus() const { return m_blinkStatus; }
QString cancelText() const { return m_cancelText; } QString cancelText() const { return m_cancelText; }
void setCancelText(const QString &text) { m_cancelText = text; } void setCancelText(const QString &text) { m_cancelText = text; }
@ -318,6 +320,11 @@ public:
bool processEvent(QEvent *ev); bool processEvent(QEvent *ev);
QTextLayout *textLayout()
{
return &m_textLayout;
}
private: private:
void init(const QString &txt); void init(const QString &txt);
void removeSelectedText(); void removeSelectedText();