infinipaint/src/RichTextBox/TextStyleModifier.hpp

86 lines
3.6 KiB
C++
Raw Normal View History

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,
FONT_FAMILIES
};
static std::shared_ptr<TextStyleModifier> allocate_modifier(ModifierType type);
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:
virtual bool equivalent_data(TextStyleModifier& modifier) const = 0;
};
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;
};