SkFontDescriptor.cpp revision a8c7f7702fb4bbedb615031bc653c5cd161a038e
19714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com/* 29714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com * Copyright 2012 Google Inc. 39714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com * 49714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com * Use of this source code is governed by a BSD-style license that can be 59714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com * found in the LICENSE file. 69714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com */ 79714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com 89714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com#include "SkFontDescriptor.h" 99714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com#include "SkStream.h" 109714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com 119714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.comenum { 123b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com // these must match the sfnt 'name' enums 139714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com kFontFamilyName = 0x01, 143b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com kFullName = 0x04, 153b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com kPostscriptName = 0x06, 16d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 173b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com // These count backwards from 0xFF, so as not to collide with the SFNT 183b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com // defines for names in its 'name' table. 193b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com kFontFileName = 0xFE, 203b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com kSentinel = 0xFF, 219714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com}; 229714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com 233b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.comSkFontDescriptor::SkFontDescriptor(SkTypeface::Style style) { 243b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com fStyle = style; 259714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com} 269714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com 273b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.comstatic void read_string(SkStream* stream, SkString* string) { 28a8c7f7702fb4bbedb615031bc653c5cd161a038ecommit-bot@chromium.org const uint32_t length = SkToU32(stream->readPackedUInt()); 299714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com if (length > 0) { 303b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com string->resize(length); 313b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com stream->read(string->writable_str(), length); 329714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com } 339714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com} 349714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com 353b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.comstatic void write_string(SkWStream* stream, const SkString& string, 363b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com uint32_t id) { 379714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com if (!string.isEmpty()) { 389714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com stream->writePackedUInt(id); 399714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com stream->writePackedUInt(string.size()); 409714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com stream->write(string.c_str(), string.size()); 419714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com } 429714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com} 439714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com 449714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.comSkFontDescriptor::SkFontDescriptor(SkStream* stream) { 453b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com fStyle = (SkTypeface::Style)stream->readPackedUInt(); 469714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com 473b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com for (;;) { 483b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com switch (stream->readPackedUInt()) { 493b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com case kFontFamilyName: 503b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com read_string(stream, &fFamilyName); 513b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com break; 523b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com case kFullName: 533b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com read_string(stream, &fFullName); 543b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com break; 553b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com case kPostscriptName: 563b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com read_string(stream, &fPostscriptName); 573b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com break; 583b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com case kFontFileName: 593b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com read_string(stream, &fFontFileName); 603b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com break; 613b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com case kSentinel: 623b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com return; 639714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com default: 649714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com SkDEBUGFAIL("Unknown id used by a font descriptor"); 653b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com return; 669714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com } 679714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com } 689714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com} 699714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com 709714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.comvoid SkFontDescriptor::serialize(SkWStream* stream) { 713b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com stream->writePackedUInt(fStyle); 729714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com 733b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com write_string(stream, fFamilyName, kFontFamilyName); 743b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com write_string(stream, fFullName, kFullName); 753b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com write_string(stream, fPostscriptName, kPostscriptName); 763b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com write_string(stream, fFontFileName, kFontFileName); 779714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com 789714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com stream->writePackedUInt(kSentinel); 799714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com} 80