1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
// Copyright 2015 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 "components/font_service/public/cpp/font_loader.h"
#include <utility>
#include "base/bind.h"
#include "base/trace_event/trace_event.h"
#include "components/font_service/public/cpp/font_service_thread.h"
#include "mojo/shell/public/cpp/shell.h"
namespace font_service {
FontLoader::FontLoader(mojo::Shell* shell) {
FontServicePtr font_service;
shell->ConnectToInterface("mojo:font_service", &font_service);
thread_ = new internal::FontServiceThread(std::move(font_service));
}
FontLoader::~FontLoader() {}
void FontLoader::Shutdown() {
thread_->Stop();
thread_ = nullptr;
}
bool FontLoader::matchFamilyName(const char family_name[],
SkTypeface::Style requested,
FontIdentity* out_font_identifier,
SkString* out_family_name,
SkTypeface::Style* out_style) {
TRACE_EVENT1("font_service", "FontServiceThread::MatchFamilyName",
"family_name", family_name);
return thread_->MatchFamilyName(family_name, requested, out_font_identifier,
out_family_name, out_style);
}
SkStreamAsset* FontLoader::openStream(const FontIdentity& identity) {
TRACE_EVENT2("font_loader", "FontLoader::openStream",
"identity", identity.fID,
"name", identity.fString.c_str());
{
base::AutoLock lock(lock_);
auto mapped_font_files_it = mapped_font_files_.find(identity.fID);
if (mapped_font_files_it != mapped_font_files_.end())
return mapped_font_files_it->second->CreateMemoryStream();
}
scoped_refptr<internal::MappedFontFile> mapped_font_file =
thread_->OpenStream(identity);
if (!mapped_font_file)
return nullptr;
// Get notified with |mapped_font_file| is destroyed.
mapped_font_file->set_observer(this);
{
base::AutoLock lock(lock_);
auto mapped_font_files_it =
mapped_font_files_.insert(std::make_pair(mapped_font_file->font_id(),
mapped_font_file.get()))
.first;
return mapped_font_files_it->second->CreateMemoryStream();
}
}
void FontLoader::OnMappedFontFileDestroyed(internal::MappedFontFile* f) {
TRACE_EVENT1("font_loader", "FontLoader::OnMappedFontFileDestroyed",
"identity", f->font_id());
base::AutoLock lock(lock_);
mapped_font_files_.erase(f->font_id());
}
} // namespace font_service
|