Introduce QUnicodeTools

Add QUnicodeTools namespace and rename qGetCharAttributes to initCharAttributes;

Make it possible to disable tailoring globally by overriding
qt_initcharattributes_default_algorithm_only value
(useful for i.e. running the specification conformance tests);

This is mostly a preparation step for the upcoming patches.

Change-Id: I783879fd17b63b52d7983e25dad5b820f0515e7f
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
This commit is contained in:
Konstantin Ritt 2012-05-29 05:15:53 +03:00 committed by Qt by Nokia
parent c16455dbcf
commit 32c39330ef
5 changed files with 53 additions and 31 deletions

View File

@ -65,6 +65,9 @@ Q_CORE_EXPORT HB_Face qHBNewFace(void *font, HB_GetFontTableFunc tableFunc);
Q_CORE_EXPORT void qHBFreeFace(HB_Face);
Q_CORE_EXPORT HB_Face qHBLoadFace(HB_Face face);
Q_DECLARE_TYPEINFO(HB_CharAttributes, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(HB_ScriptItem, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(HB_GlyphAttributes, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(HB_FixedPoint, Q_PRIMITIVE_TYPE);

View File

@ -93,12 +93,15 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int
scriptItems.append(item);
}
QCharAttributeOptions options = 0;
if (type == QTextBoundaryFinder::Word)
options |= GetWordBreaks;
else if (type == QTextBoundaryFinder::Sentence)
options |= GetSentenceBreaks;
qGetCharAttributes(string, length, scriptItems.data(), scriptItems.count(), attributes, options);
QUnicodeTools::CharAttributeOptions options = QUnicodeTools::WhiteSpaces;
switch (type) {
case QTextBoundaryFinder::Grapheme: options |= QUnicodeTools::GraphemeBreaks; break;
case QTextBoundaryFinder::Word: options |= QUnicodeTools::WordBreaks; break;
case QTextBoundaryFinder::Sentence: options |= QUnicodeTools::SentenceBreaks; break;
case QTextBoundaryFinder::Line: options |= QUnicodeTools::LineBreaks; break;
default: break;
}
QUnicodeTools::initCharAttributes(string, length, scriptItems.data(), scriptItems.count(), attributes, options);
}
/*!

View File

@ -45,6 +45,10 @@
QT_BEGIN_NAMESPACE
Q_AUTOTEST_EXPORT int qt_initcharattributes_default_algorithm_only = 0;
namespace QUnicodeTools {
// -----------------------------------------------------------------------------------------------------
//
// The line breaking algorithm. See http://www.unicode.org/reports/tr14/tr14-19.html
@ -55,8 +59,6 @@ QT_BEGIN_NAMESPACE
//
// -----------------------------------------------------------------------------------------------------
namespace {
/* The Unicode algorithm does in our opinion allow line breaks at some
places they shouldn't be allowed. The following changes were thus
made in comparison to the Unicode reference:
@ -374,25 +376,33 @@ static void calcSentenceBreaks(const ushort *string, quint32 len, HB_CharAttribu
}
}
} // namespace
Q_CORE_EXPORT void qGetCharAttributes(const ushort *string, int length,
Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
const HB_ScriptItem *items, int numItems,
HB_CharAttributes *attributes, QCharAttributeOptions options)
HB_CharAttributes *attributes, CharAttributeOptions options)
{
if (length <= 0)
return;
memset(attributes, 0, length * sizeof(HB_CharAttributes));
if (!(options & DontClearAttributes)) {
::memset(attributes, 0, length * sizeof(HB_CharAttributes));
if (options & (WordBreaks | SentenceBreaks))
options |= GraphemeBreaks;
}
calcGraphemeAndLineBreaks(string, length, attributes);
if (options & GetWordBreaks)
if (options & (GraphemeBreaks | LineBreaks | WhiteSpaces))
calcGraphemeAndLineBreaks(string, length, attributes);
if (options & WordBreaks)
calcWordBreaks(string, length, attributes);
if (options & GetSentenceBreaks)
if (options & SentenceBreaks)
calcSentenceBreaks(string, length, attributes);
HB_GetTailoredCharAttributes(string, length, items, numItems, attributes);
if (!items || numItems <= 0)
return;
if (!qt_initcharattributes_default_algorithm_only)
HB_GetTailoredCharAttributes(string, length, items, numItems, attributes);
}
} // namespace QUnicodeTools
QT_END_NAMESPACE

View File

@ -53,23 +53,29 @@
// We mean it.
//
#include <QtCore/qglobal.h>
#include <harfbuzz-shaper.h>
#include <private/qharfbuzz_p.h>
QT_BEGIN_NAMESPACE
Q_DECLARE_TYPEINFO(HB_CharAttributes, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(HB_ScriptItem, Q_PRIMITIVE_TYPE);
namespace QUnicodeTools {
enum QCharAttributeOption {
GetWordBreaks = 1,
GetSentenceBreaks = 2
enum CharAttributeOption {
GraphemeBreaks = 0x01,
WordBreaks = 0x02,
SentenceBreaks = 0x04,
LineBreaks = 0x08,
WhiteSpaces = 0x10,
DefaultOptionsCompat = GraphemeBreaks | LineBreaks | WhiteSpaces, // ### remove
DontClearAttributes = 0x1000
};
Q_DECLARE_FLAGS(QCharAttributeOptions, QCharAttributeOption)
Q_DECLARE_FLAGS(CharAttributeOptions, CharAttributeOption)
Q_CORE_EXPORT void qGetCharAttributes(const ushort *string, int length,
Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
const HB_ScriptItem *items, int numItems,
HB_CharAttributes *attributes, QCharAttributeOptions options = QFlag(0));
HB_CharAttributes *attributes, CharAttributeOptions options = DefaultOptionsCompat);
} // namespace QUnicodeTools
QT_END_NAMESPACE

View File

@ -1214,10 +1214,10 @@ const HB_CharAttributes *QTextEngine::attributes() const
hbScriptItems[i].script = (HB_Script)si.analysis.script;
}
qGetCharAttributes(reinterpret_cast<const HB_UChar16 *>(layoutData->string.constData()),
layoutData->string.length(),
hbScriptItems.data(), hbScriptItems.size(),
(HB_CharAttributes *)layoutData->memory);
QUnicodeTools::initCharAttributes(reinterpret_cast<const HB_UChar16 *>(layoutData->string.constData()),
layoutData->string.length(),
hbScriptItems.data(), hbScriptItems.size(),
(HB_CharAttributes *)layoutData->memory);
layoutData->haveCharAttributes = true;