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;
141 while (
it.hasNext()) {
142 const uint uc =
it.next();
144 if (!glyphs->
glyphs[glyph_pos] && uc < 0x100)
150 while (
it.hasNext()) {
151 const uint uc =
it.next();
157 while (
it.hasNext()) {
158 const uint uc =
it.next();
159 if (uc >= tm.tmFirstChar && uc <= tm.tmLastChar)
160 glyphs->
glyphs[glyph_pos] = uc;
162 glyphs->
glyphs[glyph_pos] = 0;
183 m_fontEngineData(fontEngineData),
189 qCDebug(lcQpaFonts) << __FUNCTION__ <<
name << lf.lfHeight;
190 hfont = CreateFontIndirect(&m_logfont);
196 HDC hdc = m_fontEngineData->
hdc;
197 SelectObject(hdc, hfont);
198 const BOOL
res = GetTextMetrics(hdc, &tm);
201 ZeroMemory(&tm,
sizeof(TEXTMETRIC));
207 cache_cost = tm.tmHeight * tm.tmAveCharWidth * 2000;
210 hasUnreliableOutline = (tm.tmPitchAndFamily & (TMPF_TRUETYPE | TMPF_VECTOR)) == 0;
216 free(designAdvances);
224 if (!DeleteObject(hfont))
225 qErrnoWarning(
"%s: QFontEngineWin: failed to delete font...", __FUNCTION__);
226 qCDebug(lcQpaFonts) << __FUNCTION__ << _name;
228 if (!uniqueFamilyName.
isEmpty()) {
242 if (glyph == 0 && ucs4 < 0x100)
246 }
else if (ucs4 >= tm.tmFirstChar && ucs4 <= tm.tmLastChar) {
255 LOGFONT
f = m_logfont;
256 f.lfHeight = -unitsPerEm;
258 HFONT designFont = CreateFontIndirect(&
f);
259 return SelectObject(m_fontEngineData->
hdc, designFont);
265 if (*nglyphs <
len) {
281 GetCharWidthI(hdc, glyph, 1, 0, &
width);
287 HDC hdc = m_fontEngineData->
hdc;
290 unsigned int glyph = glyphs->
glyphs[
i];
291 if (
int(glyph) >= designAdvancesSize) {
292 const int newSize = int(glyph + 256) >> 8 << 8;
293 designAdvances =
reinterpret_cast<QFixed *
>(realloc(designAdvances,
size_t(newSize) *
sizeof(
QFixed)));
295 for(
int i = designAdvancesSize;
i < newSize; ++
i)
296 designAdvances[
i] = -1000000;
297 designAdvancesSize = newSize;
299 if (designAdvances[glyph] < -999999) {
305 designAdvances[glyph] =
QFixed(
width) / designToDevice;
307 glyphs->
advances[
i] = designAdvances[glyph];
310 DeleteObject(SelectObject(hdc, oldFont));
313 unsigned int glyph = glyphs->
glyphs[
i];
315 if (glyph >= widthCacheSize) {
316 const uint newSize = (glyph + 256) >> 8 << 8;
317 widthCache =
reinterpret_cast<unsigned char *
>(realloc(widthCache, newSize *
sizeof(
QFixed)));
319 memset(widthCache + widthCacheSize, 0, newSize - widthCacheSize);
320 widthCacheSize = newSize;
327 oldFont = SelectObject(hdc, hfont);
338 GetTextExtentPoint32(hdc,
reinterpret_cast<const wchar_t *
>(
ch), chrLen, &
size);
351 SelectObject(hdc, oldFont);
359 HDC hdc = m_fontEngineData->
hdc;
364 mat.eM11.value = mat.eM22.value = 1;
365 mat.eM11.fract = mat.eM22.fract = 0;
366 mat.eM21.value = mat.eM12.value = 0;
367 mat.eM21.fract = mat.eM12.fract = 0;
375 xform.eM11 = FLOAT(
t.m11());
376 xform.eM12 = FLOAT(
t.m12());
377 xform.eM21 = FLOAT(
t.m21());
378 xform.eM22 = FLOAT(
t.m22());
381 SetGraphicsMode(hdc, GM_ADVANCED);
382 SetWorldTransform(hdc, &
xform);
387 format |= GGO_GLYPH_INDEX;
388 res = GetGlyphOutline(hdc, glyph,
format, &gm, 0, 0, &mat);
394 SetWorldTransform(hdc, &
xform);
395 SetGraphicsMode(hdc, GM_COMPATIBLE);
398 if (
res != GDI_ERROR) {
400 int(gm.gmBlackBoxX),
int(gm.gmBlackBoxY),
401 gm.gmCellIncX, gm.gmCellIncY);
410 HDC hdc = m_fontEngineData->
hdc;
411 SelectObject(hdc, hfont);
416 if (!ttf && !success) {
418 wchar_t ch = wchar_t(glyph);
420 GetCharABCWidthsFloat(hdc,
ch,
ch, &abc);
445 qint16 superscriptXOffset;
446 qint16 superscriptYOffset;
475 if (
size_t(tableData.
size()) >=
sizeof(OS2Table)) {
476 const OS2Table *
table =
reinterpret_cast<const OS2Table *
>(tableData.
constData());
477 if (qFromBigEndian<quint16>(
table->version) >= 2) {
495 return tm.tmAveCharWidth;
500 return tm.tmMaxCharWidth;
531 HDC hdc = m_fontEngineData->
hdc;
532 SelectObject(hdc, hfont);
536 GetCharABCWidthsI(hdc, glyph, 1, 0, &abcWidths);
538 *leftBearing = abcWidths.abcA;
540 *rightBearing = abcWidths.abcC;
563 if (lbearing == SHRT_MIN)
571 if (rbearing == SHRT_MIN) {
574 HDC hdc = m_fontEngineData->
hdc;
575 SelectObject(hdc, hfont);
578 int n = tm.tmLastChar - tm.tmFirstChar;
581 GetCharABCWidths(hdc, tm.tmFirstChar, tm.tmLastChar, abc);
590 for (
int i = 1;
i <
n;
i++) {
591 if (abc[
i].abcA + abc[
i].abcB + abc[
i].abcC != 0) {
592 ml =
qMin(ml,abc[
i].abcA);
593 mr =
qMin(mr,abc[
i].abcC);
599 int n = tm.tmLastChar - tm.tmFirstChar+1;
601 abc =
new ABCFLOAT[
n];
602 GetCharABCWidthsFloat(hdc, tm.tmFirstChar, tm.tmLastChar, abc);
609 float fml = abc[0].abcfA;
610 float fmr = abc[0].abcfC;
611 for (
int i=1;
i<
n;
i++) {
612 if (abc[
i].abcfA + abc[
i].abcfB + abc[
i].abcfC != 0) {
613 fml =
qMin(fml,abc[
i].abcfA);
614 fmr =
qMin(fmr,abc[
i].abcfC);
629 return ((
p.value << 16) +
p.fract) / 65536.0;
637#define GGO_UNHINTED 0x0100
645 mat.eM11.value = mat.eM22.value = 1;
646 mat.eM11.fract = mat.eM22.fract = 0;
647 mat.eM21.value = mat.eM12.value = 0;
648 mat.eM21.fract = mat.eM12.fract = 0;
650 GLYPHMETRICS gMetric;
651 memset(&gMetric, 0,
sizeof(GLYPHMETRICS));
659 format |= GGO_GLYPH_INDEX;
660 if (GetGlyphOutline(hdc, glyph,
format, &gMetric, 0, 0, &mat) == GDI_ERROR)
663 *metric =
glyph_metrics_t(gMetric.gmptGlyphOrigin.x, -gMetric.gmptGlyphOrigin.y,
664 int(gMetric.gmBlackBoxX),
int(gMetric.gmBlackBoxY),
665 gMetric.gmCellIncX, gMetric.gmCellIncY);
668 uint glyphFormat = GGO_NATIVE;
671 glyphFormat |= GGO_GLYPH_INDEX;
673 const DWORD bufferSize = GetGlyphOutline(hdc, glyph, glyphFormat, &gMetric, 0, 0, &mat);
674 if (bufferSize == GDI_ERROR)
677 char *dataBuffer =
new char[bufferSize];
678 DWORD
ret = GDI_ERROR;
679 ret = GetGlyphOutline(hdc, glyph, glyphFormat, &gMetric, bufferSize, dataBuffer, &mat);
680 if (
ret == GDI_ERROR) {
681 delete [] dataBuffer;
686 DWORD headerOffset = 0;
689 while (headerOffset < bufferSize) {
690 const TTPOLYGONHEADER *ttph =
reinterpret_cast<const TTPOLYGONHEADER *
>(dataBuffer + headerOffset);
693 path->moveTo(lastPoint + oset);
694 offset +=
sizeof(TTPOLYGONHEADER);
695 while (offset < headerOffset + ttph->
cb) {
696 const TTPOLYCURVE *curve =
reinterpret_cast<const TTPOLYCURVE *
>(dataBuffer +
offset);
697 switch (curve->wType) {
699 for (
int i=0;
i<curve->cpfx; ++
i) {
705 case TT_PRIM_QSPLINE: {
709 for (
int i=0;
i<curve->cpfx - 1; ++
i) {
712 if (i < curve->cpfx - 2) {
718 path->quadTo(
p1, endPoint);
725 for (
int i=0;
i<curve->cpfx; ) {
729 path->cubicTo(
p2, p3, p4);
734 qWarning(
"QFontEngineWin::addOutlineToPath, unhandled switch case");
736 offset +=
sizeof(TTPOLYCURVE) + (curve->cpfx-1) *
sizeof(POINTFX);
738 path->closeSubpath();
739 headerOffset += ttph->cb;
741 delete [] dataBuffer;
749 LOGFONT lf = m_logfont;
754 lf.lfHeight = -unitsPerEm;
756 HFONT hf = CreateFontIndirect(&lf);
757 HDC hdc = m_fontEngineData->
hdc;
758 HGDIOBJ oldfont = SelectObject(hdc, hf);
762 for(
int i = 0;
i < nglyphs; ++
i) {
773 DeleteObject(SelectObject(hdc, oldfont));
779 if (tm.tmPitchAndFamily & (TMPF_TRUETYPE | TMPF_VECTOR)) {
803 if (synthesized_flags == -1) {
804 synthesized_flags = 0;
807 HDC hdc = m_fontEngineData->
hdc;
808 SelectObject(hdc, hfont);
810 GetFontData(hdc, HEAD, 44, &
data, 4);
812 if (tm.tmItalic && !(macStyle & 2))
816 if (tm.tmWeight >= 500 && tm.tmWeight < 750 && !(macStyle & 1))
822 return synthesized_flags;
832 LOGFONT lf = m_logfont;
833 lf.lfHeight = unitsPerEm;
834 HFONT hf = CreateFontIndirect(&lf);
835 HDC hdc = m_fontEngineData->
hdc;
836 HGDIOBJ oldfont = SelectObject(hdc, hf);
839 p.emSquare = unitsPerEm;
840 p.italicAngle = otm->otmItalicAngle;
844 p.boundingBox =
QRectF(otm->otmrcFontBox.left, -otm->otmrcFontBox.top,
845 otm->otmrcFontBox.right - otm->otmrcFontBox.left,
846 otm->otmrcFontBox.top - otm->otmrcFontBox.bottom);
847 p.ascent = otm->otmAscent;
848 p.descent = -otm->otmDescent;
849 p.leading = int(otm->otmLineGap);
851 p.lineWidth = otm->otmsUnderscoreSize;
853 DeleteObject(SelectObject(hdc, oldfont));
859 LOGFONT lf = m_logfont;
860 lf.lfHeight = -unitsPerEm;
865 HFONT hf = CreateFontIndirect(&lf);
866 HDC hdc = m_fontEngineData->
hdc;
867 HGDIOBJ oldfont = SelectObject(hdc, hf);
872 DeleteObject(SelectObject(hdc, oldfont));
877 if (!ttf && !cffTable)
879 HDC hdc = m_fontEngineData->
hdc;
880 SelectObject(hdc, hfont);
881 DWORD
t = qbswap<quint32>(
tag);
884 return *
length != GDI_ERROR;
887#if !defined(CLEARTYPE_QUALITY)
888# define CLEARTYPE_QUALITY 5
905 if (iw <= 0 || ih <= 0)
910 unsigned int options = ttf ? ETO_GLYPH_INDEX : 0;
913 if (has_transformation) {
914 xform.eM11 = FLOAT(
t.m11());
915 xform.eM12 = FLOAT(
t.m12());
916 xform.eM21 = FLOAT(
t.m21());
917 xform.eM22 = FLOAT(
t.m22());
921 const HDC hdc = m_fontEngineData->
hdc;
923 SetGraphicsMode(hdc, GM_ADVANCED);
924 SetWorldTransform(hdc, &
xform);
925 HGDIOBJ old_font = SelectObject(hdc,
font);
927 const UINT ggo_options = GGO_METRICS | (ttf ? GGO_GLYPH_INDEX : 0);
930 memset(&mat, 0,
sizeof(mat));
931 mat.eM11.value = mat.eM22.value = 1;
933 const DWORD
result = GetGlyphOutline(hdc, glyph, ggo_options, &tgm, 0, 0, &mat);
935 XFORM identity = {1, 0, 0, 1, 0, 0};
936 SetWorldTransform(hdc, &identity);
937 SetGraphicsMode(hdc, GM_COMPATIBLE);
938 SelectObject(hdc, old_font);
940 if (
result == GDI_ERROR) {
941 const int errorCode = int(GetLastError());
942 qErrnoWarning(errorCode,
"QWinFontEngine: unable to query transformed glyph metrics (GetGlyphOutline() failed, error %d)...", errorCode);
946 iw = int(tgm.gmBlackBoxX);
947 ih = int(tgm.gmBlackBoxY);
949 xform.eDx -= tgm.gmptGlyphOrigin.x;
950 xform.eDy += tgm.gmptGlyphOrigin.y;
965 SelectObject(hdc, GetStockObject(NULL_BRUSH));
966 SelectObject(hdc, GetStockObject(BLACK_PEN));
967 SetTextColor(hdc, RGB(0,0,0));
968 SetBkMode(hdc, TRANSPARENT);
969 SetTextAlign(hdc, TA_BASELINE);
971 HGDIOBJ old_font = SelectObject(hdc,
font);
973 if (has_transformation) {
974 SetGraphicsMode(hdc, GM_ADVANCED);
975 SetWorldTransform(hdc, &
xform);
976 ExtTextOut(hdc, 0, 0, options, 0,
reinterpret_cast<LPCWSTR
>(&glyph), 1, 0);
978 ExtTextOut(hdc, -gx + margin, -gy + margin, options, 0,
reinterpret_cast<LPCWSTR
>(&glyph), 1, 0);
981 SelectObject(hdc, old_font);
994 gm.
width += margin * 2;
1003 bool clearTypeTemporarilyDisabled = (m_fontEngineData->
clearTypeEnabled && m_logfont.lfQuality != NONANTIALIASED_QUALITY);
1004 if (clearTypeTemporarilyDisabled) {
1005 LOGFONT lf = m_logfont;
1006 lf.lfQuality = ANTIALIASED_QUALITY;
1007 font = CreateFontIndirect(&lf);
1024 for (
int y=0;
y<
mask->height(); ++
y) {
1028 for (
int x=0;
x<
mask->width(); ++
x)
1031 const uint *
src =
reinterpret_cast<const uint *
>(
mask->image().constScanLine(
y));
1032 for (
int x=0;
x<
mask->width(); ++
x) {
1043 if (clearTypeTemporarilyDisabled) {
1050#define SPI_GETFONTSMOOTHINGCONTRAST 0x200C
1051#define SPI_SETFONTSMOOTHINGCONTRAST 0x200D
1076 for (
int y=0;
y<
mask->height(); ++
y) {
1079 for (
int x=0;
x<
mask->width(); ++
x) {
1080 dest[
x] = 0xffffffff - (0x00ffffff &
src[
x]);
1093 if (!uniqueFamilyName.
isEmpty())
1095 request.pixelSize = pixelSize;
1104 if (!uniqueFamilyName.
isEmpty()) {
1124 HDC dc = m_fontEngineData->
hdc;
1125 SelectObject(dc, hfont);
1127 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 constexpr bool requiresSurrogates(char32_t ucs4) noexcept
Returns true if the UCS-4-encoded character specified by ucs4 can be split into the high and low part...
static constexpr char16_t highSurrogate(char32_t ucs4) noexcept
Returns the high surrogate part of a UCS-4-encoded code point.
static constexpr char16_t lowSurrogate(char32_t ucs4) noexcept
Returns the low surrogate part of a UCS-4-encoded code point.
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)
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()
uchar * scanLine(int)
Returns a pointer to the pixel data at the scanline with index i.
Format
The following image formats are available in Qt.
void fill(uint pixel)
Fills the entire image with the given pixelValue.
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\macro QT_RESTRICTED_CAST_FROM_ASCII
QByteArray toLatin1() const &
bool isEmpty() const
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
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
int getGlyphIndexes(const QChar *ch, int numChars, QGlyphLayout *glyphs) const
glyph_t glyphIndex(uint ucs4) const override
~QWindowsFontEngine() override
HGDIOBJ selectDesignFont() const
FaceId faceId() const override
bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, ShaperFlags flags) 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
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.
AudioChannelLayoutTag tag
static const QCssKnownValue positions[NumKnownPositionModes - 1]
int qRound(qfloat16 d) noexcept
#define MAKE_TAG(ch1, ch2, ch3, ch4)
#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
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
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
constexpr int toInt() const
glyph_metrics_t transformed(const QTransform &xform) const