blob: 4f21748d5e7692674fdd96a3c176139f8dd218bc [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.
#ifndef FLUTTER_IMPELLER_TYPOGRAPHER_FONT_H_
#define FLUTTER_IMPELLER_TYPOGRAPHER_FONT_H_
#include <memory>
#include <optional>
#include "flutter/fml/macros.h"
#include "impeller/base/comparable.h"
#include "impeller/typographer/glyph.h"
#include "impeller/typographer/typeface.h"
namespace impeller {
//------------------------------------------------------------------------------
/// @brief Describes a typeface along with any modifications to its
/// intrinsic properties.
///
class Font : public Comparable<Font> {
public:
//----------------------------------------------------------------------------
/// @brief Describes the modifications made to the intrinsic properties
/// of a typeface.
///
/// The coordinate system of a font has its origin at (0, 0) on
/// the baseline with an upper-left-origin coordinate system.
///
struct Metrics {
//--------------------------------------------------------------------------
/// The point size of the font.
///
Scalar point_size = 12.0f;
bool embolden = false;
Scalar skewX = 0.0f;
Scalar scaleX = 1.0f;
constexpr bool operator==(const Metrics& o) const {
return point_size == o.point_size && embolden == o.embolden &&
skewX == o.skewX && scaleX == o.scaleX;
}
};
Font(std::shared_ptr<Typeface> typeface, Metrics metrics);
~Font();
bool IsValid() const;
//----------------------------------------------------------------------------
/// @brief The typeface whose intrinsic properties this font modifies.
///
/// @return The typeface.
///
const std::shared_ptr<Typeface>& GetTypeface() const;
const Metrics& GetMetrics() const;
// |Comparable<Font>|
std::size_t GetHash() const override;
// |Comparable<Font>|
bool IsEqual(const Font& other) const override;
private:
std::shared_ptr<Typeface> typeface_;
Metrics metrics_ = {};
bool is_valid_ = false;
};
} // namespace impeller
template <>
struct std::hash<impeller::Font::Metrics> {
constexpr std::size_t operator()(const impeller::Font::Metrics& m) const {
return fml::HashCombine(m.point_size, m.skewX, m.scaleX);
}
};
#endif // FLUTTER_IMPELLER_TYPOGRAPHER_FONT_H_