// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef PPAPI_CPP_TRUETYPE_FONT_H_ #define PPAPI_CPP_TRUETYPE_FONT_H_ #include #include "ppapi/c/dev/ppb_truetype_font_dev.h" #include "ppapi/c/pp_time.h" #include "ppapi/cpp/completion_callback.h" #include "ppapi/cpp/pass_ref.h" #include "ppapi/cpp/resource.h" /// @file /// This file defines the API to create a TrueType font object. namespace pp { class InstanceHandle; // TrueTypeFontDesc_Dev -------------------------------------------------------- /// The TrueTypeFontDesc_Dev class represents a TrueType font /// descriptor, used to Create and Describe fonts. class TrueTypeFontDesc_Dev { public: /// Default constructor for creating a TrueTypeFontDesc_Dev /// object. TrueTypeFontDesc_Dev(); /// Constructor that takes an existing PP_TrueTypeFontDesc_Dev /// structure. The 'family' PP_Var field in the structure will be managed by /// this instance. TrueTypeFontDesc_Dev(PassRef, const PP_TrueTypeFontDesc_Dev& pp_desc); /// The copy constructor for TrueTypeFontDesc_Dev. /// /// @param[in] other A reference to a TrueTypeFontDesc_Dev. TrueTypeFontDesc_Dev(const TrueTypeFontDesc_Dev& other); ~TrueTypeFontDesc_Dev(); TrueTypeFontDesc_Dev& operator=(const TrueTypeFontDesc_Dev& other); const PP_TrueTypeFontDesc_Dev& pp_desc() const { return desc_; } Var family() const { return family_; } void set_family(const Var& family) { family_ = family; // The assignment above manages the underlying PP_Vars. Copy the new one // into the wrapped desc struct. desc_.family = family_.pp_var(); } PP_TrueTypeFontFamily_Dev generic_family() const { return desc_.generic_family; } void set_generic_family(PP_TrueTypeFontFamily_Dev family) { desc_.generic_family = family; } PP_TrueTypeFontStyle_Dev style() const { return desc_.style; } void set_style(PP_TrueTypeFontStyle_Dev style) { desc_.style = style; } PP_TrueTypeFontWeight_Dev weight() const { return desc_.weight; } void set_weight(PP_TrueTypeFontWeight_Dev weight) { desc_.weight = weight; } PP_TrueTypeFontWidth_Dev width() const { return desc_.width; } void set_width(PP_TrueTypeFontWidth_Dev width) { desc_.width = width; } PP_TrueTypeFontCharset_Dev charset() const { return desc_.charset; } void set_charset(PP_TrueTypeFontCharset_Dev charset) { desc_.charset = charset; } private: pp::Var family_; // This manages the PP_Var embedded in desc_. PP_TrueTypeFontDesc_Dev desc_; }; // TrueTypeFont_Dev ------------------------------------------------------------ /// The TrueTypeFont_Dev class represents a TrueType font resource. class TrueTypeFont_Dev : public Resource { public: /// Default constructor for creating a TrueTypeFont_Dev object. TrueTypeFont_Dev(); /// A constructor used to create a TrueTypeFont_Dev and associate /// it with the provided Instance. /// /// @param[in] instance The instance that owns this resource. TrueTypeFont_Dev(const InstanceHandle& instance, const TrueTypeFontDesc_Dev& desc); /// The copy constructor for TrueTypeFont_Dev. /// /// @param[in] other A reference to a TrueTypeFont_Dev. TrueTypeFont_Dev(const TrueTypeFont_Dev& other); /// A constructor used when you have received a PP_Resource as a return /// value that has had its reference count incremented for you. /// /// @param[in] resource A PP_Resource corresponding to a TrueType font. TrueTypeFont_Dev(PassRef, PP_Resource resource); /// Gets an array of TrueType font family names available on the host. /// These names can be used to create a font from a specific family. /// /// @param[in] instance A InstanceHandle requesting the family /// names. /// @param[in] callback A CompletionCallbackWithOutput to be /// called upon completion of GetFontFamilies. /// /// @return If >= 0, the number of family names returned, otherwise an error /// code from pp_errors.h. static int32_t GetFontFamilies( const InstanceHandle& instance, const CompletionCallbackWithOutput >& callback); /// Gets an array of TrueType font descriptors for a given font family. These /// descriptors can be used to create a font in that family and matching the /// descriptor attributes. /// /// @param[in] instance A PP_Instance requesting the font /// descriptors. /// @param[in] family A Var holding a string specifying the font /// family. /// @param[in] callback A CompletionCallbackWithOutput to be /// called upon completion of GetFontsInFamily. /// /// @return If >= 0, the number of font descriptors returned, otherwise an /// error code from pp_errors.h. static int32_t GetFontsInFamily( const InstanceHandle& instance, const Var& family, const CompletionCallbackWithOutput >& callback); /// Returns a description of the given font resource. This description may /// differ from the description passed to Create, reflecting the host's font /// matching and fallback algorithm. /// /// @param[in] callback A CompletionCallback to be called upon /// completion of Describe. /// /// @return A return code from pp_errors.h. If an error code is /// returned, the descriptor will be left unchanged. int32_t Describe( const CompletionCallbackWithOutput& callback); /// Gets an array of identifying tags for each table in the font. /// These tags can be used to request specific tables using GetTable. /// /// @param[in] callback A CompletionCallbackWithOutput to be /// called upon completion of GetTableTags. /// /// @return If >= 0, the number of table tags returned, otherwise an error /// code from pp_errors.h. int32_t GetTableTags( const CompletionCallbackWithOutput >& callback); /// Copies the given font table into client memory. /// /// @param[in] table A 4 byte value indicating which table to copy. /// For example, 'glyf' will cause the outline table to be copied into the /// output array. A zero tag value will cause the entire font to be copied. /// @param[in] offset The offset into the font table. /// @param[in] max_data_length The maximum number of bytes to transfer from /// offset. /// @param[in] callback A CompletionCallbackWithOutput to be /// called upon completion of GetTable. /// /// @return If >= 0, the table size in bytes, otherwise an error code from /// pp_errors.h. int32_t GetTable( uint32_t table, int32_t offset, int32_t max_data_length, const CompletionCallbackWithOutput >& callback); }; namespace internal { // A specialization of CallbackOutputTraits to provide the callback system the // information on how to handle pp::TrueTypeFontDesc_Dev. This converts // PP_TrueTypeFontDesc_Dev to pp::TrueTypeFontDesc_Dev when passing to the // plugin, and specifically manages the PP_Var embedded in the desc_ field. template<> struct CallbackOutputTraits { typedef PP_TrueTypeFontDesc_Dev* APIArgType; typedef PP_TrueTypeFontDesc_Dev StorageType; static inline APIArgType StorageToAPIArg(StorageType& t) { return &t; } static inline TrueTypeFontDesc_Dev StorageToPluginArg(StorageType& t) { return TrueTypeFontDesc_Dev(PASS_REF, t); } static inline void Initialize(StorageType* t) { // Use the same defaults as TrueTypeFontDesc_Dev does. TrueTypeFontDesc_Dev dummy; *t = dummy.pp_desc(); } }; class TrueTypeFontDescArrayOutputAdapterWithStorage : public ArrayOutputAdapter { public: TrueTypeFontDescArrayOutputAdapterWithStorage() { set_output(&temp_storage_); }; virtual ~TrueTypeFontDescArrayOutputAdapterWithStorage() { if (!temp_storage_.empty()) { // An easy way to release the resource references held by |temp_storage_|. output(); } }; std::vector& output() { PP_DCHECK(output_storage_.empty()); typedef std::vector Entries; for (Entries::iterator it = temp_storage_.begin(); it != temp_storage_.end(); ++it) output_storage_.push_back(TrueTypeFontDesc_Dev(PASS_REF, *it)); temp_storage_.clear(); return output_storage_; } private: std::vector temp_storage_; std::vector output_storage_; }; // A specialization of CallbackOutputTraits to provide the callback system the // information on how to handle vectors of TrueTypeFontDesc_Dev. This converts // PP_TrueTypeFontDesc_Dev to TrueTypeFontDesc_Dev when passing to the plugin. template<> struct CallbackOutputTraits< std::vector > { typedef PP_ArrayOutput APIArgType; typedef TrueTypeFontDescArrayOutputAdapterWithStorage StorageType; static inline APIArgType StorageToAPIArg(StorageType& t) { return t.pp_array_output(); } static inline std::vector& StorageToPluginArg( StorageType& t) { return t.output(); } static inline void Initialize(StorageType* /* t */) {} }; } // namespace internal } // namespace pp #endif // PPAPI_CPP_TRUETYPE_FONT_H_