7#include <QtCore/QtEndian>
8#include <QtCore/QVarLengthArray>
10#include <private/qstringiterator_p.h>
11#include <QtCore/private/qsystemlibrary_p.h>
12#include <QtCore/private/qwinregistry_p.h>
13#include <QtGui/private/qguiapplication_p.h>
14#include <qpa/qplatformintegration.h>
15#include <QtGui/qpainterpath.h>
17#if QT_CONFIG(directwrite3)
32#define DESIGN_TO_LOGICAL(DESIGN_UNIT_VALUE) \
33 QFixed::fromReal((qreal(DESIGN_UNIT_VALUE) / qreal(m_unitsPerEm)) * fontDef.pixelSize)
37 class GeometrySink:
public IDWriteGeometrySink
39 Q_DISABLE_COPY_MOVE(GeometrySink)
42 : m_refCount(0), m_path(
path)
46 virtual ~GeometrySink() =
default;
48 IFACEMETHOD_(
void, AddBeziers)(
const D2D1_BEZIER_SEGMENT *beziers, UINT bezierCount)
override;
49 IFACEMETHOD_(
void, AddLines)(
const D2D1_POINT_2F *
points, UINT pointCount)
override;
50 IFACEMETHOD_(
void, BeginFigure)(D2D1_POINT_2F startPoint, D2D1_FIGURE_BEGIN figureBegin)
override;
51 IFACEMETHOD(Close)()
override;
52 IFACEMETHOD_(
void, EndFigure)(D2D1_FIGURE_END figureEnd)
override;
53 IFACEMETHOD_(
void, SetFillMode)(D2D1_FILL_MODE
fillMode)
override;
54 IFACEMETHOD_(
void, SetSegmentFlags)(D2D1_PATH_SEGMENT vertexFlags)
override;
56 IFACEMETHOD_(
unsigned long, AddRef)()
override;
57 IFACEMETHOD_(
unsigned long, Release)()
override;
58 IFACEMETHOD(QueryInterface)(
IID const &
riid,
void **ppvObject)
override;
61 inline static QPointF fromD2D1_POINT_2F(
const D2D1_POINT_2F &inp)
66 unsigned long m_refCount;
71 void GeometrySink::AddBeziers(
const D2D1_BEZIER_SEGMENT *beziers,
72 UINT bezierCount)
noexcept
74 for (
uint i=0;
i<bezierCount; ++
i) {
75 QPointF c1 = fromD2D1_POINT_2F(beziers[
i].point1);
76 QPointF c2 = fromD2D1_POINT_2F(beziers[
i].point2);
77 QPointF p2 = fromD2D1_POINT_2F(beziers[
i].point3);
79 m_path->cubicTo(c1,
c2,
p2);
83 void GeometrySink::AddLines(
const D2D1_POINT_2F *
points, UINT pointsCount)
noexcept
85 for (
uint i=0;
i<pointsCount; ++
i)
86 m_path->lineTo(fromD2D1_POINT_2F(
points[
i]));
89 void GeometrySink::BeginFigure(D2D1_POINT_2F startPoint,
90 D2D1_FIGURE_BEGIN )
noexcept
92 m_startPoint = fromD2D1_POINT_2F(startPoint);
93 m_path->moveTo(m_startPoint);
96 IFACEMETHODIMP GeometrySink::Close()
noexcept
101 void GeometrySink::EndFigure(D2D1_FIGURE_END figureEnd)
noexcept
103 if (figureEnd == D2D1_FIGURE_END_CLOSED)
104 m_path->closeSubpath();
107 void GeometrySink::SetFillMode(D2D1_FILL_MODE
fillMode)
noexcept
109 m_path->setFillRule(
fillMode == D2D1_FILL_MODE_ALTERNATE
114 void GeometrySink::SetSegmentFlags(D2D1_PATH_SEGMENT )
noexcept
119 IFACEMETHODIMP_(
unsigned long) GeometrySink::AddRef()
noexcept
121 return InterlockedIncrement(&m_refCount);
124 IFACEMETHODIMP_(
unsigned long) GeometrySink::Release()
noexcept
126 unsigned long newCount = InterlockedDecrement(&m_refCount);
136 IFACEMETHODIMP GeometrySink::QueryInterface(
IID const &
riid,
void **ppvObject)
noexcept
138 if (__uuidof(IDWriteGeometrySink) ==
riid) {
140 }
else if (__uuidof(IUnknown) ==
riid) {
155 switch (renderMode) {
156 case DWRITE_RENDERING_MODE_GDI_CLASSIC:
157 return DWRITE_MEASURING_MODE_GDI_CLASSIC;
158 case DWRITE_RENDERING_MODE_GDI_NATURAL:
159 return DWRITE_MEASURING_MODE_GDI_NATURAL;
161 return DWRITE_MEASURING_MODE_NATURAL;
165DWRITE_RENDERING_MODE QWindowsFontEngineDirectWrite::hintingPreferenceToRenderingMode(
const QFontDef &fontDef)
const
168 return DWRITE_RENDERING_MODE_ALIASED;
179 switch (hintingPreference) {
181 return DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC;
183 return DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL;
185 return DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC;
203 const QSharedPointer<QWindowsFontEngineData> &
d)
205 , m_fontEngineData(
d)
206 , m_directWriteFontFace(directWriteFontFace)
207 , m_directWriteBitmapRenderTarget(0)
208 , m_lineThickness(-1)
213 qCDebug(lcQpaFonts) << __FUNCTION__ << pixelSize;
217 m_fontEngineData->directWriteFactory->AddRef();
218 m_directWriteFontFace->AddRef();
227 qCDebug(lcQpaFonts) << __FUNCTION__;
229 m_fontEngineData->directWriteFactory->Release();
230 m_directWriteFontFace->Release();
232 if (m_directWriteBitmapRenderTarget != 0)
233 m_directWriteBitmapRenderTarget->Release();
235 if (!m_uniqueFamilyName.
isEmpty()) {
246 return __uuidof(IDWriteLocalFontFileLoader);
251 STDMETHOD(GetFilePathLengthFromKey)(THIS_
void const *, UINT32, UINT32*) PURE;
252 STDMETHOD(GetFilePathFromKey)(THIS_
void const *, UINT32, WCHAR *, UINT32) PURE;
253 STDMETHOD(GetLastWriteTimeFromKey)(THIS_
void const *, UINT32, FILETIME *) PURE;
258 static const UUID
result = { 0xb2d9f3ec, 0xc9fe, 0x4a11, {0xa2, 0xec, 0xd8, 0x62, 0x8, 0xf7, 0xc0, 0xa2}};
263QString QWindowsFontEngineDirectWrite::filenameFromFontFile(IDWriteFontFile *fontFile)
265 IDWriteFontFileLoader *loader =
nullptr;
267 HRESULT hr = fontFile->GetLoader(&loader);
275 reinterpret_cast<void **
>(&localLoader));
277 const void *fontFileReferenceKey =
nullptr;
278 UINT32 fontFileReferenceKeySize = 0;
280 hr = fontFile->GetReferenceKey(&fontFileReferenceKey,
281 &fontFileReferenceKeySize);
283 qErrnoWarning(hr,
"%s: GetReferenceKey failed", __FUNCTION__);
286 UINT32 filePathLength = 0;
288 hr = localLoader->GetFilePathLengthFromKey(fontFileReferenceKey,
289 fontFileReferenceKeySize,
296 if (SUCCEEDED(hr) && filePathLength > 0) {
297 QVarLengthArray<wchar_t> filePath(filePathLength + 1);
299 hr = localLoader->GetFilePathFromKey(fontFileReferenceKey,
300 fontFileReferenceKeySize,
304 qErrnoWarning(hr,
"%s: GetFilePathFromKey failed", __FUNCTION__);
309 if (localLoader !=
nullptr)
310 localLoader->Release();
312 if (loader !=
nullptr)
319 if (m_fontEngineData ==
nullptr || m_directWriteFontFace ==
nullptr)
323 HRESULT hr = m_fontEngineData->directWriteGdiInterop->ConvertFontFaceToLOGFONT(m_directWriteFontFace,
327 return CreateFontIndirect(&lf);
336 m_directWriteFontFace->GetMetrics(&
metrics);
345void QWindowsFontEngineDirectWrite::collectMetrics()
349 m_directWriteFontFace->GetMetrics(&
metrics);
350 m_unitsPerEm =
metrics.designUnitsPerEm;
357 IDWriteFontFile *fontFile =
nullptr;
358 UINT32 numberOfFiles = 1;
359 if (SUCCEEDED(m_directWriteFontFace->GetFiles(&numberOfFiles, &fontFile))) {
365 const int advanceWidthMaxLocation = 10;
366 if (
table.size() >= advanceWidthMaxLocation +
int(
sizeof(
quint16))) {
367 quint16 advanceWidthMax = qFromBigEndian<quint16>(
table.constData() + advanceWidthMaxLocation);
376 if (m_underlinePosition > 0)
377 return m_underlinePosition;
384 if (m_lineThickness > 0)
385 return m_lineThickness;
394 const void *tableData = 0;
396 void *tableContext = 0;
398 HRESULT hr = m_directWriteFontFace->TryGetFontTable(qbswap<quint32>(
tag),
399 &tableData, &tableSize,
400 &tableContext, &exists);
405 memcpy(
buffer, tableData, tableSize);
409 m_directWriteFontFace->ReleaseFontTable(tableContext);
419 if (m_unitsPerEm > 0)
439 int *nglyphs, QFontEngine::ShaperFlags
flags)
const
442 if (*nglyphs <
len) {
447 QVarLengthArray<UINT32> codePoints(
len);
448 int actualLength = 0;
451 codePoints[actualLength++] =
it.next();
453 QVarLengthArray<UINT16> glyphIndices(actualLength);
454 HRESULT hr = m_directWriteFontFace->GetGlyphIndicesW(codePoints.data(), actualLength,
455 glyphIndices.data());
461 int mappedGlyphs = 0;
462 for (
int i = 0;
i < actualLength; ++
i) {
463 glyphs->
glyphs[
i] = glyphIndices.at(
i);
468 *nglyphs = actualLength;
484 QVarLengthArray<UINT16> glyphIndices(glyphs->
numGlyphs);
488 glyphIndices[
i] = UINT16(glyphs->
glyphs[
i]);
490 QVarLengthArray<DWRITE_GLYPH_METRICS> glyphMetrics(glyphIndices.size());
493 DWRITE_RENDERING_MODE renderMode = hintingPreferenceToRenderingMode(
fontDef);
495 if (!needsDesignMetrics && (renderMode == DWRITE_RENDERING_MODE_GDI_CLASSIC
496 || renderMode == DWRITE_RENDERING_MODE_GDI_NATURAL
497 || renderMode == DWRITE_RENDERING_MODE_ALIASED)) {
498 hr = m_directWriteFontFace->GetGdiCompatibleGlyphMetrics(
float(
fontDef.
pixelSize),
501 renderMode == DWRITE_RENDERING_MODE_GDI_NATURAL,
504 glyphMetrics.data());
506 hr = m_directWriteFontFace->GetDesignGlyphMetrics(glyphIndices.data(),
508 glyphMetrics.data());
515 qErrnoWarning(
"%s: GetDesignGlyphMetrics failed", __FUNCTION__);
523 float advance = 0.0f;
525 DWRITE_GLYPH_OFFSET
offset;
527 offset.ascenderOffset = 0;
528 GeometrySink geometrySink(
path);
529 HRESULT hr = m_directWriteFontFace->GetGlyphRunOutline(m_unitsPerEm,
538 qErrnoWarning(
"%s: GetGlyphRunOutline failed", __FUNCTION__);
542 DWRITE_GLYPH_METRICS glyphMetrics;
543 hr = m_directWriteFontFace->GetDesignGlyphMetrics(&
g, 1, &glyphMetrics);
545 qErrnoWarning(
"%s: GetDesignGlyphMetrics failed", __FUNCTION__);
549 QFixed advanceWidth =
QFixed(
int(glyphMetrics.advanceWidth));
550 QFixed leftSideBearing =
QFixed(glyphMetrics.leftSideBearing);
551 QFixed rightSideBearing =
QFixed(glyphMetrics.rightSideBearing);
552 QFixed advanceHeight =
QFixed(
int(glyphMetrics.advanceHeight));
553 QFixed verticalOriginY =
QFixed(glyphMetrics.verticalOriginY);
554 QFixed topSideBearing =
QFixed(glyphMetrics.topSideBearing);
555 QFixed bottomSideBearing =
QFixed(glyphMetrics.bottomSideBearing);
556 QFixed width = advanceWidth - leftSideBearing - rightSideBearing;
557 QFixed height = advanceHeight - topSideBearing - bottomSideBearing;
559 -verticalOriginY + topSideBearing,
570 QVarLengthArray<UINT16> glyphIndices(nglyphs);
571 QVarLengthArray<DWRITE_GLYPH_OFFSET> glyphOffsets(nglyphs);
572 QVarLengthArray<FLOAT> glyphAdvances(nglyphs);
574 for (
int i=0;
i<nglyphs; ++
i) {
575 glyphIndices[
i] = glyphs[
i];
576 glyphOffsets[
i].advanceOffset =
positions[
i].x.toReal();
577 glyphOffsets[
i].ascenderOffset = -
positions[
i].y.toReal();
578 glyphAdvances[
i] = 0.0;
581 GeometrySink geometrySink(
path);
582 HRESULT hr = m_directWriteFontFace->GetGlyphRunOutline(
585 glyphAdvances.data(),
594 qErrnoWarning(
"%s: GetGlyphRunOutline failed", __FUNCTION__);
614 DWRITE_GLYPH_METRICS glyphMetrics;
615 HRESULT hr = m_directWriteFontFace->GetDesignGlyphMetrics(&
glyphIndex, 1, &glyphMetrics);
624 QFixed width = advanceWidth - leftSideBearing - rightSideBearing;
625 QFixed height = advanceHeight - topSideBearing - bottomSideBearing;
627 -verticalOriginY + topSideBearing,
633 qErrnoWarning(
"%s: GetDesignGlyphMetrics failed", __FUNCTION__);
641 if (m_capHeight <= 0)
654 return m_maxAdvanceWidth.
toReal();
686 DWRITE_RENDERING_MODE renderMode = hintingPreferenceToRenderingMode(
fontDef);
687 return (renderMode != DWRITE_RENDERING_MODE_GDI_CLASSIC
688 && renderMode != DWRITE_RENDERING_MODE_GDI_NATURAL
689 && renderMode != DWRITE_RENDERING_MODE_ALIASED);
694 IDWriteFontFace2 *directWriteFontFace2;
695 if (SUCCEEDED(m_directWriteFontFace->QueryInterface(__uuidof(IDWriteFontFace2),
696 reinterpret_cast<void **
>(&directWriteFontFace2)))) {
698 directWriteFontFace2->GetMetrics(&
metrics);
701 p.emSquare =
metrics.designUnitsPerEm;
710 p.lineWidth =
metrics.underlineThickness;
712 directWriteFontFace2->Release();
726 FLOAT glyphAdvance = 0;
728 DWRITE_GLYPH_OFFSET glyphOffset;
729 glyphOffset.advanceOffset = 0;
730 glyphOffset.ascenderOffset = 0;
732 DWRITE_GLYPH_RUN glyphRun;
733 glyphRun.fontFace = m_directWriteFontFace;
735 glyphRun.glyphCount = 1;
737 glyphRun.glyphAdvances = &glyphAdvance;
738 glyphRun.isSideways =
false;
739 glyphRun.bidiLevel = 0;
740 glyphRun.glyphOffsets = &glyphOffset;
754 DWRITE_RENDERING_MODE renderMode = hintingPreferenceToRenderingMode(
fontDef);
755 DWRITE_MEASURING_MODE measureMode =
759 ? DWRITE_GRID_FIT_MODE_DISABLED
760 : DWRITE_GRID_FIT_MODE_DEFAULT;
762 IDWriteFactory2 *factory2 =
nullptr;
763 HRESULT hr = m_fontEngineData->directWriteFactory->QueryInterface(__uuidof(IDWriteFactory2),
764 reinterpret_cast<void **
>(&factory2));
765 IDWriteGlyphRunAnalysis *glyphAnalysis = NULL;
766 if (!SUCCEEDED(hr)) {
767 qErrnoWarning(hr,
"%s: Failed to query IDWriteFactory2 interface.", __FUNCTION__);
768 hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
778 hr = factory2->CreateGlyphRunAnalysis(
784 DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE,
792 glyphAnalysis->GetAlphaTextureBounds(renderMode == DWRITE_RENDERING_MODE_ALIASED
793 ? DWRITE_TEXTURE_ALIASED_1x1
794 : DWRITE_TEXTURE_CLEARTYPE_3x1,
803 rect.bottom + margin));
811 IDWriteColorGlyphRunEnumerator *enumerator = 0;
813 hr = factory2->TranslateColorGlyphRun(0.0f,
825 image.fill(0xffffffff);
831 while (SUCCEEDED(hr) &&
ok) {
832 const DWRITE_COLOR_GLYPH_RUN *colorGlyphRun = 0;
833 hr = enumerator->GetCurrentRun(&colorGlyphRun);
835 qErrnoWarning(hr,
"%s: IDWriteColorGlyphRunEnumerator::GetCurrentRun failed", __FUNCTION__);
839 IDWriteGlyphRunAnalysis *colorGlyphsAnalysis = NULL;
840 hr = factory2->CreateGlyphRunAnalysis(
841 &colorGlyphRun->glyphRun,
846 DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE,
852 qErrnoWarning(hr,
"%s: CreateGlyphRunAnalysis failed for color run", __FUNCTION__);
857 if (colorGlyphRun->paletteIndex == 0xFFFF) {
859 g = float(
color.greenF());
861 a = float(
color.alphaF());
863 r =
qBound(0.0f, colorGlyphRun->runColor.r, 1.0f);
864 g =
qBound(0.0f, colorGlyphRun->runColor.g, 1.0f);
865 b =
qBound(0.0f, colorGlyphRun->runColor.b, 1.0f);
866 a =
qBound(0.0f, colorGlyphRun->runColor.a, 1.0f);
870 renderGlyphRun(&
image,
879 colorGlyphsAnalysis->Release();
881 hr = enumerator->MoveNext(&
ok);
883 qErrnoWarning(hr,
"%s: IDWriteColorGlyphRunEnumerator::MoveNext failed", __FUNCTION__);
891 g = float(
color.greenF());
893 a = float(
color.alphaF());
898 renderGlyphRun(&
image,
908 glyphAnalysis->Release();
911 qErrnoWarning(hr,
"%s: CreateGlyphRunAnalysis failed", __FUNCTION__);
922 IDWriteGlyphRunAnalysis *glyphAnalysis,
924 DWRITE_RENDERING_MODE renderMode)
941 QVarLengthArray<BYTE, 1024> alphaValueArray(
size);
942 BYTE *alphaValues = alphaValueArray.data();
943 memset(alphaValues, 0,
size);
945 HRESULT hr = glyphAnalysis->CreateAlphaTexture(renderMode == DWRITE_RENDERING_MODE_ALIASED
946 ? DWRITE_TEXTURE_ALIASED_1x1
947 : DWRITE_TEXTURE_CLEARTYPE_3x1,
958 float redAlpha =
a * *
src++ / 255.0;
959 float greenAlpha =
a * *
src++ / 255.0;
960 float blueAlpha =
a * *
src++ / 255.0;
961 float averageAlpha = (redAlpha + greenAlpha + blueAlpha) / 3.0;
963 QRgb currentRgb = dest[
x];
964 dest[
x] =
qRgba(
qRound(
qRed(currentRgb) * (1.0 - averageAlpha) + averageAlpha *
r),
965 qRound(
qGreen(currentRgb) * (1.0 - averageAlpha) + averageAlpha *
g),
966 qRound(
qBlue(currentRgb) * (1.0 - averageAlpha) + averageAlpha *
b),
967 qRound(
qAlpha(currentRgb) * (1.0 - averageAlpha) + averageAlpha * 255));
970 }
else if (renderMode == DWRITE_RENDERING_MODE_ALIASED) {
986 dest[
x] = *(
src + 0) << 16
995 qErrnoWarning(
"%s: CreateAlphaTexture failed", __FUNCTION__);
998 glyphAnalysis->Release();
999 qWarning(
"%s: Glyph has no bounds", __FUNCTION__);
1012 return mask.depth() == 32
1025 if (!m_uniqueFamilyName.
isEmpty()) {
1036 return m_directWriteFontFace;
1051#if QT_CONFIG(directwrite3)
1052 IDWriteFontFace3 *face3 =
nullptr;
1053 if (SUCCEEDED(m_directWriteFontFace->QueryInterface(__uuidof(IDWriteFontFace3),
1054 reinterpret_cast<void **
>(&face3)))) {
1055 IDWriteLocalizedStrings *
names;
1056 if (SUCCEEDED(face3->GetFaceNames(&
names))) {
1057 wchar_t englishLocale[] = L
"en-us";
1063 if (face3->GetPaletteEntryCount() > 0)
1075 LR
"(Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes)")
1077 return substitute.
isEmpty() ? familyName : substitute;
1094 FLOAT glyphAdvance = 0;
1096 DWRITE_GLYPH_OFFSET glyphOffset;
1097 glyphOffset.advanceOffset = 0;
1098 glyphOffset.ascenderOffset = 0;
1100 DWRITE_GLYPH_RUN glyphRun;
1101 glyphRun.fontFace = m_directWriteFontFace;
1103 glyphRun.glyphCount = 1;
1105 glyphRun.glyphAdvances = &glyphAdvance;
1106 glyphRun.isSideways =
false;
1107 glyphRun.bidiLevel = 0;
1108 glyphRun.glyphOffsets = &glyphOffset;
1118 DWRITE_RENDERING_MODE renderMode = hintingPreferenceToRenderingMode(
fontDef);
1121 ? DWRITE_GRID_FIT_MODE_DISABLED
1122 : DWRITE_GRID_FIT_MODE_DEFAULT;
1124 IDWriteFactory2 *factory2 =
nullptr;
1125 HRESULT hr = m_fontEngineData->directWriteFactory->QueryInterface(__uuidof(IDWriteFactory2),
1126 reinterpret_cast<void **
>(&factory2));
1128 IDWriteGlyphRunAnalysis *glyphAnalysis = NULL;
1129 if (SUCCEEDED(hr)) {
1130 hr = factory2->CreateGlyphRunAnalysis(
1136 DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE,
1141 hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
1152 if (SUCCEEDED(hr)) {
1154 glyphAnalysis->GetAlphaTextureBounds(renderMode == DWRITE_RENDERING_MODE_ALIASED ? DWRITE_TEXTURE_ALIASED_1x1 : DWRITE_TEXTURE_CLEARTYPE_3x1, &
rect);
1155 glyphAnalysis->Release();
1164 rect.right -
rect.left + margin * 2,
1165 rect.bottom -
rect.top + margin * 2,
1166 bbox.xoff, bbox.yoff);
The QColor class provides colors based on RGB, HSV or CMYK values.
static QByteArray encodeName(const QString &fileName)
Converts fileName to an 8-bit encoding that you can use in native APIs.
virtual QFixed descent() const
virtual Properties properties() const
void loadKerningPairs(QFixed scalingFactor)
QFixed calculatedCapHeight() const
static bool isIgnorableChar(char32_t ucs4)
virtual QFixed ascent() const
virtual int glyphMargin(GlyphFormat format)
QFixed firstLeftBearing(const QGlyphLayout &glyphs)
QByteArray getSfntTable(uint tag) const
virtual void initializeHeightMetrics() const
virtual QFixed lineThickness() const
virtual QFixed underlinePosition() const
virtual glyph_metrics_t boundingBox(const QGlyphLayout &glyphs)
QFixed lastRightBearing(const QGlyphLayout &glyphs)
virtual QFixed emSquareSize() const
static QPlatformIntegration * platformIntegration()
int width() const
Returns the width of the image.
int height() const
Returns the height of the image.
@ Format_ARGB32_Premultiplied
const uchar * constScanLine(int) const
Returns a pointer to the pixel data at the scanline with index i.
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
static QString fromWCharArray(const wchar_t *string, qsizetype size=-1)
QString stringValue(QStringView subKey) const
Font database for Windows.
Windows font engine using Direct Write.
Qt::HANDLE handle() const override
void getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics) override
void setUniqueFamilyName(const QString &newName)
bool getSfntTableData(uint tag, uchar *buffer, uint *length) const override
Returns true if the font table idetified by tag exists in the font; returns false otherwise.
void initializeHeightMetrics() const override
Properties properties() const override
glyph_metrics_t boundingBox(const QGlyphLayout &glyphs) override
QFixed lineThickness() const override
QImage alphaMapForGlyph(glyph_t glyph, const QFixedPoint &subPixelPosition) override
QFixed xHeight() const override
glyph_metrics_t alphaMapBoundingBox(glyph_t glyph, const QFixedPoint &, const QTransform &matrix, GlyphFormat) override
HFONT createHFONT() const
~QWindowsFontEngineDirectWrite() override
void initFontInfo(const QFontDef &request, int dpi)
QFontEngine * cloneWithSize(qreal pixelSize) const override
qreal maxCharWidth() const override
glyph_t glyphIndex(uint ucs4) const override
QFixed capHeight() const override
FaceId faceId() const override
static QString fontNameSubstitute(const QString &familyName)
bool supportsHorizontalSubPixelPositions() const override
void recalcAdvances(QGlyphLayout *glyphs, ShaperFlags) const override
QWindowsFontEngineDirectWrite(IDWriteFontFace *directWriteFontFace, qreal pixelSize, const QSharedPointer< QWindowsFontEngineData > &d)
QFixed emSquareSize() const override
QImage alphaRGBMapForGlyph(glyph_t t, const QFixedPoint &subPixelPosition, const QTransform &xform) override
QImage bitmapForGlyph(glyph_t, const QFixedPoint &subPixelPosition, const QTransform &t, const QColor &color) override
void addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, QPainterPath *path, QTextItem::RenderFlags flags) override
int stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, ShaperFlags flags) const override
QFixed underlinePosition() const override
QSet< QString >::iterator it
void qErrnoWarning(const char *msg,...)
Combined button and popup list for selecting options.
#define QT_WARNING_DISABLE_CLANG(text)
AudioChannelLayoutTag tag
static const QCssKnownValue positions[NumKnownPositionModes - 1]
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char * destination
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
bool qFuzzyIsNull(qfloat16 f) noexcept
int qRound(qfloat16 d) noexcept
#define qCDebug(category,...)
constexpr const T & qBound(const T &min, const T &val, const T &max)
GLboolean GLboolean GLboolean b
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
GLint GLsizei GLsizei height
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLuint GLenum GLsizei length
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
GLenum GLuint GLintptr offset
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
GLint GLsizei GLsizei GLenum format
GLuint GLenum GLenum transform
GLfixed GLfixed GLint GLint GLfixed points
GLsizei const GLchar *const * path
GLfloat GLfloat GLfloat alpha
GLenum GLenum GLsizei void * table
static const QRectF boundingRect(const QPointF *points, int pointCount)
QT_BEGIN_NAMESPACE typedef unsigned int QRgb
constexpr int qRed(QRgb rgb)
constexpr int qGreen(QRgb rgb)
constexpr int qGray(int r, int g, int b)
constexpr QRgb qRgba(int r, int g, int b, int a)
constexpr int qBlue(QRgb rgb)
constexpr int qAlpha(QRgb rgb)
IUIViewSettingsInterop __RPC__in REFIID riid
static UUID uuidIdWriteLocalFontFileLoader()
IDWriteLocalFontFileLoader QIdWriteLocalFontFileLoader
#define DESIGN_TO_LOGICAL(DESIGN_UNIT_VALUE)
static DWRITE_MEASURING_MODE renderModeToMeasureMode(DWRITE_RENDERING_MODE renderMode)
QNetworkRequest request(url)
static constexpr QFixed fromReal(qreal r)
constexpr int toInt() const
constexpr qreal toReal() const
QMap< QFont::Tag, float > variableAxes
The QFont::Tag type provides access to advanced font features.
QFixed effectiveAdvance(int item) const