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 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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user