// Copyright (c) 2012 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.

#ifndef UI_GFX_PLATFORM_FONT_MAC_H_
#define UI_GFX_PLATFORM_FONT_MAC_H_

#include "base/compiler_specific.h"
#include "base/mac/scoped_nsobject.h"
#include "base/macros.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/font_render_params.h"
#include "ui/gfx/platform_font.h"

namespace gfx {

class GFX_EXPORT PlatformFontMac : public PlatformFont {
 public:
  // An enum indicating a type of system-specified font.
  //   - kGeneral: +[NSFont systemFontOfSize:(weight:)]
  //   - kMenu: +[NSFont menuFontOfSize:]
  //   - kToolTip: +[NSFont toolTipsFontOfSize:]
  enum class SystemFontType { kGeneral, kMenu, kToolTip };

  // Constructs a PlatformFontMac for a system-specified font of
  // |system_font_type| type. For a non-system-specified font, use any other
  // constructor.
  explicit PlatformFontMac(SystemFontType system_font_type);

  // Constructs a PlatformFontMac for containing the NSFont* |native_font|. Do
  // not call this for a system-specified font; use the |SystemFontType|
  // constructor for that. |native_font| must not be null.
  explicit PlatformFontMac(NativeFont native_font);

  // Constructs a PlatformFontMac representing the font with name |font_name|
  // and the size |font_size|. Do not call this for a system-specified font; use
  // the |SystemFontType| constructor for that.
  PlatformFontMac(const std::string& font_name,
                  int font_size);

  // Constructs a PlatformFontMac representing the font specified by |typeface|
  // and the size |font_size_pixels|. Do not call this for a system-specified
  // font; use the |SystemFontType| constructor for that.
  PlatformFontMac(sk_sp<SkTypeface> typeface,
                  int font_size_pixels,
                  const absl::optional<FontRenderParams>& params);

  PlatformFontMac(const PlatformFontMac&) = delete;
  PlatformFontMac& operator=(const PlatformFontMac&) = delete;

  // Overridden from PlatformFont:
  Font DeriveFont(int size_delta,
                  int style,
                  Font::Weight weight) const override;
  int GetHeight() override;
  Font::Weight GetWeight() const override;
  int GetBaseline() override;
  int GetCapHeight() override;
  int GetExpectedTextWidth(int length) override;
  int GetStyle() const override;
  const std::string& GetFontName() const override;
  std::string GetActualFontName() const override;
  int GetFontSize() const override;
  const FontRenderParams& GetFontRenderParams() override;
  NativeFont GetNativeFont() const override;
  sk_sp<SkTypeface> GetNativeSkTypeface() const override;

  // A utility function to get the weight of an NSFont. Used by the unit test.
  static Font::Weight GetFontWeightFromNSFontForTesting(NSFont* font);

 private:
  struct FontSpec {
    std::string name;  // Corresponds to -[NSFont fontFamily].
    int size;
    int style;
    Font::Weight weight;
  };

  PlatformFontMac(NativeFont font,
                  absl::optional<SystemFontType> system_font_type);

  PlatformFontMac(NativeFont font,
                  absl::optional<SystemFontType> system_font_type,
                  FontSpec spec);

  ~PlatformFontMac() override;

  // Calculates and caches the font metrics and initializes |render_params_|.
  void CalculateMetricsAndInitRenderParams();

  // Returns an autoreleased NSFont created with the passed-in specifications.
  NSFont* NSFontWithSpec(FontSpec font_spec) const;

  // The NSFont instance for this object. If this object was constructed from an
  // NSFont instance, this holds that NSFont instance. Otherwise this NSFont
  // instance is constructed from the name, size, and style. If there is no
  // active font that matched those criteria a default font is used.
  base::scoped_nsobject<NSFont> native_font_;

  // If the font is a system font, and if so, what kind.
  const absl::optional<SystemFontType> system_font_type_;

  // The name/size/style/weight quartet that specify the font. Initialized in
  // the constructors.
  const FontSpec font_spec_;

  // Cached metrics, generated in CalculateMetrics().
  int height_;
  int ascent_;
  int cap_height_;

  // Cached average width, generated in GetExpectedTextWidth().
  float average_width_ = 0.0;

  // Details about how the font should be rendered.
  FontRenderParams render_params_;
};

}  // namespace gfx

#endif  // UI_GFX_PLATFORM_FONT_MAC_H_
