#include "stdafx.h" #include "V8DataModel/TextService.h" FASTFLAGVARIABLE(TypesettersReleaseResources, true); FASTFLAGVARIABLE(UseDynamicTypesetterUTF8, false) namespace RBX { const char* const sTextService = "TextService"; namespace Reflection { template<> EnumDesc::EnumDesc() :EnumDescriptor("FontSize") { addPair(TextService::SIZE_8 , "Size8"); addPair(TextService::SIZE_9 , "Size9"); addPair(TextService::SIZE_10, "Size10"); addPair(TextService::SIZE_11, "Size11"); addPair(TextService::SIZE_12, "Size12"); addPair(TextService::SIZE_14, "Size14"); addPair(TextService::SIZE_18, "Size18"); addPair(TextService::SIZE_24, "Size24"); addPair(TextService::SIZE_36, "Size36"); addPair(TextService::SIZE_48, "Size48"); addPair(TextService::SIZE_28, "Size28"); addPair(TextService::SIZE_32, "Size32"); addPair(TextService::SIZE_42, "Size42"); addPair(TextService::SIZE_60, "Size60"); addPair(TextService::SIZE_96, "Size96"); } template<> EnumDesc::EnumDesc() :EnumDescriptor("Font") { addPair(TextService::FONT_LEGACY, "Legacy"); addPair(TextService::FONT_ARIAL, "Arial"); addPair(TextService::FONT_ARIALBOLD, "ArialBold"); addPair(TextService::FONT_SOURCESANS, "SourceSans"); addPair(TextService::FONT_SOURCESANSBOLD, "SourceSansBold"); addPair(TextService::FONT_SOURCESANSLIGHT, "SourceSansLight"); addPair(TextService::FONT_SOURCESANSITALIC, "SourceSansItalic"); } template<> TextService::Font& Variant::convert(void) { return genericConvert(); } template<> EnumDesc::EnumDesc() :EnumDescriptor("TextXAlignment") { addPair(TextService::XALIGNMENT_LEFT, "Left"); addPair(TextService::XALIGNMENT_CENTER, "Center"); addPair(TextService::XALIGNMENT_RIGHT, "Right"); } template<> EnumDesc::EnumDesc() :EnumDescriptor("TextYAlignment") { addPair(TextService::YALIGNMENT_TOP, "Top"); addPair(TextService::YALIGNMENT_CENTER,"Center"); addPair(TextService::YALIGNMENT_BOTTOM,"Bottom"); } }//namespace Reflection template<> bool StringConverter::convertToValue(const std::string& text, TextService::Font& value) { return Reflection::EnumDesc::singleton().convertToValue(text.c_str(),value); } static Reflection::BoundFuncDesc func_getTextSize(&TextService::getTextSize, "GetTextSize", "string", "fontSize", "font", "frameSize", Security::RobloxScript); TextService::Font TextService::FromTextFont(Text::Font font) { switch(font) { case Text::FONT_LEGACY: return FONT_LEGACY; case Text::FONT_ARIAL: return FONT_ARIAL; case Text::FONT_ARIALBOLD: return FONT_ARIALBOLD; case Text::FONT_SOURCESANS: return FONT_SOURCESANS; case Text::FONT_SOURCESANSBOLD: return FONT_SOURCESANSBOLD; case Text::FONT_SOURCESANSLIGHT: return FONT_SOURCESANSLIGHT; case Text::FONT_SOURCESANSITALIC: return FONT_SOURCESANSITALIC; default: RBXASSERT(0); return FONT_LEGACY; } } Text::Font TextService::ToTextFont(Font font) { switch(font) { case FONT_LEGACY: return Text::FONT_LEGACY; case FONT_ARIAL: return Text::FONT_ARIAL; case FONT_ARIALBOLD: return Text::FONT_ARIALBOLD; case FONT_SOURCESANS: return Text::FONT_SOURCESANS; case FONT_SOURCESANSBOLD: return Text::FONT_SOURCESANSBOLD; case FONT_SOURCESANSLIGHT: return Text::FONT_SOURCESANSLIGHT; case FONT_SOURCESANSITALIC: return Text::FONT_SOURCESANSITALIC; default: RBXASSERT(0); return Text::FONT_LEGACY; } } Text::XAlign TextService::ToTextXAlign(XAlignment xalign) { switch(xalign){ case TextService::XALIGNMENT_LEFT: return Text::XALIGN_LEFT; case TextService::XALIGNMENT_RIGHT: return Text::XALIGN_RIGHT; case TextService::XALIGNMENT_CENTER: return Text::XALIGN_CENTER; default: RBXASSERT(0); return Text::XALIGN_LEFT; } } Text::YAlign TextService::ToTextYAlign(YAlignment yalign) { switch(yalign){ case TextService::YALIGNMENT_TOP: return Text::YALIGN_TOP; case TextService::YALIGNMENT_CENTER: return Text::YALIGN_CENTER; case TextService::YALIGNMENT_BOTTOM: return Text::YALIGN_BOTTOM; default: RBXASSERT(0); return Text::YALIGN_TOP; } } TextService::TextService() :Super() { this->setName(sTextService); clearTypesetters(); } void TextService::clearTypesetters() { if (FFlag::TypesettersReleaseResources) { if (m_typesetters.get()) { for (size_t i = 0; i < FONT_LAST; ++i) { m_typesetters[i].get()->releaseResources(); } } else { m_typesetters.reset(new shared_ptr[FONT_LAST]); } } else { m_typesetters.reset(new shared_ptr[FONT_LAST]); } } void TextService::registerTypesetter(Font font, shared_ptr typesetter) { RBXASSERT(font < FONT_LAST); m_typesetters[font] = typesetter; } Typesetter* TextService::getTypesetter(Font font) { RBXASSERT(font < FONT_LAST); return m_typesetters[font].get(); } Vector2 TextService::getTextSize(std::string text, int fontSize, Font font, Vector2 frameSize) { if (font >= FONT_LAST || font < FONT_LEGACY) { return Vector2::zero(); } if (Typesetter* typesetter = getTypesetter(font)) { return typesetter->measure(text, (float) fontSize, frameSize); } return Vector2::zero(); } }