7#include <QtCore/qt_windows.h>
8#if QT_CONFIG(directwrite)
11#include <QtGui/qpa/qplatformintegration.h>
12#include <QtGui/private/qtextengine_p.h>
13#include <QtGui/private/qguiapplication_p.h>
14#include <QtGui/QPaintDevice>
15#include <QtGui/QBitmap>
16#include <QtGui/QPainter>
17#include <QtGui/private/qpainter_p.h>
18#include <QtGui/QPaintEngine>
19#include <QtGui/private/qpaintengine_raster_p.h>
20#include <QtGui/private/qtgui-config_p.h>
22#include <QtCore/QtEndian>
23#include <QtCore/QFile>
24#include <QtCore/qmath.h>
25#include <QtCore/QTextStream>
26#include <QtCore/QThreadStorage>
27#include <QtCore/private/qsystemlibrary_p.h>
28#include <QtCore/private/qstringiterator_p.h>
30#include <QtCore/QDebug>
34#if QT_CONFIG(directwrite)
45#ifndef TT_PRIM_CSPLINE
46#define TT_PRIM_CSPLINE 3
50#define MAKE_LITTLE_ENDIAN_TAG(ch1, ch2, ch3, ch4) (\
51 (((quint32)(ch4)) << 24) | \
52 (((quint32)(ch3)) << 16) | \
53 (((quint32)(ch2)) << 8) | \
71 const auto size = GetOutlineTextMetrics(hdc, 0,
nullptr);
72 auto otm =
reinterpret_cast<OUTLINETEXTMETRIC *
>(malloc(
size));
73 GetOutlineTextMetrics(hdc,
size, otm);
77bool QWindowsFontEngine::hasCFFTable()
const
79 HDC hdc = m_fontEngineData->
hdc;
80 SelectObject(hdc, hfont);
84bool QWindowsFontEngine::hasCMapTable()
const
86 HDC hdc = m_fontEngineData->
hdc;
87 SelectObject(hdc, hfont);
99 ttf = (bool)(tm.tmPitchAndFamily & TMPF_TRUETYPE) || hasCMapTable();
101 cffTable = hasCFFTable();
103 HDC hdc = m_fontEngineData->
hdc;
104 SelectObject(hdc, hfont);
109 cmapTable.
size(), &symb, &cmapSize);
120 unitsPerEm = int(otm->otmEMSquare);
121 const QFixed unitsPerEmF(unitsPerEm);
123 x_height = int(otm->otmsXHeight);
126 lineWidth = otm->otmsUnderscoreSize;
131 unitsPerEm = tm.tmHeight;
142 while (
it.hasNext()) {
143 const uint uc =
it.next();
145 if (!glyphs->
glyphs[glyph_pos] && uc < 0x100)
153 while (
it.hasNext()) {
154 const uint uc =
it.next();
162 while (
it.hasNext()) {
163 const uint uc =
it.next();
164 if (uc >= tm.tmFirstChar && uc <= tm.tmLastChar)
165 glyphs->
glyphs[glyph_pos] = uc;
167 glyphs->
glyphs[glyph_pos] = 0;
188 const QSharedPointer<QWindowsFontEngineData> &fontEngineData)
190 m_fontEngineData(fontEngineData),
196 qCDebug(lcQpaFonts) << __FUNCTION__ <<
name << lf.lfHeight;
197 hfont = CreateFontIndirect(&m_logfont);
203 HDC hdc = m_fontEngineData->
hdc;
204 SelectObject(hdc, hfont);
205 const BOOL
res = GetTextMetrics(hdc, &tm);
208 ZeroMemory(&tm,
sizeof(TEXTMETRIC));
214 cache_cost = tm.tmHeight * tm.tmAveCharWidth * 2000;
217 hasUnreliableOutline = (tm.tmPitchAndFamily & (TMPF_TRUETYPE | TMPF_VECTOR)) == 0;
223 free(designAdvances);
231 if (!DeleteObject(hfont))
232 qErrnoWarning(
"%s: QFontEngineWin: failed to delete font...", __FUNCTION__);
233 qCDebug(lcQpaFonts) << __FUNCTION__ << _name;
235 if (!uniqueFamilyName.
isEmpty()) {
249 if (glyph == 0 && ucs4 < 0x100)
253 }
else if (ucs4 >= tm.tmFirstChar && ucs4 <= tm.tmLastChar) {
262 LOGFONT
f = m_logfont;
263 f.lfHeight = -unitsPerEm;
265 HFONT designFont = CreateFontIndirect(&
f);
266 return SelectObject(m_fontEngineData->
hdc, designFont);
272 if (*nglyphs <
len) {
289 GetCharWidthI(hdc, glyph, 1, 0, &
width);
295 HDC hdc = m_fontEngineData->
hdc;
298 unsigned int glyph = glyphs->
glyphs[
i];
299 if (
int(glyph) >= designAdvancesSize) {
300 const int newSize = int(glyph + 256) >> 8 << 8;
301 designAdvances =
reinterpret_cast<QFixed *
>(realloc(designAdvances,
size_t(newSize) *
sizeof(
QFixed)));
303 for(
int i = designAdvancesSize;
i < newSize; ++
i)
304 designAdvances[
i] = -1000000;
305 designAdvancesSize = newSize;
307 if (designAdvances[glyph] < -999999) {
313 designAdvances[glyph] =
QFixed(
width) / designToDevice;
315 glyphs->
advances[
i] = designAdvances[glyph];
318 DeleteObject(SelectObject(hdc, oldFont));
321 unsigned int glyph = glyphs->
glyphs[
i];
323 if (glyph >= widthCacheSize) {
324 const uint newSize = (glyph + 256) >> 8 << 8;
325 widthCache =
reinterpret_cast<unsigned char *
>(realloc(widthCache, newSize *
sizeof(
QFixed)));
327 memset(widthCache + widthCacheSize, 0, newSize - widthCacheSize);
328 widthCacheSize = newSize;
335 oldFont = SelectObject(hdc, hfont);
340 if (QChar::requiresSurrogates(glyph)) {
341 ch[0] = QChar::highSurrogate(glyph);
342 ch[1] = QChar::lowSurrogate(glyph);
346 GetTextExtentPoint32(hdc,
reinterpret_cast<const wchar_t *
>(
ch), chrLen, &
size);
359 SelectObject(hdc, oldFont);
367 HDC hdc = m_fontEngineData->
hdc;
372 mat.eM11.value = mat.eM22.value = 1;
373 mat.eM11.fract = mat.eM22.fract = 0;
374 mat.eM21.value = mat.eM12.value = 0;
375 mat.eM21.fract = mat.eM12.fract = 0;
383 xform.eM11 = FLOAT(
t.m11());
384 xform.eM12 = FLOAT(
t.m12());
385 xform.eM21 = FLOAT(
t.m21());
386 xform.eM22 = FLOAT(
t.m22());
389 SetGraphicsMode(hdc, GM_ADVANCED);
390 SetWorldTransform(hdc, &
xform);
395 format |= GGO_GLYPH_INDEX;
396 res = GetGlyphOutline(hdc, glyph,
format, &gm, 0, 0, &mat);
402 SetWorldTransform(hdc, &
xform);
403 SetGraphicsMode(hdc, GM_COMPATIBLE);
406 if (
res != GDI_ERROR) {
408 int(gm.gmBlackBoxX),
int(gm.gmBlackBoxY),
409 gm.gmCellIncX, gm.gmCellIncY);
418 HDC hdc = m_fontEngineData->
hdc;
419 SelectObject(hdc, hfont);
424 if (!ttf && !success) {
426 wchar_t ch = wchar_t(glyph);
428 GetCharABCWidthsFloat(hdc,
ch,
ch, &abc);
453 qint16 superscriptXOffset;
454 qint16 superscriptYOffset;
483 if (
size_t(tableData.
size()) >=
sizeof(OS2Table)) {
484 const OS2Table *
table =
reinterpret_cast<const OS2Table *
>(tableData.
constData());
485 if (qFromBigEndian<quint16>(
table->version) >= 2) {
503 return tm.tmAveCharWidth;
508 return tm.tmMaxCharWidth;
539 HDC hdc = m_fontEngineData->
hdc;
540 SelectObject(hdc, hfont);
544 GetCharABCWidthsI(hdc, glyph, 1, 0, &abcWidths);
546 *leftBearing = abcWidths.abcA;
548 *rightBearing = abcWidths.abcC;
571 if (lbearing == SHRT_MIN)
579 if (rbearing == SHRT_MIN) {
582 HDC hdc = m_fontEngineData->
hdc;
583 SelectObject(hdc, hfont);
586 int n = tm.tmLastChar - tm.tmFirstChar;
589 GetCharABCWidths(hdc, tm.tmFirstChar, tm.tmLastChar, abc);
598 for (
int i = 1;
i <
n;
i++) {
599 if (abc[
i].abcA + abc[
i].abcB + abc[
i].abcC != 0) {
600 ml =
qMin(ml,abc[
i].abcA);
601 mr =
qMin(mr,abc[
i].abcC);
607 int n = tm.tmLastChar - tm.tmFirstChar+1;
609 abc =
new ABCFLOAT[
n];
610 GetCharABCWidthsFloat(hdc, tm.tmFirstChar, tm.tmLastChar, abc);
617 float fml = abc[0].abcfA;
618 float fmr = abc[0].abcfC;
619 for (
int i=1;
i<
n;
i++) {
620 if (abc[
i].abcfA + abc[
i].abcfB + abc[
i].abcfC != 0) {
621 fml =
qMin(fml,abc[
i].abcfA);
622 fmr =
qMin(fmr,abc[
i].abcfC);
637 return ((
p.value << 16) +
p.fract) / 65536.0;
645#define GGO_UNHINTED 0x0100
653 mat.eM11.value = mat.eM22.value = 1;
654 mat.eM11.fract = mat.eM22.fract = 0;
655 mat.eM21.value = mat.eM12.value = 0;
656 mat.eM21.fract = mat.eM12.fract = 0;
658 GLYPHMETRICS gMetric;
659 memset(&gMetric, 0,
sizeof(GLYPHMETRICS));
667 format |= GGO_GLYPH_INDEX;
668 if (GetGlyphOutline(hdc, glyph,
format, &gMetric, 0, 0, &mat) == GDI_ERROR)
671 *metric =
glyph_metrics_t(gMetric.gmptGlyphOrigin.x, -gMetric.gmptGlyphOrigin.y,
672 int(gMetric.gmBlackBoxX),
int(gMetric.gmBlackBoxY),
673 gMetric.gmCellIncX, gMetric.gmCellIncY);
676 uint glyphFormat = GGO_NATIVE;
679 glyphFormat |= GGO_GLYPH_INDEX;
681 const DWORD bufferSize = GetGlyphOutline(hdc, glyph, glyphFormat, &gMetric, 0, 0, &mat);
682 if (bufferSize == GDI_ERROR)
685 char *dataBuffer =
new char[bufferSize];
686 DWORD
ret = GDI_ERROR;
687 ret = GetGlyphOutline(hdc, glyph, glyphFormat, &gMetric, bufferSize, dataBuffer, &mat);
688 if (
ret == GDI_ERROR) {
689 delete [] dataBuffer;
694 DWORD headerOffset = 0;
697 while (headerOffset < bufferSize) {
698 const TTPOLYGONHEADER *ttph =
reinterpret_cast<const TTPOLYGONHEADER *
>(dataBuffer + headerOffset);
701 path->moveTo(lastPoint + oset);
702 offset +=
sizeof(TTPOLYGONHEADER);
703 while (offset < headerOffset + ttph->
cb) {
704 const TTPOLYCURVE *curve =
reinterpret_cast<const TTPOLYCURVE *
>(dataBuffer +
offset);
705 switch (curve->wType) {
707 for (
int i=0;
i<curve->cpfx; ++
i) {
713 case TT_PRIM_QSPLINE: {
717 for (
int i=0;
i<curve->cpfx - 1; ++
i) {
720 if (i < curve->cpfx - 2) {
726 path->quadTo(
p1, endPoint);
733 for (
int i=0;
i<curve->cpfx; ) {
737 path->cubicTo(
p2, p3, p4);
742 qWarning(
"QFontEngineWin::addOutlineToPath, unhandled switch case");
744 offset +=
sizeof(TTPOLYCURVE) + (curve->cpfx-1) *
sizeof(POINTFX);
746 path->closeSubpath();
747 headerOffset += ttph->cb;
749 delete [] dataBuffer;
757 LOGFONT lf = m_logfont;
762 lf.lfHeight = -unitsPerEm;
764 HFONT hf = CreateFontIndirect(&lf);
765 HDC hdc = m_fontEngineData->
hdc;
766 HGDIOBJ oldfont = SelectObject(hdc, hf);
770 for(
int i = 0;
i < nglyphs; ++
i) {
781 DeleteObject(SelectObject(hdc, oldfont));
787 if (tm.tmPitchAndFamily & (TMPF_TRUETYPE | TMPF_VECTOR)) {
811 if (synthesized_flags == -1) {
812 synthesized_flags = 0;
815 HDC hdc = m_fontEngineData->
hdc;
816 SelectObject(hdc, hfont);
818 GetFontData(hdc, HEAD, 44, &
data, 4);
820 if (tm.tmItalic && !(macStyle & 2))
824 if (tm.tmWeight >= 500 && tm.tmWeight < 750 && !(macStyle & 1))
830 return synthesized_flags;
840 LOGFONT lf = m_logfont;
841 lf.lfHeight = unitsPerEm;
842 HFONT hf = CreateFontIndirect(&lf);
843 HDC hdc = m_fontEngineData->
hdc;
844 HGDIOBJ oldfont = SelectObject(hdc, hf);
848 p.italicAngle = otm->otmItalicAngle;
852 p.boundingBox =
QRectF(otm->otmrcFontBox.left, -otm->otmrcFontBox.top,
853 otm->otmrcFontBox.right - otm->otmrcFontBox.left,
854 otm->otmrcFontBox.top - otm->otmrcFontBox.bottom);
855 p.ascent = otm->otmAscent;
856 p.descent = -otm->otmDescent;
857 p.leading = int(otm->otmLineGap);
859 p.lineWidth = otm->otmsUnderscoreSize;
861 DeleteObject(SelectObject(hdc, oldfont));
867 LOGFONT lf = m_logfont;
868 lf.lfHeight = -unitsPerEm;
873 HFONT hf = CreateFontIndirect(&lf);
874 HDC hdc = m_fontEngineData->
hdc;
875 HGDIOBJ oldfont = SelectObject(hdc, hf);
880 DeleteObject(SelectObject(hdc, oldfont));
885 if (!ttf && !cffTable)
887 HDC hdc = m_fontEngineData->
hdc;
888 SelectObject(hdc, hfont);
889 DWORD
t = qbswap<quint32>(
tag);
892 return *
length != GDI_ERROR;
895#if !defined(CLEARTYPE_QUALITY)
896# define CLEARTYPE_QUALITY 5
908 int gx = gm.x.toInt();
909 int gy = gm.y.toInt();
910 int iw = gm.width.toInt();
911 int ih = gm.height.toInt();
913 if (iw <= 0 || ih <= 0)
918 unsigned int options = ttf ? ETO_GLYPH_INDEX : 0;
921 if (has_transformation) {
922 xform.eM11 = FLOAT(
t.m11());
923 xform.eM12 = FLOAT(
t.m12());
924 xform.eM21 = FLOAT(
t.m21());
925 xform.eM22 = FLOAT(
t.m22());
929 const HDC hdc = m_fontEngineData->
hdc;
931 SetGraphicsMode(hdc, GM_ADVANCED);
932 SetWorldTransform(hdc, &
xform);
933 HGDIOBJ old_font = SelectObject(hdc,
font);
935 const UINT ggo_options = GGO_METRICS | (ttf ? GGO_GLYPH_INDEX : 0);
938 memset(&mat, 0,
sizeof(mat));
939 mat.eM11.value = mat.eM22.value = 1;
941 const DWORD
result = GetGlyphOutline(hdc, glyph, ggo_options, &tgm, 0, 0, &mat);
943 XFORM identity = {1, 0, 0, 1, 0, 0};
944 SetWorldTransform(hdc, &identity);
945 SetGraphicsMode(hdc, GM_COMPATIBLE);
946 SelectObject(hdc, old_font);
948 if (
result == GDI_ERROR) {
949 const int errorCode = int(GetLastError());
950 qErrnoWarning(errorCode,
"QWinFontEngine: unable to query transformed glyph metrics (GetGlyphOutline() failed, error %d)...", errorCode);
954 iw = int(tgm.gmBlackBoxX);
955 ih = int(tgm.gmBlackBoxY);
957 xform.eDx -= tgm.gmptGlyphOrigin.x;
958 xform.eDy += tgm.gmptGlyphOrigin.y;
969 ni->image().fill(0xffffffff);
973 SelectObject(hdc, GetStockObject(NULL_BRUSH));
974 SelectObject(hdc, GetStockObject(BLACK_PEN));
975 SetTextColor(hdc, RGB(0,0,0));
976 SetBkMode(hdc, TRANSPARENT);
977 SetTextAlign(hdc, TA_BASELINE);
979 HGDIOBJ old_font = SelectObject(hdc,
font);
981 if (has_transformation) {
982 SetGraphicsMode(hdc, GM_ADVANCED);
983 SetWorldTransform(hdc, &
xform);
984 ExtTextOut(hdc, 0, 0, options, 0,
reinterpret_cast<LPCWSTR
>(&glyph), 1, 0);
986 ExtTextOut(hdc, -gx + margin, -gy + margin, options, 0,
reinterpret_cast<LPCWSTR
>(&glyph), 1, 0);
989 SelectObject(hdc, old_font);
1002 gm.width += margin * 2;
1003 gm.height += margin * 2;
1011 bool clearTypeTemporarilyDisabled = (m_fontEngineData->
clearTypeEnabled && m_logfont.lfQuality != NONANTIALIASED_QUALITY);
1012 if (clearTypeTemporarilyDisabled) {
1013 LOGFONT lf = m_logfont;
1014 lf.lfQuality = ANTIALIASED_QUALITY;
1015 font = CreateFontIndirect(&lf);
1032 for (
int y=0;
y<
mask->height(); ++
y) {
1033 uchar *dest = alphaMap.scanLine(
y);
1036 for (
int x=0;
x<
mask->width(); ++
x)
1039 const uint *
src =
reinterpret_cast<const uint *
>(
mask->image().constScanLine(
y));
1040 for (
int x=0;
x<
mask->width(); ++
x) {
1051 if (clearTypeTemporarilyDisabled) {
1058#define SPI_GETFONTSMOOTHINGCONTRAST 0x200C
1059#define SPI_SETFONTSMOOTHINGCONTRAST 0x200D
1084 for (
int y=0;
y<
mask->height(); ++
y) {
1085 auto dest =
reinterpret_cast<uint *
>(rgbMask.scanLine(
y));
1087 for (
int x=0;
x<
mask->width(); ++
x) {
1088 dest[
x] = 0xffffffff - (0x00ffffff &
src[
x]);
1101 if (!uniqueFamilyName.
isEmpty())
1103 request.pixelSize = pixelSize;
1112 if (!uniqueFamilyName.
isEmpty()) {
1132 HDC dc = m_fontEngineData->
hdc;
1133 SelectObject(dc, hfont);
1135 GetTextFace(dc, 64,
n);
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
static QByteArray encodeName(const QString &fileName)
Converts fileName to an 8-bit encoding that you can use in native APIs.
void loadKerningPairs(QFixed scalingFactor)
QFixed calculatedCapHeight() const
static const uchar * getCMap(const uchar *table, uint tableSize, bool *isSymbolFont, int *cmapSize)
static QByteArray convertToPostscriptFontFamilyName(const QByteArray &fontFamily)
virtual void getGlyphBearings(glyph_t glyph, qreal *leftBearing=nullptr, qreal *rightBearing=nullptr)
static bool isIgnorableChar(char32_t ucs4)
virtual int glyphMargin(GlyphFormat format)
QByteArray getSfntTable(uint tag) const
virtual void initializeHeightMetrics() const
virtual void addOutlineToPath(qreal, qreal, const QGlyphLayout &, QPainterPath *, QTextItem::RenderFlags flags)
virtual QFixed lineThickness() const
void addBitmapFontToPath(qreal x, qreal y, const QGlyphLayout &, QPainterPath *, QTextItem::RenderFlags)
static quint32 getTrueTypeGlyphIndex(const uchar *cmap, int cmapSize, uint unicode)
virtual bool hasUnreliableGlyphOutline() const
virtual QFixed xHeight() const
static QPlatformIntegration * platformIntegration()
Format
The following image formats are available in Qt.
\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)
static HFONT systemFont()
static int defaultVerticalDPI()
Font database for Windows.
static QFontEngine * createEngine(const QFontDef &request, const QString &faceName, int dpi, const QSharedPointer< QWindowsFontEngineData > &data)
Standard Windows font engine.
QFixed averageCharWidth() const override
bool getOutlineMetrics(glyph_t glyph, const QTransform &t, glyph_metrics_t *metrics) const
QFixed xHeight() const override
int stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, ShaperFlags flags) const override
void setUniqueFamilyName(const QString &newName)
void addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, QPainterPath *path, QTextItem::RenderFlags flags) override
void addOutlineToPath(qreal x, qreal y, const QGlyphLayout &glyphs, QPainterPath *path, QTextItem::RenderFlags flags) override
glyph_metrics_t boundingBox(glyph_t g) override
glyph_t glyphIndex(uint ucs4) const override
~QWindowsFontEngine() override
HGDIOBJ selectDesignFont() const
FaceId faceId() const override
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 initFontInfo(const QFontDef &request, int dpi)
void initializeHeightMetrics() const override
void recalcAdvances(QGlyphLayout *glyphs, ShaperFlags) const override
QFixed emSquareSize() const override
glyph_metrics_t alphaMapBoundingBox(glyph_t glyph, const QFixedPoint &, const QTransform &matrix, GlyphFormat) override
qreal minLeftBearing() const override
bool hasUnreliableGlyphOutline() const override
QFontEngine * cloneWithSize(qreal pixelSize) const override
int getGlyphIndexes(const QChar *ch, int numChars, QGlyphLayout *glyphs, int *mappedGlyphs) const
QWindowsFontEngine(const QString &name, LOGFONT lf, const QSharedPointer< QWindowsFontEngineData > &fontEngineData)
void getGlyphBearings(glyph_t glyph, qreal *leftBearing=nullptr, qreal *rightBearing=nullptr) override
QFixed capHeight() const override
QFixed lineThickness() const override
QImage alphaRGBMapForGlyph(glyph_t t, const QFixedPoint &subPixelPosition, const QTransform &xform) override
bool supportsTransformation(const QTransform &transform) const override
qreal minRightBearing() const override
QImage alphaMapForGlyph(glyph_t t) override
Qt::HANDLE handle() const override
void getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics) override
Properties properties() const override
int synthesized() const override
qreal maxCharWidth() const override
static QImage::Format systemFormat()
QSet< QString >::iterator it
void qErrnoWarning(const char *msg,...)
Combined button and popup list for selecting options.
QList< QString > QStringList
Constructs a string list that contains the given string, str.
AudioChannelLayoutTag tag
static const QCssKnownValue positions[NumKnownPositionModes - 1]
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
int qRound(qfloat16 d) noexcept
#define qCDebug(category,...)
#define SIZE(large, small, mini)
constexpr const T & qMin(const T &a, const T &b)
GLint GLint GLint GLint GLint x
[0]
GLint GLsizei GLsizei height
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLuint GLenum GLsizei length
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
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
GLsizei GLsizei GLchar * source
GLuint GLenum GLenum transform
GLsizei const GLchar *const * path
GLenum GLenum GLenum GLenum GLenum scale
GLenum GLenum GLsizei void * table
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
constexpr int qGray(int r, int g, int b)
SSL_CTX int(* cb)(SSL *ssl, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
#define qPrintable(string)
#define QT_BEGIN_INCLUDE_NAMESPACE
#define QT_END_INCLUDE_NAMESPACE
quint16 qt_getUShort(const unsigned char *p)
static OUTLINETEXTMETRIC * getOutlineTextMetric(HDC hdc)
static const ushort char_table[]
static bool addGlyphToPath(glyph_t glyph, const QFixedPoint &position, HDC hdc, QPainterPath *path, bool ttf, glyph_metrics_t *metric=nullptr, qreal scale=1.0, qreal stretch=1.0)
void calculateTTFGlyphWidth(HDC hdc, UINT glyph, int &width)
static QString stringFromOutLineTextMetric(const OUTLINETEXTMETRIC *otm, PSTR offset)
#define SPI_SETFONTSMOOTHINGCONTRAST
#define MAKE_LITTLE_ENDIAN_TAG(ch1, ch2, ch3, ch4)
static const int char_table_entries
static double qt_fixed_to_double(const FIXED &p)
static QPointF qt_to_qpointf(const POINTFX &pt, qreal scale, qreal stretch)
#define SPI_GETFONTSMOOTHINGCONTRAST
Q_CHECK_PTR(a=new int[80])
QItemSelection * selection
[0]
QNetworkRequest request(url)
static constexpr QFixed fromReal(qreal r)
constexpr int value() const
The QFont::Tag type provides access to advanced font features.
glyph_metrics_t transformed(const QTransform &xform) const