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