12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/dev/truetype_font_dev.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string.h>  // memcpy
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/dev/ppb_truetype_font_dev.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/ppb_var.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/completion_callback.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/instance_handle.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/module.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/module_impl.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/var.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace pp {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <> const char* interface_name<PPB_TrueTypeFont_Dev_0_1>() {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PPB_TRUETYPEFONT_DEV_INTERFACE_0_1;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TrueTypeFontDesc_Dev --------------------------------------------------------
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFontDesc_Dev::TrueTypeFontDesc_Dev() {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  desc_.family = family_.pp_var();
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_generic_family(PP_TRUETYPEFONTFAMILY_SERIF);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_style(PP_TRUETYPEFONTSTYLE_NORMAL);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_weight(PP_TRUETYPEFONTWEIGHT_NORMAL);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_width(PP_TRUETYPEFONTWIDTH_NORMAL);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_charset(PP_TRUETYPEFONTCHARSET_DEFAULT);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFontDesc_Dev::TrueTypeFontDesc_Dev(
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PassRef,
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PP_TrueTypeFontDesc_Dev& pp_desc) {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  desc_ = pp_desc;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  set_family(Var(PASS_REF, pp_desc.family));
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFontDesc_Dev::TrueTypeFontDesc_Dev(const TrueTypeFontDesc_Dev& other) {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_family(other.family());
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_generic_family(other.generic_family());
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_style(other.style());
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_weight(other.weight());
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_width(other.width());
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_charset(other.charset());
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFontDesc_Dev::~TrueTypeFontDesc_Dev() {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFontDesc_Dev& TrueTypeFontDesc_Dev::operator=(
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TrueTypeFontDesc_Dev& other) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (this == &other)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return *this;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  set_family(other.family());
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  set_generic_family(other.generic_family());
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  set_style(other.style());
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  set_weight(other.weight());
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  set_width(other.width());
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  set_charset(other.charset());
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return *this;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TrueTypeFont_Dev ------------------------------------------------------------
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFont_Dev::TrueTypeFont_Dev() {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFont_Dev::TrueTypeFont_Dev(const InstanceHandle& instance,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const TrueTypeFontDesc_Dev& desc) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!has_interface<PPB_TrueTypeFont_Dev_0_1>())
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PassRefFromConstructor(get_interface<PPB_TrueTypeFont_Dev_0_1>()->Create(
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      instance.pp_instance(), &desc.pp_desc()));
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFont_Dev::TrueTypeFont_Dev(const TrueTypeFont_Dev& other)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Resource(other) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFont_Dev::TrueTypeFont_Dev(PassRef, PP_Resource resource)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Resource(PASS_REF, resource) {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t TrueTypeFont_Dev::GetFontFamilies(
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const InstanceHandle& instance,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CompletionCallbackWithOutput<std::vector<Var> >& cc) {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (has_interface<PPB_TrueTypeFont_Dev_0_1>()) {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return get_interface<PPB_TrueTypeFont_Dev_0_1>()->GetFontFamilies(
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        instance.pp_instance(),
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        cc.output(), cc.pp_completion_callback());
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return cc.MayForce(PP_ERROR_NOINTERFACE);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int32_t TrueTypeFont_Dev::GetFontsInFamily(
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const InstanceHandle& instance,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Var& family,
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const CompletionCallbackWithOutput<std::vector<TrueTypeFontDesc_Dev> >& cc)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (has_interface<PPB_TrueTypeFont_Dev_0_1>()) {
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return get_interface<PPB_TrueTypeFont_Dev_0_1>()->GetFontsInFamily(
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        instance.pp_instance(),
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        family.pp_var(),
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        cc.output(), cc.pp_completion_callback());
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return cc.MayForce(PP_ERROR_NOINTERFACE);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t TrueTypeFont_Dev::Describe(
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CompletionCallbackWithOutput<TrueTypeFontDesc_Dev>& cc) {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (has_interface<PPB_TrueTypeFont_Dev_0_1>()) {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int32_t result =
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        get_interface<PPB_TrueTypeFont_Dev_0_1>()->Describe(
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pp_resource(), cc.output(), cc.pp_completion_callback());
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return cc.MayForce(PP_ERROR_NOINTERFACE);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t TrueTypeFont_Dev::GetTableTags(
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CompletionCallbackWithOutput<std::vector<uint32_t> >& cc) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (has_interface<PPB_TrueTypeFont_Dev_0_1>()) {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return get_interface<PPB_TrueTypeFont_Dev_0_1>()->GetTableTags(
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pp_resource(),
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        cc.output(), cc.pp_completion_callback());
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return cc.MayForce(PP_ERROR_NOINTERFACE);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t TrueTypeFont_Dev::GetTable(
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint32_t table,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int32_t offset,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int32_t max_data_length,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CompletionCallbackWithOutput<std::vector<char> >& cc) {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (has_interface<PPB_TrueTypeFont_Dev_0_1>()) {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return get_interface<PPB_TrueTypeFont_Dev_0_1>()->GetTable(
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pp_resource(),
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        table, offset, max_data_length,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        cc.output(), cc.pp_completion_callback());
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return cc.MayForce(PP_ERROR_NOINTERFACE);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace pp
157