10#if defined(SK_BUILD_FOR_WIN)
40 int weight =
font->GetWeight();
43 switch (
font->GetStyle()) {
50#if defined(NTDDI_WIN10_RS3) && NTDDI_VERSION >= NTDDI_WIN10_RS3
51 [&weight, &
width, &slant, fontFace]() ->
void {
52 SkTScopedComPtr<IDWriteFontFace5> fontFace5;
53 if (
FAILED(fontFace->QueryInterface(&fontFace5))) {
56 if (!fontFace5->HasVariations()) {
60 UINT32 fontAxisCount = fontFace5->GetFontAxisValueCount();
61 SkTScopedComPtr<IDWriteFontResource> fontResource;
62 HRV(fontFace5->GetFontResource(&fontResource));
65 HRV(fontFace5->GetFontAxisValues(fontAxisValue.get(), fontAxisCount));
66 for (UINT32 axisIndex = 0; axisIndex < fontAxisCount; ++axisIndex) {
67 if (fontAxisValue[axisIndex].axisTag == DWRITE_FONT_AXIS_TAG_WEIGHT) {
68 weight = fontAxisValue[axisIndex].value;
70 if (fontAxisValue[axisIndex].axisTag == DWRITE_FONT_AXIS_TAG_WIDTH) {
71 SkScalar wdthValue = fontAxisValue[axisIndex].value;
74 if (fontAxisValue[axisIndex].axisTag == DWRITE_FONT_AXIS_TAG_SLANT &&
77 if (fontAxisValue[axisIndex].value == 0) {
90 IDWriteFactory* factory,
91 IDWriteFontFace* fontFace,
93 IDWriteFontFamily* fontFamily,
98 GetStyle(font, fontFace), factory, fontFace, font, fontFamily, std::move(loaders), palette));
101HRESULT DWriteFontTypeface::initializePalette() {
107 if (dwPaletteCount == 0) {
113 UINT32 basePaletteIndex = 0;
123 0, dwPaletteEntryCount,
125 "Could not retrieve palette entries.");
128 fDWPalette.reset(
new DWRITE_COLOR_F[dwPaletteEntryCount]);
129 for (UINT32 i = 0; i < dwPaletteEntryCount; ++i) {
139 if (SkTFitsIn<UINT32>(paletteOverride.
index) &&
140 SkTo<UINT32>(paletteOverride.
index) < dwPaletteEntryCount)
149 dwColor.r = skColor.fR;
150 dwColor.g = skColor.fG;
151 dwColor.b = skColor.fB;
152 dwColor.a = skColor.fA;
160DWriteFontTypeface::DWriteFontTypeface(
const SkFontStyle& style,
161 IDWriteFactory* factory,
162 IDWriteFontFace* fontFace,
164 IDWriteFontFamily* fontFamily,
168 , fFactory(SkRefComPtr(factory))
169 , fDWriteFontFamily(SkRefComPtr(fontFamily))
170 , fDWriteFont(SkRefComPtr(
font))
171 , fDWriteFontFace(SkRefComPtr(fontFace))
172 , fRequestedPaletteEntryOverrides(palette.overrideCount
176 palette.overrideCount * sizeof(palette.overrides[0]))
178 , fRequestedPalette{palette.index,
179 fRequestedPaletteEntryOverrides.
get(), palette.overrideCount }
180 , fPaletteEntryCount(0)
181 , fLoaders(
std::move(loaders))
183 if (!
SUCCEEDED(fDWriteFontFace->QueryInterface(&fDWriteFontFace1))) {
188 if (!
SUCCEEDED(fDWriteFontFace->QueryInterface(&fDWriteFontFace2))) {
191 if (!
SUCCEEDED(fDWriteFontFace->QueryInterface(&fDWriteFontFace4))) {
194#if DWRITE_CORE || (defined(NTDDI_WIN11_ZN) && NTDDI_VERSION >= NTDDI_WIN11_ZN)
195 if (!
SUCCEEDED(fDWriteFontFace->QueryInterface(&fDWriteFontFace7))) {
199 if (!
SUCCEEDED(fFactory->QueryInterface(&fFactory2))) {
203 if (fDWriteFontFace1 && fDWriteFontFace1->IsMonospacedFont()) {
204 this->setIsFixedPitch(
true);
207 fIsColorFont = fFactory2 && fDWriteFontFace2 && fDWriteFontFace2->IsColorFont();
208 this->initializePalette();
212#if DWRITE_CORE || (defined(NTDDI_WIN11_ZN) && NTDDI_VERSION >= NTDDI_WIN11_ZN)
225 SK_TRACEHR(hr,
"FontCollectionLoader");
230 SK_TRACEHR(hr,
"FontFileLoader");
235 SkTScopedComPtr<IDWriteLocalizedStrings> familyNames;
243 SkTScopedComPtr<IDWriteLocalizedStrings> postScriptNames;
246 DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_NAME,
254 if (skPostScriptName) {
255 *skPostScriptName = localSkPostScriptName;
263 SkTScopedComPtr<IDWriteLocalizedStrings> familyNames;
269 desc->setFamilyName(utf8FamilyName.
c_str());
293 DWRITE_FONT_METRICS metrics;
295 return metrics.designUnitsPerEm;
301 explicit LocalizedStrings_IDWriteLocalizedStrings(IDWriteLocalizedStrings* strings)
302 : fIndex(0), fStrings(strings)
306 if (fIndex >= fStrings->GetCount()) {
312 HRBM(fStrings->GetStringLength(fIndex, &stringLen),
"Could not get string length.");
315 HRBM(fStrings->GetString(fIndex, wString.get(), stringLen+1),
"Could not get string.");
321 HRBM(fStrings->GetLocaleNameLength(fIndex, &localeLen),
"Could not get locale length.");
324 HRBM(fStrings->GetLocaleName(fIndex, wLocale.get(), localeLen+1),
"Could not get locale.");
334 SkTScopedComPtr<IDWriteLocalizedStrings> fStrings;
341 SkTScopedComPtr<IDWriteLocalizedStrings> familyNames;
342 HRNM(
fDWriteFontFamily->GetFamilyNames(&familyNames),
"Could not obtain family names.");
343 nameIter = sk_make_sp<LocalizedStrings_IDWriteLocalizedStrings>(familyNames.release());
356#if defined(NTDDI_WIN10_RS3) && NTDDI_VERSION >= NTDDI_WIN10_RS3
358 SkTScopedComPtr<IDWriteFontFace5> fontFace5;
364 if (!fontFace5->HasVariations()) {
368 UINT32 fontAxisCount = fontFace5->GetFontAxisValueCount();
369 SkTScopedComPtr<IDWriteFontResource> fontResource;
370 HR_GENERAL(fontFace5->GetFontResource(&fontResource),
nullptr, -1);
371 UINT32 variableAxisCount = 0;
372 for (UINT32 i = 0; i < fontAxisCount; ++i) {
373 if (fontResource->GetFontAxisAttributes(i) & DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE) {
378 if (!coordinates || coordinateCount < 0 || (
unsigned)coordinateCount < variableAxisCount) {
379 return SkTo<int>(variableAxisCount);
383 HR_GENERAL(fontFace5->GetFontAxisValues(fontAxisValue.get(), fontAxisCount),
nullptr, -1);
384 UINT32 coordIndex = 0;
385 for (UINT32 axisIndex = 0; axisIndex < fontAxisCount; ++axisIndex) {
386 if (fontResource->GetFontAxisAttributes(axisIndex) & DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE) {
388 coordinates[coordIndex].
value = fontAxisValue[axisIndex].value;
393 SkASSERT(coordIndex == variableAxisCount);
394 return SkTo<int>(variableAxisCount);
405#if defined(NTDDI_WIN10_RS3) && NTDDI_VERSION >= NTDDI_WIN10_RS3
407 SkTScopedComPtr<IDWriteFontFace5> fontFace5;
413 if (!fontFace5->HasVariations()) {
417 UINT32 fontAxisCount = fontFace5->GetFontAxisValueCount();
418 SkTScopedComPtr<IDWriteFontResource> fontResource;
419 HR_GENERAL(fontFace5->GetFontResource(&fontResource),
nullptr, -1);
420 int variableAxisCount = 0;
421 for (UINT32 i = 0; i < fontAxisCount; ++i) {
422 if (fontResource->GetFontAxisAttributes(i) & DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE) {
427 if (!parameters || parameterCount < variableAxisCount) {
428 return variableAxisCount;
432 HR_GENERAL(fontResource->GetFontAxisRanges(fontAxisRange.get(), fontAxisCount),
nullptr, -1);
434 HR_GENERAL(fontResource->GetDefaultFontAxisValues(fontAxisDefaultValue.get(), fontAxisCount),
436 UINT32 coordIndex = 0;
438 for (UINT32 axisIndex = 0; axisIndex < fontAxisCount; ++axisIndex) {
439 if (fontResource->GetFontAxisAttributes(axisIndex) & DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE) {
441 parameters[coordIndex].
min = fontAxisRange[axisIndex].minValue;
442 parameters[coordIndex].
def = fontAxisDefaultValue[axisIndex].value;
443 parameters[coordIndex].
max = fontAxisRange[axisIndex].maxValue;
444 parameters[coordIndex].
setHidden(fontResource->GetFontAxisAttributes(axisIndex) &
445 DWRITE_FONT_AXIS_ATTRIBUTES_HIDDEN);
450 return variableAxisCount;
459 if (
type != DWRITE_FONT_FACE_TYPE_CFF &&
460 type != DWRITE_FONT_FACE_TYPE_TRUETYPE &&
461 type != DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION)
472 size_t length,
void* data)
const
475 if (!
table.fExists) {
496 reinterpret_cast<const void **
>(&data), &size, &lock, &exists);
501 Context(
void* lock, IDWriteFontFace* face) : fLock(lock), fFontFace(SkRefComPtr(face)) {}
502 ~Context() { fFontFace->ReleaseFontTable(fLock); }
504 SkTScopedComPtr<IDWriteFontFace> fFontFace;
507 [](
const void*,
void* ctx) {
delete (
Context*)ctx; },
517#if defined(NTDDI_WIN10_RS3) && NTDDI_VERSION >= NTDDI_WIN10_RS3
519 SkTScopedComPtr<IDWriteFontFace5> fontFace5;
522 UINT32 fontAxisCount = fontFace5->GetFontAxisValueCount();
523 UINT32 argsCoordCount =
args.getVariationDesignPosition().coordinateCount;
525 HRN(fontFace5->GetFontAxisValues(fontAxisValue.get(), fontAxisCount));
527 for (UINT32 fontIndex = 0; fontIndex < fontAxisCount; ++fontIndex) {
528 for (UINT32 argsIndex = 0; argsIndex < argsCoordCount; ++argsIndex) {
530 args.getVariationDesignPosition().coordinates[argsIndex].axis) {
531 fontAxisValue[fontIndex].value =
532 args.getVariationDesignPosition().coordinates[argsIndex].value;
536 SkTScopedComPtr<IDWriteFontResource> fontResource;
537 HRN(fontFace5->GetFontResource(&fontResource));
538 SkTScopedComPtr<IDWriteFontFace5> newFontFace5;
539 HRN(fontResource->CreateFontFace(
fDWriteFont->GetSimulations(),
544 SkTScopedComPtr<IDWriteFontFace> newFontFace;
545 HRN(newFontFace5->QueryInterface(&newFontFace));
578 "Could not get number of font files.");
583 SkTScopedComPtr<IDWriteFontFile> fontFile;
584 HRNM(
fDWriteFontFace->GetFiles(&numFiles, &fontFile),
"Could not get font files.");
586 const void* fontFileKey;
587 UINT32 fontFileKeySize;
588 HRNM(fontFile->GetReferenceKey(&fontFileKey, &fontFileKeySize),
589 "Could not get font file reference key.");
591 SkTScopedComPtr<IDWriteFontFileLoader> fontFileLoader;
592 HRNM(fontFile->GetLoader(&fontFileLoader),
"Could not get font file loader.");
594 SkTScopedComPtr<IDWriteFontFileStream> fontFileStream;
595 HRNM(fontFileLoader->CreateStreamFromKey(fontFileKey, fontFileKeySize,
597 "Could not create font file stream.");
605 return std::make_unique<SkScalerContext_DW>(
618 rec->
fFlags &= ~flagsWeDontSupport;
627#if defined(SK_FONT_HOST_USE_SYSTEM_SETTINGS)
629 if (factory !=
nullptr) {
630 SkTScopedComPtr<IDWriteRenderingParams> defaultRenderingParams;
631 if (
SUCCEEDED(factory->CreateRenderingParams(&defaultRenderingParams))) {
632 float gamma = defaultRenderingParams->GetGamma();
636 rec->
setContrast(defaultRenderingParams->GetEnhancedContrast());
645static void glyph_to_unicode_map(IDWriteFontFace* fontFace, DWRITE_UNICODE_RANGE range,
646 UINT32* remainingGlyphCount, UINT32 numGlyphs,
649 constexpr const int batchSize = 128;
650 UINT32 codepoints[batchSize];
652 for (UINT32 c = range.first; c <= range.last && *remainingGlyphCount != 0; c += batchSize) {
653 UINT32 numBatchedCodePoints = std::min<UINT32>(range.last - c + 1, batchSize);
654 for (UINT32 i = 0; i < numBatchedCodePoints; ++i) {
655 codepoints[i] = c + i;
657 HRVM(fontFace->GetGlyphIndices(codepoints, numBatchedCodePoints,
glyphs),
658 "Failed to get glyph indexes.");
659 for (UINT32 i = 0; i < numBatchedCodePoints; ++i) {
662 if (glyph >= numGlyphs) {
665 if (0 < glyph && glyphToUnicode[glyph] == 0) {
666 glyphToUnicode[glyph] = c + i;
667 --*remainingGlyphCount;
675 UINT32 numGlyphs = face->GetGlyphCount();
677 UINT32 remainingGlyphCount = numGlyphs;
681 UINT32 numRanges = 0;
682 HRESULT hr = face1->GetUnicodeRanges(0,
nullptr, &numRanges);
683 if (hr != E_NOT_SUFFICIENT_BUFFER &&
FAILED(hr)) {
684 HRVM(hr,
"Failed to get number of ranges.");
686 std::unique_ptr<DWRITE_UNICODE_RANGE[]> ranges(
new DWRITE_UNICODE_RANGE[numRanges]);
687 HRVM(face1->GetUnicodeRanges(numRanges, ranges.get(), &numRanges),
"Failed to get ranges.");
688 for (UINT32 i = 0; i < numRanges; ++i) {
689 glyph_to_unicode_map(face1, ranges[i], &remainingGlyphCount, numGlyphs, glyphToUnicode);
692 glyph_to_unicode_map(face, {0, 0x10FFFF}, &remainingGlyphCount, numGlyphs, glyphToUnicode);
698 std::unique_ptr<SkAdvancedTypefaceMetrics>
info(
nullptr);
700 DWRITE_FONT_METRICS dwfm;
710 SkTScopedComPtr<IDWriteLocalizedStrings> postScriptNames;
713 DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_NAME,
719 SkDEBUGF(
"Unable to get postscript name for typeface %p\n",
this);
724 if (fontType != DWRITE_FONT_FACE_TYPE_TRUETYPE &&
725 fontType != DWRITE_FONT_FACE_TYPE_CFF &&
726 fontType != DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION &&
727 fontType != DWRITE_FONT_FACE_TYPE_OPENTYPE_COLLECTION)
733 if (
fDWriteFontFace->GetSimulations() == DWRITE_FONT_SIMULATIONS_NONE) {
741 if (!headTable.fExists || !postTable.fExists || !hheaTable.fExists || !os2Table.fExists) {
750 if (fvarTable.fExists) {
756 bool fixedWidth = (postTable->isFixedPitch &&
763 if (os2Table->version.v0.fsSelection.field.Italic) {
768 SerifStyle serifStyle = os2Table->version.v0.panose.data.textAndDisplay.bSerifStyle;
770 if (SerifStyle::Cove == serifStyle ||
771 SerifStyle::ObtuseCove == serifStyle ||
772 SerifStyle::SquareCove == serifStyle ||
773 SerifStyle::ObtuseSquareCove == serifStyle ||
774 SerifStyle::Square == serifStyle ||
775 SerifStyle::Thin == serifStyle ||
776 SerifStyle::Bone == serifStyle ||
777 SerifStyle::Exaggerated == serifStyle ||
778 SerifStyle::Triangle == serifStyle)
796class StreamFontFileLoader :
public IDWriteFontFileLoader {
805 void const* fontFileReferenceKey,
806 UINT32 fontFileReferenceKeySize,
807 IDWriteFontFileStream** fontFileStream)
override;
810 static HRESULT
Create(std::unique_ptr<SkStreamAsset> stream,
811 StreamFontFileLoader** streamFontFileLoader) {
812 *streamFontFileLoader =
new StreamFontFileLoader(std::move(stream));
813 if (
nullptr == *streamFontFileLoader) {
814 return E_OUTOFMEMORY;
820 StreamFontFileLoader(std::unique_ptr<SkStreamAsset> stream)
821 : fStream(
std::move(
stream)), fRefCount(1)
823 virtual ~StreamFontFileLoader() { }
825 std::unique_ptr<SkStreamAsset> fStream;
829SK_STDMETHODIMP StreamFontFileLoader::QueryInterface(REFIID iid,
void** ppvObject) {
830 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) {
835 *ppvObject =
nullptr;
836 return E_NOINTERFACE;
841 return InterlockedIncrement(&fRefCount);
845 ULONG newCount = InterlockedDecrement(&fRefCount);
853 void const* fontFileReferenceKey,
854 UINT32 fontFileReferenceKeySize,
855 IDWriteFontFileStream** fontFileStream)
857 SkTScopedComPtr<SkDWriteFontFileStreamWrapper>
stream;
859 *fontFileStream =
stream.release();
863class StreamFontFileEnumerator :
public IDWriteFontFileEnumerator {
872 SK_STDMETHODIMP GetCurrentFontFile(IDWriteFontFile** fontFile)
override;
874 static HRESULT
Create(IDWriteFactory* factory, IDWriteFontFileLoader* fontFileLoader,
875 StreamFontFileEnumerator** streamFontFileEnumerator) {
876 *streamFontFileEnumerator =
new StreamFontFileEnumerator(factory, fontFileLoader);
877 if (
nullptr == *streamFontFileEnumerator) {
878 return E_OUTOFMEMORY;
883 StreamFontFileEnumerator(IDWriteFactory* factory, IDWriteFontFileLoader* fontFileLoader);
884 virtual ~StreamFontFileEnumerator() { }
888 SkTScopedComPtr<IDWriteFactory> fFactory;
889 SkTScopedComPtr<IDWriteFontFile> fCurrentFile;
890 SkTScopedComPtr<IDWriteFontFileLoader> fFontFileLoader;
894StreamFontFileEnumerator::StreamFontFileEnumerator(IDWriteFactory* factory,
895 IDWriteFontFileLoader* fontFileLoader)
899 , fFontFileLoader(SkRefComPtr(fontFileLoader))
903SK_STDMETHODIMP StreamFontFileEnumerator::QueryInterface(REFIID iid,
void** ppvObject) {
904 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileEnumerator)) {
909 *ppvObject =
nullptr;
910 return E_NOINTERFACE;
915 return InterlockedIncrement(&fRefCount);
919 ULONG newCount = InterlockedDecrement(&fRefCount);
927 *hasCurrentFile =
FALSE;
934 UINT32 fontFileReferenceKey = 0;
935 HR(fFactory->CreateCustomFontFileReference(
936 &fontFileReferenceKey,
937 sizeof(fontFileReferenceKey),
938 fFontFileLoader.get(),
941 *hasCurrentFile =
TRUE;
945SK_STDMETHODIMP StreamFontFileEnumerator::GetCurrentFontFile(IDWriteFontFile** fontFile) {
946 if (fCurrentFile.get() ==
nullptr) {
951 *fontFile = SkRefComPtr(fCurrentFile.get());
955class StreamFontCollectionLoader :
public IDWriteFontCollectionLoader {
964 IDWriteFactory* factory,
965 void const* collectionKey,
966 UINT32 collectionKeySize,
967 IDWriteFontFileEnumerator** fontFileEnumerator)
override;
969 static HRESULT
Create(IDWriteFontFileLoader* fontFileLoader,
970 StreamFontCollectionLoader** streamFontCollectionLoader) {
971 *streamFontCollectionLoader =
new StreamFontCollectionLoader(fontFileLoader);
972 if (
nullptr == *streamFontCollectionLoader) {
973 return E_OUTOFMEMORY;
978 StreamFontCollectionLoader(IDWriteFontFileLoader* fontFileLoader)
980 , fFontFileLoader(SkRefComPtr(fontFileLoader))
982 virtual ~StreamFontCollectionLoader() { }
985 SkTScopedComPtr<IDWriteFontFileLoader> fFontFileLoader;
988SK_STDMETHODIMP StreamFontCollectionLoader::QueryInterface(REFIID iid,
void** ppvObject) {
989 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontCollectionLoader)) {
994 *ppvObject =
nullptr;
995 return E_NOINTERFACE;
1000 return InterlockedIncrement(&fRefCount);
1004 ULONG newCount = InterlockedDecrement(&fRefCount);
1005 if (0 == newCount) {
1011template <
typename T>
class SkAutoIDWriteUnregister {
1013 SkAutoIDWriteUnregister(IDWriteFactory* factory,
T* unregister)
1014 : fFactory(factory), fUnregister(unregister)
1016 SkAutoIDWriteUnregister(
const SkAutoIDWriteUnregister&) =
delete;
1017 SkAutoIDWriteUnregister& operator=(
const SkAutoIDWriteUnregister&) =
delete;
1018 SkAutoIDWriteUnregister(SkAutoIDWriteUnregister&&) =
delete;
1019 SkAutoIDWriteUnregister& operator=(SkAutoIDWriteUnregister&&) =
delete;
1021 ~SkAutoIDWriteUnregister() {
1023 unregister(fFactory, fUnregister);
1028 T* old = fUnregister;
1029 fUnregister =
nullptr;
1034 HRESULT unregister(IDWriteFactory* factory, IDWriteFontFileLoader* unregister) {
1035 return factory->UnregisterFontFileLoader(unregister);
1038 HRESULT unregister(IDWriteFactory* factory, IDWriteFontCollectionLoader* unregister) {
1039 return factory->UnregisterFontCollectionLoader(unregister);
1042 IDWriteFactory* fFactory;
1047 IDWriteFactory* factory,
1048 void const* collectionKey,
1049 UINT32 collectionKeySize,
1050 IDWriteFontFileEnumerator** fontFileEnumerator)
1052 SkTScopedComPtr<StreamFontFileEnumerator> enumerator;
1053 HR(StreamFontFileEnumerator::Create(factory, fFontFileLoader.get(), &enumerator));
1054 *fontFileEnumerator = enumerator.release();
1058static HRESULT apply_fontargument_variation(SkTScopedComPtr<IDWriteFontFace>& fontFace,
1061#if defined(NTDDI_WIN10_RS3) && NTDDI_VERSION >= NTDDI_WIN10_RS3
1063 SkTScopedComPtr<IDWriteFontFace5> fontFace5;
1064 if (
FAILED(fontFace->QueryInterface(&fontFace5)) || !fontFace5->HasVariations()) {
1068 UINT32 fontAxisCount = fontFace5->GetFontAxisValueCount();
1069 UINT32 argsCoordCount =
args.getVariationDesignPosition().coordinateCount;
1071 SkTScopedComPtr<IDWriteFontResource> fontResource;
1072 HR(fontFace5->GetFontResource(&fontResource));
1073 HR(fontResource->GetDefaultFontAxisValues(variation, fontAxisCount));
1075 for (UINT32 fontAxisIndex = 0; fontAxisIndex < fontAxisCount; ++fontAxisIndex) {
1076 DWRITE_FONT_AXIS_VALUE& fontCoordinate = variation[fontAxisIndex];
1078 for (UINT32 argsCoordIndex = argsCoordCount; argsCoordIndex --> 0;) {
1080 args.getVariationDesignPosition().coordinates[argsCoordIndex];
1088 SkTScopedComPtr<IDWriteFontFace5> fontFace5_Out;
1089 HR(fontResource->CreateFontFace(DWRITE_FONT_SIMULATIONS_NONE,
1090 variation.get(), fontAxisCount,
1093 HR(fontFace5_Out->QueryInterface(&fontFace));
1102 if (
nullptr == factory) {
1106 SkTScopedComPtr<StreamFontFileLoader> fontFileLoader;
1107 HRN(StreamFontFileLoader::Create(std::move(stream), &fontFileLoader));
1108 HRN(factory->RegisterFontFileLoader(fontFileLoader.get()));
1109 SkAutoIDWriteUnregister<StreamFontFileLoader> autoUnregisterFontFileLoader(
1110 factory, fontFileLoader.get());
1112 SkTScopedComPtr<StreamFontCollectionLoader> fontCollectionLoader;
1113 HRN(StreamFontCollectionLoader::Create(fontFileLoader.get(), &fontCollectionLoader));
1114 HRN(factory->RegisterFontCollectionLoader(fontCollectionLoader.get()));
1115 SkAutoIDWriteUnregister<StreamFontCollectionLoader> autoUnregisterFontCollectionLoader(
1116 factory, fontCollectionLoader.get());
1118 SkTScopedComPtr<IDWriteFontCollection> fontCollection;
1119 HRN(factory->CreateCustomFontCollection(fontCollectionLoader.get(),
nullptr, 0,
1123 UINT32 familyCount = fontCollection->GetFontFamilyCount();
1124 for (UINT32 familyIndex = 0; familyIndex < familyCount; ++familyIndex) {
1125 SkTScopedComPtr<IDWriteFontFamily> fontFamily;
1126 HRN(fontCollection->GetFontFamily(familyIndex, &fontFamily));
1128 UINT32 fontCount = fontFamily->GetFontCount();
1129 for (UINT32 fontIndex = 0; fontIndex < fontCount; ++fontIndex) {
1130 SkTScopedComPtr<IDWriteFont>
font;
1131 HRN(fontFamily->GetFont(fontIndex, &font));
1134 if (
font->GetSimulations() != DWRITE_FONT_SIMULATIONS_NONE) {
1137 SkTScopedComPtr<IDWriteFontFace> fontFace;
1138 HRN(
font->CreateFontFace(&fontFace));
1139 int faceIndex = fontFace->GetIndex();
1140 int ttcIndex =
args.getCollectionIndex();
1143 if (faceIndex != ttcIndex) {
1147 apply_fontargument_variation(fontFace,
args);
1150 factory, fontFace.get(),
font.get(), fontFamily.get(),
1151 sk_make_sp<DWriteFontTypeface::Loaders>(
1153 autoUnregisterFontFileLoader.detatch(),
1154 autoUnregisterFontCollectionLoader.detatch()),
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
static float next(float f)
static sk_sp< Effect > Create()
#define SkASSERT_RELEASE(cond)
static constexpr SkColor SkColorSetARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
HRESULT sk_wchar_to_skstring(WCHAR *name, int nameLen, SkString *skname)
HRESULT sk_get_locale_string(IDWriteLocalizedStrings *names, const WCHAR *preferedLocale, SkString *skname)
IDWriteFactory * sk_get_dwrite_factory()
#define SkEndian_SwapBE32(n)
#define SkEndian_SwapBE16(n)
#define sk_float_round2int(x)
@ kNormal
glyph outlines modified to improve constrast
@ kNone
glyph outlines unchanged
static void sk_bzero(void *buffer, size_t size)
static void * sk_careful_memcpy(void *dst, const void *src, size_t len)
#define SK_STDMETHODIMP_(type)
sk_sp< T > sk_ref_sp(T *obj)
static constexpr bool SkToBool(const T &x)
constexpr int16_t SkToS16(S x)
int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], int parameterCount) const override
int onGetUPEM() const override
SkTScopedComPtr< IDWriteFontFace2 > fDWriteFontFace2
std::unique_ptr< SkScalerContext > onCreateScalerContext(const SkScalerContextEffects &, const SkDescriptor *) const override
static sk_sp< SkTypeface > SK_SPI MakeFromStream(std::unique_ptr< SkStreamAsset >, const SkFontArguments &)
SkTypeface::LocalizedStrings * onCreateFamilyNameIterator() const override
SkTScopedComPtr< IDWriteFactory2 > fFactory2
SkTScopedComPtr< IDWriteFactory > fFactory
SkFontArguments::Palette fRequestedPalette
void onFilterRec(SkScalerContextRec *) const override
void getGlyphToUnicodeMap(SkUnichar *glyphToUnicode) const override
size_t onGetTableData(SkFontTableTag, size_t offset, size_t length, void *data) const override
size_t fPaletteEntryCount
static SkFontStyle GetStyle(IDWriteFont *font, IDWriteFontFace *fontFace)
std::unique_ptr< SkAdvancedTypefaceMetrics > onGetAdvancedMetrics() const override
void onCharsToGlyphs(const SkUnichar *chars, int count, SkGlyphID glyphs[]) const override
std::unique_ptr< SkColor[]> fPalette
~DWriteFontTypeface() override
IDWriteFontFace7 * fDWriteFontFace7
SkTScopedComPtr< IDWriteFontFamily > fDWriteFontFamily
SkTScopedComPtr< IDWriteFontFace1 > fDWriteFontFace1
std::unique_ptr< SkStreamAsset > onOpenStream(int *ttcIndex) const override
int onGetTableTags(SkFontTableTag tags[]) const override
std::unique_ptr< DWRITE_COLOR_F[]> fDWPalette
int onCountGlyphs() const override
bool onGetPostScriptName(SkString *) const override
void getPostScriptGlyphNames(SkString *) const override
bool onGlyphMaskNeedsCurrentColor() const override
sk_sp< SkData > onCopyTableData(SkFontTableTag) const override
void onGetFamilyName(SkString *familyName) const override
static constexpr SkTypeface::FactoryId FactoryId
SkTScopedComPtr< IDWriteFontFace > fDWriteFontFace
SkTScopedComPtr< IDWriteFont > fDWriteFont
int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const override
static sk_sp< DWriteFontTypeface > Make(IDWriteFactory *factory, IDWriteFontFace *fontFace, IDWriteFont *font, IDWriteFontFamily *fontFamily, sk_sp< Loaders > loaders, const SkFontArguments::Palette &palette)
sk_sp< SkTypeface > onMakeClone(const SkFontArguments &) const override
void onGetFontDescriptor(SkFontDescriptor *, bool *) const override
static HRESULT Create(SkStreamAsset *stream, SkDWriteFontFileStreamWrapper **streamFontFileStream)
static sk_sp< SkData > MakeWithProc(const void *ptr, size_t length, ReleaseProc proc, void *ctx)
static SkFontStyle::Width SkFontStyleWidthForWidthAxisValue(SkScalar width)
void setPaletteIndex(int paletteIndex)
static int GetTableTags(SkStream *, int ttcIndex, SkFontTableTag tags[])
const char * c_str() const
SkFontStyle fontStyle() const
void serialize(SkWStream *, SerializeBehavior=SerializeBehavior::kIncludeDataIfLocal) const
std::unique_ptr< SkStreamAsset > openStream(int *ttcIndex) const
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
font
Font Metadata and Metrics.
const myers::Point & get(const myers::Segment &)
SkTScopedComPtr< IDWriteFactory > fFactory
SkTScopedComPtr< IDWriteFontFileLoader > fDWriteFontFileLoader
SkTScopedComPtr< IDWriteFontCollectionLoader > fDWriteFontCollectionLoader
@ kVariable_FontFlag
May be true for Type1, CFF, or TrueType fonts.
const Override * overrides
void setHidden(bool hidden)
static constexpr SkIRect MakeLTRB(int32_t l, int32_t t, int32_t r, int32_t b)
@ kA8_Format
8bits per pixel mask (e.g. antialiasing)
static void SetAdvancedTypefaceFlags(SkOTTableOS2_V4::Type fsType, SkAdvancedTypefaceMetrics *info)
static SkRGBA4f FromColor(SkColor color)
void setPaintGamma(SkScalar pg)
void setDeviceGamma(SkScalar dg)
SkMask::Format fMaskFormat
void setContrast(SkScalar c)
SkFontHinting getHinting() const
void setHinting(SkFontHinting)