2025-11-04 10:58:26 +03:00
|
|
|
#pragma once
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
#include <modules/skparagraph/include/Paragraph.h>
|
|
|
|
|
#include <modules/skparagraph/include/TextStyle.h>
|
|
|
|
|
#include "cereal/archives/portable_binary.hpp"
|
|
|
|
|
#include "../SharedTypes.hpp"
|
|
|
|
|
|
|
|
|
|
class TextStyleModifier {
|
|
|
|
|
public:
|
|
|
|
|
enum class ModifierType : uint16_t {
|
|
|
|
|
SIZE = 0,
|
|
|
|
|
COLOR,
|
|
|
|
|
WEIGHT,
|
|
|
|
|
SLANT,
|
2025-11-05 18:21:49 +03:00
|
|
|
DECORATION,
|
2025-11-05 12:29:31 +03:00
|
|
|
FONT_FAMILIES,
|
|
|
|
|
|
|
|
|
|
COUNT
|
2025-11-04 10:58:26 +03:00
|
|
|
};
|
2025-11-05 12:29:31 +03:00
|
|
|
|
|
|
|
|
typedef std::unordered_map<ModifierType, std::shared_ptr<TextStyleModifier>> ModifierMap;
|
|
|
|
|
|
2025-11-04 10:58:26 +03:00
|
|
|
static std::shared_ptr<TextStyleModifier> allocate_modifier(ModifierType type);
|
2025-11-05 12:29:31 +03:00
|
|
|
static std::shared_ptr<TextStyleModifier> get_default_modifier(ModifierType type);
|
|
|
|
|
static const ModifierMap& get_default_modifiers();
|
2025-11-04 10:58:26 +03:00
|
|
|
virtual ModifierType get_type() const = 0;
|
|
|
|
|
virtual void save(cereal::PortableBinaryOutputArchive& a) const = 0;
|
|
|
|
|
virtual void load(cereal::PortableBinaryInputArchive& a) = 0;
|
|
|
|
|
virtual void modify_text_style(skia::textlayout::TextStyle& style) const = 0;
|
|
|
|
|
bool equivalent(TextStyleModifier& modifier) const;
|
|
|
|
|
virtual ~TextStyleModifier();
|
|
|
|
|
private:
|
2025-11-05 12:29:31 +03:00
|
|
|
static ModifierMap defaultMods;
|
2025-11-04 10:58:26 +03:00
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const = 0;
|
|
|
|
|
};
|
|
|
|
|
|
2025-11-05 18:21:49 +03:00
|
|
|
class DecorationTextStyleModifier : public TextStyleModifier {
|
|
|
|
|
public:
|
2025-11-09 15:01:57 +03:00
|
|
|
DecorationTextStyleModifier() = default;
|
|
|
|
|
DecorationTextStyleModifier(uint8_t initDecorationValue);
|
2025-11-05 18:21:49 +03:00
|
|
|
virtual ModifierType get_type() const override;
|
|
|
|
|
virtual void save(cereal::PortableBinaryOutputArchive& a) const override;
|
|
|
|
|
virtual void load(cereal::PortableBinaryInputArchive& a) override;
|
|
|
|
|
virtual void modify_text_style(skia::textlayout::TextStyle& style) const override;
|
2025-11-09 15:01:57 +03:00
|
|
|
uint8_t get_decoration_value() const;
|
2025-11-05 18:21:49 +03:00
|
|
|
private:
|
2025-11-09 15:01:57 +03:00
|
|
|
uint8_t decorationValue;
|
2025-11-05 18:21:49 +03:00
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
};
|
|
|
|
|
|
2025-11-04 10:58:26 +03:00
|
|
|
class WeightTextStyleModifier : public TextStyleModifier {
|
|
|
|
|
public:
|
2025-11-09 15:01:57 +03:00
|
|
|
WeightTextStyleModifier() = default;
|
|
|
|
|
WeightTextStyleModifier(SkFontStyle::Weight initWeight);
|
2025-11-04 10:58:26 +03:00
|
|
|
virtual ModifierType get_type() const override;
|
|
|
|
|
virtual void save(cereal::PortableBinaryOutputArchive& a) const override;
|
|
|
|
|
virtual void load(cereal::PortableBinaryInputArchive& a) override;
|
|
|
|
|
virtual void modify_text_style(skia::textlayout::TextStyle& style) const override;
|
2025-11-09 15:01:57 +03:00
|
|
|
SkFontStyle::Weight get_weight() const;
|
2025-11-04 10:58:26 +03:00
|
|
|
private:
|
|
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
uint8_t weightValue;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class SlantTextStyleModifier : public TextStyleModifier {
|
|
|
|
|
public:
|
2025-11-09 15:01:57 +03:00
|
|
|
SlantTextStyleModifier() = default;
|
|
|
|
|
SlantTextStyleModifier(uint8_t initSlantValue);
|
2025-11-04 10:58:26 +03:00
|
|
|
virtual ModifierType get_type() const override;
|
|
|
|
|
virtual void save(cereal::PortableBinaryOutputArchive& a) const override;
|
|
|
|
|
virtual void load(cereal::PortableBinaryInputArchive& a) override;
|
|
|
|
|
virtual void modify_text_style(skia::textlayout::TextStyle& style) const override;
|
2025-11-09 15:01:57 +03:00
|
|
|
SkFontStyle::Slant get_slant() const;
|
2025-11-04 10:58:26 +03:00
|
|
|
private:
|
|
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
uint8_t slantValue;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class ColorTextStyleModifier : public TextStyleModifier {
|
|
|
|
|
public:
|
2025-11-09 15:01:57 +03:00
|
|
|
ColorTextStyleModifier() = default;
|
|
|
|
|
ColorTextStyleModifier(const Vector4f& initColor);
|
2025-11-04 10:58:26 +03:00
|
|
|
virtual ModifierType get_type() const override;
|
|
|
|
|
virtual void save(cereal::PortableBinaryOutputArchive& a) const override;
|
|
|
|
|
virtual void load(cereal::PortableBinaryInputArchive& a) override;
|
|
|
|
|
virtual void modify_text_style(skia::textlayout::TextStyle& style) const override;
|
2025-11-09 15:01:57 +03:00
|
|
|
const Vector4f& get_color() const;
|
2025-11-04 10:58:26 +03:00
|
|
|
private:
|
2025-11-09 15:01:57 +03:00
|
|
|
Vector4f color;
|
2025-11-04 10:58:26 +03:00
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class SizeTextStyleModifier : public TextStyleModifier {
|
|
|
|
|
public:
|
2025-11-09 15:01:57 +03:00
|
|
|
SizeTextStyleModifier() = default;
|
|
|
|
|
SizeTextStyleModifier(float initSize);
|
2025-11-04 10:58:26 +03:00
|
|
|
virtual ModifierType get_type() const override;
|
|
|
|
|
virtual void save(cereal::PortableBinaryOutputArchive& a) const override;
|
|
|
|
|
virtual void load(cereal::PortableBinaryInputArchive& a) override;
|
|
|
|
|
virtual void modify_text_style(skia::textlayout::TextStyle& style) const override;
|
2025-11-09 15:01:57 +03:00
|
|
|
float get_size() const;
|
2025-11-04 10:58:26 +03:00
|
|
|
private:
|
2025-11-09 15:01:57 +03:00
|
|
|
float size;
|
2025-11-04 10:58:26 +03:00
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class FontFamiliesTextStyleModifier : public TextStyleModifier {
|
|
|
|
|
public:
|
2025-11-09 15:01:57 +03:00
|
|
|
FontFamiliesTextStyleModifier() = default;
|
|
|
|
|
FontFamiliesTextStyleModifier(const std::vector<SkString>& initFamilies);
|
2025-11-04 10:58:26 +03:00
|
|
|
virtual ModifierType get_type() const override;
|
|
|
|
|
virtual void save(cereal::PortableBinaryOutputArchive& a) const override;
|
|
|
|
|
virtual void load(cereal::PortableBinaryInputArchive& a) override;
|
|
|
|
|
virtual void modify_text_style(skia::textlayout::TextStyle& style) const override;
|
2025-11-09 15:01:57 +03:00
|
|
|
const std::vector<SkString>& get_families() const;
|
2025-11-04 10:58:26 +03:00
|
|
|
private:
|
2025-11-09 15:01:57 +03:00
|
|
|
std::vector<SkString> families;
|
2025-11-04 10:58:26 +03:00
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
};
|