1311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Use of this source code is governed by a BSD-style license that can be
3311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// found in the LICENSE file.
4311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
5311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#ifndef PPAPI_CPP_TRUETYPE_FONT_H_
6311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#define PPAPI_CPP_TRUETYPE_FONT_H_
7311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
8311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "ppapi/c/dev/ppb_truetype_font_dev.h"
9311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "ppapi/c/pp_time.h"
10311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "ppapi/cpp/completion_callback.h"
11311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "ppapi/cpp/pass_ref.h"
12311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "ppapi/cpp/resource.h"
13311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
14311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff/// @file
15311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff/// This file defines the API to create a TrueType font object.
16311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
17311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffnamespace pp {
18311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
19311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass InstanceHandle;
20311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
21311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// TrueTypeFontDesc_Dev --------------------------------------------------------
22311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
23311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff/// The <code>TrueTypeFontDesc_Dev</code> class represents a TrueType font
24311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff/// descriptor, used to Create and Describe fonts.
25311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass TrueTypeFontDesc_Dev {
26311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff public:
27311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// Default constructor for creating a <code>TrueTypeFontDesc_Dev</code>
28311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// object.
29311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TrueTypeFontDesc_Dev();
30311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
31311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// Constructor that takes an existing <code>PP_TrueTypeFontDesc_Dev</code>
32311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// structure. The 'family' PP_Var field in the structure will be managed by
33311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// this instance.
34311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TrueTypeFontDesc_Dev(PassRef, const PP_TrueTypeFontDesc_Dev& pp_desc);
35311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
36311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// The copy constructor for <code>TrueTypeFontDesc_Dev</code>.
37311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
38311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] other A reference to a <code>TrueTypeFontDesc_Dev</code>.
39311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TrueTypeFontDesc_Dev(const TrueTypeFontDesc_Dev& other);
40311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
41311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ~TrueTypeFontDesc_Dev();
42311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
43311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TrueTypeFontDesc_Dev& operator=(const TrueTypeFontDesc_Dev& other);
44311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
45311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  const PP_TrueTypeFontDesc_Dev& pp_desc() const {
46311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    return desc_;
47311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
48311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
49311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  Var family() const {
50311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    return family_;
51311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
52311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void set_family(const Var& family) {
53311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    family_ = family;
54311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // The assignment above manages the underlying PP_Vars. Copy the new one
55311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // into the wrapped desc struct.
56311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    desc_.family = family_.pp_var();
57311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
58311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
59311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  PP_TrueTypeFontFamily_Dev generic_family() const {
60311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    return desc_.generic_family;
61311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
62311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void set_generic_family(PP_TrueTypeFontFamily_Dev family) {
63311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    desc_.generic_family = family;
64311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
65311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
66311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  PP_TrueTypeFontStyle_Dev style() const { return desc_.style; }
67311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void set_style(PP_TrueTypeFontStyle_Dev style) {
68311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    desc_.style = style;
69311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
70311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
71311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  PP_TrueTypeFontWeight_Dev weight() const { return desc_.weight; }
72311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void set_weight(PP_TrueTypeFontWeight_Dev weight) {
73311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    desc_.weight = weight;
74311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
75311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
76311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  PP_TrueTypeFontWidth_Dev width() const { return desc_.width; }
77311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void set_width(PP_TrueTypeFontWidth_Dev width) {
78311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    desc_.width = width;
79311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
80311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
81311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  PP_TrueTypeFontCharset_Dev charset() const { return desc_.charset; }
82311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void set_charset(PP_TrueTypeFontCharset_Dev charset) {
83311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    desc_.charset = charset;
84311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
85311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
86311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff private:
87311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  pp::Var family_;  // This manages the PP_Var embedded in desc_.
88311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  PP_TrueTypeFontDesc_Dev desc_;
89311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff};
90311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
91311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// TrueTypeFont_Dev ------------------------------------------------------------
92311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
93311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff/// The <code>TrueTypeFont_Dev</code> class represents a TrueType font resource.
94311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass TrueTypeFont_Dev : public Resource {
95311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff public:
96311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// Default constructor for creating a <code>TrueTypeFont_Dev</code> object.
97311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TrueTypeFont_Dev();
98311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
99311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// A constructor used to create a <code>TrueTypeFont_Dev</code> and associate
100311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// it with the provided <code>Instance</code>.
101311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
102311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] instance The instance that owns this resource.
103311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TrueTypeFont_Dev(const InstanceHandle& instance,
104311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                   const TrueTypeFontDesc_Dev& desc);
105311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
106311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// The copy constructor for <code>TrueTypeFont_Dev</code>.
107311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
108311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] other A reference to a <code>TrueTypeFont_Dev</code>.
109311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TrueTypeFont_Dev(const TrueTypeFont_Dev& other);
110311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
111311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// A constructor used when you have received a PP_Resource as a return
112311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// value that has had its reference count incremented for you.
113311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
114311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] resource A PP_Resource corresponding to a TrueType font.
115311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TrueTypeFont_Dev(PassRef, PP_Resource resource);
116311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
117311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// Gets an array of TrueType font family names available on the host.
118311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// These names can be used to create a font from a specific family.
119311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
120311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] instance A <code>InstanceHandle</code> requesting the family
121311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// names.
122311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] callback A <code>CompletionCallbackWithOutput</code> to be
123311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// called upon completion of GetFontFamilies.
124311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
125311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @return If >= 0, the number of family names returned, otherwise an error
126311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// code from <code>pp_errors.h</code>.
127311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static int32_t GetFontFamilies(
128311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      const InstanceHandle& instance,
129311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      const CompletionCallbackWithOutput<std::vector<Var> >& callback);
130311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
131311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// Gets an array of TrueType font descriptors for a given font family. These
132311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// descriptors can be used to create a font in that family and matching the
133311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// descriptor attributes.
134311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
135311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] instance A <code>PP_Instance</code> requesting the font
136311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// descriptors.
137311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] family A <code>Var</code> holding a string specifying the font
138311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// family.
139311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] callback A <code>CompletionCallbackWithOutput</code> to be
140311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// called upon completion of GetFontsInFamily.
141311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
142311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @return If >= 0, the number of font descriptors returned, otherwise an
143311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// error code from <code>pp_errors.h</code>.
144311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static int32_t GetFontsInFamily(
145311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      const InstanceHandle& instance,
146311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      const Var& family,
147311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      const CompletionCallbackWithOutput<std::vector<TrueTypeFontDesc_Dev> >&
148311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff          callback);
149311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
150311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// Returns a description of the given font resource. This description may
151311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// differ from the description passed to Create, reflecting the host's font
152311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// matching and fallback algorithm.
153311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
154311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] callback A <code>CompletionCallback</code> to be called upon
155311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// completion of Describe.
156311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
157311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @return A return code from <code>pp_errors.h</code>. If an error code is
158311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// returned, the descriptor will be left unchanged.
159311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  int32_t Describe(
160311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      const CompletionCallbackWithOutput<TrueTypeFontDesc_Dev>& callback);
161311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
162311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// Gets an array of identifying tags for each table in the font.
163311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// These tags can be used to request specific tables using GetTable.
164311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
165311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] callback A <code>CompletionCallbackWithOutput</code> to be
166311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// called upon completion of GetTableTags.
167311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
168311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @return If >= 0, the number of table tags returned, otherwise an error
169311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// code from <code>pp_errors.h</code>.
170311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  int32_t GetTableTags(
171311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      const CompletionCallbackWithOutput<std::vector<uint32_t> >& callback);
172311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
173311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// Copies the given font table into client memory.
174311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
175311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] table A 4 byte value indicating which table to copy.
176311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// For example, 'glyf' will cause the outline table to be copied into the
177311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// output array. A zero tag value will cause the entire font to be copied.
178311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] offset The offset into the font table.
179311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] max_data_length The maximum number of bytes to transfer from
180311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// <code>offset</code>.
181311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @param[in] callback A <code>CompletionCallbackWithOutput</code> to be
182311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// called upon completion of GetTable.
183311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ///
184311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// @return If >= 0, the table size in bytes, otherwise an error code from
185311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  /// <code>pp_errors.h</code>.
186311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  int32_t GetTable(
187311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      uint32_t table,
188311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      int32_t offset,
189311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      int32_t max_data_length,
190311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      const CompletionCallbackWithOutput<std::vector<char> >& callback);
191311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff};
192311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
193311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffnamespace internal {
194311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
195311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// A specialization of CallbackOutputTraits to provide the callback system the
196311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // information on how to handle pp::TrueTypeFontDesc_Dev. This converts
197311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// PP_TrueTypeFontDesc_Dev to pp::TrueTypeFontDesc_Dev when passing to the
198311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// plugin, and specifically manages the PP_Var embedded in the desc_ field.
199311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftemplate<>
200311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffstruct CallbackOutputTraits<TrueTypeFontDesc_Dev> {
201311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  typedef PP_TrueTypeFontDesc_Dev* APIArgType;
202311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  typedef PP_TrueTypeFontDesc_Dev StorageType;
203311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
204311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static inline APIArgType StorageToAPIArg(StorageType& t) {
205311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    return &t;
206311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
207311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
208311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static inline TrueTypeFontDesc_Dev StorageToPluginArg(StorageType& t) {
209311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    return TrueTypeFontDesc_Dev(PASS_REF, t);
210311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
211311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
212311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static inline void Initialize(StorageType* t) {
213311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Use the same defaults as TrueTypeFontDesc_Dev does.
214311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    TrueTypeFontDesc_Dev dummy;
215311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    *t = dummy.pp_desc();
216311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
217311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff};
218311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
219311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass TrueTypeFontDescArrayOutputAdapterWithStorage
220311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    : public ArrayOutputAdapter<PP_TrueTypeFontDesc_Dev> {
221311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff public:
222311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TrueTypeFontDescArrayOutputAdapterWithStorage() {
223311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    set_output(&temp_storage_);
224311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  };
225311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
226311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  virtual ~TrueTypeFontDescArrayOutputAdapterWithStorage() {
227311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    if (!temp_storage_.empty()) {
228311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      // An easy way to release the resource references held by |temp_storage_|.
229311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      output();
230311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    }
231311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  };
232311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
233311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  std::vector<TrueTypeFontDesc_Dev>& output() {
234311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    PP_DCHECK(output_storage_.empty());
235311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    typedef std::vector<PP_TrueTypeFontDesc_Dev> Entries;
236311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    for (Entries::iterator it = temp_storage_.begin();
237311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff         it != temp_storage_.end(); ++it)
238311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      output_storage_.push_back(TrueTypeFontDesc_Dev(PASS_REF, *it));
239311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    temp_storage_.clear();
240311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    return output_storage_;
241311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
242311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
243311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff private:
244311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  std::vector<PP_TrueTypeFontDesc_Dev> temp_storage_;
245311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  std::vector<TrueTypeFontDesc_Dev> output_storage_;
246311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff};
247311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
248311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// A specialization of CallbackOutputTraits to provide the callback system the
249311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// information on how to handle vectors of TrueTypeFontDesc_Dev. This converts
250311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// PP_TrueTypeFontDesc_Dev to TrueTypeFontDesc_Dev when passing to the plugin.
251311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftemplate<>
252311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffstruct CallbackOutputTraits< std::vector<TrueTypeFontDesc_Dev> > {
253311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  typedef PP_ArrayOutput APIArgType;
254311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  typedef TrueTypeFontDescArrayOutputAdapterWithStorage StorageType;
255311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
256311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static inline APIArgType StorageToAPIArg(StorageType& t) {
257311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    return t.pp_array_output();
258311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
259311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
260311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static inline std::vector<TrueTypeFontDesc_Dev>& StorageToPluginArg(
261311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      StorageType& t) {
262311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    return t.output();
263311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
264311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
265311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static inline void Initialize(StorageType* /* t */) {}
266311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff};
267311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
268311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}  // namespace internal
269311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
270311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}  // namespace pp
271311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
272311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#endif  // PPAPI_CPP_TRUETYPE_FONT_H_
273311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff