// 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.

#include "content/browser/renderer_host/pepper/pepper_truetype_font_list.h"

#import <Cocoa/Cocoa.h>

#include "base/mac/scoped_nsautorelease_pool.h"
#include "base/stl_util.h"
#include "base/strings/sys_string_conversions.h"
#include "ppapi/c/dev/ppb_truetype_font_dev.h"
#include "ppapi/proxy/serialized_structs.h"

namespace content {

namespace {

// Table to map AppKit weights to Pepper ones.
const PP_TrueTypeFontWeight_Dev kPepperFontWeights[] = {
    PP_TRUETYPEFONTWEIGHT_THIN,         // 0 is the minimum AppKit weight.
    PP_TRUETYPEFONTWEIGHT_ULTRALIGHT,
    PP_TRUETYPEFONTWEIGHT_ULTRALIGHT,
    PP_TRUETYPEFONTWEIGHT_LIGHT,
    PP_TRUETYPEFONTWEIGHT_LIGHT,
    PP_TRUETYPEFONTWEIGHT_NORMAL,       // 5 is a 'normal' AppKit weight.
    PP_TRUETYPEFONTWEIGHT_MEDIUM,
    PP_TRUETYPEFONTWEIGHT_MEDIUM,
    PP_TRUETYPEFONTWEIGHT_SEMIBOLD,
    PP_TRUETYPEFONTWEIGHT_BOLD,         // 9 is a 'bold' AppKit weight.
    PP_TRUETYPEFONTWEIGHT_ULTRABOLD,
    PP_TRUETYPEFONTWEIGHT_HEAVY,
};
const NSInteger kPepperFontWeightsLength = base::size(kPepperFontWeights);

}  // namespace

void GetFontFamilies_SlowBlocking(std::vector<std::string>* font_families) {
  base::mac::ScopedNSAutoreleasePool autorelease_pool;
  NSFontManager* fontManager = [[[NSFontManager alloc] init] autorelease];
  NSArray* fonts = [fontManager availableFontFamilies];
  font_families->reserve([fonts count]);
  for (NSString* family_name in fonts)
    font_families->push_back(base::SysNSStringToUTF8(family_name));
}

void GetFontsInFamily_SlowBlocking(
    const std::string& family,
    std::vector<ppapi::proxy::SerializedTrueTypeFontDesc>* fonts_in_family) {
  base::mac::ScopedNSAutoreleasePool autorelease_pool;
  NSFontManager* fontManager = [[[NSFontManager alloc] init] autorelease];
  NSString* ns_family = base::SysUTF8ToNSString(family);
  NSArray* ns_fonts_in_family =
      [fontManager availableMembersOfFontFamily:ns_family];

  for (NSArray* font_info in ns_fonts_in_family) {
    ppapi::proxy::SerializedTrueTypeFontDesc desc;
    desc.family = family;
    NSInteger font_weight = [[font_info objectAtIndex:2] intValue];
    font_weight = std::max(static_cast<NSInteger>(0), font_weight);
    font_weight = std::min(kPepperFontWeightsLength - 1, font_weight);
    desc.weight = kPepperFontWeights[font_weight];

    NSFontTraitMask font_traits =
        [[font_info objectAtIndex:3] unsignedIntValue];
    desc.style = PP_TRUETYPEFONTSTYLE_NORMAL;
    if (font_traits & NSItalicFontMask)
      desc.style = PP_TRUETYPEFONTSTYLE_ITALIC;

    desc.width = PP_TRUETYPEFONTWIDTH_NORMAL;
    if (font_traits & NSCondensedFontMask)
      desc.width = PP_TRUETYPEFONTWIDTH_CONDENSED;
    else if (font_traits & NSExpandedFontMask)
      desc.width = PP_TRUETYPEFONTWIDTH_EXPANDED;

    // Mac doesn't support requesting non-default character sets.
    desc.charset = PP_TRUETYPEFONTCHARSET_DEFAULT;

    fonts_in_family->push_back(desc);
  }
}

}  // namespace content
