Index: components/font_service/public/cpp/font_loader.cc |
diff --git a/components/font_service/public/cpp/font_loader.cc b/components/font_service/public/cpp/font_loader.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8b6338481f54cde63cd87cbf6e3da2b9e555e0f6 |
--- /dev/null |
+++ b/components/font_service/public/cpp/font_loader.cc |
@@ -0,0 +1,63 @@ |
+// 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 "components/font_service/public/cpp/font_service_thread.h" |
+#include "mojo/application/public/cpp/application_impl.h" |
+ |
+namespace font_service { |
+ |
+FontLoader::FontLoader(mojo::ApplicationImpl* application_impl) { |
+ mojo::URLRequestPtr request(mojo::URLRequest::New()); |
+ request->url = mojo::String::From("mojo:font_service"); |
+ FontServicePtr font_service; |
+ application_impl->ConnectToService(request.Pass(), &font_service); |
+ |
+ thread_ = new internal::FontServiceThread(font_service.Pass()); |
+} |
+ |
+FontLoader::~FontLoader() {} |
+ |
+bool FontLoader::matchFamilyName(const char family_name[], |
+ SkTypeface::Style requested, |
+ FontIdentity* out_font_identifier, |
+ SkString* out_family_name, |
+ SkTypeface::Style* out_style) { |
+ return thread_->MatchFamilyName(family_name, requested, out_font_identifier, |
+ out_family_name, out_style); |
+} |
+ |
+SkStreamAsset* FontLoader::openStream(const FontIdentity& identity) { |
+ { |
+ 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) { |
+ base::AutoLock lock(lock_); |
+ mapped_font_files_.erase(f->font_id()); |
+} |
+ |
+} // namespace font_service |