blob: 0fc85ec5ef4890f53e69117978bf765e60e3e4b8 [file] [log] [blame]
// Copyright (c) 2012 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.
#ifndef CONTENT_COMMON_FONT_CONFIG_IPC_LINUX_H_
#define CONTENT_COMMON_FONT_CONFIG_IPC_LINUX_H_
#include "base/compiler_specific.h"
#include "base/containers/mru_cache.h"
#include "base/macros.h"
#include "base/synchronization/lock.h"
#include "third_party/skia/include/core/SkRefCnt.h"
#include "third_party/skia/include/core/SkStream.h"
#include "third_party/skia/include/core/SkTypeface.h"
#include "third_party/skia/include/ports/SkFontConfigInterface.h"
#include <stddef.h>
#include <string>
class SkString;
namespace content {
struct SkFontConfigInterfaceFontIdentityHash {
std::size_t operator()(const SkFontConfigInterface::FontIdentity& sp) const;
};
// FontConfig implementation for Skia that proxies out of process to get out
// of the sandbox. See https://chromium.googlesource.com/chromium/src/+/master/docs/linux_sandbox_ipc.md
class FontConfigIPC : public SkFontConfigInterface {
public:
explicit FontConfigIPC(int fd);
~FontConfigIPC() override;
bool matchFamilyName(const char familyName[],
SkFontStyle requested,
FontIdentity* outFontIdentifier,
SkString* outFamilyName,
SkFontStyle* outStyle) override;
sk_sp<SkTypeface> makeTypeface(const FontIdentity& identity) override
WARN_UNUSED_RESULT;
enum Method {
METHOD_MATCH = 0,
METHOD_OPEN = 1,
};
enum {
kMaxFontFamilyLength = 2048
};
private:
// Marking this private in Blink's implementation of SkFontConfigInterface
// since our caching implementation's efficacy is impaired if both
// createTypeface and openStream are used in parallel.
SkStreamAsset* openStream(const FontIdentity&) override;
SkMemoryStream* mapFileDescriptorToStream(int fd);
const int fd_;
// Lock preventing multiple threads from creating a typeface and removing
// an element from |mapped_typefaces_| map at the same time.
base::Lock lock_;
// Practically, this hash_map definition means that we re-map the same font
// file multiple times if we receive createTypeface requests for multiple
// ttc-indices or styles but the same fontconfig interface id. Since the usage
// frequency of ttc indices is very low, and style is not used by clients of
// this API, this seems okay.
base::HashingMRUCache<FontIdentity,
sk_sp<SkTypeface>,
SkFontConfigInterfaceFontIdentityHash>
mapped_typefaces_;
DISALLOW_COPY_AND_ASSIGN(FontConfigIPC);
};
} // namespace content
#endif // CONTENT_COMMON_FONT_CONFIG_IPC_LINUX_H_