// Copyright 2016 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/common/font_list.h"

#include <memory>
#include <set>
#include <string>
#include <utility>

#include <fontconfig/fontconfig.h>

#include "base/values.h"

namespace content {

std::unique_ptr<FcPattern, decltype(&FcPatternDestroy)> CreateFormatPattern(
    const char* format) {
  std::unique_ptr<FcPattern, decltype(&FcPatternDestroy)> pattern(
      FcPatternCreate(), FcPatternDestroy);
  FcPatternAddBool(pattern.get(), FC_SCALABLE, FcTrue);
  FcPatternAddString(pattern.get(), FC_FONTFORMAT,
                     reinterpret_cast<const FcChar8*>(format));
  return pattern;
}

std::unique_ptr<base::ListValue> GetFontList_SlowBlocking() {
  DCHECK(GetFontListTaskRunner()->RunsTasksInCurrentSequence());

  std::unique_ptr<base::ListValue> font_list(new base::ListValue);

  std::unique_ptr<FcObjectSet, decltype(&FcObjectSetDestroy)> object_set(
      FcObjectSetBuild(FC_FAMILY, NULL), FcObjectSetDestroy);

  std::set<std::string> sorted_families;

  // See https://www.freetype.org/freetype2/docs/reference/ft2-font_formats.html
  // for the list of possible formats.
  const char* allowed_formats[] = { "TrueType", "CFF" };
  for (size_t i = 0; i < arraysize(allowed_formats); ++i) {
    auto format_pattern = CreateFormatPattern(allowed_formats[i]);
    std::unique_ptr<FcFontSet, decltype(&FcFontSetDestroy)> fontset(
        FcFontList(nullptr, format_pattern.get(), object_set.get()),
        FcFontSetDestroy);
    for (int j = 0; j < fontset->nfont; ++j) {
      char* family_string;
      FcPatternGetString(fontset->fonts[j], FC_FAMILY, 0,
                         reinterpret_cast<FcChar8**>(&family_string));
      sorted_families.insert(family_string);
    }
  }

  // For backwards compatibility with the older pango implementation, add the
  // three Fontconfig aliases that pango added. Our linux default settings for
  // fixed-width was "Monospace". If we remove that, this entry is not found in
  // the list anymore, see also:
  // https://git.gnome.org/browse/pango/tree/pango/pangofc-fontmap.c?h=1.40.1#n1351
  sorted_families.insert("Monospace");
  sorted_families.insert("Sans");
  sorted_families.insert("Serif");

  for (const auto& family : sorted_families) {
    std::unique_ptr<base::ListValue> font_item(new base::ListValue());
    font_item->AppendString(family);
    font_item->AppendString(family);  // localized name.
    // TODO(yusukes): Support localized family names.
    font_list->Append(std::move(font_item));
  }

  return font_list;
}

}  // namespace content
