| 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 | 
|  |