// 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 (ccw angle, -10 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.
kSyntheticBold = 0xF6, // no data
kSyntheticOblique = 0xF7, // no data
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
};
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 (SkStreamPriv::RemainingLengthIsBelow(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 (SkStreamPriv::RemainingLengthIsBelow(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 kSyntheticBold:
result->fSyntheticBold = true; break; case kSyntheticOblique:
result->fSyntheticOblique = true; 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.