// Copyright 2016 The Fuchsia 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 "examples/ui/lib/skia_font_loader.h"

#include <utility>

#include "examples/ui/lib/skia_vmo_data.h"
#include "third_party/skia/include/core/SkFontMgr.h"

namespace scenic {

SkiaFontLoader::SkiaFontLoader(fuchsia::fonts::ProviderPtr font_provider)
    : font_provider_(std::move(font_provider)) {}

SkiaFontLoader::~SkiaFontLoader() {}

void SkiaFontLoader::LoadFont(fuchsia::fonts::Request request,
                              FontCallback callback) {
  // TODO(jeffbrown): Handle errors in case the font provider itself dies.
  font_provider_->GetFont(
      std::move(request), [callback = std::move(callback)](
                              fuchsia::fonts::ResponsePtr response) {
        if (response) {
          fsl::SizedVmo vmo;
          if (!fsl::SizedVmo::FromTransport(std::move(response->buffer),
                                            &vmo)) {
            callback(nullptr);
            return;
          }
          sk_sp<SkData> font_data = MakeSkDataFromVMO(vmo);
          if (font_data) {
            callback(
                SkFontMgr::RefDefault()->makeFromData(std::move(font_data)));
            return;
          }
        }
        callback(nullptr);
      });
}

void SkiaFontLoader::LoadDefaultFont(FontCallback callback) {
  fuchsia::fonts::Request request;
  request.family = "Roboto";
  LoadFont(std::move(request), std::move(callback));
}

}  // namespace scenic
