blob: ef0250a82100abcd222f742359d761d00060bf3b [file] [log] [blame]
// Copyright 2013 The Flutter 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 "impeller/typographer/backends/stb/typeface_stb.h"
#include <cstring>
#include "flutter/fml/logging.h"
namespace impeller {
// Instantiate a typeface based on a .ttf or other font file
TypefaceSTB::TypefaceSTB(std::unique_ptr<fml::Mapping> typeface_mapping)
: typeface_mapping_(std::move(typeface_mapping)),
font_info_(std::make_unique<stbtt_fontinfo>()),
is_valid_(false) {
// We need an "offset" into the ttf file
auto offset = stbtt_GetFontOffsetForIndex(typeface_mapping_->GetMapping(), 0);
if (stbtt_InitFont(font_info_.get(), typeface_mapping_->GetMapping(),
offset) == 0) {
FML_LOG(ERROR) << "Failed to initialize stb font from binary data.";
} else {
is_valid_ = true;
}
}
TypefaceSTB::~TypefaceSTB() = default;
bool TypefaceSTB::IsValid() const {
return is_valid_;
}
std::size_t TypefaceSTB::GetHash() const {
if (!IsValid()) {
return 0u;
}
return reinterpret_cast<size_t>(typeface_mapping_->GetMapping());
}
bool TypefaceSTB::IsEqual(const Typeface& other) const {
auto stb_other = reinterpret_cast<const TypefaceSTB*>(&other);
return stb_other->GetHash() == GetHash();
}
const uint8_t* TypefaceSTB::GetTypefaceFile() const {
return typeface_mapping_->GetMapping();
}
const stbtt_fontinfo* TypefaceSTB::GetFontInfo() const {
return font_info_.get();
}
} // namespace impeller