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:
parent
c16455dbcf
commit
32c39330ef
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
if (options & (GraphemeBreaks | LineBreaks | WhiteSpaces))
|
||||
calcGraphemeAndLineBreaks(string, length, attributes);
|
||||
if (options & GetWordBreaks)
|
||||
if (options & WordBreaks)
|
||||
calcWordBreaks(string, length, attributes);
|
||||
if (options & GetSentenceBreaks)
|
||||
if (options & SentenceBreaks)
|
||||
calcSentenceBreaks(string, length, attributes);
|
||||
|
||||
if (!items || numItems <= 0)
|
||||
return;
|
||||
if (!qt_initcharattributes_default_algorithm_only)
|
||||
HB_GetTailoredCharAttributes(string, length, items, numItems, attributes);
|
||||
}
|
||||
|
||||
} // namespace QUnicodeTools
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -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
|
||||
|
||||
|
@ -1214,7 +1214,7 @@ const HB_CharAttributes *QTextEngine::attributes() const
|
||||
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(),
|
||||
hbScriptItems.data(), hbScriptItems.size(),
|
||||
(HB_CharAttributes *)layoutData->memory);
|
||||
|
Loading…
Reference in New Issue
Block a user