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:
|
|
|
|
|
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;
|
|
|
|
|
uint8_t decorationValue;
|
|
|
|
|
private:
|
|
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
};
|
|
|
|
|
|
2025-11-04 10:58:26 +03:00
|
|
|
class WeightTextStyleModifier : public TextStyleModifier {
|
|
|
|
|
public:
|
|
|
|
|
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;
|
|
|
|
|
void set_weight(SkFontStyle::Weight newWeight);
|
|
|
|
|
SkFontStyle::Weight get_weight();
|
|
|
|
|
private:
|
|
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
uint8_t weightValue;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class SlantTextStyleModifier : public TextStyleModifier {
|
|
|
|
|
public:
|
|
|
|
|
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;
|
|
|
|
|
void set_slant(SkFontStyle::Slant newSlant);
|
|
|
|
|
SkFontStyle::Slant get_slant();
|
|
|
|
|
private:
|
|
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
uint8_t slantValue;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class ColorTextStyleModifier : public TextStyleModifier {
|
|
|
|
|
public:
|
|
|
|
|
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;
|
|
|
|
|
Vector4f color;
|
|
|
|
|
private:
|
|
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class SizeTextStyleModifier : public TextStyleModifier {
|
|
|
|
|
public:
|
|
|
|
|
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;
|
|
|
|
|
float size;
|
|
|
|
|
private:
|
|
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class FontFamiliesTextStyleModifier : public TextStyleModifier {
|
|
|
|
|
public:
|
|
|
|
|
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;
|
|
|
|
|
std::vector<SkString> families;
|
|
|
|
|
private:
|
|
|
|
|
virtual bool equivalent_data(TextStyleModifier& modifier) const override;
|
|
|
|
|
};
|