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>
Q_CORE_EXPORT void qHBFreeFace(HB_Face);
Q_CORE_EXPORT HB_Face qHBLoadFace(HB_Face face);
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);
Q_DECLARE_TYPEINFO(HB_GlyphAttributes, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(HB_FixedPoint, Q_PRIMITIVE_TYPE);
scriptItems.append(item);
}
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);
+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
//
// -----------------------------------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------------------------------
/* 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:
/* 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:
-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)
+ HB_CharAttributes *attributes, CharAttributeOptions options)
{
if (length <= 0)
return;
{
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);
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
+
-#include <QtCore/qglobal.h>
-#include <harfbuzz-shaper.h>
+#include <private/qharfbuzz_p.h>
-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,
const HB_ScriptItem *items, int numItems,
- HB_CharAttributes *attributes, QCharAttributeOptions options = QFlag(0));
+ HB_CharAttributes *attributes, CharAttributeOptions options = DefaultOptionsCompat);
+
+} // namespace QUnicodeTools
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()),
- 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;
layoutData->haveCharAttributes = true;