#include <fontconfig/fontconfig.h>
#include <array>
#include <memory>
#include <set>
#include <string>
#include <utility>
#include "base/compiler_specific.h"
#include "base/values.h"
#include "content/common/font_list.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;
}
base::Value::List GetFontList_SlowBlocking() {
DCHECK(GetFontListTaskRunner()->RunsTasksInCurrentSequence());
base::Value::List font_list;
std::unique_ptr<FcObjectSet, decltype(&FcObjectSetDestroy)> object_set(
FcObjectSetBuild(FC_FAMILY, NULL), FcObjectSetDestroy);
std::set<std::string> sorted_families;
for (const char* allowed_format : {"TrueType", "CFF"}) {
auto format_pattern = CreateFormatPattern(allowed_format);
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(UNSAFE_TODO(fontset->fonts[j]), FC_FAMILY, 0,
reinterpret_cast<FcChar8**>(&family_string));
sorted_families.insert(family_string);
}
}
sorted_families.insert("Monospace");
sorted_families.insert("Sans");
sorted_families.insert("Serif");
for (const auto& family : sorted_families) {
base::Value::List font_item;
font_item.Append(family);
font_item.Append(family);
font_list.Append(std::move(font_item));
}
return font_list;
}
}