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#ifndef SkFontDescriptor_DEFINED
99714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com#define SkFontDescriptor_DEFINED
109714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com
116c71e0a065c2eb32139682bb1ca1cbbeb02ebcb9benjaminwagner#include "SkFixed.h"
12d71b75757335393d9643a5b7a0f2769b6ba52fb6bungeman#include "SkStream.h"
139714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com#include "SkString.h"
149714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com#include "SkTypeface.h"
159714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com
1641868fe5625fc3bd70daa3f461c881b5db6a9265bungemanclass SkFontData {
1741868fe5625fc3bd70daa3f461c881b5db6a9265bungemanpublic:
18f93d71122e4fcfcdc674a0163455990b13855f2fbungeman    /** Makes a copy of the data in 'axis'. */
19f93d71122e4fcfcdc674a0163455990b13855f2fbungeman    SkFontData(std::unique_ptr<SkStreamAsset> stream, int index, const SkFixed axis[],int axisCount)
20f93d71122e4fcfcdc674a0163455990b13855f2fbungeman        : fStream(std::move(stream)), fIndex(index), fAxisCount(axisCount), fAxis(axisCount)
2141868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    {
2241868fe5625fc3bd70daa3f461c881b5db6a9265bungeman        for (int i = 0; i < axisCount; ++i) {
2341868fe5625fc3bd70daa3f461c881b5db6a9265bungeman            fAxis[i] = axis[i];
2441868fe5625fc3bd70daa3f461c881b5db6a9265bungeman        }
2541868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    }
2641868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    SkFontData(const SkFontData& that)
2741868fe5625fc3bd70daa3f461c881b5db6a9265bungeman        : fStream(that.fStream->duplicate())
2841868fe5625fc3bd70daa3f461c881b5db6a9265bungeman        , fIndex(that.fIndex)
2941868fe5625fc3bd70daa3f461c881b5db6a9265bungeman        , fAxisCount(that.fAxisCount)
3041868fe5625fc3bd70daa3f461c881b5db6a9265bungeman        , fAxis(fAxisCount)
3141868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    {
3241868fe5625fc3bd70daa3f461c881b5db6a9265bungeman        for (int i = 0; i < fAxisCount; ++i) {
3341868fe5625fc3bd70daa3f461c881b5db6a9265bungeman            fAxis[i] = that.fAxis[i];
3441868fe5625fc3bd70daa3f461c881b5db6a9265bungeman        }
3541868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    }
3696fcdcc219d2a0d3579719b84b28bede76efba64halcanary    bool hasStream() const { return fStream.get() != nullptr; }
37f93d71122e4fcfcdc674a0163455990b13855f2fbungeman    std::unique_ptr<SkStreamAsset> detachStream() { return std::move(fStream); }
3841868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    SkStreamAsset* getStream() { return fStream.get(); }
39f93d71122e4fcfcdc674a0163455990b13855f2fbungeman    SkStreamAsset const* getStream() const { return fStream.get(); }
4041868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    int getIndex() const { return fIndex; }
4141868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    int getAxisCount() const { return fAxisCount; }
4241868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    const SkFixed* getAxis() const { return fAxis.get(); }
4341868fe5625fc3bd70daa3f461c881b5db6a9265bungeman
4441868fe5625fc3bd70daa3f461c881b5db6a9265bungemanprivate:
45f93d71122e4fcfcdc674a0163455990b13855f2fbungeman    std::unique_ptr<SkStreamAsset> fStream;
4641868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    int fIndex;
4741868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    int fAxisCount;
4841868fe5625fc3bd70daa3f461c881b5db6a9265bungeman    SkAutoSTMalloc<4, SkFixed> fAxis;
4941868fe5625fc3bd70daa3f461c881b5db6a9265bungeman};
5041868fe5625fc3bd70daa3f461c881b5db6a9265bungeman
5141868fe5625fc3bd70daa3f461c881b5db6a9265bungemanclass SkFontDescriptor : SkNoncopyable {
529714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.compublic:
53b8113780c3cfed640016b263194b7f1531d43312bungeman    SkFontDescriptor();
54a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo    // Does not affect ownership of SkStream.
553552ba18ee41e135d6fc52228adae37794fc15ffrobertphillips    static bool Deserialize(SkStream*, SkFontDescriptor* result);
569714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com
579714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com    void serialize(SkWStream*);
589714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com
59b8113780c3cfed640016b263194b7f1531d43312bungeman    SkFontStyle getStyle() { return fStyle; }
60b8113780c3cfed640016b263194b7f1531d43312bungeman    void setStyle(SkFontStyle style) { fStyle = style; }
619714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com
62d71b75757335393d9643a5b7a0f2769b6ba52fb6bungeman    const char* getFamilyName() const { return fFamilyName.c_str(); }
63d71b75757335393d9643a5b7a0f2769b6ba52fb6bungeman    const char* getFullName() const { return fFullName.c_str(); }
64d71b75757335393d9643a5b7a0f2769b6ba52fb6bungeman    const char* getPostscriptName() const { return fPostscriptName.c_str(); }
6596fcdcc219d2a0d3579719b84b28bede76efba64halcanary    bool hasFontData() const { return fFontData.get() != nullptr; }
66f93d71122e4fcfcdc674a0163455990b13855f2fbungeman    std::unique_ptr<SkFontData> detachFontData() { return std::move(fFontData); }
67d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
683b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com    void setFamilyName(const char* name) { fFamilyName.set(name); }
693b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com    void setFullName(const char* name) { fFullName.set(name); }
703b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com    void setPostscriptName(const char* name) { fPostscriptName.set(name); }
71f93d71122e4fcfcdc674a0163455990b13855f2fbungeman    /** Set the font data only if it is necessary for serialization. */
72f93d71122e4fcfcdc674a0163455990b13855f2fbungeman    void setFontData(std::unique_ptr<SkFontData> data) { fFontData = std::move(data); }
733b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com
749714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.comprivate:
753b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com    SkString fFamilyName;
763b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com    SkString fFullName;
773b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com    SkString fPostscriptName;
78f93d71122e4fcfcdc674a0163455990b13855f2fbungeman    std::unique_ptr<SkFontData> fFontData;
793b700f6929e093cb14cc0e4ef569e6f697c5a816reed@google.com
80b8113780c3cfed640016b263194b7f1531d43312bungeman    SkFontStyle fStyle;
819714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com};
829714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com
839714516a0db56fe1c59d5e831cb0c6d820102c30djsollen@google.com#endif // SkFontDescriptor_DEFINED
84