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 void qHBFreeFace(HB_Face);
Q_CORE_EXPORT HB_Face qHBLoadFace(HB_Face 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_GlyphAttributes, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(HB_FixedPoint, 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); scriptItems.append(item);
} }
QCharAttributeOptions options = 0; QUnicodeTools::CharAttributeOptions options = QUnicodeTools::WhiteSpaces;
if (type == QTextBoundaryFinder::Word) switch (type) {
options |= GetWordBreaks; case QTextBoundaryFinder::Grapheme: options |= QUnicodeTools::GraphemeBreaks; break;
else if (type == QTextBoundaryFinder::Sentence) case QTextBoundaryFinder::Word: options |= QUnicodeTools::WordBreaks; break;
options |= GetSentenceBreaks; case QTextBoundaryFinder::Sentence: options |= QUnicodeTools::SentenceBreaks; break;
qGetCharAttributes(string, length, scriptItems.data(), scriptItems.count(), attributes, options); 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 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 // 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 /* The Unicode algorithm does in our opinion allow line breaks at some
places they shouldn't be allowed. The following changes were thus places they shouldn't be allowed. The following changes were thus
made in comparison to the Unicode reference: 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 initCharAttributes(const ushort *string, int length,
Q_CORE_EXPORT void qGetCharAttributes(const ushort *string, int length,
const HB_ScriptItem *items, int numItems, const HB_ScriptItem *items, int numItems,
HB_CharAttributes *attributes, QCharAttributeOptions options) HB_CharAttributes *attributes, CharAttributeOptions options)
{ {
if (length <= 0) if (length <= 0)
return; 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 & (GraphemeBreaks | LineBreaks | WhiteSpaces))
if (options & GetWordBreaks) calcGraphemeAndLineBreaks(string, length, attributes);
if (options & WordBreaks)
calcWordBreaks(string, length, attributes); calcWordBreaks(string, length, attributes);
if (options & GetSentenceBreaks) if (options & SentenceBreaks)
calcSentenceBreaks(string, length, attributes); 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 QT_END_NAMESPACE

View File

@ -53,23 +53,29 @@
// We mean it. // We mean it.
// //
#include <QtCore/qglobal.h> #include <private/qharfbuzz_p.h>
#include <harfbuzz-shaper.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
Q_DECLARE_TYPEINFO(HB_CharAttributes, Q_PRIMITIVE_TYPE); namespace QUnicodeTools {
Q_DECLARE_TYPEINFO(HB_ScriptItem, Q_PRIMITIVE_TYPE);
enum QCharAttributeOption { enum CharAttributeOption {
GetWordBreaks = 1, GraphemeBreaks = 0x01,
GetSentenceBreaks = 2 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, const HB_ScriptItem *items, int numItems,
HB_CharAttributes *attributes, QCharAttributeOptions options = QFlag(0)); HB_CharAttributes *attributes, CharAttributeOptions options = DefaultOptionsCompat);
} // namespace QUnicodeTools
QT_END_NAMESPACE QT_END_NAMESPACE

View File

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