// Related to a font request.
kFontFamilyName = 0x01, // int length, data[length]
kFullName = 0x04, // int length, data[length]
kPostscriptName = 0x06, // int length, data[length]
kWeight = 0x10, // scalar (1 - 1000)
kWidth = 0x11, // scalar (percentage, 100 is 'normal')
kSlant = 0x12, // scalar (cw angle, 14 is a normal right leaning oblique)
kItalic = 0x13, // scalar (0 is Roman, 1 is fully Italic)
// Related to font data. Can also be used with a requested font.
kPaletteIndex = 0xF8, // int
kPaletteEntryOverrides = 0xF9, // int count, (int, u32)[count]
kFontVariation = 0xFA, // int count, (u32, scalar)[count]
// Related to font data.
kFactoryId = 0xFC, // int
kFontIndex = 0xFD, // int
kSentinel = 0xFF, // no data
};
SkFontDescriptor::SkFontDescriptor() { }
[[nodiscard]] staticbool read_string(SkStream* stream, SkString* string) {
size_t length; if (!stream->readPackedUInt(&length)) { returnfalse; } if (length > 0) { if (StreamRemainingLengthIsBelow(stream, length)) { returnfalse;
}
string->resize(length); if (stream->read(string->data(), length) != length) { returnfalse; }
} returntrue;
}
for (size_t id; (id = read_id(stream)) != kSentinel;) { switch (id) { case kFontFamilyName: if (!read_string(stream, &result->fFamilyName)) { returnfalse; } break; case kFullName: if (!read_string(stream, &result->fFullName)) { returnfalse; } break; case kPostscriptName: if (!read_string(stream, &result->fPostscriptName)) { returnfalse; } break; case kWeight: if (!stream->readScalar(&weight)) { returnfalse; } break; case kWidth: if (!stream->readScalar(&width)) { returnfalse; } break; case kSlant: if (!stream->readScalar(&slant)) { returnfalse; } break; case kItalic: if (!stream->readScalar(&italic)) { returnfalse; } break; case kFontVariation: if (!stream->readPackedUInt(&coordinateCount)) { returnfalse; } if (!SkTFitsIn<CoordinateCountType>(coordinateCount)) { returnfalse; } if (StreamRemainingLengthIsBelow(stream, coordinateCount)) { returnfalse;
}
result->fCoordinateCount = SkTo<CoordinateCountType>(coordinateCount);
result->fVariation.reset(coordinateCount); for (size_t i = 0; i < coordinateCount; ++i) { if (!stream->readU32(&result->fVariation[i].axis)) { returnfalse; } if (!stream->readScalar(&result->fVariation[i].value)) { returnfalse; }
} break; case kFontIndex: if (!stream->readPackedUInt(&index)) { returnfalse; } if (!SkTFitsIn<CollectionIndexType>(index)) { returnfalse; }
result->fCollectionIndex = SkTo<CollectionIndexType>(index); break; case kPaletteIndex: if (!stream->readPackedUInt(&paletteIndex)) { returnfalse; } if (!SkTFitsIn<PaletteIndexType>(paletteIndex)) { returnfalse; }
result->fPaletteIndex = SkTo<PaletteIndexType>(paletteIndex); break; case kPaletteEntryOverrides: if (!stream->readPackedUInt(&paletteEntryOverrideCount)) { returnfalse; } if (!SkTFitsIn<PaletteEntryOverrideCountType>(paletteEntryOverrideCount)) { returnfalse;
} if (StreamRemainingLengthIsBelow(stream, paletteEntryOverrideCount)) { returnfalse;
}
result->fPaletteEntryOverrideCount =
SkTo<PaletteEntryOverrideCountType>(paletteEntryOverrideCount);
result->fPaletteEntryOverrides.reset(paletteEntryOverrideCount); for (size_t i = 0; i < paletteEntryOverrideCount; ++i) { if (!stream->readPackedUInt(&paletteEntryOverrideIndex)) { returnfalse; } if (!SkTFitsIn<PaletteEntryOverrideIndexType>(paletteEntryOverrideIndex)) { returnfalse;
}
result->fPaletteEntryOverrides[i].index =
SkTo<PaletteEntryOverrideIndexType>(paletteEntryOverrideIndex); if (!stream->readU32(&result->fPaletteEntryOverrides[i].color)) { returnfalse;
}
} break; case kFactoryId: if (!stream->readPackedUInt(&factoryId)) { returnfalse; } if (!SkTFitsIn<FactoryIdType>(factoryId)) { returnfalse; }
result->fFactoryId = SkTo<FactoryIdType>(factoryId); break; default:
SkDEBUGFAIL("Unknown id used by a font descriptor"); returnfalse;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.