diff --git a/.clang-format b/.clang-format index ef86260..08eb890 100644 --- a/.clang-format +++ b/.clang-format @@ -1,10 +1,10 @@ --- -Language: Cpp +Language: Cpp AccessModifierOffset: -4 AlignAfterOpenBracket: Align AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false -AlignOperands: true +AlignOperands: true AlignTrailingComments: true AllowAllParametersOfDeclarationOnNextLine: true AllowShortBlocksOnASingleLine: Never @@ -22,28 +22,30 @@ BreakBeforeBinaryOperators: None BreakBeforeBraces: Attach BreakBeforeTernaryOperators: false BreakConstructorInitializersBeforeComma: false -ColumnLimit: 100 -CommentPragmas: '^ (IWYU pragma:|NOLINT)' +ColumnLimit: 100 +CommentPragmas: '^ (IWYU pragma:|NOLINT)' ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 Cpp11BracedListStyle: true DerivePointerAlignment: false -DisableFormat: false -ForEachMacros: [] +DisableFormat: false +ForEachMacros: [ ] IncludeCategories: - - Regex: '^<[Ww]indows\.h>$' - Priority: 1 - - Regex: '^<' - Priority: 2 - - Regex: '^"' - Priority: 3 + - Regex: '^<[Ww]indows\.h>$' + Priority: 1 + - Regex: '^<' + Priority: 2 + - Regex: '^"' + Priority: 3 IndentCaseLabels: false -IndentWidth: 4 +IndentWidth: 4 IndentWrappedFunctionNames: false +InsertNewlineAtEOF: true KeepEmptyLinesAtTheStartOfBlocks: false +LineEnding: LF MacroBlockBegin: '' -MacroBlockEnd: '' +MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: None ObjCBlockIndentWidth: 4 @@ -56,19 +58,23 @@ PenaltyBreakString: 1000 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 60 PointerAlignment: Left -ReflowComments: true -SortIncludes: true +QualifierAlignment: Left +ReflowComments: true +RemoveBracesLLVM: true +SeparateDefinitionBlocks: Always +SortIncludes: true SpaceAfterCStyleCast: false SpaceBeforeAssignmentOperators: true SpaceBeforeParens: ControlStatements SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 2 -SpacesInAngles: false +SpacesInAngles: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false Standard: c++17 -TabWidth: 4 -UseTab: Never +TabWidth: 4 +UseTab: Never +WhitespaceSensitiveMacros: [ "SEAD_ENUM", "SEAD_ENUM_EX", "SEAD_ENUM_EX_VALUES" ] ... diff --git a/CMakeLists.txt b/CMakeLists.txt index c0458ae..433a5d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,9 @@ project(eui CXX ASM) add_library(eui OBJECT include/euiControlBase.h + include/message/euiScalableFontMgr.h + include/message/euiFontMgr.h + include/sys/euiSharcArchive.h src/euiControlBase.cpp ) @@ -11,7 +14,10 @@ target_compile_options(eui PRIVATE -fno-strict-aliasing) target_compile_options(eui PRIVATE -Wno-invalid-offsetof) target_include_directories(eui PUBLIC include/) +if(NOT TARGET sead) + add_subdirectory(../sead) +endif() if(NOT TARGET agl) add_subdirectory(../agl) endif() -target_link_libraries(eui PUBLIC agl) +target_link_libraries(eui PUBLIC agl sead) diff --git a/include/message/euiFontMgr.h b/include/message/euiFontMgr.h new file mode 100644 index 0000000..5c9aeaf --- /dev/null +++ b/include/message/euiFontMgr.h @@ -0,0 +1,54 @@ +#pragma once + +#include +#include +#include + +#include "sys/euiSharcArchive.h" + +namespace sead { +class Heap; +} + +namespace nn::font { +class Font; +class ResFont; +} // namespace nn::font + +namespace eui { +class ScalableFontMgr; + +class FontMgr { + SEAD_SINGLETON_DISPOSER(FontMgr) +public: + FontMgr(); + + void initialize(sead::Heap*, void*, u32, const sead::Buffer&, + eui::ScalableFontMgr*); + void finalize(); + void registFont(nn::ui2d::ResourceAccessor*); + const nn::font::Font* tryGetFont(const sead::SafeString&) const; + nn::font::Font* tryGetFont(const sead::SafeString&); + const nn::font::Font* getFont(const sead::SafeString&) const; + nn::font::Font* getFont(const sead::SafeString&); + const nn::font::Font* getFontByMessageIndex(u32) const; + nn::font::Font* getFontByMessageIndex(u32); + void setRubyFont(const sead::SafeString&); + void setRubyFont(const nn::font::Font*); + bool isScalableFont(const sead::SafeString&) const; + void findFontName(sead::BufferedSafeString*, const nn::font::Font*) const; + + ScalableFontMgr* getScalableFontMgr() const { return mScalableFontMrg; } + +private: + char filler[0x8]; + SharcArchive mSharcArchive; + sead::PtrArray _30; + sead::PtrArray _40; + nn::font::Font* mRubyFont; + ScalableFontMgr* mScalableFontMrg; +}; + +static_assert(sizeof(FontMgr) == 0x60); + +} // namespace eui diff --git a/include/message/euiScalableFontMgr.h b/include/message/euiScalableFontMgr.h new file mode 100644 index 0000000..be316f4 --- /dev/null +++ b/include/message/euiScalableFontMgr.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include +#include + +namespace nn::font { +class ScalableFont; +class TextureCache; +} // namespace nn::font + +namespace nn::ui2d { +class ResourceAccessor; +} + +namespace eui { +class FontMgr; +class ScalableFontTextBoxEx; + +class ScalableFontMgr { + SEAD_SINGLETON_DISPOSER(ScalableFontMgr) +public: + struct InitializeArg; + + ScalableFontMgr(); + + void initialize(const InitializeArg&); + void update(); + void registFont(nn::ui2d::ResourceAccessor*); + const nn::font::ScalableFont* getFont(const sead::SafeString&) const; + nn::font::ScalableFont* getFont(const sead::SafeString&); + bool isGlyphsReady(const char16*, u32, const nn::font::ScalableFont*, const eui::FontMgr*); + bool registerGlyphs(const char16*, u32, const nn::font::ScalableFont*, const eui::FontMgr*, + s32); + const char* findFontName(const nn::font::ScalableFont*) const; + void reserveRegisterGlyphs(eui::ScalableFontTextBoxEx*); + void dumpTextureCacheGlyphTreeMap() const; + s32 getTextureCacheNoSpaceError() const; + void clearNoSpaceError(); + + bool is_55() const { return _55; } + +private: + bool registerGlyphs_(const char16*, u32, const nn::font::ScalableFont*, const eui::FontMgr*, + s32, bool); + bool isNeedPlot_(char16, u32, u32); + + char filler[0x18]; + nn::font::TextureCache* _38; + sead::Thread* _40; + ScalableFontTextBoxEx* _48; + s32 _50; + bool _54; + bool _55; + bool _56; +}; + +static_assert(sizeof(ScalableFontMgr) == 0x58); + +} // namespace eui diff --git a/include/sys/euiSharcArchive.h b/include/sys/euiSharcArchive.h new file mode 100644 index 0000000..b280fa9 --- /dev/null +++ b/include/sys/euiSharcArchive.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +namespace sead { +class Heap; +} + +namespace eui { + +class SharcArchive { +public: + class FileReader; + + SharcArchive(); + + void finalize(); + void initialize(sead::Heap*, void*, u32); + void startFileReader(eui::SharcArchive::FileReader*) const; + +private: + char _filler[0x8]; +}; + +static_assert(sizeof(SharcArchive) == 0x8); + +} // namespace eui