#include "TextStyleModifier.hpp" #include #include #include #include #define WEIGHT_VALUE_MODIFIER 100 TextStyleModifier::ModifierMap TextStyleModifier::defaultMods; std::shared_ptr TextStyleModifier::allocate_modifier(ModifierType type) { switch(type) { case ModifierType::SIZE: return std::make_shared(); case ModifierType::COLOR: return std::make_shared(); case ModifierType::WEIGHT: return std::make_shared(); case ModifierType::SLANT: return std::make_shared(); case ModifierType::DECORATION: return std::make_shared(); case ModifierType::FONT_FAMILIES: return std::make_shared(); case ModifierType::COUNT: return nullptr; } return nullptr; } std::shared_ptr TextStyleModifier::get_default_modifier(ModifierType type) { auto& defaultMods = get_default_modifiers(); auto it = defaultMods.find(type); if(it == defaultMods.end()) return nullptr; return it->second; } const TextStyleModifier::ModifierMap& TextStyleModifier::get_default_modifiers() { if(defaultMods.empty()) { auto weightMod = std::make_shared(); weightMod->set_weight(SkFontStyle::kNormal_Weight); defaultMods[ModifierType::WEIGHT] = weightMod; auto slantMod = std::make_shared(); slantMod->set_slant(SkFontStyle::kUpright_Slant); defaultMods[ModifierType::SLANT] = slantMod; auto decorationMod = std::make_shared(); decorationMod->decorationValue = skia::textlayout::TextDecoration::kNoDecoration; defaultMods[ModifierType::DECORATION] = decorationMod; } return defaultMods; } bool TextStyleModifier::equivalent(TextStyleModifier& modifier) const { if(modifier.get_type() != get_type()) return false; return equivalent_data(modifier); } TextStyleModifier::~TextStyleModifier() {} TextStyleModifier::ModifierType WeightTextStyleModifier::get_type() const { return ModifierType::WEIGHT; } void WeightTextStyleModifier::save(cereal::PortableBinaryOutputArchive& a) const { a(weightValue); } void WeightTextStyleModifier::load(cereal::PortableBinaryInputArchive& a) { a(weightValue); } void WeightTextStyleModifier::set_weight(SkFontStyle::Weight newWeight) { weightValue = newWeight / WEIGHT_VALUE_MODIFIER; } SkFontStyle::Weight WeightTextStyleModifier::get_weight() { return static_cast(static_cast(weightValue) * WEIGHT_VALUE_MODIFIER); } void WeightTextStyleModifier::modify_text_style(skia::textlayout::TextStyle& style) const { style.setFontStyle(SkFontStyle(static_cast(weightValue) * WEIGHT_VALUE_MODIFIER, style.getFontStyle().width(), style.getFontStyle().slant())); } bool WeightTextStyleModifier::equivalent_data(TextStyleModifier& modifier) const { return weightValue == static_cast(modifier).weightValue; } TextStyleModifier::ModifierType SlantTextStyleModifier::get_type() const { return ModifierType::SLANT; } void SlantTextStyleModifier::save(cereal::PortableBinaryOutputArchive& a) const { a(slantValue); } void SlantTextStyleModifier::load(cereal::PortableBinaryInputArchive& a) { a(slantValue); } void SlantTextStyleModifier::set_slant(SkFontStyle::Slant newSlant) { slantValue = newSlant; } SkFontStyle::Slant SlantTextStyleModifier::get_slant() { return static_cast(slantValue); } void SlantTextStyleModifier::modify_text_style(skia::textlayout::TextStyle& style) const { style.setFontStyle(SkFontStyle(style.getFontStyle().weight(), style.getFontStyle().width(), static_cast(slantValue))); } bool SlantTextStyleModifier::equivalent_data(TextStyleModifier& modifier) const { return slantValue == static_cast(modifier).slantValue; } TextStyleModifier::ModifierType ColorTextStyleModifier::get_type() const { return ModifierType::COLOR; } void ColorTextStyleModifier::save(cereal::PortableBinaryOutputArchive& a) const { a(color); } void ColorTextStyleModifier::load(cereal::PortableBinaryInputArchive& a) { a(color); } void ColorTextStyleModifier::modify_text_style(skia::textlayout::TextStyle& style) const { style.setForegroundPaint(SkPaint{convert_vec4(color)}); style.setDecorationColor(convert_vec4(color).toSkColor()); } bool ColorTextStyleModifier::equivalent_data(TextStyleModifier& modifier) const { return color == static_cast(modifier).color; } TextStyleModifier::ModifierType SizeTextStyleModifier::get_type() const { return ModifierType::SIZE; } void SizeTextStyleModifier::save(cereal::PortableBinaryOutputArchive& a) const { a(size); } void SizeTextStyleModifier::load(cereal::PortableBinaryInputArchive& a) { a(size); } void SizeTextStyleModifier::modify_text_style(skia::textlayout::TextStyle& style) const { style.setFontSize(size); } bool SizeTextStyleModifier::equivalent_data(TextStyleModifier& modifier) const { return size == static_cast(modifier).size; } TextStyleModifier::ModifierType FontFamiliesTextStyleModifier::get_type() const { return ModifierType::FONT_FAMILIES; } void FontFamiliesTextStyleModifier::save(cereal::PortableBinaryOutputArchive& a) const { a(families); } void FontFamiliesTextStyleModifier::load(cereal::PortableBinaryInputArchive& a) { a(families); } void FontFamiliesTextStyleModifier::modify_text_style(skia::textlayout::TextStyle& style) const { style.setFontFamilies(families); } bool FontFamiliesTextStyleModifier::equivalent_data(TextStyleModifier& modifier) const { return families == static_cast(modifier).families; } TextStyleModifier::ModifierType DecorationTextStyleModifier::get_type() const { return ModifierType::DECORATION; } void DecorationTextStyleModifier::save(cereal::PortableBinaryOutputArchive& a) const { a(decorationValue); } void DecorationTextStyleModifier::load(cereal::PortableBinaryInputArchive& a) { a(decorationValue); } void DecorationTextStyleModifier::modify_text_style(skia::textlayout::TextStyle& style) const { style.setDecoration(static_cast(decorationValue)); } bool DecorationTextStyleModifier::equivalent_data(TextStyleModifier& modifier) const { return decorationValue == static_cast(modifier).decorationValue; }