From efcaad0f53bde2844bac023e59b864d787f2bf2e Mon Sep 17 00:00:00 2001 From: Justin Scofield Date: Wed, 15 Jun 2022 20:56:15 -0400 Subject: [PATCH] overhaul directory structure --- CMakeLists.txt | 2 +- src/Application/Core/constants.h | 8 +- src/Application/Core/controller.cc | 4 +- src/Application/Core/controller.h | 4 +- src/Application/Core/entry_point.h | 2 +- src/Application/Data/OW/overworld.cc | 4 +- src/Application/Data/OW/overworld.h | 4 +- src/Application/Data/OW/overworld_map.cc | 4 +- src/Application/Data/OW/overworld_map.h | 4 +- src/Application/Data/rom.cc | 121 +- src/Application/Data/rom.h | 8 +- src/Application/Editor/editor.cc | 10 +- src/Application/Editor/editor.h | 4 +- src/Application/Editor/overworld_editor.cc | 4 +- src/Application/Editor/overworld_editor.h | 4 +- src/Application/Editor/tile_editor.cc | 4 +- src/Application/Editor/tile_editor.h | 4 +- src/Application/Graphics/bitmap.cc | 4 +- src/Application/Graphics/bitmap.h | 4 +- src/Application/Graphics/icons.h | 2 +- src/Application/Graphics/palette.cc | 4 +- src/Application/Graphics/palette.h | 4 +- src/Application/Graphics/scene.cc | 4 +- src/Application/Graphics/scene.h | 4 +- src/Application/Graphics/style.cc | 4 +- src/Application/Graphics/style.h | 4 +- src/Application/Graphics/tile.cc | 6 +- src/Application/Graphics/tile.h | 4 +- src/CMakeLists.txt | 27 +- src/application/Core/constants.h | 1232 +++++++++++ src/application/Core/controller.cc | 185 ++ src/application/Core/controller.h | 55 + src/application/Core/entry_point.h | 18 + src/application/Core/input.cc | 25 + src/application/Core/input.h | 19 + src/application/Data/OW/overworld.cc | 349 ++++ src/application/Data/OW/overworld.h | 74 + src/application/Data/OW/overworld_map.cc | 359 ++++ src/application/Data/OW/overworld_map.h | 77 + src/application/Data/rom.cc | 244 +++ src/application/Data/rom.h | 59 + src/application/Editor/editor.cc | 510 +++++ src/application/Editor/editor.h | 71 + src/application/Editor/overworld_editor.cc | 290 +++ src/application/Editor/overworld_editor.h | 76 + src/application/Editor/tile_editor.cc | 10 + src/application/Editor/tile_editor.h | 15 + src/application/Graphics/bitmap.cc | 178 ++ src/application/Graphics/bitmap.h | 37 + src/application/Graphics/icons.h | 2192 ++++++++++++++++++++ src/application/Graphics/palette.cc | 113 + src/application/Graphics/palette.h | 50 + src/application/Graphics/scene.cc | 78 + src/application/Graphics/scene.h | 39 + src/application/Graphics/style.cc | 113 + src/application/Graphics/style.h | 19 + src/application/Graphics/tile.cc | 152 ++ src/application/Graphics/tile.h | 106 + src/yaze.h | 4 +- test/CMakeLists.txt | 10 +- test/rom_test.cc | 6 +- test/yaze_test.cc | 2 +- 62 files changed, 6948 insertions(+), 85 deletions(-) create mode 100644 src/application/Core/constants.h create mode 100644 src/application/Core/controller.cc create mode 100644 src/application/Core/controller.h create mode 100644 src/application/Core/entry_point.h create mode 100644 src/application/Core/input.cc create mode 100644 src/application/Core/input.h create mode 100644 src/application/Data/OW/overworld.cc create mode 100644 src/application/Data/OW/overworld.h create mode 100644 src/application/Data/OW/overworld_map.cc create mode 100644 src/application/Data/OW/overworld_map.h create mode 100644 src/application/Data/rom.cc create mode 100644 src/application/Data/rom.h create mode 100644 src/application/Editor/editor.cc create mode 100644 src/application/Editor/editor.h create mode 100644 src/application/Editor/overworld_editor.cc create mode 100644 src/application/Editor/overworld_editor.h create mode 100644 src/application/Editor/tile_editor.cc create mode 100644 src/application/Editor/tile_editor.h create mode 100644 src/application/Graphics/bitmap.cc create mode 100644 src/application/Graphics/bitmap.h create mode 100644 src/application/Graphics/icons.h create mode 100644 src/application/Graphics/palette.cc create mode 100644 src/application/Graphics/palette.h create mode 100644 src/application/Graphics/scene.cc create mode 100644 src/application/Graphics/scene.h create mode 100644 src/application/Graphics/style.cc create mode 100644 src/application/Graphics/style.h create mode 100644 src/application/Graphics/tile.cc create mode 100644 src/application/Graphics/tile.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 581b4c3d..1ca8a5d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,4 +16,4 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) # Project Files add_subdirectory(src) -add_subdirectory(tests) \ No newline at end of file +add_subdirectory(test) \ No newline at end of file diff --git a/src/Application/Core/constants.h b/src/Application/Core/constants.h index daf7478f..4365b8bf 100644 --- a/src/Application/Core/constants.h +++ b/src/Application/Core/constants.h @@ -1,5 +1,5 @@ -#ifndef YAZE_APPLICATION_CORE_CONSTANTS_H -#define YAZE_APPLICATION_CORE_CONSTANTS_H +#ifndef YAZE_application_CORE_CONSTANTS_H +#define YAZE_application_CORE_CONSTANTS_H #include #include @@ -21,7 +21,7 @@ using uint = unsigned int; using uchar = unsigned char; namespace yaze { -namespace Application { +namespace application { namespace Core { namespace Constants { @@ -1226,7 +1226,7 @@ static const std::string TileTypeNames[] = { } // namespace Constants } // namespace Core -} // namespace Application +} // namespace application } // namespace yaze #endif \ No newline at end of file diff --git a/src/Application/Core/controller.cc b/src/Application/Core/controller.cc index 907ff18b..24488a7d 100644 --- a/src/Application/Core/controller.cc +++ b/src/Application/Core/controller.cc @@ -11,7 +11,7 @@ #include "Editor/editor.h" namespace yaze { -namespace Application { +namespace application { namespace Core { bool Controller::isActive() const { return active_; } @@ -181,5 +181,5 @@ void Controller::CreateGuiContext() { } } // namespace Core -} // namespace Application +} // namespace application } // namespace yaze \ No newline at end of file diff --git a/src/Application/Core/controller.h b/src/Application/Core/controller.h index 201311fb..7ed4e2f2 100644 --- a/src/Application/Core/controller.h +++ b/src/Application/Core/controller.h @@ -15,7 +15,7 @@ int main(int argc, char **argv); namespace yaze { -namespace Application { +namespace application { namespace Core { class Controller { @@ -49,7 +49,7 @@ class Controller { }; } // namespace Core -} // namespace Application +} // namespace application } // namespace yaze #endif // YAZE_APPLICATION_CORE_CONTROLLER_H \ No newline at end of file diff --git a/src/Application/Core/entry_point.h b/src/Application/Core/entry_point.h index d94fa3cb..c764548a 100644 --- a/src/Application/Core/entry_point.h +++ b/src/Application/Core/entry_point.h @@ -4,7 +4,7 @@ #include "controller.h" int main(int argc, char** argv) { - yaze::Application::Core::Controller controller; + yaze::application::Core::Controller controller; controller.onEntry(); while (controller.isActive()) { controller.onInput(); diff --git a/src/Application/Data/OW/overworld.cc b/src/Application/Data/OW/overworld.cc index bff60dfb..4e270c8d 100644 --- a/src/Application/Data/OW/overworld.cc +++ b/src/Application/Data/OW/overworld.cc @@ -3,7 +3,7 @@ #include "Graphics/tile.h" namespace yaze { -namespace Application { +namespace application { namespace Data { using namespace Core; @@ -345,5 +345,5 @@ void Overworld::LoadOverworldMap() { } } // namespace Data -} // namespace Application +} // namespace application } // namespace yaze \ No newline at end of file diff --git a/src/Application/Data/OW/overworld.h b/src/Application/Data/OW/overworld.h index 537478b1..18db9e59 100644 --- a/src/Application/Data/OW/overworld.h +++ b/src/Application/Data/OW/overworld.h @@ -13,7 +13,7 @@ #include "overworld_map.h" namespace yaze { -namespace Application { +namespace application { namespace Data { class Overworld { @@ -68,7 +68,7 @@ class Overworld { }; } // namespace Data -} // namespace Application +} // namespace application } // namespace yaze #endif \ No newline at end of file diff --git a/src/Application/Data/OW/overworld_map.cc b/src/Application/Data/OW/overworld_map.cc index 26816ea8..adafaa7c 100644 --- a/src/Application/Data/OW/overworld_map.cc +++ b/src/Application/Data/OW/overworld_map.cc @@ -4,7 +4,7 @@ #include "Graphics/tile.h" namespace yaze { -namespace Application { +namespace application { namespace Data { using namespace Core; @@ -355,5 +355,5 @@ void OverworldMap::BuildTileset(int gameState) { } } // namespace Data -} // namespace Application +} // namespace application } // namespace yaze \ No newline at end of file diff --git a/src/Application/Data/OW/overworld_map.h b/src/Application/Data/OW/overworld_map.h index 7bde40c4..e95ebac6 100644 --- a/src/Application/Data/OW/overworld_map.h +++ b/src/Application/Data/OW/overworld_map.h @@ -8,7 +8,7 @@ #include "Graphics/tile.h" namespace yaze { -namespace Application { +namespace application { namespace Data { using ushort = unsigned short; @@ -73,5 +73,5 @@ class OverworldMap { }; } // namespace Data -} // namespace Application +} // namespace application } // namespace yaze \ No newline at end of file diff --git a/src/Application/Data/rom.cc b/src/Application/Data/rom.cc index 7c037c5e..57d9d821 100644 --- a/src/Application/Data/rom.cc +++ b/src/Application/Data/rom.cc @@ -5,7 +5,7 @@ #include "Core/constants.h" namespace yaze { -namespace Application { +namespace application { namespace Data { ROM::~ROM() { @@ -116,10 +116,127 @@ uint32_t ROM::GetRomPosition(const Graphics::TilePreset &preset, int directAddr, return filePos; } +unsigned char *sheetBuffer = (unsigned char *)malloc(0x1000); +unsigned char bitmask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; +void SNES3bppTo8bppSheet() // 128x32 +{ + int xx = 0; // positions where we are at on the sheet + int yy = 0; + int pos = 0; + int ypos = 0; + for (int i = 0; i < 64; i++) // for each tiles //16 per lines + { + for (int y = 0; y < 8; y++) // for each lines + { + //[0] + [1] + [16] + for (int x = 0; x < 8; x++) { + unsigned char b1 = + (unsigned char)((buffer[(y * 2) + (24 * pos)] & (bitmask[x]))); + unsigned char b2 = + (unsigned char)(buffer[((y * 2) + (24 * pos)) + 1] & (bitmask[x])); + unsigned char b3 = + (unsigned char)(buffer[(16 + y) + (24 * pos)] & (bitmask[x])); + unsigned char b = 0; + if (b1 != 0) { + b |= 1; + }; + if (b2 != 0) { + b |= 2; + }; + if (b3 != 0) { + b |= 4; + }; + sheetBuffer[x + (xx) + (y * 128) + (yy * 1024)] = b; + } + } + pos++; + ypos++; + xx += 8; + if (ypos >= 16) { + yy++; + xx = 0; + ypos = 0; + } + } +} + +char *Decompress(int pos, bool reversed = false) { + // char* buffer = new char[0x800]; + for (int i = 0; i < 0x800; i++) { + buffer[i] = 0; + } + unsigned int bufferPos = 0; + unsigned char cmd = 0; + unsigned int length = 0; + unsigned char databyte = (unsigned char)romData[pos]; + while (true) { + databyte = (unsigned char)romData[pos]; + if (databyte == 0xFF) // End of decompression + { + break; + } + + if ((databyte & 0xE0) == 0xE0) // Expanded Command + { + cmd = (unsigned char)((databyte >> 2) & 0x07); + length = + (unsigned short)(((romData[pos] << 8) | romData[pos + 1]) & 0x3FF); + pos += 2; // Advance 2 bytes in ROM + } else // Normal Command + { + cmd = (unsigned char)((databyte >> 5) & 0x07); + length = (unsigned char)(databyte & 0x1F); + pos += 1; // Advance 1 byte in ROM + } + length += 1; // Every commands are at least 1 size even if 00 + switch (cmd) { + case 00: // Direct Copy (Could be replaced with a MEMCPY) + for (int i = 0; i < length; i++) { + buffer[bufferPos++] = (unsigned char)romData[pos++]; + } + // Do not advance in the ROM + break; + case 01: // Byte Fill + for (int i = 0; i < length; i++) { + buffer[bufferPos++] = (unsigned char)romData[pos]; + } + pos += 1; // Advance 1 byte in the ROM + break; + case 02: // Word Fill + for (int i = 0; i < length; i += 2) { + buffer[bufferPos++] = (unsigned char)romData[pos]; + buffer[bufferPos++] = (unsigned char)romData[pos + 1]; + } + pos += 2; // Advance 2 byte in the ROM + break; + case 03: // Increasing Fill + { + unsigned char incByte = (unsigned char)romData[pos]; + for (int i = 0; i < (unsigned int)length; i++) { + buffer[bufferPos++] = (unsigned char)incByte++; + } + pos += 1; // Advance 1 byte in the ROM + } break; + case 04: // Repeat (Reversed byte order for maps) + { + unsigned short s1 = ((romData[pos + 1] & 0xFF) << 8); + unsigned short s2 = ((romData[pos] & 0xFF)); + unsigned short Addr = (unsigned short)(s1 | s2); + for (int i = 0; i < length; i++) { + buffer[bufferPos] = (unsigned char)buffer[Addr + i]; + bufferPos++; + } + pos += 2; // Advance 2 bytes in the ROM + } break; + } + } + return buffer; +} + int AddressFromBytes(uchar addr1, uchar addr2, uchar addr3) { return (addr1 << 16) | (addr2 << 8) | addr3; } } // namespace Data -} // namespace Application +} // namespace application } // namespace yaze \ No newline at end of file diff --git a/src/Application/Data/rom.h b/src/Application/Data/rom.h index 74d3d8c4..c99ea6ac 100644 --- a/src/Application/Data/rom.h +++ b/src/Application/Data/rom.h @@ -1,5 +1,5 @@ -#ifndef YAZE_APPLICATION_UTILS_ROM_H -#define YAZE_APPLICATION_UTILS_ROM_H +#ifndef YAZE_application_UTILS_ROM_H +#define YAZE_application_UTILS_ROM_H #include #include @@ -17,7 +17,7 @@ #include "Graphics/tile.h" namespace yaze { -namespace Application { +namespace application { namespace Data { int AddressFromBytes(uchar addr1, uchar addr2, uchar addr3); @@ -53,7 +53,7 @@ class ROM { }; } // namespace Data -} // namespace Application +} // namespace application } // namespace yaze #endif \ No newline at end of file diff --git a/src/Application/Editor/editor.cc b/src/Application/Editor/editor.cc index 1755072d..35032928 100644 --- a/src/Application/Editor/editor.cc +++ b/src/Application/Editor/editor.cc @@ -4,7 +4,7 @@ #include "Graphics/tile.h" namespace yaze { -namespace Application { +namespace application { namespace Editor { using namespace Core; @@ -266,14 +266,14 @@ void Editor::DrawSurface() { tile8 tile = arranged_tiles_[j][i]; // SDL_PIXELFORMAT_RGB888 ? SDL_Surface *surface = SDL_CreateRGBSurfaceWithFormat( - 0, 8, 8, SDL_BITSPERPIXEL(3), SDL_PIXELFORMAT_RGB444); + 0, 8, 8, SDL_BITSPERPIXEL(4), SDL_PIXELFORMAT_RGB444); if (surface == nullptr) { SDL_Log("SDL_CreateRGBSurfaceWithFormat() failed: %s", SDL_GetError()); exit(1); } SDL_PixelFormat *format = surface->format; format->palette = current_palette_.GetSDL_Palette(); - char *ptr = (char *)surface->pixels; + uchar *ptr = (uchar *)surface->pixels; for (int k = 0; k < 8; k++) { for (int l = 0; l < 8; l++) { @@ -341,7 +341,7 @@ void Editor::DrawProjectEditor() { ImGui::Image((void *)(SDL_Texture *)texture, ImVec2(32, 32)); if (i != 16) { ImGui::SameLine(); - } else if ( i == 16 ) { + } else if (i == 16) { i = 0; } i++; @@ -506,5 +506,5 @@ void Editor::DrawScreenEditor() { } } // namespace Editor -} // namespace Application +} // namespace application } // namespace yaze \ No newline at end of file diff --git a/src/Application/Editor/editor.h b/src/Application/Editor/editor.h index 9577f8cb..d39026dd 100644 --- a/src/Application/Editor/editor.h +++ b/src/Application/Editor/editor.h @@ -15,7 +15,7 @@ #include "Graphics/tile.h" namespace yaze { -namespace Application { +namespace application { namespace Editor { class Editor { @@ -65,7 +65,7 @@ class Editor { }; } // namespace Editor -} // namespace Application +} // namespace application } // namespace yaze #endif // YAZE_APPLICATION_VIEW_EDITOR_H \ No newline at end of file diff --git a/src/Application/Editor/overworld_editor.cc b/src/Application/Editor/overworld_editor.cc index 649bf61d..5c325614 100644 --- a/src/Application/Editor/overworld_editor.cc +++ b/src/Application/Editor/overworld_editor.cc @@ -27,7 +27,7 @@ // have an overworld map viewer, in less than few hours if are able to // understand the data quickly namespace yaze { -namespace Application { +namespace application { namespace Editor { void OverworldEditor::Update() { if (rom_.isLoaded()) { @@ -286,5 +286,5 @@ void OverworldEditor::DrawChangelist() { } } // namespace Editor -} // namespace Application +} // namespace application } // namespace yaze \ No newline at end of file diff --git a/src/Application/Editor/overworld_editor.h b/src/Application/Editor/overworld_editor.h index f77c92c5..2f81283d 100644 --- a/src/Application/Editor/overworld_editor.h +++ b/src/Application/Editor/overworld_editor.h @@ -10,7 +10,7 @@ #include "Graphics/tile.h" namespace yaze { -namespace Application { +namespace application { namespace Editor { static constexpr unsigned int k4BPP = 4; @@ -70,7 +70,7 @@ class OverworldEditor { bool opt_enable_grid = true; }; } // namespace Editor -} // namespace Application +} // namespace application } // namespace yaze #endif \ No newline at end of file diff --git a/src/Application/Editor/tile_editor.cc b/src/Application/Editor/tile_editor.cc index 0731b965..c698ea4f 100644 --- a/src/Application/Editor/tile_editor.cc +++ b/src/Application/Editor/tile_editor.cc @@ -1,10 +1,10 @@ #include "tile_editor.h" namespace yaze { -namespace Application { +namespace application { namespace Editor { void TileEditor::UpdateScreen() {} } // namespace Editor -} // namespace Application +} // namespace application } // namespace yaze \ No newline at end of file diff --git a/src/Application/Editor/tile_editor.h b/src/Application/Editor/tile_editor.h index daba96f1..be4ada46 100644 --- a/src/Application/Editor/tile_editor.h +++ b/src/Application/Editor/tile_editor.h @@ -2,14 +2,14 @@ #define YAZE_APPLICATION_EDITOR_TILEEDITOR_H namespace yaze { -namespace Application { +namespace application { namespace Editor { class TileEditor { public: void UpdateScreen(); }; } // namespace Editor -} // namespace Application +} // namespace application } // namespace yaze #endif \ No newline at end of file diff --git a/src/Application/Graphics/bitmap.cc b/src/Application/Graphics/bitmap.cc index 99798c6a..f9787e9e 100644 --- a/src/Application/Graphics/bitmap.cc +++ b/src/Application/Graphics/bitmap.cc @@ -5,7 +5,7 @@ #include "Data/rom.h" namespace yaze { -namespace Application { +namespace application { namespace Graphics { int GetPCGfxAddress(char *romData, char id) { @@ -174,5 +174,5 @@ void CreateAllGfxData(char *romData, char *allgfx16Ptr) { } } // namespace Graphics -} // namespace Application +} // namespace application } // namespace yaze diff --git a/src/Application/Graphics/bitmap.h b/src/Application/Graphics/bitmap.h index e5a26ac1..79cad488 100644 --- a/src/Application/Graphics/bitmap.h +++ b/src/Application/Graphics/bitmap.h @@ -6,7 +6,7 @@ #include "Core/constants.h" namespace yaze { -namespace Application { +namespace application { namespace Graphics { class Bitmap { @@ -31,7 +31,7 @@ char *CreateAllGfxDataRaw(char *romData); void CreateAllGfxData(char *romData, char *allgfx16Ptr); } // namespace Graphics -} // namespace Application +} // namespace application } // namespace yaze #endif \ No newline at end of file diff --git a/src/Application/Graphics/icons.h b/src/Application/Graphics/icons.h index b15d02c0..6aac5f1c 100644 --- a/src/Application/Graphics/icons.h +++ b/src/Application/Graphics/icons.h @@ -1696,7 +1696,7 @@ #define ICON_MD_SET_MEAL "\xef\x87\xaa" // U+f1ea #define ICON_MD_SETTINGS "\xee\xa2\xb8" // U+e8b8 #define ICON_MD_SETTINGS_ACCESSIBILITY "\xef\x81\x9d" // U+f05d -#define ICON_MD_SETTINGS_APPLICATIONS "\xee\xa2\xb9" // U+e8b9 +#define ICON_MD_SETTINGS_applicationS "\xee\xa2\xb9" // U+e8b9 #define ICON_MD_SETTINGS_BACKUP_RESTORE "\xee\xa2\xba" // U+e8ba #define ICON_MD_SETTINGS_BLUETOOTH "\xee\xa2\xbb" // U+e8bb #define ICON_MD_SETTINGS_BRIGHTNESS "\xee\xa2\xbd" // U+e8bd diff --git a/src/Application/Graphics/palette.cc b/src/Application/Graphics/palette.cc index fbd42522..299f78ef 100644 --- a/src/Application/Graphics/palette.cc +++ b/src/Application/Graphics/palette.cc @@ -4,7 +4,7 @@ #include namespace yaze { -namespace Application { +namespace application { namespace Graphics { SNESColor::SNESColor() : rgb(ImVec4(0.f, 0.f, 0.f, 0.f)) {} @@ -109,5 +109,5 @@ SDL_Palette* SNESPalette::GetSDL_Palette() { } } // namespace Graphics -} // namespace Application +} // namespace application } // namespace yaze \ No newline at end of file diff --git a/src/Application/Graphics/palette.h b/src/Application/Graphics/palette.h index 7e820da3..789a34cb 100644 --- a/src/Application/Graphics/palette.h +++ b/src/Application/Graphics/palette.h @@ -12,7 +12,7 @@ #include namespace yaze { -namespace Application { +namespace application { namespace Graphics { struct SNESColor { @@ -44,7 +44,7 @@ class SNESPalette { }; } // namespace Graphics -} // namespace Application +} // namespace application } // namespace yaze #endif // YAZE_APPLICATION_GRAPHICS_PALETTE_H \ No newline at end of file diff --git a/src/Application/Graphics/scene.cc b/src/Application/Graphics/scene.cc index c3f99738..68d21710 100644 --- a/src/Application/Graphics/scene.cc +++ b/src/Application/Graphics/scene.cc @@ -9,7 +9,7 @@ #include "Graphics/tile.h" namespace yaze { -namespace Application { +namespace application { namespace Graphics { void Scene::buildSurface(const std::vector& tiles, SNESPalette& mPalette, @@ -74,5 +74,5 @@ void Scene::setTilesZoom(unsigned int tileZoom) { void Scene::setTilesPattern(TilesPattern tp) { tilesPattern = tp; } } // namespace Graphics -} // namespace Application +} // namespace application } // namespace yaze diff --git a/src/Application/Graphics/scene.h b/src/Application/Graphics/scene.h index d209286c..759303ab 100644 --- a/src/Application/Graphics/scene.h +++ b/src/Application/Graphics/scene.h @@ -10,7 +10,7 @@ #include "Graphics/tile.h" namespace yaze { -namespace Application { +namespace application { namespace Graphics { class Scene { @@ -33,7 +33,7 @@ class Scene { }; } // namespace Graphics -} // namespace Application +} // namespace application } // namespace yaze #endif \ No newline at end of file diff --git a/src/Application/Graphics/style.cc b/src/Application/Graphics/style.cc index b0e16085..0ac2b50a 100644 --- a/src/Application/Graphics/style.cc +++ b/src/Application/Graphics/style.cc @@ -4,7 +4,7 @@ #include "imgui/imgui_internal.h" namespace yaze { -namespace Application { +namespace application { namespace Core { namespace Style { @@ -109,5 +109,5 @@ void ColorsYaze() { } } // namespace Style } // namespace Core -} // namespace Application +} // namespace application } // namespace yaze \ No newline at end of file diff --git a/src/Application/Graphics/style.h b/src/Application/Graphics/style.h index 520329d7..6a3fca1f 100644 --- a/src/Application/Graphics/style.h +++ b/src/Application/Graphics/style.h @@ -5,7 +5,7 @@ #include namespace yaze { -namespace Application { +namespace application { namespace Core { namespace Style { @@ -13,7 +13,7 @@ void ColorsYaze(); } // namespace Style } // namespace Core -} // namespace Application +} // namespace application } // namespace yaze #endif \ No newline at end of file diff --git a/src/Application/Graphics/tile.cc b/src/Application/Graphics/tile.cc index e4a7b927..d8a640e9 100644 --- a/src/Application/Graphics/tile.cc +++ b/src/Application/Graphics/tile.cc @@ -9,7 +9,7 @@ #include namespace yaze { -namespace Application { +namespace application { namespace Graphics { TilesPattern::TilesPattern() { @@ -22,6 +22,8 @@ TilesPattern::TilesPattern() { transform_vector_.push_back(std::vector{4, 5, 6, 7}); transform_vector_.push_back(std::vector{8, 9, 11, 12}); transform_vector_.push_back(std::vector{13, 14, 15, 16}); + + // "[0, 1, 4, 5], [2, 3, 6, 7], [8, 9, C, D], [A, B, E, F]" } // [pattern] @@ -146,5 +148,5 @@ std::vector > TilesPattern::transform( } } // namespace Graphics -} // namespace Application +} // namespace application } // namespace yaze diff --git a/src/Application/Graphics/tile.h b/src/Application/Graphics/tile.h index 872f7837..56d0122e 100644 --- a/src/Application/Graphics/tile.h +++ b/src/Application/Graphics/tile.h @@ -12,7 +12,7 @@ #include "Graphics/palette.h" namespace yaze { -namespace Application { +namespace application { namespace Graphics { // vhopppcc cccccccc @@ -100,7 +100,7 @@ class TilePreset { }; } // namespace Graphics -} // namespace Application +} // namespace application } // namespace yaze #endif \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 931e535f..ee1cfe33 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -32,19 +32,18 @@ add_library("NintendoCompression" STATIC ${SNESHACKING_SOURCES}) add_executable( yaze yaze.cc - Application/Core/controller.cc - Application/Core/renderer.cc - Application/Core/window.cc - Application/Data/rom.cc - Application/Data/OW/overworld.cc - Application/Data/OW/overworld_map.cc - Application/Graphics/bitmap.cc - Application/Graphics/tile.cc - Application/Graphics/palette.cc - Application/Graphics/style.cc - Application/Graphics/scene.cc - Application/Editor/editor.cc - Application/Editor/overworld_editor.cc + application/Core/controller.cc + application/Core/input.cc + application/Data/rom.cc + application/Data/OW/overworld.cc + application/Data/OW/overworld_map.cc + application/Graphics/bitmap.cc + application/Graphics/tile.cc + application/Graphics/palette.cc + application/Graphics/style.cc + application/Graphics/scene.cc + application/Editor/editor.cc + application/Editor/overworld_editor.cc # GUI libraries ${IMGUI_PATH}/imgui.cpp ${IMGUI_PATH}/imgui_demo.cpp @@ -67,7 +66,7 @@ add_executable( target_include_directories( yaze PUBLIC Library/ - Application/ + application/ "C:/msys64/mingw64/include/libpng16" "C:/msys64/mingw64/include/SDL2" "C:/msys64/mingw64/include" diff --git a/src/application/Core/constants.h b/src/application/Core/constants.h new file mode 100644 index 00000000..bdcc8bf6 --- /dev/null +++ b/src/application/Core/constants.h @@ -0,0 +1,1232 @@ +#ifndef YAZE_APPLICATION_CORE_CONSTANTS_H +#define YAZE_APPLICATION_CORE_CONSTANTS_H + +#include +#include + +#define BASIC_BUTTON(w) if (ImGui::Button(w)) + +#define TAB_BAR(w) if (ImGui::BeginTabBar(w)) { +#define END_TAB_BAR() \ + ImGui::EndTabBar(); \ + } + +#define MENU_BAR() if (ImGui::BeginMenuBar()) { +#define END_MENU_BAR() \ + ImGui::EndMenuBar(); \ + } + +using ushort = unsigned short; +using uint = unsigned int; +using uchar = unsigned char; + +namespace yaze { +namespace application { +namespace Core { +namespace Constants { + +//=========================================================================================== +// 65816 LanguageDefinition +//=========================================================================================== +static const char *const kKeywords[] = { + "ADC", "AND", "ASL", "BCC", "BCS", "BEQ", "BIT", "BMI", "BNE", + "BPL", "BRA", "BRL", "BVC", "BVS", "CLC", "CLD", "CLI", "CLV", + "CMP", "CPX", "CPY", "DEC", "DEX", "DEY", "EOR", "INC", "INX", + "INY", "JMP", "JSR", "JSL", "LDA", "LDX", "LDY", "LSR", "MVN", + "NOP", "ORA", "PEA", "PER", "PHA", "PHB", "PHD", "PHP", "PHX", + "PHY", "PLA", "PLB", "PLD", "PLP", "PLX", "PLY", "REP", "ROL", + "ROR", "RTI", "RTL", "RTS", "SBC", "SEC", "SEI", "SEP", "STA", + "STP", "STX", "STY", "STZ", "TAX", "TAY", "TCD", "TCS", "TDC", + "TRB", "TSB", "TSC", "TSX", "TXA", "TXS", "TXY", "TYA", "TYX", + "WAI", "WDM", "XBA", "XCE", "ORG", "LOROM", "HIROM", "NAMESPACE", "DB"}; + +static const char *const kIdentifiers[] = { + "abort", "abs", "acos", "asin", "atan", "atexit", + "atof", "atoi", "atol", "ceil", "clock", "cosh", + "ctime", "div", "exit", "fabs", "floor", "fmod", + "getchar", "getenv", "isalnum", "isalpha", "isdigit", "isgraph", + "ispunct", "isspace", "isupper", "kbhit", "log10", "log2", + "log", "memcmp", "modf", "pow", "putchar", "putenv", + "puts", "rand", "remove", "rename", "sinh", "sqrt", + "srand", "strcat", "strcmp", "strerror", "time", "tolower", + "toupper"}; + +//=========================================================================================== +// Magic numbers +//=========================================================================================== + +/// Bit set for object priority +constexpr ushort TilePriorityBit = 0x2000; + +/// Bit set for object hflip +constexpr ushort TileHFlipBit = 0x4000; + +/// Bit set for object vflip +constexpr ushort TileVFlipBit = 0x8000; + +/// Bits used for tile name +constexpr ushort TileNameMask = 0x03FF; + +constexpr int Uncompressed3BPPSize = 0x0600; +constexpr int UncompressedSheetSize = 0x0800; + +constexpr int NumberOfSheets = 223; +constexpr int LimitOfMap32 = 8864; +constexpr int NumberOfRooms = 296; + +constexpr int NumberOfOWMaps = 160; +constexpr int Map32PerScreen = 256; +constexpr int NumberOfMap16 = 3752; // 4096 +constexpr int NumberOfMap32 = Map32PerScreen * NumberOfOWMaps; +constexpr int NumberOfOWSprites = 352; +constexpr int NumberOfColors = 3143; + +// =========================================================================================== +// Graphics +// =========================================================================================== + +constexpr int tile_address = 0x1B52; // JP = Same +constexpr int tile_address_floor = 0x1B5A; // JP = Same +constexpr int subtype1_tiles = 0x8000; // JP = Same +constexpr int subtype2_tiles = 0x83F0; // JP = Same +constexpr int subtype3_tiles = 0x84F0; // JP = Same +constexpr int gfx_animated_pointer = 0x10275; // JP 0x10624 //long pointer +constexpr int overworldgfxGroups2 = 0x6073; // 0x60B3 +constexpr int gfx_1_pointer = + 0x6790; // 2byte pointer bank 00 pc -> 0x4320 CF80 ; 004F80 +constexpr int gfx_2_pointer = 0x6795; // D05F ; 00505F +constexpr int gfx_3_pointer = 0x679A; // D13E ; 00513E +constexpr int hud_palettes = 0xDD660; +constexpr int maxGfx = 0xC3FB5; + +// =========================================================================================== +// Overworld Related Variables +// =========================================================================================== + +constexpr int compressedAllMap32PointersHigh = 0x1794D; +constexpr int compressedAllMap32PointersLow = 0x17B2D; +constexpr int overworldgfxGroups = 0x05D97; +constexpr int map16Tiles = 0x78000; +constexpr int map32TilesTL = 0x18000; +constexpr int map32TilesTR = 0x1B400; +constexpr int map32TilesBL = 0x20000; +constexpr int map32TilesBR = 0x23400; +constexpr int overworldPalGroup1 = 0xDE6C8; +constexpr int overworldPalGroup2 = 0xDE86C; +constexpr int overworldPalGroup3 = 0xDE604; +constexpr int overworldMapPalette = 0x7D1C; +constexpr int overworldSpritePalette = 0x7B41; +constexpr int overworldMapPaletteGroup = 0x75504; +constexpr int overworldSpritePaletteGroup = 0x75580; +constexpr int overworldSpriteset = 0x7A41; +constexpr int overworldSpecialGFXGroup = 0x16821; +constexpr int overworldSpecialPALGroup = 0x16831; + +constexpr int overworldSpritesBegining = 0x4C881; +constexpr int overworldSpritesAgahnim = 0x4CA21; +constexpr int overworldSpritesZelda = 0x4C901; + +constexpr int overworldItemsPointers = 0xDC2F9; +constexpr int overworldItemsAddress = 0xDC8B9; // 1BC2F9 +constexpr int overworldItemsBank = 0xDC8BF; +constexpr int overworldItemsEndData = 0xDC89C; // 0DC89E + +constexpr int mapGfx = 0x7C9C; +constexpr int overlayPointers = 0x77664; +constexpr int overlayPointersBank = 0x0E; + +constexpr int overworldTilesType = 0x71459; +constexpr int overworldMessages = 0x3F51D; + +// TODO: +constexpr int overworldMusicBegining = 0x14303; +constexpr int overworldMusicZelda = 0x14303 + 0x40; +constexpr int overworldMusicMasterSword = 0x14303 + 0x80; +constexpr int overworldMusicAgahim = 0x14303 + 0xC0; +constexpr int overworldMusicDW = 0x14403; + +constexpr int overworldEntranceAllowedTilesLeft = 0xDB8C1; +constexpr int overworldEntranceAllowedTilesRight = 0xDB917; + +constexpr int overworldMapSize = 0x12844; // 0x00 = small maps, 0x20 = large + // maps +constexpr int overworldMapSizeHighByte = + 0x12884; // 0x01 = small maps, 0x03 = large maps + +// relative to the WORLD + 0x200 per map +// large map that are not == parent id = same position as their parent! +// eg for X position small maps : +// 0000, 0200, 0400, 0600, 0800, 0A00, 0C00, 0E00 +// all Large map would be : +// 0000, 0000, 0400, 0400, 0800, 0800, 0C00, 0C00 + +constexpr int overworldTransitionPositionY = 0x128C4; +constexpr int overworldTransitionPositionX = 0x12944; + +constexpr int overworldScreenSize = 0x1788D; + +//=========================================================================================== +// Overworld Exits/Entrances Variables +//=========================================================================================== +constexpr int OWExitRoomId = 0x15D8A; // 0x15E07 Credits sequences +// 105C2 Ending maps +// 105E2 Sprite Group Table for Ending +constexpr int OWExitMapId = 0x15E28; +constexpr int OWExitVram = 0x15E77; +constexpr int OWExitYScroll = 0x15F15; +constexpr int OWExitXScroll = 0x15FB3; +constexpr int OWExitYPlayer = 0x16051; +constexpr int OWExitXPlayer = 0x160EF; +constexpr int OWExitYCamera = 0x1618D; +constexpr int OWExitXCamera = 0x1622B; +constexpr int OWExitDoorPosition = 0x15724; +constexpr int OWExitUnk1 = 0x162C9; +constexpr int OWExitUnk2 = 0x16318; +constexpr int OWExitDoorType1 = 0x16367; +constexpr int OWExitDoorType2 = 0x16405; +constexpr int OWEntranceMap = 0xDB96F; +constexpr int OWEntrancePos = 0xDBA71; +constexpr int OWEntranceEntranceId = 0xDBB73; +constexpr int OWHolePos = 0xDB800; //(0x13 entries, 2 bytes each) modified(less + // 0x400) map16 coordinates for each hole +constexpr int OWHoleArea = + 0xDB826; //(0x13 entries, 2 bytes each) corresponding + // area numbers for each hole +constexpr int OWHoleEntrance = + 0xDB84C; //(0x13 entries, 1 byte each) corresponding entrance numbers + +constexpr int OWExitMapIdWhirlpool = 0x16AE5; // JP = ;016849 +constexpr int OWExitVramWhirlpool = 0x16B07; // JP = ;01686B +constexpr int OWExitYScrollWhirlpool = 0x16B29; // JP = ;01688D +constexpr int OWExitXScrollWhirlpool = 0x16B4B; // JP = ;016DE7 +constexpr int OWExitYPlayerWhirlpool = 0x16B6D; // JP = ;016E09 +constexpr int OWExitXPlayerWhirlpool = 0x16B8F; // JP = ;016E2B +constexpr int OWExitYCameraWhirlpool = 0x16BB1; // JP = ;016E4D +constexpr int OWExitXCameraWhirlpool = 0x16BD3; // JP = ;016E6F +constexpr int OWExitUnk1Whirlpool = 0x16BF5; // JP = ;016E91 +constexpr int OWExitUnk2Whirlpool = 0x16C17; // JP = ;016EB3 +constexpr int OWWhirlpoolPosition = 0x16CF8; // JP = ;016F94 + +//=========================================================================================== +// Dungeon Related Variables +//=========================================================================================== +// That could be turned into a pointer : +constexpr int dungeons_palettes_groups = 0x75460; // JP 0x67DD0 +constexpr int dungeons_main_bg_palette_pointers = 0xDEC4B; // JP Same +constexpr int dungeons_palettes = + 0xDD734; // JP Same (where all dungeons palettes are) + +// That could be turned into a pointer : +constexpr int room_items_pointers = 0xDB69; // JP 0xDB67 + +constexpr int rooms_sprite_pointer = 0x4C298; // JP Same //2byte bank 09D62E +constexpr int room_header_pointer = 0xB5DD; // LONG +constexpr int room_header_pointers_bank = 0xB5E7; // JP Same + +constexpr int gfx_groups_pointer = 0x6237; +constexpr int room_object_layout_pointer = 0x882D; + +constexpr int room_object_pointer = 0x874C; // Long pointer + +constexpr int chests_length_pointer = 0xEBF6; +constexpr int chests_data_pointer1 = 0xEBFB; +// constexpr int chests_data_pointer2 = 0xEC0A; //Disabled for now could be used +// for expansion constexpr int chests_data_pointer3 = 0xEC10; //Disabled for now +// could be used for expansion + +constexpr int blocks_length = 0x8896; // word value +constexpr int blocks_pointer1 = 0x15AFA; +constexpr int blocks_pointer2 = 0x15B01; +constexpr int blocks_pointer3 = 0x15B08; +constexpr int blocks_pointer4 = 0x15B0F; + +constexpr int torch_data = 0x2736A; // JP 0x2704A +constexpr int torches_length_pointer = 0x88C1; + +constexpr int sprite_blockset_pointer = 0x5B57; +constexpr int sprites_data = + 0x4D8B0; // It use the unused pointers to have more space //Save purpose +constexpr int sprites_data_empty_room = 0x4D8AE; +constexpr int sprites_end_data = 0x4EC9E; + +constexpr int pit_pointer = 0x394AB; +constexpr int pit_count = 0x394A6; + +constexpr int doorPointers = 0xF83C0; + +// doors +constexpr int door_gfx_up = 0x4D9E; +// +constexpr int door_gfx_down = 0x4E06; +constexpr int door_gfx_cavexit_down = 0x4E06; +constexpr int door_gfx_left = 0x4E66; +constexpr int door_gfx_right = 0x4EC6; + +constexpr int door_pos_up = 0x197E; +constexpr int door_pos_down = 0x1996; +constexpr int door_pos_left = 0x19AE; +constexpr int door_pos_right = 0x19C6; + +// TEXT EDITOR RELATED CONSTANTS +constexpr int gfx_font = 0x70000; // 2bpp format +constexpr int text_data = 0xE0000; +constexpr int text_data2 = 0x75F40; +constexpr int pointers_dictionaries = 0x74703; +constexpr int characters_width = 0x74ADF; + +//=========================================================================================== +// Dungeon Entrances Related Variables +//=========================================================================================== +constexpr int entrance_room = 0x14813; // 0x14577 //word value for each room +constexpr int entrance_scrolledge = + 0x1491D; // 0x14681 //8 bytes per room, HU, FU, HD, FD, HL, FL, HR, FR +constexpr int entrance_yscroll = 0x14D45; // 0x14AA9 //2bytes each room +constexpr int entrance_xscroll = 0x14E4F; // 0x14BB3 //2bytes +constexpr int entrance_yposition = 0x14F59; // 0x14CBD 2bytes +constexpr int entrance_xposition = 0x15063; // 0x14DC7 2bytes +constexpr int entrance_camerayposition = 0x1516D; // 0x14ED1 2bytes +constexpr int entrance_cameraxposition = 0x15277; // 0x14FDB 2bytes + +constexpr int entrance_gfx_group = 0x5D97; +constexpr int entrance_blockset = 0x15381; // 0x150E5 1byte +constexpr int entrance_floor = 0x15406; // 0x1516A 1byte +constexpr int entrance_dungeon = 0x1548B; // 0x151EF 1byte (dungeon id) +constexpr int entrance_door = 0x15510; // 0x15274 1byte +constexpr int entrance_ladderbg = + 0x15595; // 0x152F9 //1 byte, ---b ---a b = bg2, a = need to check -_- +constexpr int entrance_scrolling = 0x1561A; // 0x1537E //1byte --h- --v- +constexpr int entrance_scrollquadrant = 0x1569F; // 0x15403 1byte +constexpr int entrance_exit = 0x15724; // 0x15488 //2byte word +constexpr int entrance_music = 0x1582E; // 0x15592 + +constexpr int startingentrance_room = + 0x15B6E; // 0x158D2 //word value for each room +constexpr int startingentrance_scrolledge = + 0x15B7C; // 0x158E0 //8 bytes per room, HU, FU, HD, FD, HL, FL, HR, FR +constexpr int startingentrance_yscroll = 0x15BB4; // 0x14AA9 //2bytes each room +constexpr int startingentrance_xscroll = 0x15BC2; // 0x14BB3 //2bytes +constexpr int startingentrance_yposition = 0x15BD0; // 0x14CBD 2bytes +constexpr int startingentrance_xposition = 0x15BDE; // 0x14DC7 2bytes +constexpr int startingentrance_camerayposition = 0x15BEC; // 0x14ED1 2bytes +constexpr int startingentrance_cameraxposition = 0x15BFA; // 0x14FDB 2bytes + +constexpr int startingentrance_blockset = 0x15C08; // 0x150E5 1byte +constexpr int startingentrance_floor = 0x15C0F; // 0x1516A 1byte +constexpr int startingentrance_dungeon = 0x15C16; // 0x151EF 1byte (dungeon id) + +constexpr int startingentrance_door = 0x15C2B; // 0x15274 1byte + +constexpr int startingentrance_ladderbg = + 0x15C1D; // 0x152F9 //1 byte, ---b ---a b = bg2, a = need to check -_- +constexpr int startingentrance_scrolling = + 0x15C24; // 0x1537E //1byte --h- --v- +constexpr int startingentrance_scrollquadrant = 0x15C2B; // 0x15403 1byte +constexpr int startingentrance_exit = 0x15C32; // 0x15488 //2byte word +constexpr int startingentrance_music = 0x15C4E; // 0x15592 +constexpr int startingentrance_entrance = 0x15C40; + +constexpr int items_data_start = 0xDDE9; // save purpose +constexpr int items_data_end = 0xE6B2; // save purpose +constexpr int initial_equipement = 0x271A6; +constexpr int messages_id_dungeon = 0x3F61D; + +constexpr int chests_backupitems = + 0x3B528; // item id you get instead if you already have that item +constexpr int chests_yoffset = 0x4836C; +constexpr int chests_xoffset = 0x4836C + (76 * 1); +constexpr int chests_itemsgfx = 0x4836C + (76 * 2); +constexpr int chests_itemswide = 0x4836C + (76 * 3); +constexpr int chests_itemsproperties = 0x4836C + (76 * 4); +constexpr int chests_sramaddress = 0x4836C + (76 * 5); +constexpr int chests_sramvalue = 0x4836C + (76 * 7); +constexpr int chests_msgid = 0x442DD; + +constexpr int dungeons_startrooms = 0x7939; +constexpr int dungeons_endrooms = 0x792D; +constexpr int dungeons_bossrooms = 0x10954; // short value + +// Bed Related Values (Starting location) + +constexpr int bedPositionX = 0x039A37; // short value +constexpr int bedPositionY = 0x039A32; // short value + +constexpr int bedPositionResetXLow = + 0x02DE53; // short value(on 2 different bytes) +constexpr int bedPositionResetXHigh = 0x02DE58; //^^^^^^ + +constexpr int bedPositionResetYLow = + 0x02DE5D; // short value(on 2 different bytes) +constexpr int bedPositionResetYHigh = 0x02DE62; //^^^^^^ + +constexpr int bedSheetPositionX = 0x0480BD; // short value +constexpr int bedSheetPositionY = 0x0480B8; // short value + +//=========================================================================================== +// Gravestones related variables +//=========================================================================================== + +constexpr int GravesYTilePos = 0x49968; // short (0x0F entries) +constexpr int GravesXTilePos = 0x49986; // short (0x0F entries) +constexpr int GravesTilemapPos = 0x499A4; // short (0x0F entries) +constexpr int GravesGFX = 0x499C2; // short (0x0F entries) + +constexpr int GravesXPos = 0x4994A; // short (0x0F entries) +constexpr int GravesYLine = 0x4993A; // short (0x08 entries) +constexpr int GravesCountOnY = 0x499E0; // Byte 0x09 entries + +constexpr int GraveLinkSpecialHole = 0x46DD9; // short +constexpr int GraveLinkSpecialStairs = 0x46DE0; // short + +//=========================================================================================== +// Palettes Related Variables - This contain all the palettes of the game +//=========================================================================================== +constexpr int overworldPaletteMain = 0xDE6C8; +constexpr int overworldPaletteAuxialiary = 0xDE86C; +constexpr int overworldPaletteAnimated = 0xDE604; +constexpr int globalSpritePalettesLW = 0xDD218; +constexpr int globalSpritePalettesDW = 0xDD290; +constexpr int armorPalettes = + 0xDD308; // Green, Blue, Red, Bunny, Electrocuted (15 colors each) +constexpr int spritePalettesAux1 = 0xDD39E; // 7 colors each +constexpr int spritePalettesAux2 = 0xDD446; // 7 colors each +constexpr int spritePalettesAux3 = 0xDD4E0; // 7 colors each +constexpr int swordPalettes = 0xDD630; // 3 colors each - 4 entries +constexpr int shieldPalettes = 0xDD648; // 4 colors each - 3 entries +constexpr int hudPalettes = 0xDD660; +constexpr int dungeonMapPalettes = 0xDD70A; // 21 colors +constexpr int dungeonMainPalettes = 0xDD734; //(15*6) colors each - 20 entries +constexpr int dungeonMapBgPalettes = 0xDE544; // 16*6 +constexpr int hardcodedGrassLW = + 0x5FEA9; // Mirrored Value at 0x75645 : 0x75625 +constexpr int hardcodedGrassDW = 0x05FEB3; // 0x7564F +constexpr int hardcodedGrassSpecial = 0x75640; + +//=========================================================================================== +// Dungeon Map Related Variables +//=========================================================================================== +constexpr int dungeonMap_rooms_ptr = 0x57605; // 14 pointers of map data +constexpr int dungeonMap_floors = 0x575D9; // 14 words values + +constexpr int dungeonMap_gfx_ptr = 0x57BE4; // 14 pointers of gfx data +constexpr int dungeonMap_datastart = + 0x57039; // data start for floors/gfx MUST skip 575D9 to 57621 (pointers) + +constexpr int dungeonMap_expCheck = + 0x56652; // IF Byte = 0xB9 dungeon maps are not expanded +constexpr int dungeonMap_tile16 = 0x57009; +constexpr int dungeonMap_tile16Exp = 0x109010; +constexpr int dungeonMap_bossrooms = 0x56807; // 14 words values 0x000F = no + // boss + +constexpr int triforceVertices = 0x04FFD2; // group of 3, X, Y ,Z +constexpr int TriforceFaces = 0x04FFE4; // group of 5 + +constexpr int crystalVertices = 0x04FF98; + +//=========================================================================================== +// Names +//=========================================================================================== +static const std::string RoomEffect[] = {"Nothing", + "Nothing", + "Moving Floor", + "Moving Water", + "Trinexx Shell", + "Red Flashes", + "Light Torch to See Floor", + "Ganon's Darkness"}; + +static const std::string RoomTag[] = {"Nothing", + + "NW Kill Enemy to Open", + "NE Kill Enemy to Open", + "SW Kill Enemy to Open", + "SE Kill Enemy to Open", + "W Kill Enemy to Open", + "E Kill Enemy to Open", + "N Kill Enemy to Open", + "S Kill Enemy to Open", + "Clear Quadrant to Open", + "Clear Full Tile to Open", + + "NW Push Block to Open", + "NE Push Block to Open", + "SW Push Block to Open", + "SE Push Block to Open", + "W Push Block to Open", + "E Push Block to Open", + "N Push Block to Open", + "S Push Block to Open", + "Push Block to Open", + "Pull Lever to Open", + "Collect Prize to Open", + + "Hold Switch Open Door", + "Toggle Switch to Open Door", + "Turn off Water", + "Turn on Water", + "Water Gate", + "Water Twin", + "Moving Wall Right", + "Moving Wall Left", + "Crash", + "Crash", + "Push Switch Exploding Wall", + "Holes 0", + "Open Chest (Holes 0)", + "Holes 1", + "Holes 2", + "Defeat Boss for Dungeon Prize", + + "SE Kill Enemy to Push Block", + "Trigger Switch Chest", + "Pull Lever Exploding Wall", + "NW Kill Enemy for Chest", + "NE Kill Enemy for Chest", + "SW Kill Enemy for Chest", + "SE Kill Enemy for Chest", + "W Kill Enemy for Chest", + "E Kill Enemy for Chest", + "N Kill Enemy for Chest", + "S Kill Enemy for Chest", + "Clear Quadrant for Chest", + "Clear Full Tile for Chest", + + "Light Torches to Open", + "Holes 3", + "Holes 4", + "Holes 5", + "Holes 6", + "Agahnim Room", + "Holes 7", + "Holes 8", + "Open Chest for Holes 8", + "Push Block for Chest", + "Clear Room for Triforce Door", + "Light Torches for Chest", + "Kill Boss Again"}; + +static const std::string SecretItemNames[] = { + "Nothing", "Green Rupee", "Rock hoarder", "Bee", "Health pack", + "Bomb", "Heart ", "Blue Rupee", + + "Key", "Arrow", "Bomb", "Heart", "Magic", + "Full Magic", "Cucco", "Green Soldier", "Bush Stal", "Blue Soldier", + + "Landmine", "Heart", "Fairy", "Heart", + "Nothing ", // 22 + + "Hole", "Warp", "Staircase", "Bombable", "Switch"}; + +static const std::string Type1RoomObjectNames[] = { + "Ceiling ↔", + "Wall (top, north) ↔", + "Wall (top, south) ↔", + "Wall (bottom, north) ↔", + "Wall (bottom, south) ↔", + "Wall columns (north) ↔", + "Wall columns (south) ↔", + "Deep wall (north) ↔", + "Deep wall (south) ↔", + "Diagonal wall A ◤ (top) ↔", + "Diagonal wall A ◣ (top) ↔", + "Diagonal wall A ◥ (top) ↔", + "Diagonal wall A ◢ (top) ↔", + "Diagonal wall B ◤ (top) ↔", + "Diagonal wall B ◣ (top) ↔", + "Diagonal wall B ◥ (top) ↔", + "Diagonal wall B ◢ (top) ↔", + "Diagonal wall C ◤ (top) ↔", + "Diagonal wall C ◣ (top) ↔", + "Diagonal wall C ◥ (top) ↔", + "Diagonal wall C ◢ (top) ↔", + "Diagonal wall A ◤ (bottom) ↔", + "Diagonal wall A ◣ (bottom) ↔", + "Diagonal wall A ◥ (bottom) ↔", + "Diagonal wall A ◢ (bottom) ↔", + "Diagonal wall B ◤ (bottom) ↔", + "Diagonal wall B ◣ (bottom) ↔", + "Diagonal wall B ◥ (bottom) ↔", + "Diagonal wall B ◢ (bottom) ↔", + "Diagonal wall C ◤ (bottom) ↔", + "Diagonal wall C ◣ (bottom) ↔", + "Diagonal wall C ◥ (bottom) ↔", + "Diagonal wall C ◢ (bottom) ↔", + "Platform stairs ↔", + "Rail ↔", + "Pit edge ┏━┓ A (north) ↔", + "Pit edge ┏━┓ B (north) ↔", + "Pit edge ┏━┓ C (north) ↔", + "Pit edge ┏━┓ D (north) ↔", + "Pit edge ┏━┓ E (north) ↔", + "Pit edge ┗━┛ (south) ↔", + "Pit edge ━━━ (south) ↔", + "Pit edge ━━━ (north) ↔", + "Pit edge ━━┛ (south) ↔", + "Pit edge ┗━━ (south) ↔", + "Pit edge ━━┓ (north) ↔", + "Pit edge ┏━━ (north) ↔", + "Rail wall (north) ↔", + "Rail wall (south) ↔", + "Nothing", + "Nothing", + "Carpet ↔", + "Carpet trim ↔", + "Weird door", // TODO: WEIRD DOOR OBJECT NEEDS INVESTIGATION + "Drapes (north) ↔", + "Drapes (west, odd) ↔", + "Statues ↔", + "Columns ↔", + "Wall decors (north) ↔", + "Wall decors (south) ↔", + "Chairs in pairs ↔", + "Tall torches ↔", + "Supports (north) ↔", + "Water edge ┏━┓ (concave) ↔", + "Water edge ┗━┛ (concave) ↔", + "Water edge ┏━┓ (convex) ↔", + "Water edge ┗━┛ (convex) ↔", + "Water edge ┏━┛ (concave) ↔", + "Water edge ┗━┓ (concave) ↔", + "Water edge ┗━┓ (convex) ↔", + "Water edge ┏━┛ (convex) ↔", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Supports (south) ↔", + "Bar ↔", + "Shelf A ↔", + "Shelf B ↔", + "Shelf C ↔", + "Somaria path ↔", + "Cannon hole A (north) ↔", + "Cannon hole A (south) ↔", + "Pipe path ↔", + "Nothing", + "Wall torches (north) ↔", + "Wall torches (south) ↔", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Cannon hole B (north) ↔", + "Cannon hole B (south) ↔", + "Thick rail ↔", + "Blocks ↔", + "Long rail ↔", + "Ceiling ↕", + "Wall (top, west) ↕", + "Wall (top, east) ↕", + "Wall (bottom, west) ↕", + "Wall (bottom, east) ↕", + "Wall columns (west) ↕", + "Wall columns (east) ↕", + "Deep wall (west) ↕", + "Deep wall (east) ↕", + "Rail ↕", + "Pit edge (west) ↕", + "Pit edge (east) ↕", + "Rail wall (west) ↕", + "Rail wall (east) ↕", + "Nothing", + "Nothing", + "Carpet ↕", + "Carpet trim ↕", + "Nothing", + "Drapes (west) ↕", + "Drapes (east) ↕", + "Columns ↕", + "Wall decors (west) ↕", + "Wall decors (east) ↕", + "Supports (west) ↕", + "Water edge (west) ↕", + "Water edge (east) ↕", + "Supports (east) ↕", + "Somaria path ↕", + "Pipe path ↕", + "Nothing", + "Wall torches (west) ↕", + "Wall torches (east) ↕", + "Wall decors tight A (west) ↕", + "Wall decors tight A (east) ↕", + "Wall decors tight B (west) ↕", + "Wall decors tight B (east) ↕", + "Cannon hole (west) ↕", + "Cannon hole (east) ↕", + "Tall torches ↕", + "Thick rail ↕", + "Blocks ↕", + "Long rail ↕", + "Jump ledge (west) ↕", + "Jump ledge (east) ↕", + "Rug trim (west) ↕", + "Rug trim (east) ↕", + "Bar ↕", + "Wall flair (west) ↕", + "Wall flair (east) ↕", + "Blue pegs ↕", + "Orange pegs ↕", + "Invisible floor ↕", + "Fake pots ↕", + "Hammer pegs ↕", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Diagonal ceiling A ◤", + "Diagonal ceiling A ◣", + "Diagonal ceiling A ◥", + "Diagonal ceiling A ◢", + "Pit ⇲", + "Diagonal layer 2 mask A ◤", + "Diagonal layer 2 mask A ◣", + "Diagonal layer 2 mask A ◥", + "Diagonal layer 2 mask A ◢", + "Diagonal layer 2 mask B ◤", // TODO: VERIFY + "Diagonal layer 2 mask B ◣", // TODO: VERIFY + "Diagonal layer 2 mask B ◥", // TODO: VERIFY + "Diagonal layer 2 mask B ◢", // TODO: VERIFY + "Nothing", + "Nothing", + "Nothing", + "Jump ledge (north) ↔", + "Jump ledge (south) ↔", + "Rug ↔", + "Rug trim (north) ↔", + "Rug trim (south) ↔", + "Archery game curtains ↔", + "Wall flair (north) ↔", + "Wall flair (south) ↔", + "Blue pegs ↔", + "Orange pegs ↔", + "Invisible floor ↔", + "Fake pressure plates ↔", + "Fake pots ↔", + "Hammer pegs ↔", + "Nothing", + "Nothing", + "Ceiling (large) ⇲", + "Chest platform (tall) ⇲", + "Layer 2 pit mask (large) ⇲", + "Layer 2 pit mask (medium) ⇲", + "Floor 1 ⇲", + "Floor 3 ⇲", + "Layer 2 mask (large) ⇲", + "Floor 4 ⇲", + "Water floor ⇲ ", + "Flood water (medium) ⇲ ", + "Conveyor floor ⇲ ", + "Nothing", + "Nothing", + "Moving wall (west) ⇲", + "Moving wall (east) ⇲", + "Nothing", + "Nothing", + "Icy floor A ⇲", + "Icy floor B ⇲", + "Moving wall flag", // TODO: WTF IS THIS? + "Moving wall flag", // TODO: WTF IS THIS? + "Moving wall flag", // TODO: WTF IS THIS? + "Moving wall flag", // TODO: WTF IS THIS? + "Layer 2 mask (medium) ⇲", + "Flood water (large) ⇲", + "Layer 2 swim mask ⇲", + "Flood water B (large) ⇲", + "Floor 2 ⇲", + "Chest platform (short) ⇲", + "Table / rock ⇲", + "Spike blocks ⇲", + "Spiked floor ⇲", + "Floor 7 ⇲", + "Tiled floor ⇲", + "Rupee floor ⇲", + "Conveyor upwards ⇲", + "Conveyor downwards ⇲", + "Conveyor leftwards ⇲", + "Conveyor rightwards ⇲", + "Heavy current water ⇲", + "Floor 10 ⇲", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", +}; + +static const std::string Type2RoomObjectNames[] = { + "Corner (top, concave) ▛", + "Corner (top, concave) ▙", + "Corner (top, concave) ▜", + "Corner (top, concave) ▟", + "Corner (top, convex) ▟", + "Corner (top, convex) ▜", + "Corner (top, convex) ▙", + "Corner (top, convex) ▛", + "Corner (bottom, concave) ▛", + "Corner (bottom, concave) ▙", + "Corner (bottom, concave) ▜", + "Corner (bottom, concave) ▟", + "Corner (bottom, convex) ▟", + "Corner (bottom, convex) ▜", + "Corner (bottom, convex) ▙", + "Corner (bottom, convex) ▛", + "Kinked corner north (bottom) ▜", + "Kinked corner south (bottom) ▟", + "Kinked corner north (bottom) ▛", + "Kinked corner south (bottom) ▙", + "Kinked corner west (bottom) ▙", + "Kinked corner west (bottom) ▛", + "Kinked corner east (bottom) ▟", + "Kinked corner east (bottom) ▜", + "Deep corner (concave) ▛", + "Deep corner (concave) ▙", + "Deep corner (concave) ▜", + "Deep corner (concave) ▟", + "Large brazier", + "Statue", + "Star tile (disabled)", + "Star tile (enabled)", + "Small torch (lit)", + "Barrel", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Table", + "Fairy statue", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Chair", + "Bed", + "Fireplace", + "Mario portrait", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Interroom stairs (up)", + "Interroom stairs (down)", + "Interroom stairs B (down)", + "Intraroom stairs north B", // TODO: VERIFY LAYER HANDLING + "Intraroom stairs north (separate layers)", + "Intraroom stairs north (merged layers)", + "Intraroom stairs north (swim layer)", + "Block", + "Water ladder (north)", + "Water ladder (south)", // TODO: NEEDS IN GAME VERIFICATION + "Dam floodgate", + "Interroom spiral stairs up (top)", + "Interroom spiral stairs down (top)", + "Interroom spiral stairs up (bottom)", + "Interroom spiral stairs down (bottom)", + "Sanctuary wall (north)", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Pew", + "Magic bat altar", +}; + +static const std::string Type3RoomObjectNames[] = { + "Waterfall face (empty)", + "Waterfall face (short)", + "Waterfall face (long)", + "Somaria path endpoint", + "Somaria path intersection ╋", + "Somaria path corner ┏", + "Somaria path corner ┗", + "Somaria path corner ┓", + "Somaria path corner ┛", + "Somaria path intersection ┳", + "Somaria path intersection ┻", + "Somaria path intersection ┣", + "Somaria path intersection ┫", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Somaria path 2-way endpoint", + "Somaria path crossover", + "Babasu hole (north)", + "Babasu hole (south)", + "9 blue rupees", + "Telepathy tile", + "Warp door", // TODO: NEEDS IN GAME VERIFICATION THAT THIS IS USELESS + "Kholdstare's shell", + "Hammer peg", + "Prison cell", + "Big key lock", + "Chest", + "Chest (open)", + "Intraroom stairs south", // TODO: VERIFY LAYER HANDLING + "Intraroom stairs south (separate layers)", + "Intraroom stairs south (merged layers)", + "Interroom straight stairs up (north, top)", + "Interroom straight stairs down (north, top)", + "Interroom straight stairs up (south, top)", + "Interroom straight stairs down (south, top)", + "Deep corner (convex) ▟", + "Deep corner (convex) ▜", + "Deep corner (convex) ▙", + "Deep corner (convex) ▛", + "Interroom straight stairs up (north, bottom)", + "Interroom straight stairs down (north, bottom)", + "Interroom straight stairs up (south, bottom)", + "Interroom straight stairs down (south, bottom)", + "Lamp cones", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Liftable large block", + "Agahnim's altar", + "Agahnim's boss room", + "Pot", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Big chest", + "Big chest (open)", + "Intraroom stairs south (swim layer)", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Pipe end (south)", + "Pipe end (north)", + "Pipe end (east)", + "Pipe end (west)", + "Pipe corner ▛", + "Pipe corner ▙", + "Pipe corner ▜", + "Pipe corner ▟", + "Pipe-rock intersection ⯊", + "Pipe-rock intersection ⯋", + "Pipe-rock intersection ◖", + "Pipe-rock intersection ◗", + "Pipe crossover", + "Bombable floor", + "Fake bombable floor", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Warp tile", + "Tool rack", + "Furnace", + "Tub (wide)", + "Anvil", + "Warp tile (disabled)", + "Pressure plate", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Blue peg", + "Orange peg", + "Fortune teller room", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Bar corner ▛", + "Bar corner ▙", + "Bar corner ▜", + "Bar corner ▟", + "Decorative bowl", + "Tub (tall)", + "Bookcase", + "Range", + "Suitcase", + "Bar bottles", + "Arrow game hole (west)", + "Arrow game hole (east)", + "Vitreous goo graphics", + "Fake pressure plate", + "Medusa head", + "4-way shooter block", + "Pit", + "Wall crack (north)", + "Wall crack (south)", + "Wall crack (west)", + "Wall crack (east)", + "Large decor", + "Water grate (north)", + "Water grate (south)", + "Water grate (west)", + "Water grate (east)", + "Window sunlight", + "Floor sunlight", + "Trinexx's shell", + "Layer 2 mask (full)", + "Boss entrance", + "Minigame chest", + "Ganon door", + "Triforce wall ornament", + "Triforce floor tiles", + "Freezor hole", + "Pile of bones", + "Vitreous goo damage", + "Arrow tile ↑", + "Arrow tile ↓", + "Arrow tile →", + "Nothing", +}; + +static const std::string TileTypeNames[] = { + "$00 Nothing (standard floor)", + "$01 Collision", + "$02 Collision", + "$03 Collision", + "$04 Collision", + "$05 Nothing (unused?)", + "$06 Nothing (unused?)", + "$07 Nothing (unused?)", + "$08 Deep water", + "$09 Shallow water", + "$0A Unknown? Possibly unused", + "$0B Collision (different in Overworld and unknown)", + "$0C Overlay mask", + "$0D Spike floor", + "$0E GT ice", + "$0F Ice palace ice", + "$10 Slope ◤", + "$11 Slope ◥", + "$12 Slope ◣", + "$13 Slope ◢", + "$14 Nothing (unused?)", + "$15 Nothing (unused?)", + "$16 Nothing (unused?)", + "$17 Nothing (unused?)", + "$18 Slope ◤", + "$19 Slope ◥", + "$1A Slope ◣", + "$1B Slope ◢", + "$1C Layer 2 overlay", + "$1D North single-layer auto stairs", + "$1E North layer-swap auto stairs", + "$1F North layer-swap auto stairs", + "$20 Pit", + "$21 Nothing (unused?)", + "$22 Manual stairs", + "$23 Pot switch", + "$24 Pressure switch", + "$25 Nothing (unused but referenced by somaria blocks)", + "$26 Collision (near stairs?)", + "$27 Brazier/Fence/Statue/Block/General hookable things", + "$28 North ledge", + "$29 South ledge", + "$2A East ledge", + "$2B West ledge", + "$2C ◤ ledge", + "$2D ◣ ledge", + "$2E ◥ ledge", + "$2F ◢ ledge", + "$30 Straight inter-room stairs south/up 0", + "$31 Straight inter-room stairs south/up 1", + "$32 Straight inter-room stairs south/up 2", + "$33 Straight inter-room stairs south/up 3", + "$34 Straight inter-room stairs north/down 0", + "$35 Straight inter-room stairs north/down 1", + "$36 Straight inter-room stairs north/down 2", + "$37 Straight inter-room stairs north/down 3", + "$38 Straight inter-room stairs north/down edge", + "$39 Straight inter-room stairs south/up edge", + "$3A Star tile (inactive on load)", + "$3B Star tile (active on load)", + "$3C Nothing (unused?)", + "$3D South single-layer auto stairs", + "$3E South layer-swap auto stairs", + "$3F South layer-swap auto stairs", + "$40 Thick grass", + "$41 Nothing (unused?)", + "$42 Gravestone / Tower of hera ledge shadows??", + "$43 Skull Woods entrance/Hera columns???", + "$44 Spike", + "$45 Nothing (unused?)", + "$46 Desert Tablet", + "$47 Nothing (unused?)", + "$48 Diggable ground", + "$49 Nothing (unused?)", + "$4A Diggable ground", + "$4B Warp tile", + "$4C Nothing (unused?) | Something unknown in overworld", + "$4D Nothing (unused?) | Something unknown in overworld", + "$4E Square corners in EP overworld", + "$4F Square corners in EP overworld", + "$50 Green bush", + "$51 Dark bush", + "$52 Gray rock", + "$53 Black rock", + "$54 Hint tile/Sign", + "$55 Big gray rock", + "$56 Big black rock", + "$57 Bonk rocks", + "$58 Chest 0", + "$59 Chest 1", + "$5A Chest 2", + "$5B Chest 3", + "$5C Chest 4", + "$5D Chest 5", + "$5E Spiral stairs", + "$5F Spiral stairs", + "$60 Rupee tile", + "$61 Nothing (unused?)", + "$62 Bombable floor", + "$63 Minigame chest", + "$64 Nothing (unused?)", + "$65 Nothing (unused?)", + "$66 Crystal peg down", + "$67 Crystal peg up", + "$68 Upwards conveyor", + "$69 Downwards conveyor", + "$6A Leftwards conveyor", + "$6B Rightwards conveyor", + "$6C North vines", + "$6D South vines", + "$6E West vines", + "$6F East vines", + "$70 Pot/Hammer peg/Push block 00", + "$71 Pot/Hammer peg/Push block 01", + "$72 Pot/Hammer peg/Push block 02", + "$73 Pot/Hammer peg/Push block 03", + "$74 Pot/Hammer peg/Push block 04", + "$75 Pot/Hammer peg/Push block 05", + "$76 Pot/Hammer peg/Push block 06", + "$77 Pot/Hammer peg/Push block 07", + "$78 Pot/Hammer peg/Push block 08", + "$79 Pot/Hammer peg/Push block 09", + "$7A Pot/Hammer peg/Push block 0A", + "$7B Pot/Hammer peg/Push block 0B", + "$7C Pot/Hammer peg/Push block 0C", + "$7D Pot/Hammer peg/Push block 0D", + "$7E Pot/Hammer peg/Push block 0E", + "$7F Pot/Hammer peg/Push block 0F", + "$80 North/South door", + "$81 East/West door", + "$82 North/South shutter door", + "$83 East/West shutter door", + "$84 North/South layer 2 door", + "$85 East/West layer 2 door", + "$86 North/South layer 2 shutter door", + "$87 East/West layer 2 shutter door", + "$88 Some type of door (?)", + "$89 East/West transport door", + "$8A Some type of door (?)", + "$8B Some type of door (?)", + "$8C Some type of door (?)", + "$8D Some type of door (?)", + "$8E Entrance door", + "$8F Entrance door", + "$90 Layer toggle shutter door (?)", + "$91 Layer toggle shutter door (?)", + "$92 Layer toggle shutter door (?)", + "$93 Layer toggle shutter door (?)", + "$94 Layer toggle shutter door (?)", + "$95 Layer toggle shutter door (?)", + "$96 Layer toggle shutter door (?)", + "$97 Layer toggle shutter door (?)", + "$98 Layer+Dungeon toggle shutter door (?)", + "$99 Layer+Dungeon toggle shutter door (?)", + "$9A Layer+Dungeon toggle shutter door (?)", + "$9B Layer+Dungeon toggle shutter door (?)", + "$9C Layer+Dungeon toggle shutter door (?)", + "$9D Layer+Dungeon toggle shutter door (?)", + "$9E Layer+Dungeon toggle shutter door (?)", + "$9F Layer+Dungeon toggle shutter door (?)", + "$A0 North/South Dungeon swap door", + "$A1 Dungeon toggle door (?)", + "$A2 Dungeon toggle door (?)", + "$A3 Dungeon toggle door (?)", + "$A4 Dungeon toggle door (?)", + "$A5 Dungeon toggle door (?)", + "$A6 Nothing (unused?)", + "$A7 Nothing (unused?)", + "$A8 Layer+Dungeon toggle shutter door (?)", + "$A9 Layer+Dungeon toggle shutter door (?)", + "$AA Layer+Dungeon toggle shutter door (?)", + "$AB Layer+Dungeon toggle shutter door (?)", + "$AC Layer+Dungeon toggle shutter door (?)", + "$AD Layer+Dungeon toggle shutter door (?)", + "$AE Layer+Dungeon toggle shutter door (?)", + "$AF Layer+Dungeon toggle shutter door (?)", + "$B0 Somaria ─", + "$B1 Somaria │", + "$B2 Somaria ┌", + "$B3 Somaria └", + "$B4 Somaria ┐", + "$B5 Somaria ┘", + "$B6 Somaria ⍰ 1 way", + "$B7 Somaria ┬", + "$B8 Somaria ┴", + "$B9 Somaria ├", + "$BA Somaria ┤", + "$BB Somaria ┼", + "$BC Somaria ⍰ 2 way", + "$BD Somaria ┼ crossover", + "$BE Pipe entrance", + "$BF Nothing (unused?)", + "$C0 Torch 00", + "$C1 Torch 01", + "$C2 Torch 02", + "$C3 Torch 03", + "$C4 Torch 04", + "$C5 Torch 05", + "$C6 Torch 06", + "$C7 Torch 07", + "$C8 Torch 08", + "$C9 Torch 09", + "$CA Torch 0A", + "$CB Torch 0B", + "$CC Torch 0C", + "$CD Torch 0D", + "$CE Torch 0E", + "$CF Torch 0F", + "$D0 Nothing (unused?)", + "$D1 Nothing (unused?)", + "$D2 Nothing (unused?)", + "$D3 Nothing (unused?)", + "$D4 Nothing (unused?)", + "$D5 Nothing (unused?)", + "$D6 Nothing (unused?)", + "$D7 Nothing (unused?)", + "$D8 Nothing (unused?)", + "$D9 Nothing (unused?)", + "$DA Nothing (unused?)", + "$DB Nothing (unused?)", + "$DC Nothing (unused?)", + "$DD Nothing (unused?)", + "$DE Nothing (unused?)", + "$DF Nothing (unused?)", + "$E0 Nothing (unused?)", + "$E1 Nothing (unused?)", + "$E2 Nothing (unused?)", + "$E3 Nothing (unused?)", + "$E4 Nothing (unused?)", + "$E5 Nothing (unused?)", + "$E6 Nothing (unused?)", + "$E7 Nothing (unused?)", + "$E8 Nothing (unused?)", + "$E9 Nothing (unused?)", + "$EA Nothing (unused?)", + "$EB Nothing (unused?)", + "$EC Nothing (unused?)", + "$ED Nothing (unused?)", + "$EE Nothing (unused?)", + "$EF Nothing (unused?)", + "$F0 Door 0 bottom", + "$F1 Door 1 bottom", + "$F2 Door 2 bottom", + "$F3 Door 3 bottom", + "$F4 Door X bottom? (unused?)", + "$F5 Door X bottom? (unused?)", + "$F6 Door X bottom? (unused?)", + "$F7 Door X bottom? (unused?)", + "$F8 Door 0 top", + "$F9 Door 1 top", + "$FA Door 2 top", + "$FB Door 3 top", + "$FC Door X top? (unused?)", + "$FD Door X top? (unused?)", + "$FE Door X top? (unused?)", + "$FF Door X top? (unused?)"}; + +} // namespace Constants +} // namespace Core +} // namespace application +} // namespace yaze + +#endif \ No newline at end of file diff --git a/src/application/Core/controller.cc b/src/application/Core/controller.cc new file mode 100644 index 00000000..24488a7d --- /dev/null +++ b/src/application/Core/controller.cc @@ -0,0 +1,185 @@ +#include "controller.h" + +#include +#include +#include +#include +#include + +#include + +#include "Editor/editor.h" + +namespace yaze { +namespace application { +namespace Core { + +bool Controller::isActive() const { return active_; } + +void Controller::onEntry() { + CreateWindow(); + CreateRenderer(); + CreateGuiContext(); + editor_.SetupScreen(sdl_renderer_); + ImGuiIO &io = ImGui::GetIO(); + io.KeyMap[ImGuiKey_Backspace] = SDL_GetScancodeFromKey(SDLK_BACKSPACE); + io.KeyMap[ImGuiKey_Enter] = SDL_GetScancodeFromKey(SDLK_RETURN); + io.KeyMap[ImGuiKey_UpArrow] = SDL_GetScancodeFromKey(SDLK_UP); + io.KeyMap[ImGuiKey_DownArrow] = SDL_GetScancodeFromKey(SDLK_DOWN); + io.KeyMap[ImGuiKey_Tab] = SDL_GetScancodeFromKey(SDLK_TAB); + io.KeyMap[ImGuiKey_LeftCtrl] = SDL_GetScancodeFromKey(SDLK_LCTRL); + active_ = true; +} + +void Controller::onInput() { + int wheel = 0; + int mouseX; + int mouseY; + SDL_Event event; + ImGuiIO &io = ImGui::GetIO(); + const int buttons = SDL_GetMouseState(&mouseX, &mouseY); + + while (SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_KEYDOWN: + switch (event.key.keysym.sym) { + case SDLK_UP: + case SDLK_DOWN: + case SDLK_RETURN: + case SDLK_BACKSPACE: + case SDLK_TAB: + io.KeysDown[event.key.keysym.scancode] = + (event.type == SDL_KEYDOWN); + break; + default: + break; + } + break; + + case SDL_KEYUP: { + int key = event.key.keysym.scancode; + IM_ASSERT(key >= 0 && key < IM_ARRAYSIZE(io.KeysDown)); + io.KeysDown[key] = (event.type == SDL_KEYDOWN); + io.KeyShift = ((SDL_GetModState() & KMOD_SHIFT) != 0); + io.KeyCtrl = ((SDL_GetModState() & KMOD_CTRL) != 0); + io.KeyAlt = ((SDL_GetModState() & KMOD_ALT) != 0); + io.KeySuper = ((SDL_GetModState() & KMOD_GUI) != 0); + break; + } + case SDL_WINDOWEVENT: + switch (event.window.event) { + case SDL_WINDOWEVENT_CLOSE: + quit(); + break; + case SDL_WINDOWEVENT_SIZE_CHANGED: + io.DisplaySize.x = static_cast(event.window.data1); + io.DisplaySize.y = static_cast(event.window.data2); + break; + default: + break; + } + break; + case SDL_TEXTINPUT: + io.AddInputCharactersUTF8(event.text.text); + break; + case SDL_MOUSEWHEEL: + wheel = event.wheel.y; + break; + default: + break; + } + } + io.DeltaTime = 1.0f / 60.0f; + io.MousePos = ImVec2(static_cast(mouseX), static_cast(mouseY)); + io.MouseDown[0] = buttons & SDL_BUTTON(SDL_BUTTON_LEFT); + io.MouseDown[1] = buttons & SDL_BUTTON(SDL_BUTTON_RIGHT); + io.MouseWheel = static_cast(wheel); +} + +void Controller::onLoad() { editor_.UpdateScreen(); } + +void Controller::doRender() { + SDL_RenderClear(sdl_renderer_.get()); + ImGui::Render(); + ImGui_ImplSDLRenderer_RenderDrawData(ImGui::GetDrawData()); + SDL_RenderPresent(sdl_renderer_.get()); +} + +void Controller::onExit() { + ImGui_ImplSDLRenderer_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + SDL_Quit(); +} + +void Controller::CreateWindow() { + if (SDL_Init(SDL_INIT_EVERYTHING)) { + SDL_Log("SDL_Init: %s\n", SDL_GetError()); + } else { + sdl_window_ = std::unique_ptr( + SDL_CreateWindow("Yet Another Zelda3 Editor", // window title + SDL_WINDOWPOS_UNDEFINED, // initial x position + SDL_WINDOWPOS_UNDEFINED, // initial y position + 1200, // width, in pixels + 800, // height, in pixels + SDL_WINDOW_RESIZABLE), + sdl_deleter()); + } +} + +void Controller::CreateRenderer() { + if (sdl_window_ == nullptr) { + SDL_Log("SDL_CreateWindow: %s\n", SDL_GetError()); + SDL_Quit(); + } else { + sdl_renderer_ = std::unique_ptr( + SDL_CreateRenderer( + sdl_window_.get(), -1, + SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC), + sdl_deleter()); + if (sdl_renderer_ == nullptr) { + SDL_Log("SDL_CreateRenderer: %s\n", SDL_GetError()); + SDL_Quit(); + } else { + SDL_SetRenderDrawBlendMode(sdl_renderer_.get(), SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(sdl_renderer_.get(), 0x00, 0x00, 0x00, 0x00); + } + } +} + +void Controller::CreateGuiContext() { + // Create the ImGui and ImPlot contexts + ImGui::CreateContext(); + + // Initialize ImGui for SDL + ImGui_ImplSDL2_InitForSDLRenderer(sdl_window_.get(), sdl_renderer_.get()); + ImGui_ImplSDLRenderer_Init(sdl_renderer_.get()); + + // Load available fonts + const ImGuiIO &io = ImGui::GetIO(); + io.Fonts->AddFontFromFileTTF("assets/Fonts/Karla-Regular.ttf", 14.0f); + + // merge in icons from Google Material Design + static const ImWchar icons_ranges[] = {ICON_MIN_MD, 0xf900, 0}; + ImFontConfig icons_config; + icons_config.MergeMode = true; + icons_config.GlyphOffset.y = 5.0f; + icons_config.GlyphMinAdvanceX = 13.0f; + icons_config.PixelSnapH = true; + io.Fonts->AddFontFromFileTTF(FONT_ICON_FILE_NAME_MD, 18.0f, &icons_config, + icons_ranges); + io.Fonts->AddFontFromFileTTF("assets/Fonts/Roboto-Medium.ttf", 14.0f); + io.Fonts->AddFontFromFileTTF("assets/Fonts/Cousine-Regular.ttf", 14.0f); + io.Fonts->AddFontFromFileTTF("assets/Fonts/DroidSans.ttf", 16.0f); + + // Set the default style + Style::ColorsYaze(); + + // Build a new ImGui frame + ImGui_ImplSDLRenderer_NewFrame(); + ImGui_ImplSDL2_NewFrame(sdl_window_.get()); +} + +} // namespace Core +} // namespace application +} // namespace yaze \ No newline at end of file diff --git a/src/application/Core/controller.h b/src/application/Core/controller.h new file mode 100644 index 00000000..7ed4e2f2 --- /dev/null +++ b/src/application/Core/controller.h @@ -0,0 +1,55 @@ +#ifndef YAZE_APPLICATION_CORE_CONTROLLER_H +#define YAZE_APPLICATION_CORE_CONTROLLER_H +#define SDL_MAIN_HANDLED + +#include +#include +#include +#include +#include + +#include "Editor/editor.h" +#include "Graphics/icons.h" +#include "Graphics/style.h" + +int main(int argc, char **argv); + +namespace yaze { +namespace application { +namespace Core { + +class Controller { + public: + Controller() = default; + + bool isActive() const; + void onEntry(); + void onInput(); + void onLoad(); + void doRender(); + void onExit(); + + private: + void CreateWindow(); + void CreateRenderer(); + void CreateGuiContext(); + inline void quit() { active_ = false; } + friend int ::main(int argc, char **argv); + + struct sdl_deleter { + void operator()(SDL_Window *p) const { SDL_DestroyWindow(p); } + void operator()(SDL_Renderer *p) const { SDL_DestroyRenderer(p); } + void operator()(SDL_Texture *p) const { SDL_DestroyTexture(p); } + }; + + bool active_; + Editor::Editor editor_; + std::shared_ptr sdl_window_; + std::shared_ptr sdl_renderer_; +}; + +} // namespace Core +} // namespace application +} // namespace yaze + +#endif // YAZE_APPLICATION_CORE_CONTROLLER_H \ No newline at end of file diff --git a/src/application/Core/entry_point.h b/src/application/Core/entry_point.h new file mode 100644 index 00000000..c764548a --- /dev/null +++ b/src/application/Core/entry_point.h @@ -0,0 +1,18 @@ +#ifndef YAZE_APPLICATION_CONTROLLER_ENTRYPOINT_H +#define YAZE_APPLICATION_CONTROLLER_ENTRYPOINT_H + +#include "controller.h" + +int main(int argc, char** argv) { + yaze::application::Core::Controller controller; + controller.onEntry(); + while (controller.isActive()) { + controller.onInput(); + controller.onLoad(); + controller.doRender(); + } + controller.onExit(); + return EXIT_SUCCESS; +} + +#endif // YAZE_APPLICATION_CONTROLLER_ENTRYPOINT_H \ No newline at end of file diff --git a/src/application/Core/input.cc b/src/application/Core/input.cc new file mode 100644 index 00000000..e4dba475 --- /dev/null +++ b/src/application/Core/input.cc @@ -0,0 +1,25 @@ +#include "input.h" + +#include +#include + +namespace yaze { +namespace Gui { + +const int kStepOneHex = 0x01; +const int kStepFastHex = 0x0F; + +bool InputHex(const char* label, int* data) { + return ImGui::InputScalar(label, ImGuiDataType_U64, data, &kStepOneHex, + &kStepFastHex, "%06X", + ImGuiInputTextFlags_CharsHexadecimal); +} + +bool InputHexShort(const char* label, int* data) { + return ImGui::InputScalar(label, ImGuiDataType_U32, data, &kStepOneHex, + &kStepFastHex, "%06X", + ImGuiInputTextFlags_CharsHexadecimal); +} + +} // namespace Gui +} // namespace yaze diff --git a/src/application/Core/input.h b/src/application/Core/input.h new file mode 100644 index 00000000..0c5313cc --- /dev/null +++ b/src/application/Core/input.h @@ -0,0 +1,19 @@ +#ifndef YAZE_APPLICATION_CORE_INPUT_H +#define YAZE_APPLICATION_CORE_INPUT_H + +#include +#include + +#include +#include + +namespace yaze { +namespace Gui { + +IMGUI_API bool InputHex(const char* label, int* data); +IMGUI_API bool InputHexShort(const char* label, int* data); + +} // namespace Gui +} // namespace yaze + +#endif \ No newline at end of file diff --git a/src/application/Data/OW/overworld.cc b/src/application/Data/OW/overworld.cc new file mode 100644 index 00000000..4e270c8d --- /dev/null +++ b/src/application/Data/OW/overworld.cc @@ -0,0 +1,349 @@ +#include "overworld.h" + +#include "Graphics/tile.h" + +namespace yaze { +namespace application { +namespace Data { + +using namespace Core; +using namespace Graphics; + +Overworld::~Overworld() { + if (isLoaded) { + for (int i = 0; i < (int) tiles32.size(); i++) { + free(allmapsTilesLW[i]); + free(allmapsTilesDW[i]); + free(allmapsTilesSP[i]); + } + free(allmapsTilesLW); + free(allmapsTilesDW); + free(allmapsTilesSP); + + delete[] overworldMapPointer; + delete[] owactualMapPointer; + } + +} + +static TileInfo GetTilesInfo(ushort tile) { + // vhopppcc cccccccc + ushort o = 0; + ushort v = 0; + ushort h = 0; + ushort tid = (ushort)(tile & 0x3FF); + uchar p = (uchar)((tile >> 10) & 0x07); + + o = (ushort)((tile & 0x2000) >> 13); + h = (ushort)((tile & 0x4000) >> 14); + v = (ushort)((tile & 0x8000) >> 15); + + return TileInfo(tid, p, v, h, o); +} + +void Overworld::Load(Data::ROM rom) { + rom_ = rom; + for (int i = 0; i < 0x2B; i++) { + // tileLeftEntrance.push_back( + // rom_.ReadShort(Constants::overworldEntranceAllowedTilesLeft + (i * + // 2))); + // tileRightEntrance.push_back(rom_.ReadShort( + // Constants::overworldEntranceAllowedTilesRight + (i * 2))); + } + + AssembleMap32Tiles(); + AssembleMap16Tiles(); + DecompressAllMapTiles(); + + // Map Initialization : + for (int i = 0; i < 160; i++) { + allmaps.push_back(OverworldMap(rom_, tiles16, (uchar)i)); + } + FetchLargeMaps(); + LoadOverworldMap(); + + auto size = tiles16.size(); + for (int i = 0; i < 160; i++) { + allmaps[i].BuildMap(mapParent, size, gameState, allmapsTilesLW, + allmapsTilesDW, allmapsTilesSP); + } + + isLoaded = true; +} + +ushort Overworld::GenerateTile32(int i, int k, int dimension) { + return (ushort)(rom_.GetRawData()[map32address[dimension] + k + (i)] + + (((rom_.GetRawData()[map32address[dimension] + (i) + + (k <= 1 ? 4 : 5)] >> + (k % 2 == 0 ? 4 : 0)) & + 0x0F) * + 256)); +} + +void Overworld::AssembleMap32Tiles() { + for (int i = 0; i < 0x33F0; i += 6) { + ushort tl, tr, bl, br; + for (int k = 0; k < 4; k++) { + tl = GenerateTile32(i, k, (int)Dimension::map32TilesTL); + tr = GenerateTile32(i, k, (int)Dimension::map32TilesTR); + bl = GenerateTile32(i, k, (int)Dimension::map32TilesBL); + br = GenerateTile32(i, k, (int)Dimension::map32TilesBR); + tiles32.push_back(Tile32(tl, tr, bl, br)); + } + } + + allmapsTilesLW = (ushort**)malloc(tiles32.size() * sizeof(ushort*)); + for (int i = 0; i < tiles32.size(); i++) + allmapsTilesLW[i] = (ushort*)malloc(tiles32.size() * sizeof(ushort)); + + allmapsTilesDW = (ushort**)malloc(tiles32.size() * sizeof(ushort*)); + for (int i = 0; i < tiles32.size(); i++) + allmapsTilesDW[i] = (ushort*)malloc(tiles32.size() * sizeof(ushort)); + + allmapsTilesSP = (ushort**)malloc(tiles32.size() * sizeof(ushort*)); + for (int i = 0; i < tiles32.size(); i++) + allmapsTilesSP[i] = (ushort*)malloc(tiles32.size() * sizeof(ushort)); +} + +void Overworld::AssembleMap16Tiles() { + int tpos = Core::Constants::map16Tiles; + for (int i = 0; i < 4096; i += 1) // 3760 + { + TileInfo t0 = GetTilesInfo((uintptr_t)rom_.GetRawData() + tpos); + tpos += 2; + TileInfo t1 = GetTilesInfo((uintptr_t)rom_.GetRawData() + tpos); + tpos += 2; + TileInfo t2 = GetTilesInfo((uintptr_t)rom_.GetRawData() + tpos); + tpos += 2; + TileInfo t3 = GetTilesInfo((uintptr_t)rom_.GetRawData() + tpos); + tpos += 2; + tiles16.push_back(Tile16(t0, t1, t2, t3)); + } +} + +void Overworld::DecompressAllMapTiles() { + int lowest = 0x0FFFFF; + int highest = 0x0F8000; + int sx = 0; + int sy = 0; + int c = 0; + for (int i = 0; i < 160; i++) { + int p1 = (rom_.GetRawData()[(Constants::compressedAllMap32PointersHigh) + + 2 + (int)(3 * i)] + << 16) + + (rom_.GetRawData()[(Constants::compressedAllMap32PointersHigh) + + 1 + (int)(3 * i)] + << 8) + + (rom_.GetRawData()[(Constants::compressedAllMap32PointersHigh + + (int)(3 * i))]); + + char* tmp = new char[256]; + p1 = lorom_snes_to_pc(p1, &tmp); + std::cout << tmp << std::endl; + int p2 = (rom_.GetRawData()[(Constants::compressedAllMap32PointersLow) + 2 + + (int)(3 * i)] + << 16) + + (rom_.GetRawData()[(Constants::compressedAllMap32PointersLow) + 1 + + (int)(3 * i)] + << 8) + + (rom_.GetRawData()[(Constants::compressedAllMap32PointersLow + + (int)(3 * i))]); + p2 = lorom_snes_to_pc(p2, &tmp); + std::cout << tmp << std::endl; + delete[] tmp; + + int ttpos = 0; + unsigned int compressedSize1 = 0; + unsigned int compressedSize2 = 0; + unsigned int compressedLength1 = 0; + unsigned int compressedLength2 = 0; + + if (p1 >= highest) { + highest = p1; + } + if (p2 >= highest) { + highest = p2; + } + + if (p1 <= lowest) { + if (p1 > 0x0F8000) { + lowest = p1; + } + } + if (p2 <= lowest) { + if (p2 > 0x0F8000) { + lowest = p2; + } + } + + auto bytes = + alttp_decompress_overworld((char*)rom_.GetRawData(), p2, 1000, + &compressedSize1, &compressedLength1); + auto bytes2 = + alttp_decompress_overworld((char*)rom_.GetRawData(), p1, 1000, + &compressedSize2, &compressedLength2); + + for (int y = 0; y < 16; y++) { + for (int x = 0; x < 16; x++) { + ushort tidD = (ushort)((bytes2[ttpos] << 8) + bytes[ttpos]); + + int tpos = tidD; + if (tpos < tiles32.size()) { + if (i < 64) { + allmapsTilesLW[(x * 2) + (sx * 32)][(y * 2) + (sy * 32)] = + tiles32[tpos].tile0_; + allmapsTilesLW[(x * 2) + 1 + (sx * 32)][(y * 2) + (sy * 32)] = + tiles32[tpos].tile1_; + allmapsTilesLW[(x * 2) + (sx * 32)][(y * 2) + 1 + (sy * 32)] = + tiles32[tpos].tile2_; + allmapsTilesLW[(x * 2) + 1 + (sx * 32)][(y * 2) + 1 + (sy * 32)] = + tiles32[tpos].tile3_; + } else if (i < 128 && i >= 64) { + allmapsTilesDW[(x * 2) + (sx * 32)][(y * 2) + (sy * 32)] = + tiles32[tpos].tile0_; + allmapsTilesDW[(x * 2) + 1 + (sx * 32)][(y * 2) + (sy * 32)] = + tiles32[tpos].tile1_; + allmapsTilesDW[(x * 2) + (sx * 32)][(y * 2) + 1 + (sy * 32)] = + tiles32[tpos].tile2_; + allmapsTilesDW[(x * 2) + 1 + (sx * 32)][(y * 2) + 1 + (sy * 32)] = + tiles32[tpos].tile3_; + } else { + allmapsTilesSP[(x * 2) + (sx * 32)][(y * 2) + (sy * 32)] = + tiles32[tpos].tile0_; + allmapsTilesSP[(x * 2) + 1 + (sx * 32)][(y * 2) + (sy * 32)] = + tiles32[tpos].tile1_; + allmapsTilesSP[(x * 2) + (sx * 32)][(y * 2) + 1 + (sy * 32)] = + tiles32[tpos].tile2_; + allmapsTilesSP[(x * 2) + 1 + (sx * 32)][(y * 2) + 1 + (sy * 32)] = + tiles32[tpos].tile3_; + } + } + + ttpos += 1; + } + } + + sx++; + if (sx >= 8) { + sy++; + sx = 0; + } + + c++; + if (c >= 64) { + sx = 0; + sy = 0; + c = 0; + } + } + + std::cout << "MapPointers(lowest) : " << lowest << std::endl; + std::cout << "MapPointers(highest) : " << highest << std::endl; +} + +void Overworld::FetchLargeMaps() { + for (int i = 128; i < 145; i++) { + mapParent[i] = 0; + } + + mapParent[128] = 128; + mapParent[129] = 129; + mapParent[130] = 129; + mapParent[137] = 129; + mapParent[138] = 129; + mapParent[136] = 136; + allmaps[136].largeMap = false; + + bool mapChecked[64]; + for (int i = 0; i < 64; i++) { + mapChecked[i] = false; + } + int xx = 0; + int yy = 0; + while (true) { + int i = xx + (yy * 8); + if (mapChecked[i] == false) { + if (allmaps[i].largeMap == true) { + mapChecked[i] = true; + mapParent[i] = (uchar)i; + mapParent[i + 64] = (uchar)(i + 64); + + mapChecked[i + 1] = true; + mapParent[i + 1] = (uchar)i; + mapParent[i + 65] = (uchar)(i + 64); + + mapChecked[i + 8] = true; + mapParent[i + 8] = (uchar)i; + mapParent[i + 72] = (uchar)(i + 64); + + mapChecked[i + 9] = true; + mapParent[i + 9] = (uchar)i; + mapParent[i + 73] = (uchar)(i + 64); + xx++; + } else { + mapParent[i] = (uchar)i; + mapParent[i + 64] = (uchar)(i + 64); + mapChecked[i] = true; + } + } + + xx++; + if (xx >= 8) { + xx = 0; + yy += 1; + if (yy >= 8) { + break; + } + } + } +} + +void Overworld::LoadOverworldMap() { + overworldMapBitmap = new Bitmap(128, 128, overworldMapPointer); + owactualMapBitmap = new Bitmap(512, 512, owactualMapPointer); + + // Mode 7 + char* ptr = overworldMapPointer; + + int pos = 0; + for (int sy = 0; sy < 16; sy++) { + for (int sx = 0; sx < 16; sx++) { + for (int y = 0; y < 8; y++) { + for (int x = 0; x < 8; x++) { + ptr[x + (sx * 8) + (y * 128) + (sy * 1024)] = + rom_.GetRawData()[0x0C4000 + pos]; + pos++; + } + } + } + } + + // ColorPalette cp = overworldMapBitmap.Palette; + // for (int i = 0; i < 256; i += 2) + // { + // //55B27 = US LW + // //55C27 = US DW + // cp.Entries[i / 2] = getColor((short)((ROM.DATA[0x55B27 + i + 1] << 8) + + // ROM.DATA[0x55B27 + i])); + + // int k = 0; + // int j = 0; + // for (int y = 10; y < 14; y++) + // { + // for (int x = 0; x < 15; x++) + // { + // cp.Entries[145 + k] = Palettes.globalSprite_Palettes[0][j]; + // k++; + // j++; + // } + // k++; + // } + // } + + // overworldMapBitmap.Palette = cp; + // owactualMapBitmap.Palette = cp; +} + +} // namespace Data +} // namespace application +} // namespace yaze \ No newline at end of file diff --git a/src/application/Data/OW/overworld.h b/src/application/Data/OW/overworld.h new file mode 100644 index 00000000..18db9e59 --- /dev/null +++ b/src/application/Data/OW/overworld.h @@ -0,0 +1,74 @@ +#ifndef YAZE_APPLICATION_DATA_OVERWORLD_H +#define YAZE_APPLICATION_DATA_OVERWORLD_H + +#include + +#include +#include + +#include "Core/constants.h" +#include "Data/rom.h" +#include "Graphics/bitmap.h" +#include "Graphics/tile.h" +#include "overworld_map.h" + +namespace yaze { +namespace application { +namespace Data { + +class Overworld { + public: + Overworld() = default; + ~Overworld(); + + void Load(Data::ROM rom); + + char* overworldMapPointer = new char[0x40000]; + Graphics::Bitmap* overworldMapBitmap; + + char* owactualMapPointer = new char[0x40000]; + Graphics::Bitmap* owactualMapBitmap; + + private: + Data::ROM rom_; + int gameState = 1; + bool isLoaded = false; + uchar mapParent[160]; + + ushort** allmapsTilesLW; // 64 maps * (32*32 tiles) + ushort** allmapsTilesDW; // 64 maps * (32*32 tiles) + ushort** allmapsTilesSP; // 32 maps * (32*32 tiles) + + std::vector tiles16; + std::vector tiles32; + std::vector map16tiles; + + std::vector allmaps; + + std::vector tileLeftEntrance; + std::vector tileRightEntrance; + + int map32address[4] = { + Core::Constants::map32TilesTL, Core::Constants::map32TilesTR, + Core::Constants::map32TilesBL, Core::Constants::map32TilesBR}; + + enum Dimension { + map32TilesTL = 0, + map32TilesTR = 1, + map32TilesBL = 2, + map32TilesBR = 3 + }; + + ushort GenerateTile32(int i, int k, int dimension); + void AssembleMap32Tiles(); + void AssembleMap16Tiles(); + void DecompressAllMapTiles(); + void FetchLargeMaps(); + void LoadOverworldMap(); +}; + +} // namespace Data +} // namespace application +} // namespace yaze + +#endif \ No newline at end of file diff --git a/src/application/Data/OW/overworld_map.cc b/src/application/Data/OW/overworld_map.cc new file mode 100644 index 00000000..adafaa7c --- /dev/null +++ b/src/application/Data/OW/overworld_map.cc @@ -0,0 +1,359 @@ +#include "overworld_map.h" + +#include "Data/rom.h" +#include "Graphics/tile.h" + +namespace yaze { +namespace application { +namespace Data { + +using namespace Core; +using namespace Graphics; + +OverworldMap::OverworldMap(Data::ROM rom, + const std::vector tiles16, + uchar index) + : rom_(rom), index(index), tiles16_(tiles16), parent(index) { + if (index != 0x80) { + if (index <= 150) { + if (rom_.GetRawData()[Constants::overworldMapSize + (index & 0x3F)] != + 0) { + largeMap = true; + } + } + } + + if (index < 64) { + sprgfx[0] = rom_.GetRawData()[Constants::overworldSpriteset + parent]; + sprgfx[1] = rom_.GetRawData()[Constants::overworldSpriteset + parent + 64]; + sprgfx[2] = rom_.GetRawData()[Constants::overworldSpriteset + parent + 128]; + gfx = rom_.GetRawData()[Constants::mapGfx + parent]; + palette = rom_.GetRawData()[Constants::overworldMapPalette + parent]; + sprpalette[0] = + rom_.GetRawData()[Constants::overworldSpritePalette + parent]; + sprpalette[1] = + rom_.GetRawData()[Constants::overworldSpritePalette + parent + 64]; + sprpalette[2] = + rom_.GetRawData()[Constants::overworldSpritePalette + parent + 128]; + musics[0] = rom_.GetRawData()[Constants::overworldMusicBegining + parent]; + musics[1] = rom_.GetRawData()[Constants::overworldMusicZelda + parent]; + musics[2] = + rom_.GetRawData()[Constants::overworldMusicMasterSword + parent]; + musics[3] = rom_.GetRawData()[Constants::overworldMusicAgahim + parent]; + } else if (index < 128) { + sprgfx[0] = rom_.GetRawData()[Constants::overworldSpriteset + parent + 128]; + sprgfx[1] = rom_.GetRawData()[Constants::overworldSpriteset + parent + 128]; + sprgfx[2] = rom_.GetRawData()[Constants::overworldSpriteset + parent + 128]; + gfx = rom_.GetRawData()[Constants::mapGfx + parent]; + palette = rom_.GetRawData()[Constants::overworldMapPalette + parent]; + sprpalette[0] = + rom_.GetRawData()[Constants::overworldSpritePalette + parent + 128]; + sprpalette[1] = + rom_.GetRawData()[Constants::overworldSpritePalette + parent + 128]; + sprpalette[2] = + rom_.GetRawData()[Constants::overworldSpritePalette + parent + 128]; + + musics[0] = rom_.GetRawData()[Constants::overworldMusicDW + (parent - 64)]; + } else { + if (index == 0x94) { + parent = 128; + } else if (index == 0x95) { + parent = 03; + } else if (index == 0x96) // pyramid bg use 0x5B map + { + parent = 0x5B; + } else if (index == 0x97) // pyramid bg use 0x5B map + { + parent = 0x00; + } else if (index == 156) { + parent = 67; + } else if (index == 157) { + parent = 0; + } else if (index == 158) { + parent = 0; + } else if (index == 159) { + parent = 44; + } else if (index == 136) { + parent = 136; + } + + messageID = rom_.GetRawData()[Constants::overworldMessages + parent]; + + sprgfx[0] = rom_.GetRawData()[Constants::overworldSpriteset + parent + 128]; + sprgfx[1] = rom_.GetRawData()[Constants::overworldSpriteset + parent + 128]; + sprgfx[2] = rom_.GetRawData()[Constants::overworldSpriteset + parent + 128]; + sprpalette[0] = + rom_.GetRawData()[Constants::overworldSpritePalette + parent + 128]; + sprpalette[1] = + rom_.GetRawData()[Constants::overworldSpritePalette + parent + 128]; + sprpalette[2] = + rom_.GetRawData()[Constants::overworldSpritePalette + parent + 128]; + + palette = + rom_.GetRawData()[Constants::overworldSpecialPALGroup + parent - 128]; + if (index >= 0x80 && index <= 0x8A && index != 0x88) { + gfx = rom_.GetRawData()[Constants::overworldSpecialGFXGroup + + (parent - 128)]; + palette = rom_.GetRawData()[Constants::overworldSpecialPALGroup + 1]; + } else if (index == 0x88) { + gfx = 81; + palette = 0; + } else // pyramid bg use 0x5B map + { + gfx = rom_.GetRawData()[Constants::mapGfx + parent]; + palette = rom_.GetRawData()[Constants::overworldMapPalette + parent]; + } + } +} + +void OverworldMap::BuildMap(uchar* mapParent, int count, int gameState, + ushort** allmapsTilesLW, ushort** allmapsTilesDW, + ushort** allmapsTilesSP) { + tilesUsed = new ushort*[32]; + for (int i = 0; i < 32; i++) tilesUsed[i] = new ushort; + + if (largeMap) { + this->parent = mapParent[index]; + + if (parent != index) { + if (!firstLoad) { + gfx = rom_.GetRawData()[Constants::mapGfx + parent]; + palette = rom_.GetRawData()[Constants::overworldMapPalette + parent]; + firstLoad = true; + } + } + } + + BuildTileset(gameState); + BuildTiles16Gfx(count); // build on GFX.mapgfx16Ptr + + int world = 0; + + if (index < 64) { + tilesUsed = allmapsTilesLW; + } else if (index < 128 && index >= 64) { + tilesUsed = allmapsTilesDW; + world = 1; + } else { + tilesUsed = allmapsTilesSP; + world = 2; + } + + int superY = ((index - (world * 64)) / 8); + int superX = index - (world * 64) - (superY * 8); + + for (int y = 0; y < 32; y++) { + for (int x = 0; x < 32; x++) { + CopyTile8bpp16((x * 16), (y * 16), + tilesUsed[x + (superX * 32)][y + (superY * 32)], gfxPtr, + mapblockset16); + } + } +} + +void OverworldMap::CopyTile8bpp16(int x, int y, int tile, int* destbmpPtr, + int* sourcebmpPtr) { + int sourceY = (tile / 8); + int sourceX = (tile) - ((sourceY)*8); + int sourcePtrPos = ((tile - ((tile / 8) * 8)) * 16) + + ((tile / 8) * 2048); //(sourceX * 16) + (sourceY * 128); + uchar* sourcePtr = (uchar*)sourcebmpPtr; + + int destPtrPos = (x + (y * 512)); + uchar* destPtr = (uchar*)destbmpPtr; + + for (int ystrip = 0; ystrip < 16; ystrip++) { + for (int xstrip = 0; xstrip < 16; xstrip++) { + destPtr[destPtrPos + xstrip + (ystrip * 512)] = + sourcePtr[sourcePtrPos + xstrip + (ystrip * 128)]; + } + } +} + +void OverworldMap::CopyTile8bpp16From8(int xP, int yP, int tileID, + int* destbmpPtr, int* sourcebmpPtr) { + auto gfx16Data = (uchar*)destbmpPtr; + + auto gfx8Data = currentOWgfx16Ptr; + + int offsets[] = {0, 8, 4096, 4104}; + + auto tiles = tiles16_[tileID]; + + for (auto tile = 0; tile < 4; tile++) { + TileInfo info = tiles.tiles_info[tile]; + int offset = offsets[tile]; + + for (auto y = 0; y < 8; y++) { + for (auto x = 0; x < 4; x++) { + CopyTileToMap(x, y, xP, yP, offset, info, gfx16Data, gfx8Data); + } + } + } +} + +void OverworldMap::BuildTiles16Gfx(int count) { + uchar* gfx16Data = (uchar*)mapblockset16; + uchar* gfx8Data = currentOWgfx16Ptr; + + int offsets[] = {0, 8, 1024, 1032}; + auto yy = 0; + auto xx = 0; + + for (auto i = 0; i < count; i++) // number of tiles16 3748? + { + // 8x8 tile draw + // gfx8 = 4bpp so everyting is /2F + auto tiles = tiles16_[i]; + + for (auto tile = 0; tile < 4; tile++) { + TileInfo info = tiles16_[i].tiles_info[tile]; + int offset = offsets[tile]; + + for (auto y = 0; y < 8; y++) { + for (auto x = 0; x < 4; x++) { + CopyTile(x, y, xx, yy, offset, info, gfx16Data, gfx8Data); + } + } + } + + xx += 16; + if (xx >= 128) { + yy += 2048; + xx = 0; + } + } +} + +void OverworldMap::CopyTile(int x, int y, int xx, int yy, int offset, + TileInfo tile, uchar* gfx16Pointer, + uchar* gfx8Pointer) // map,current +{ + int mx = x; + int my = y; + uchar r = 0; + + if (tile.horizontal_mirror_ != 0) { + mx = 3 - x; + r = 1; + } + + if (tile.vertical_mirror_ != 0) { + my = 7 - y; + } + + int tx = ((tile.id_ / 16) * 512) + ((tile.id_ - ((tile.id_ / 16) * 16)) * 4); + auto index = xx + yy + offset + (mx * 2) + (my * 128); + auto pixel = gfx8Pointer[tx + (y * 64) + x]; + + gfx16Pointer[index + r ^ 1] = (uchar)((pixel & 0x0F) + tile.palette_ * 16); + gfx16Pointer[index + r] = (uchar)(((pixel >> 4) & 0x0F) + tile.palette_ * 16); +} + +void OverworldMap::CopyTileToMap(int x, int y, int xx, int yy, int offset, + TileInfo tile, uchar* gfx16Pointer, + uchar* gfx8Pointer) // map,current +{ + int mx = x; + int my = y; + uchar r = 0; + + if (tile.horizontal_mirror_ != 0) { + mx = 3 - x; + r = 1; + } + + if (tile.vertical_mirror_ != 0) { + my = 7 - y; + } + + int tx = ((tile.id_ / 16) * 512) + ((tile.id_ - ((tile.id_ / 16) * 16)) * 4); + auto index = xx + (yy * 512) + offset + (mx * 2) + (my * 512); + auto pixel = gfx8Pointer[tx + (y * 64) + x]; + + gfx16Pointer[index + r ^ 1] = (uchar)((pixel & 0x0F) + tile.palette_ * 16); + gfx16Pointer[index + r] = (uchar)(((pixel >> 4) & 0x0F) + tile.palette_ * 16); +} + +void OverworldMap::BuildTileset(int gameState) { + int indexWorld = 0x20; + if (parent < 0x40) { + indexWorld = 0x20; + } else if (parent >= 0x40 && parent < 0x80) { + indexWorld = 0x21; + } else if (parent == 0x88) { + indexWorld = 36; + } + + // Sprites Blocksets + staticgfx[8] = 115 + 0; + staticgfx[9] = 115 + 1; + staticgfx[10] = 115 + 6; + staticgfx[11] = 115 + 7; + for (int i = 0; i < 4; i++) { + staticgfx[12 + i] = + (uchar)(rom_.GetRawData()[Constants::sprite_blockset_pointer + + (sprgfx[gameState] * 4) + i] + + 115); + } + + // Main Blocksets + for (int i = 0; i < 8; i++) { + staticgfx[i] = rom_.GetRawData()[Constants::overworldgfxGroups2 + + (indexWorld * 8) + i]; + } + + if (rom_.GetRawData()[Constants::overworldgfxGroups + (gfx * 4)] != 0) { + staticgfx[3] = rom_.GetRawData()[Constants::overworldgfxGroups + (gfx * 4)]; + } + if (rom_.GetRawData()[Constants::overworldgfxGroups + (gfx * 4) + 1] != 0) { + staticgfx[4] = + rom_.GetRawData()[Constants::overworldgfxGroups + (gfx * 4) + 1]; + } + if (rom_.GetRawData()[Constants::overworldgfxGroups + (gfx * 4) + 2] != 0) { + staticgfx[5] = + rom_.GetRawData()[Constants::overworldgfxGroups + (gfx * 4) + 2]; + } + if (rom_.GetRawData()[Constants::overworldgfxGroups + (gfx * 4) + 3] != 0) { + staticgfx[6] = + rom_.GetRawData()[Constants::overworldgfxGroups + (gfx * 4) + 3]; + } + + // Hardcoded overworld GFX Values, for death mountain + if ((parent >= 0x03 && parent <= 0x07) || + (parent >= 0x0B && parent <= 0x0E)) { + staticgfx[7] = 89; + } else if ((parent >= 0x43 && parent <= 0x47) || + (parent >= 0x4B && parent <= 0x4E)) { + staticgfx[7] = 89; + } else { + staticgfx[7] = 91; + } + + uchar* currentmapgfx8Data = new uchar[(128 * 512) / 2]; + // (uchar*)GFX.currentOWgfx16Ptr.ToPointer(); // loaded gfx for the current + // // map (empty at this point) + uchar* allgfxData = new uchar[(128 * 7136) / 2]; + // (uchar*)GFX.allgfx16Ptr + // .ToPointer(); // all gfx of the game pack of 2048 uchars (4bpp) + + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 2048; j++) { + uchar mapByte = allgfxData[j + (staticgfx[i] * 2048)]; + switch (i) { + case 0: + case 3: + case 4: + case 5: + mapByte += 0x88; + break; + } + + currentmapgfx8Data[(i * 2048) + j] = mapByte; // Upload used gfx data + } + } +} + +} // namespace Data +} // namespace application +} // namespace yaze \ No newline at end of file diff --git a/src/application/Data/OW/overworld_map.h b/src/application/Data/OW/overworld_map.h new file mode 100644 index 00000000..e95ebac6 --- /dev/null +++ b/src/application/Data/OW/overworld_map.h @@ -0,0 +1,77 @@ +#include + +#include +#include + +#include "Data/rom.h" +#include "Graphics/bitmap.h" +#include "Graphics/tile.h" + +namespace yaze { +namespace application { +namespace Data { + +using ushort = unsigned short; + +class OverworldMap { + public: + uchar parent = 0; + uchar index = 0; + uchar gfx = 0; + uchar palette = 0; + bool firstLoad = false; + short messageID = 0; + bool largeMap = false; + + uchar sprgfx[3]; + uchar sprpalette[3]; + uchar musics[4]; + + int* gfxPtr = new int[512 * 512]; + int* mapblockset16 = new int[1048576]; + Graphics::Bitmap mapblockset16Bitmap; + Graphics::Bitmap gfxBitmap; + + uchar* staticgfx = + new uchar[16]; // Need to be used to display map and not pre render it! + ushort** tilesUsed; + + bool needRefresh = false; + Data::ROM rom_; + + uchar* currentOWgfx16Ptr = new uchar[(128 * 512) / 2]; + std::vector tiles16_; + + OverworldMap(Data::ROM rom, const std::vector tiles16, + uchar index); + void BuildMap(uchar* mapParent, int count, int gameState, + ushort** allmapsTilesLW, ushort** allmapsTilesDW, + ushort** allmapsTilesSP); + void CopyTile8bpp16(int x, int y, int tile, int* destbmpPtr, + int* sourcebmpPtr); + void CopyTile8bpp16From8(int xP, int yP, int tileID, int* destbmpPtr, + int* sourcebmpPtr); + + private: + void BuildTiles16Gfx(int count); + // void ReloadPalettes() { LoadPalette(); } + + void CopyTile(int x, int y, int xx, int yy, int offset, + Graphics::TileInfo tile, uchar* gfx16Pointer, + uchar* gfx8Pointer); + void CopyTileToMap(int x, int y, int xx, int yy, int offset, + Graphics::TileInfo tile, uchar* gfx16Pointer, + uchar* gfx8Pointer); + + void LoadPalette(); + + void SetColorsPalette(int index, ImVec4 main, ImVec4 animated, ImVec4 aux1, + ImVec4 aux2, ImVec4 hud, ImVec4 bgrcolor, ImVec4 spr, + ImVec4 spr2); + + void BuildTileset(int gameState); +}; + +} // namespace Data +} // namespace application +} // namespace yaze \ No newline at end of file diff --git a/src/application/Data/rom.cc b/src/application/Data/rom.cc new file mode 100644 index 00000000..a14ef679 --- /dev/null +++ b/src/application/Data/rom.cc @@ -0,0 +1,244 @@ +#include "rom.h" + +#include + +#include "Core/constants.h" + +namespace yaze { +namespace application { +namespace Data { + +ROM::~ROM() { + if (loaded) { + delete[] current_rom_; + } +} + +// TODO: check if the rom has a header on load +void ROM::LoadFromFile(const std::string &path) { + size_ = std::filesystem::file_size(path.c_str()); + std::ifstream file(path.c_str(), std::ios::binary); + if (!file.is_open()) { + std::cout << "Error: Could not open ROM file " << path << std::endl; + return; + } + current_rom_ = new unsigned char[size_]; + for (unsigned int i = 0; i < size_; i++) { + char byte_read_ = ' '; + file.read(&byte_read_, sizeof(char)); + current_rom_[i] = byte_read_; + } + file.close(); + memcpy(title, current_rom_ + 32704, 21); + version_ = current_rom_[27]; + loaded = true; +} + +std::vector ROM::ExtractTiles(Graphics::TilePreset &preset) { + std::cout << "Extracting tiles..." << std::endl; + uint filePos = 0; + uint size_out = 0; + uint size = preset.length_; + int tilePos = preset.pc_tiles_location_; + std::vector rawTiles; + filePos = GetRomPosition(preset, tilePos, preset.SNESTilesLocation); + std::cout << "ROM Position: " << filePos << " from " + << preset.SNESTilesLocation << std::endl; + + // decompress the graphics + auto data = (char *)malloc(sizeof(char) * size); + memcpy(data, (current_rom_ + filePos), size); + data = alttp_decompress_gfx(data, 0, size, &size_out, &compressed_size_); + std::cout << "size: " << size << std::endl; + std::cout << "lastCompressedSize: " << compressed_size_ << std::endl; + if (data == nullptr) { + std::cout << alttp_decompression_error << std::endl; + return rawTiles; + } + + // unpack the tiles based on their depth + unsigned tileCpt = 0; + std::cout << "Unpacking tiles..." << std::endl; + for (unsigned int tilePos = 0; tilePos < size; + tilePos += preset.bits_per_pixel_ * 8) { + tile8 newTile = unpack_bpp_tile(data, tilePos, preset.bits_per_pixel_); + newTile.id = tileCpt; + rawTiles.push_back(newTile); + tileCpt++; + } + std::cout << "Done unpacking tiles" << std::endl; + free(data); + std::cout << "Done extracting tiles." << std::endl; + return rawTiles; +} + +Graphics::SNESPalette ROM::ExtractPalette(Graphics::TilePreset &preset) { + unsigned int filePos = GetRomPosition(preset, preset.pc_palette_location_, + preset.SNESPaletteLocation); + std::cout << "Palette pos : " << filePos << std::endl; // TODO: make this hex + unsigned int palette_size = pow(2, preset.bits_per_pixel_); // - 1; + + auto palette_data = std::make_unique(palette_size * 2); + memcpy(palette_data.get(), current_rom_ + filePos, palette_size * 2); + + // char *ab = (char *)malloc(sizeof(char) * (palette_size * 2)); + // memcpy(ab, current_rom_ + filePos, palette_size * 2); + + for (int i = 0; i < palette_size; i++) { + std::cout << palette_data[i]; + } + std::cout << std::endl; + + const unsigned char *data = palette_data.get(); + Graphics::SNESPalette pal(data); + if (preset.no_zero_color_) { + Graphics::SNESColor col; + + col.setRgb(ImVec4(153, 153, 153, 255)); + pal.colors.push_back(col); + pal.colors.erase(pal.colors.begin(), + pal.colors.begin() + pal.colors.size() - 1); + } + return pal; +} + +uint32_t ROM::GetRomPosition(const Graphics::TilePreset &preset, int directAddr, + unsigned int snesAddr) const { + unsigned int filePos = -1; + std::cout << "directAddr:" << directAddr << std::endl; + if (directAddr == -1) { + filePos = rommapping_snes_to_pc(snesAddr, type_, has_header_); + } else { + filePos = directAddr; + if (has_header_) filePos += 0x200; + } + std::cout << "filePos:" << filePos << std::endl; + return filePos; +} + +unsigned char *sheetBuffer = (unsigned char *)malloc(0x1000); +unsigned char bitmask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; +void SNES3bppTo8bppSheet() // 128x32 +{ + char *buffer = new char[0x800]; + int xx = 0; // positions where we are at on the sheet + int yy = 0; + int pos = 0; + int ypos = 0; + for (int i = 0; i < 64; i++) // for each tiles //16 per lines + { + for (int y = 0; y < 8; y++) // for each lines + { + //[0] + [1] + [16] + for (int x = 0; x < 8; x++) { + unsigned char b1 = + (unsigned char)((buffer[(y * 2) + (24 * pos)] & (bitmask[x]))); + unsigned char b2 = + (unsigned char)(buffer[((y * 2) + (24 * pos)) + 1] & (bitmask[x])); + unsigned char b3 = + (unsigned char)(buffer[(16 + y) + (24 * pos)] & (bitmask[x])); + unsigned char b = 0; + if (b1 != 0) { + b |= 1; + }; + if (b2 != 0) { + b |= 2; + }; + if (b3 != 0) { + b |= 4; + }; + sheetBuffer[x + (xx) + (y * 128) + (yy * 1024)] = b; + } + } + pos++; + ypos++; + xx += 8; + if (ypos >= 16) { + yy++; + xx = 0; + ypos = 0; + } + } +} + +char *Decompress(int pos, bool reversed = false) { + char *buffer = new char[0x800]; + for (int i = 0; i < 0x800; i++) { + buffer[i] = 0; + } + unsigned int bufferPos = 0; + unsigned char cmd = 0; + unsigned int length = 0; + char romData[256]; + unsigned char databyte = (unsigned char)romData[pos]; + while (true) { + databyte = (unsigned char)romData[pos]; + if (databyte == 0xFF) // End of decompression + { + break; + } + + if ((databyte & 0xE0) == 0xE0) // Expanded Command + { + cmd = (unsigned char)((databyte >> 2) & 0x07); + length = + (unsigned short)(((romData[pos] << 8) | romData[pos + 1]) & 0x3FF); + pos += 2; // Advance 2 bytes in ROM + } else // Normal Command + { + cmd = (unsigned char)((databyte >> 5) & 0x07); + length = (unsigned char)(databyte & 0x1F); + pos += 1; // Advance 1 byte in ROM + } + length += 1; // Every commands are at least 1 size even if 00 + switch (cmd) { + case 00: // Direct Copy (Could be replaced with a MEMCPY) + for (int i = 0; i < length; i++) { + buffer[bufferPos++] = (unsigned char)romData[pos++]; + } + // Do not advance in the ROM + break; + case 01: // Byte Fill + for (int i = 0; i < length; i++) { + buffer[bufferPos++] = (unsigned char)romData[pos]; + } + pos += 1; // Advance 1 byte in the ROM + break; + case 02: // Word Fill + for (int i = 0; i < length; i += 2) { + buffer[bufferPos++] = (unsigned char)romData[pos]; + buffer[bufferPos++] = (unsigned char)romData[pos + 1]; + } + pos += 2; // Advance 2 byte in the ROM + break; + case 03: // Increasing Fill + { + unsigned char incByte = (unsigned char)romData[pos]; + for (int i = 0; i < (unsigned int)length; i++) { + buffer[bufferPos++] = (unsigned char)incByte++; + } + pos += 1; // Advance 1 byte in the ROM + } break; + case 04: // Repeat (Reversed byte order for maps) + { + unsigned short s1 = ((romData[pos + 1] & 0xFF) << 8); + unsigned short s2 = ((romData[pos] & 0xFF)); + unsigned short Addr = (unsigned short)(s1 | s2); + for (int i = 0; i < length; i++) { + buffer[bufferPos] = (unsigned char)buffer[Addr + i]; + bufferPos++; + } + pos += 2; // Advance 2 bytes in the ROM + } break; + } + } + return buffer; +} + +int AddressFromBytes(uchar addr1, uchar addr2, uchar addr3) { + return (addr1 << 16) | (addr2 << 8) | addr3; +} + +} // namespace Data +} // namespace application +} // namespace yaze \ No newline at end of file diff --git a/src/application/Data/rom.h b/src/application/Data/rom.h new file mode 100644 index 00000000..558187aa --- /dev/null +++ b/src/application/Data/rom.h @@ -0,0 +1,59 @@ +#ifndef YAZE_APPLICATION_UTILS_ROM_H +#define YAZE_APPLICATION_UTILS_ROM_H + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "Core/constants.h" +#include "Graphics/tile.h" + +namespace yaze { +namespace application { +namespace Data { + +int AddressFromBytes(uchar addr1, uchar addr2, uchar addr3); + +class ROM { + public: + ~ROM(); + + void LoadFromFile(const std::string& path); + std::vector ExtractTiles(Graphics::TilePreset& preset); + Graphics::SNESPalette ExtractPalette(Graphics::TilePreset& preset); + uint32_t GetRomPosition(const Graphics::TilePreset& preset, int directAddr, + unsigned int snesAddr) const; + inline uchar* GetRawData() { return current_rom_; } + const uchar* getTitle() const { return title; } + long int getSize() const { return size_; } + char getVersion() const { return version_; } + bool isLoaded() const { return loaded; } + + private: + bool loaded = false; + bool has_header_ = false; + uchar* current_rom_; + uchar version_; + uchar title[21] = "ROM Not Loaded"; + uint uncompressed_size_; + uint compressed_size_; + uint compress_size_; + long int size_; + enum rom_type type_ = LoROM; + + std::shared_ptr rom_ptr_; +}; + +} // namespace Data +} // namespace application +} // namespace yaze + +#endif \ No newline at end of file diff --git a/src/application/Editor/editor.cc b/src/application/Editor/editor.cc new file mode 100644 index 00000000..35032928 --- /dev/null +++ b/src/application/Editor/editor.cc @@ -0,0 +1,510 @@ +#include "editor.h" + +#include "Graphics/palette.h" +#include "Graphics/tile.h" + +namespace yaze { +namespace application { +namespace Editor { + +using namespace Core; + +Editor::Editor() { + for (auto &k : Core::Constants::kKeywords) + language_65816_.mKeywords.emplace(k); + + for (auto &k : Core::Constants::kIdentifiers) { + TextEditor::Identifier id; + id.mDeclaration = "Built-in function"; + language_65816_.mIdentifiers.insert(std::make_pair(std::string(k), id)); + } + + language_65816_.mTokenRegexStrings.push_back( + std::make_pair( + "[ \\t]*#[ \\t]*[a-zA-Z_]+", TextEditor::PaletteIndex::Preprocessor)); + language_65816_.mTokenRegexStrings.push_back( + std::make_pair( + "L?\\\"(\\\\.|[^\\\"])*\\\"", TextEditor::PaletteIndex::String)); + language_65816_.mTokenRegexStrings.push_back( + std::make_pair( + "\\'\\\\?[^\\']\\'", TextEditor::PaletteIndex::CharLiteral)); + language_65816_.mTokenRegexStrings.push_back( + std::make_pair( + "[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?[fF]?", + TextEditor::PaletteIndex::Number)); + language_65816_.mTokenRegexStrings.push_back( + std::make_pair( + "[+-]?[0-9]+[Uu]?[lL]?[lL]?", TextEditor::PaletteIndex::Number)); + language_65816_.mTokenRegexStrings.push_back( + std::make_pair( + "0[0-7]+[Uu]?[lL]?[lL]?", TextEditor::PaletteIndex::Number)); + language_65816_.mTokenRegexStrings.push_back( + std::make_pair( + "0[xX][0-9a-fA-F]+[uU]?[lL]?[lL]?", + TextEditor::PaletteIndex::Number)); + language_65816_.mTokenRegexStrings.push_back( + std::make_pair( + "[a-zA-Z_][a-zA-Z0-9_]*", TextEditor::PaletteIndex::Identifier)); + language_65816_.mTokenRegexStrings.push_back( + std::make_pair( + "[\\[\\]\\{\\}\\!\\%\\^\\&\\*\\(\\)\\-\\+\\=\\~\\|\\<\\>\\?\\/" + "\\;\\,\\.]", + TextEditor::PaletteIndex::Punctuation)); + + language_65816_.mCommentStart = "/*"; + language_65816_.mCommentEnd = "*/"; + language_65816_.mSingleLineComment = ";"; + + language_65816_.mCaseSensitive = false; + language_65816_.mAutoIndentation = true; + + language_65816_.mName = "65816"; + asm_editor_.SetLanguageDefinition(language_65816_); + asm_editor_.SetPalette(TextEditor::GetDarkPalette()); + + current_set_.bits_per_pixel_ = 4; + current_set_.pc_tiles_location_ = 0x80000; + current_set_.SNESTilesLocation = 0x0000; + current_set_.length_ = 28672; + current_set_.pc_palette_location_ = 906022; + current_set_.SNESPaletteLocation = 0; +} + +void Editor::SetupScreen(std::shared_ptr renderer) { + sdl_renderer_ = renderer; +} + +void Editor::UpdateScreen() { + const ImGuiIO &io = ImGui::GetIO(); + ImGui::NewFrame(); + ImGui::SetNextWindowPos(ImVec2(0, 0)); + ImVec2 dimensions(io.DisplaySize.x, io.DisplaySize.y); + ImGui::SetNextWindowSize(dimensions, ImGuiCond_Always); + + if (!ImGui::Begin("##YazeMain", nullptr, main_editor_flags_)) { + ImGui::End(); + return; + } + + DrawYazeMenu(); + + TAB_BAR("##TabBar") + DrawProjectEditor(); + DrawOverworldEditor(); + DrawDungeonEditor(); + DrawGraphicsEditor(); + DrawSpriteEditor(); + DrawScreenEditor(); + END_TAB_BAR() + + ImGui::End(); +} + +void Editor::DrawYazeMenu() { + MENU_BAR() + DrawFileMenu(); + DrawEditMenu(); + DrawViewMenu(); + DrawHelpMenu(); + END_MENU_BAR() + + if (ImGuiFileDialog::Instance()->Display("ChooseFileDlgKey")) { + if (ImGuiFileDialog::Instance()->IsOk()) { + std::string filePathName = ImGuiFileDialog::Instance()->GetFilePathName(); + std::string filePath = ImGuiFileDialog::Instance()->GetCurrentPath(); + rom_.LoadFromFile(filePathName); + overworld_editor_.SetRom(rom_); + rom_data_ = (void *)rom_.GetRawData(); + } + ImGuiFileDialog::Instance()->Close(); + } +} + +void Editor::DrawFileMenu() const { + if (ImGui::BeginMenu("File")) { + if (ImGui::MenuItem("Open", "Ctrl+O")) { + ImGuiFileDialog::Instance()->OpenDialog("ChooseFileDlgKey", "Open ROM", + ".sfc,.smc", "."); + } + if (ImGui::BeginMenu("Open Recent")) { + ImGui::MenuItem("alttp.sfc"); + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Save", "Ctrl+S")) { + // TODO: Implement this + } + if (ImGui::MenuItem("Save As..")) { + // TODO: Implement this + } + + ImGui::Separator(); + + // TODO: Make these options matter + if (ImGui::BeginMenu("Options")) { + static bool enabled = true; + ImGui::MenuItem("Enabled", "", &enabled); + ImGui::BeginChild("child", ImVec2(0, 60), true); + for (int i = 0; i < 10; i++) ImGui::Text("Scrolling Text %d", i); + ImGui::EndChild(); + static float f = 0.5f; + static int n = 0; + ImGui::SliderFloat("Value", &f, 0.0f, 1.0f); + ImGui::InputFloat("Input", &f, 0.1f); + ImGui::Combo("Combo", &n, "Yes\0No\0Maybe\0\0"); + ImGui::EndMenu(); + } + ImGui::EndMenu(); + } +} + +void Editor::DrawEditMenu() const { + if (ImGui::BeginMenu("Edit")) { + if (ImGui::MenuItem("Undo", "Ctrl+Z")) { + // TODO: Implement this + } + if (ImGui::MenuItem("Undo", "Ctrl+Y")) { + // TODO: Implement this + } + ImGui::Separator(); + if (ImGui::MenuItem("Cut", "Ctrl+X")) { + // TODO: Implement this + } + if (ImGui::MenuItem("Copy", "Ctrl+C")) { + // TODO: Implement this + } + if (ImGui::MenuItem("Paste", "Ctrl+V")) { + // TODO: Implement this + } + ImGui::Separator(); + if (ImGui::MenuItem("Find", "Ctrl+F")) { + // TODO: Implement this + } + ImGui::EndMenu(); + } +} + +void Editor::DrawViewMenu() { + static bool show_imgui_metrics = false; + static bool show_imgui_style_editor = false; + static bool show_memory_editor = false; + static bool show_asm_editor = false; + static bool show_imgui_demo = false; + + if (show_imgui_metrics) { + ImGui::ShowMetricsWindow(&show_imgui_metrics); + } + + if (show_memory_editor) { + static MemoryEditor mem_edit; + mem_edit.DrawWindow("Memory Editor", rom_data_, rom_.getSize()); + } + + if (show_imgui_demo) { + ImGui::ShowDemoWindow(); + } + + if (show_asm_editor) { + static bool asm_is_loaded = false; + auto cpos = asm_editor_.GetCursorPosition(); + static const char *fileToEdit = "assets/bunnyhood.asm"; + if (!asm_is_loaded) { + std::ifstream t(fileToEdit); + if (t.good()) { + std::string str((std::istreambuf_iterator(t)), + std::istreambuf_iterator()); + asm_editor_.SetText(str); + } + asm_is_loaded = true; + } + + ImGui::Begin("ASM Editor", &show_asm_editor); + ImGui::Text("%6d/%-6d %6d lines | %s | %s | %s | %s", cpos.mLine + 1, + cpos.mColumn + 1, asm_editor_.GetTotalLines(), + asm_editor_.IsOverwrite() ? "Ovr" : "Ins", + asm_editor_.CanUndo() ? "*" : " ", + asm_editor_.GetLanguageDefinition().mName.c_str(), fileToEdit); + + asm_editor_.Render(fileToEdit); + ImGui::End(); + } + + if (show_imgui_style_editor) { + ImGui::Begin("Style Editor (ImGui)", &show_imgui_style_editor); + ImGui::ShowStyleEditor(); + ImGui::End(); + } + + if (ImGui::BeginMenu("View")) { + ImGui::MenuItem("HEX Editor", nullptr, &show_memory_editor); + ImGui::MenuItem("ASM Editor", nullptr, &show_asm_editor); + ImGui::MenuItem("ImGui Demo", nullptr, &show_imgui_demo); + + ImGui::Separator(); + if (ImGui::BeginMenu("GUI Tools")) { + ImGui::MenuItem("Metrics (ImGui)", nullptr, &show_imgui_metrics); + ImGui::MenuItem("Style Editor (ImGui)", nullptr, + &show_imgui_style_editor); + ImGui::EndMenu(); + } + ImGui::EndMenu(); + } +} + +void Editor::DrawHelpMenu() const { + if (ImGui::BeginMenu("Help")) { + if (ImGui::MenuItem("About")) { + } + ImGui::EndMenu(); + } +} + +void Editor::DrawSurface() { + arranged_tiles_ = + Graphics::TilesPattern::transform(current_set_.tilesPattern, tiles_); + for (unsigned int j = 0; j < arranged_tiles_.size(); j++) { + for (unsigned int i = 0; i < arranged_tiles_[0].size(); i++) { + tile8 tile = arranged_tiles_[j][i]; + // SDL_PIXELFORMAT_RGB888 ? + SDL_Surface *surface = SDL_CreateRGBSurfaceWithFormat( + 0, 8, 8, SDL_BITSPERPIXEL(4), SDL_PIXELFORMAT_RGB444); + if (surface == nullptr) { + SDL_Log("SDL_CreateRGBSurfaceWithFormat() failed: %s", SDL_GetError()); + exit(1); + } + SDL_PixelFormat *format = surface->format; + format->palette = current_palette_.GetSDL_Palette(); + uchar *ptr = (uchar *)surface->pixels; + + for (int k = 0; k < 8; k++) { + for (int l = 0; l < 8; l++) { + ptr[k * 8 + l] = tile.data[k * 8 + l]; + } + } + + SDL_Texture *texture = + SDL_CreateTextureFromSurface(sdl_renderer_.get(), surface); + if (texture == nullptr) { + std::cout << "Error: " << SDL_GetError() << std::endl; + } + imagesCache[tile.id] = texture; + } + } +} + +void Editor::DrawProjectEditor() { + if (ImGui::BeginTabItem("Project")) { + if (ImGui::BeginTable("##projectTable", 2, + ImGuiTableFlags_SizingStretchSame)) { + ImGui::TableSetupColumn("##inputs"); + ImGui::TableSetupColumn("##outputs"); + + ImGui::TableNextColumn(); + ImGui::Text("Title: %s", rom_.getTitle()); + ImGui::Text("Version: %d", rom_.getVersion()); + ImGui::Text("ROM Size: %ld", rom_.getSize()); + + ImGui::InputInt("Bits per Pixel", ¤t_set_.bits_per_pixel_); + + yaze::Gui::InputHex("PC Tile Location", ¤t_set_.pc_tiles_location_); + + yaze::Gui::InputHex("SNES Tile Location", + ¤t_set_.SNESTilesLocation); + + ImGui::InputInt("Tile Preset Length", ¤t_set_.length_); + + ImGui::InputInt("PC Palette Location", + ¤t_set_.pc_palette_location_); + + yaze::Gui::InputHex("SNES Palette Location", + ¤t_set_.SNESPaletteLocation); + + BASIC_BUTTON("ExtractTiles") { + if (rom_.isLoaded()) { + tiles_ = rom_.ExtractTiles(current_set_); + } + } + + BASIC_BUTTON("ExtractPalette") { + if (rom_.isLoaded()) { + current_palette_ = rom_.ExtractPalette(current_set_); + } + } + + BASIC_BUTTON("BuildSurface") { + if (rom_.isLoaded()) { + DrawSurface(); + } + } + + static int i = 0; + for (auto &[key, texture] : imagesCache) { + ImGui::Image((void *)(SDL_Texture *)texture, ImVec2(32, 32)); + if (i != 16) { + ImGui::SameLine(); + } else if (i == 16) { + i = 0; + } + i++; + } + + ImGui::TableNextColumn(); + + static ImVector points; + static ImVec2 scrolling(0.0f, 0.0f); + static bool opt_enable_context_menu = true; + static bool opt_enable_grid = true; + ImVec2 canvas_p0 = ImGui::GetCursorScreenPos(); + ImVec2 canvas_sz = ImGui::GetContentRegionAvail(); + ImVec2 canvas_p1 = + ImVec2(canvas_p0.x + canvas_sz.x, canvas_p0.y + canvas_sz.y); + + // Draw border and background color + const ImGuiIO &io = ImGui::GetIO(); + ImDrawList *draw_list = ImGui::GetWindowDrawList(); + draw_list->AddRectFilled(canvas_p0, canvas_p1, IM_COL32(32, 32, 32, 255)); + draw_list->AddRect(canvas_p0, canvas_p1, IM_COL32(255, 255, 255, 255)); + + // This will catch our interactions + ImGui::InvisibleButton( + "canvas", canvas_sz, + ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight); + const bool is_hovered = ImGui::IsItemHovered(); // Hovered + const bool is_active = ImGui::IsItemActive(); // Held + const ImVec2 origin(canvas_p0.x + scrolling.x, + canvas_p0.y + scrolling.y); // Lock scrolled origin + const ImVec2 mouse_pos_in_canvas(io.MousePos.x - origin.x, + io.MousePos.y - origin.y); + + // Pan (we use a zero mouse threshold when there's no context menu) + const float mouse_threshold_for_pan = + opt_enable_context_menu ? -1.0f : 0.0f; + if (is_active && ImGui::IsMouseDragging(ImGuiMouseButton_Right, + mouse_threshold_for_pan)) { + scrolling.x += io.MouseDelta.x; + scrolling.y += io.MouseDelta.y; + } + + // Context menu (under default mouse threshold) + ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right); + if (opt_enable_context_menu && drag_delta.x == 0.0f && + drag_delta.y == 0.0f) + ImGui::OpenPopupOnItemClick("context", + ImGuiPopupFlags_MouseButtonRight); + if (ImGui::BeginPopup("context")) { + ImGui::MenuItem("Placeholder"); + ImGui::EndPopup(); + } + + // Draw grid + all lines in the canvas + draw_list->PushClipRect(canvas_p0, canvas_p1, true); + if (opt_enable_grid) { + const float GRID_STEP = 64.0f; + for (float x = fmodf(scrolling.x, GRID_STEP); x < canvas_sz.x; + x += GRID_STEP) + draw_list->AddLine(ImVec2(canvas_p0.x + x, canvas_p0.y), + ImVec2(canvas_p0.x + x, canvas_p1.y), + IM_COL32(200, 200, 200, 40)); + for (float y = fmodf(scrolling.y, GRID_STEP); y < canvas_sz.y; + y += GRID_STEP) + draw_list->AddLine(ImVec2(canvas_p0.x, canvas_p0.y + y), + ImVec2(canvas_p1.x, canvas_p0.y + y), + IM_COL32(200, 200, 200, 40)); + } + + if (current_scene_.imagesCache.size() != 0) { + for (const auto &[key, value] : current_scene_.imagesCache) { + const float GRID_STEP = 8.0f; + float x = fmodf(scrolling.x, GRID_STEP); + float y = fmodf(scrolling.y, GRID_STEP); + draw_list->AddImage((void *)(SDL_Surface *)value, + ImVec2(canvas_p0.x + x, canvas_p0.y), + ImVec2(canvas_p0.x + x, canvas_p1.y)); + x += GRID_STEP; + if (x == 128) { + x = 0; + y += GRID_STEP; + } + } + } + + draw_list->PopClipRect(); + + ImGui::EndTable(); + } + ImGui::EndTabItem(); + } +} + +void Editor::DrawOverworldEditor() { + if (ImGui::BeginTabItem("Overworld")) { + overworld_editor_.Update(); + ImGui::EndTabItem(); + } +} + +void Editor::DrawDungeonEditor() { + if (ImGui::BeginTabItem("Dungeon")) { + if (ImGui::BeginTable("DWToolset", 9, toolset_table_flags_, ImVec2(0, 0))) { + ImGui::TableSetupColumn("#undoTool"); + ImGui::TableSetupColumn("#redoTool"); + ImGui::TableSetupColumn("#history"); + ImGui::TableSetupColumn("#separator"); + ImGui::TableSetupColumn("#bg1Tool"); + ImGui::TableSetupColumn("#bg2Tool"); + ImGui::TableSetupColumn("#bg3Tool"); + ImGui::TableSetupColumn("#itemTool"); + ImGui::TableSetupColumn("#spriteTool"); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_UNDO); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_REDO); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_MANAGE_HISTORY); + + ImGui::TableNextColumn(); + ImGui::Text(ICON_MD_MORE_VERT); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_FILTER_1); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_FILTER_2); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_FILTER_3); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_GRASS); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_PEST_CONTROL_RODENT); + ImGui::EndTable(); + } + ImGui::EndTabItem(); + } +} + +void Editor::DrawGraphicsEditor() { + if (ImGui::BeginTabItem("Graphics")) { + ImGui::EndTabItem(); + } +} + +void Editor::DrawSpriteEditor() { + if (ImGui::BeginTabItem("Sprites")) { + ImGui::EndTabItem(); + } +} + +void Editor::DrawScreenEditor() { + if (ImGui::BeginTabItem("Screens")) { + ImGui::EndTabItem(); + } +} + +} // namespace Editor +} // namespace application +} // namespace yaze \ No newline at end of file diff --git a/src/application/Editor/editor.h b/src/application/Editor/editor.h new file mode 100644 index 00000000..d39026dd --- /dev/null +++ b/src/application/Editor/editor.h @@ -0,0 +1,71 @@ +#ifndef YAZE_APPLICATION_VIEW_EDITOR_H +#define YAZE_APPLICATION_VIEW_EDITOR_H + +#include +#include +#include +#include +#include + +#include "Core/constants.h" +#include "Core/input.h" +#include "Data/rom.h" +#include "Editor/overworld_editor.h" +#include "Graphics/icons.h" +#include "Graphics/tile.h" + +namespace yaze { +namespace application { +namespace Editor { + +class Editor { + public: + Editor(); + void SetupScreen(std::shared_ptr renderer); + void UpdateScreen(); + + private: + void DrawYazeMenu(); + void DrawFileMenu() const; + void DrawEditMenu() const; + void DrawViewMenu(); + void DrawHelpMenu() const; + + void DrawSurface(); + void DrawProjectEditor(); + void DrawOverworldEditor(); + void DrawDungeonEditor(); + void DrawGraphicsEditor(); + void DrawSpriteEditor(); + void DrawScreenEditor(); + + void *rom_data_; + bool is_loaded_ = true; + + std::vector tiles_; + std::vector> arranged_tiles_; + std::unordered_map> texture_cache_; + std::unordered_map imagesCache; + std::shared_ptr sdl_renderer_; + + Data::ROM rom_; + TextEditor asm_editor_; + TextEditor::LanguageDefinition language_65816_; + OverworldEditor overworld_editor_; + + Graphics::Scene current_scene_; + Graphics::SNESPalette current_palette_; + Graphics::TilePreset current_set_; + + ImGuiWindowFlags main_editor_flags_ = + ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | + ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoScrollbar | + ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoTitleBar; + ImGuiTableFlags toolset_table_flags_ = ImGuiTableFlags_SizingFixedFit; +}; + +} // namespace Editor +} // namespace application +} // namespace yaze + +#endif // YAZE_APPLICATION_VIEW_EDITOR_H \ No newline at end of file diff --git a/src/application/Editor/overworld_editor.cc b/src/application/Editor/overworld_editor.cc new file mode 100644 index 00000000..5c325614 --- /dev/null +++ b/src/application/Editor/overworld_editor.cc @@ -0,0 +1,290 @@ +#include "overworld_editor.h" + +#include + +#include + +#include "Graphics/bitmap.h" +#include "Graphics/icons.h" +#include "Graphics/tile.h" + +// first step would be to decompress all graphics data from the game +// (in alttp that's easy they're all located in the same location all the +// same sheet size 128x32) have a code that convert PC address to SNES and +// vice-versa + +// 1) find the gfx pointers (you could use ZS constant file) +// 2) decompress all the gfx with your lz2 decompressor +// 3) convert the 3bpp snes data into PC 4bpp (probably the hardest part) +// 4) get the tiles32 data +// 5) get the tiles16 data +// 6) get the map32 data (they must be decompressed as well with a lz2 +// variant not the same as gfx compression but pretty similar) 7) get the +// gfx data of the map yeah i forgot that one and load 4bpp in a pseudo vram +// and use that to render tiles on screen 8) try to render the tiles on the +// bitmap in black & white to start 9) get the palettes data and try to find +// how they're loaded in the game that's a big puzzle to solve then 9 you'll +// have an overworld map viewer, in less than few hours if are able to +// understand the data quickly +namespace yaze { +namespace application { +namespace Editor { +void OverworldEditor::Update() { + if (rom_.isLoaded()) { + if (!doneLoaded) { + // overworld.Load(rom_); + doneLoaded = true; + } + } + + if (show_changelist_) { + DrawChangelist(); + } + + DrawToolset(); + ImGui::Separator(); + if (ImGui::BeginTable("#owEditTable", 2, ow_edit_flags, ImVec2(0, 0))) { + ImGui::TableSetupColumn("#overworldCanvas"); + ImGui::TableSetupColumn("#tileSelector"); + ImGui::TableNextColumn(); + DrawOverworldCanvas(); + ImGui::TableNextColumn(); + DrawTileSelector(); + ImGui::EndTable(); + } +} + +void OverworldEditor::DrawToolset() { + if (ImGui::BeginTable("Toolset", 14, toolset_table_flags, ImVec2(0, 0))) { + ImGui::TableSetupColumn("#undoTool"); + ImGui::TableSetupColumn("#redoTool"); + ImGui::TableSetupColumn("#drawTool"); + ImGui::TableSetupColumn("#separator2"); + ImGui::TableSetupColumn("#zoomOutTool"); + ImGui::TableSetupColumn("#zoomInTool"); + ImGui::TableSetupColumn("#separator"); + ImGui::TableSetupColumn("#history"); + ImGui::TableSetupColumn("#entranceTool"); + ImGui::TableSetupColumn("#exitTool"); + ImGui::TableSetupColumn("#itemTool"); + ImGui::TableSetupColumn("#spriteTool"); + ImGui::TableSetupColumn("#transportTool"); + ImGui::TableSetupColumn("#musicTool"); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_UNDO); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_REDO); + + ImGui::TableNextColumn(); + if (ImGui::Button(ICON_MD_MANAGE_HISTORY)) { + if (!show_changelist_) + show_changelist_ = true; + else + show_changelist_ = false; + } + + ImGui::TableNextColumn(); + ImGui::Text(ICON_MD_MORE_VERT); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_ZOOM_OUT); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_ZOOM_IN); + + ImGui::TableNextColumn(); + ImGui::Text(ICON_MD_MORE_VERT); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_DRAW); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_DOOR_FRONT); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_DOOR_BACK); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_GRASS); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_PEST_CONTROL_RODENT); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_ADD_LOCATION); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_MUSIC_NOTE); + + ImGui::EndTable(); + } +} + +void OverworldEditor::DrawOverworldMapSettings() { + if (ImGui::BeginTable("#mapSettings", 7, ow_map_settings_flags, ImVec2(0, 0), + -1)) { + ImGui::TableSetupColumn("##1stCol"); + ImGui::TableSetupColumn("##gfxCol"); + ImGui::TableSetupColumn("##palCol"); + ImGui::TableSetupColumn("##sprgfxCol"); + ImGui::TableSetupColumn("##sprpalCol"); + ImGui::TableSetupColumn("##msgidCol"); + ImGui::TableSetupColumn("##2ndCol"); + + ImGui::TableNextColumn(); + ImGui::SetNextItemWidth(100.f); + ImGui::Combo("##world", ¤t_world_, + "Light World\0Dark World\0Extra World\0"); + + ImGui::TableNextColumn(); + ImGui::Text("GFX"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(kInputFieldSize); + ImGui::InputText("##mapGFX", map_gfx_, kByteSize); + + ImGui::TableNextColumn(); + ImGui::Text("Palette"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(kInputFieldSize); + ImGui::InputText("##mapPal", map_palette_, kByteSize); + + ImGui::TableNextColumn(); + ImGui::Text("Spr GFX"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(kInputFieldSize); + ImGui::InputText("##sprGFX", spr_gfx_, kByteSize); + + ImGui::TableNextColumn(); + ImGui::Text("Spr Palette"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(kInputFieldSize); + ImGui::InputText("##sprPal", spr_palette_, kByteSize); + + ImGui::TableNextColumn(); + ImGui::Text("Msg ID"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(50.f); + ImGui::InputText("##msgid", spr_palette_, kMessageIdSize); + + ImGui::TableNextColumn(); + ImGui::Checkbox("Show grid", &opt_enable_grid); + ImGui::EndTable(); + } +} + +void OverworldEditor::DrawOverworldCanvas() { + DrawOverworldMapSettings(); + ImGui::Separator(); + static ImVector points; + static ImVec2 scrolling(0.0f, 0.0f); + static bool opt_enable_context_menu = true; + static bool adding_line = false; + ImVec2 canvas_p0 = ImGui::GetCursorScreenPos(); + ImVec2 canvas_sz = ImGui::GetContentRegionAvail(); + ImVec2 canvas_p1 = + ImVec2(canvas_p0.x + canvas_sz.x, canvas_p0.y + canvas_sz.y); + + // Draw border and background color + const ImGuiIO &io = ImGui::GetIO(); + ImDrawList *draw_list = ImGui::GetWindowDrawList(); + draw_list->AddRectFilled(canvas_p0, canvas_p1, IM_COL32(32, 32, 32, 255)); + draw_list->AddRect(canvas_p0, canvas_p1, IM_COL32(255, 255, 255, 255)); + + // This will catch our interactions + ImGui::InvisibleButton( + "canvas", canvas_sz, + ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight); + const bool is_hovered = ImGui::IsItemHovered(); // Hovered + const bool is_active = ImGui::IsItemActive(); // Held + const ImVec2 origin(canvas_p0.x + scrolling.x, + canvas_p0.y + scrolling.y); // Lock scrolled origin + const ImVec2 mouse_pos_in_canvas(io.MousePos.x - origin.x, + io.MousePos.y - origin.y); + + // Add first and second point + if (is_hovered && !adding_line && + ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { + points.push_back(mouse_pos_in_canvas); + points.push_back(mouse_pos_in_canvas); + adding_line = true; + } + if (adding_line) { + points.back() = mouse_pos_in_canvas; + if (!ImGui::IsMouseDown(ImGuiMouseButton_Left)) adding_line = false; + } + + // Pan (we use a zero mouse threshold when there's no context menu) + const float mouse_threshold_for_pan = opt_enable_context_menu ? -1.0f : 0.0f; + if (is_active && + ImGui::IsMouseDragging(ImGuiMouseButton_Right, mouse_threshold_for_pan)) { + scrolling.x += io.MouseDelta.x; + scrolling.y += io.MouseDelta.y; + } + + // Context menu (under default mouse threshold) + ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right); + if (opt_enable_context_menu && drag_delta.x == 0.0f && drag_delta.y == 0.0f) + ImGui::OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + if (ImGui::BeginPopup("context")) { + if (adding_line) points.resize(points.size() - 2); + adding_line = false; + if (ImGui::MenuItem("Remove one", NULL, false, points.Size > 0)) { + points.resize(points.size() - 2); + } + if (ImGui::MenuItem("Remove all", NULL, false, points.Size > 0)) { + points.clear(); + } + ImGui::EndPopup(); + } + + // Draw grid + all lines in the canvas + draw_list->PushClipRect(canvas_p0, canvas_p1, true); + if (opt_enable_grid) { + const float GRID_STEP = 64.0f; + for (float x = fmodf(scrolling.x, GRID_STEP); x < canvas_sz.x; + x += GRID_STEP) + draw_list->AddLine(ImVec2(canvas_p0.x + x, canvas_p0.y), + ImVec2(canvas_p0.x + x, canvas_p1.y), + IM_COL32(200, 200, 200, 40)); + for (float y = fmodf(scrolling.y, GRID_STEP); y < canvas_sz.y; + y += GRID_STEP) + draw_list->AddLine(ImVec2(canvas_p0.x, canvas_p0.y + y), + ImVec2(canvas_p1.x, canvas_p0.y + y), + IM_COL32(200, 200, 200, 40)); + } + + for (int n = 0; n < points.Size; n += 2) + draw_list->AddLine( + ImVec2(origin.x + points[n].x, origin.y + points[n].y), + ImVec2(origin.x + points[n + 1].x, origin.y + points[n + 1].y), + IM_COL32(255, 255, 0, 255), 2.0f); + + draw_list->PopClipRect(); +} +void OverworldEditor::DrawTileSelector() { + if (ImGui::BeginTabBar("##TabBar", ImGuiTabBarFlags_FittingPolicyScroll)) { + if (ImGui::BeginTabItem("Tile8")) { + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Tile16")) { + ImGui::EndTabItem(); + } + + ImGui::EndTabBar(); + } +} + +void OverworldEditor::DrawChangelist() { + if (!ImGui::Begin("Changelist")) { + ImGui::End(); + } + + ImGui::Text("Test"); + ImGui::End(); +} + +} // namespace Editor +} // namespace application +} // namespace yaze \ No newline at end of file diff --git a/src/application/Editor/overworld_editor.h b/src/application/Editor/overworld_editor.h new file mode 100644 index 00000000..2f81283d --- /dev/null +++ b/src/application/Editor/overworld_editor.h @@ -0,0 +1,76 @@ +#ifndef YAZE_APPLICATION_EDITOR_OVERWORLDEDITOR_H +#define YAZE_APPLICATION_EDITOR_OVERWORLDEDITOR_H + +#include + +#include "Data/OW/overworld.h" +#include "Graphics/icons.h" +#include "Graphics/palette.h" +#include "Graphics/scene.h" +#include "Graphics/tile.h" + +namespace yaze { +namespace application { +namespace Editor { + +static constexpr unsigned int k4BPP = 4; + +class OverworldEditor { + public: + void Update(); + + void SetRom(Data::ROM &rom) { rom_ = rom; } + + private: + void DrawToolset(); + void DrawOverworldMapSettings(); + void DrawOverworldCanvas(); + void DrawTileSelector(); + + void DrawChangelist(); + + bool show_changelist_ = false; + + Data::ROM rom_; + Data::Overworld overworld; + Graphics::Scene current_scene_; + Graphics::Bitmap allgfxBitmap; + Graphics::SNESPalette palette_; + Graphics::TilePreset current_set_; + + SDL_Texture *gfx_texture = nullptr; + + int allgfx_width = 0; + int allgfx_height = 0; + + uchar *allGfx16Ptr = new uchar[(128 * 7136) / 2]; + + ImGuiTableFlags toolset_table_flags = ImGuiTableFlags_SizingFixedFit; + ImGuiTableFlags ow_map_settings_flags = ImGuiTableFlags_Borders; + ImGuiTableFlags ow_edit_flags = ImGuiTableFlags_Reorderable | + ImGuiTableFlags_Resizable | + ImGuiTableFlags_SizingStretchSame; + + float canvas_table_ratio = 30.f; + + char map_gfx_[3] = ""; + char map_palette_[3] = ""; + char spr_gfx_[3] = ""; + char spr_palette_[3] = ""; + char message_id_[5] = ""; + + int current_world_ = 0; + + bool isLoaded = false; + bool doneLoaded = false; + + constexpr static int kByteSize = 3; + constexpr static int kMessageIdSize = 5; + constexpr static float kInputFieldSize = 30.f; + bool opt_enable_grid = true; +}; +} // namespace Editor +} // namespace application +} // namespace yaze + +#endif \ No newline at end of file diff --git a/src/application/Editor/tile_editor.cc b/src/application/Editor/tile_editor.cc new file mode 100644 index 00000000..c698ea4f --- /dev/null +++ b/src/application/Editor/tile_editor.cc @@ -0,0 +1,10 @@ +#include "tile_editor.h" + +namespace yaze { +namespace application { +namespace Editor { + +void TileEditor::UpdateScreen() {} +} // namespace Editor +} // namespace application +} // namespace yaze \ No newline at end of file diff --git a/src/application/Editor/tile_editor.h b/src/application/Editor/tile_editor.h new file mode 100644 index 00000000..be4ada46 --- /dev/null +++ b/src/application/Editor/tile_editor.h @@ -0,0 +1,15 @@ +#ifndef YAZE_APPLICATION_EDITOR_TILEEDITOR_H +#define YAZE_APPLICATION_EDITOR_TILEEDITOR_H + +namespace yaze { +namespace application { +namespace Editor { +class TileEditor { + public: + void UpdateScreen(); +}; +} // namespace Editor +} // namespace application +} // namespace yaze + +#endif \ No newline at end of file diff --git a/src/application/Graphics/bitmap.cc b/src/application/Graphics/bitmap.cc new file mode 100644 index 00000000..f9787e9e --- /dev/null +++ b/src/application/Graphics/bitmap.cc @@ -0,0 +1,178 @@ +#include "bitmap.h" + +#include + +#include "Data/rom.h" + +namespace yaze { +namespace application { +namespace Graphics { + +int GetPCGfxAddress(char *romData, char id) { + char **info1 = new char *[255]; + int gfxPointer1 = + lorom_snes_to_pc((romData[Core::Constants::gfx_1_pointer + 1] << 8) + + (romData[Core::Constants::gfx_1_pointer]), + info1); + int gfxPointer2 = + lorom_snes_to_pc((romData[Core::Constants::gfx_2_pointer + 1] << 8) + + (romData[Core::Constants::gfx_2_pointer]), + info1); + int gfxPointer3 = + lorom_snes_to_pc((romData[Core::Constants::gfx_3_pointer + 1] << 8) + + (romData[Core::Constants::gfx_3_pointer]), + info1); + + char gfxGamePointer1 = romData[gfxPointer1 + id]; + char gfxGamePointer2 = romData[gfxPointer2 + id]; + char gfxGamePointer3 = romData[gfxPointer3 + id]; + + return lorom_snes_to_pc( + Data::AddressFromBytes(gfxGamePointer1, gfxGamePointer2, gfxGamePointer3), + info1); +} + +char *CreateAllGfxDataRaw(char *romData) { + // 0-112 -> compressed 3bpp bgr -> (decompressed each) 0x600 chars + // 113-114 -> compressed 2bpp -> (decompressed each) 0x800 chars + // 115-126 -> uncompressed 3bpp sprites -> (each) 0x600 chars + // 127-217 -> compressed 3bpp sprites -> (decompressed each) 0x600 chars + // 218-222 -> compressed 2bpp -> (decompressed each) 0x800 chars + + char *buffer = new char[346624]; + int bufferPos = 0; + char *data = new char[2048]; + unsigned int uncompressedSize = 0; + unsigned int compressedSize = 0; + + for (int i = 0; i < Core::Constants::NumberOfSheets; i++) { + isbpp3[i] = ((i >= 0 && i <= 112) || // Compressed 3bpp bg + (i >= 115 && i <= 126) || // Uncompressed 3bpp sprites + (i >= 127 && i <= 217) // Compressed 3bpp sprites + ); + + // uncompressed sheets + if (i >= 115 && i <= 126) { + data = new char[Core::Constants::Uncompressed3BPPSize]; + int startAddress = GetPCGfxAddress(romData, (char)i); + for (int j = 0; j < Core::Constants::Uncompressed3BPPSize; j++) { + data[j] = romData[j + startAddress]; + } + } else { + data = alttp_decompress_gfx((char *)romData, + GetPCGfxAddress(romData, (char)i), + Core::Constants::UncompressedSheetSize, + &uncompressedSize, &compressedSize); + } + + for (int j = 0; j < sizeof(data); j++) { + buffer[j + bufferPos] = data[j]; + } + + bufferPos += sizeof(data); + } + + return buffer; +} + +void CreateAllGfxData(char *romData, char *allgfx16Ptr) { + char *data = CreateAllGfxDataRaw(romData); + char *newData = new char[0x6F800]; + uchar *mask = new uchar[]{0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; + int sheetPosition = 0; + + // 8x8 tile + for (int s = 0; s < Core::Constants::NumberOfSheets; s++) // Per Sheet + { + for (int j = 0; j < 4; j++) // Per Tile Line Y + { + for (int i = 0; i < 16; i++) // Per Tile Line X + { + for (int y = 0; y < 8; y++) // Per Pixel Line + { + if (isbpp3[s]) { + char lineBits0 = + data[(y * 2) + (i * 24) + (j * 384) + sheetPosition]; + char lineBits1 = + data[(y * 2) + (i * 24) + (j * 384) + 1 + sheetPosition]; + char lineBits2 = + data[(y) + (i * 24) + (j * 384) + 16 + sheetPosition]; + + for (int x = 0; x < 4; x++) // Per Pixel X + { + char pixdata = 0; + char pixdata2 = 0; + + if ((lineBits0 & mask[(x * 2)]) == mask[(x * 2)]) { + pixdata += 1; + } + if ((lineBits1 & mask[(x * 2)]) == mask[(x * 2)]) { + pixdata += 2; + } + if ((lineBits2 & mask[(x * 2)]) == mask[(x * 2)]) { + pixdata += 4; + } + + if ((lineBits0 & mask[(x * 2) + 1]) == mask[(x * 2) + 1]) { + pixdata2 += 1; + } + if ((lineBits1 & mask[(x * 2) + 1]) == mask[(x * 2) + 1]) { + pixdata2 += 2; + } + if ((lineBits2 & mask[(x * 2) + 1]) == mask[(x * 2) + 1]) { + pixdata2 += 4; + } + + newData[(y * 64) + (x) + (i * 4) + (j * 512) + (s * 2048)] = + (char)((pixdata << 4) | pixdata2); + } + } else { + char lineBits0 = + data[(y * 2) + (i * 16) + (j * 256) + sheetPosition]; + char lineBits1 = + data[(y * 2) + (i * 16) + (j * 256) + 1 + sheetPosition]; + + for (int x = 0; x < 4; x++) // Per Pixel X + { + char pixdata = 0; + char pixdata2 = 0; + + if ((lineBits0 & mask[(x * 2)]) == mask[(x * 2)]) { + pixdata += 1; + } + if ((lineBits1 & mask[(x * 2)]) == mask[(x * 2)]) { + pixdata += 2; + } + + if ((lineBits0 & mask[(x * 2) + 1]) == mask[(x * 2) + 1]) { + pixdata2 += 1; + } + if ((lineBits1 & mask[(x * 2) + 1]) == mask[(x * 2) + 1]) { + pixdata2 += 2; + } + + newData[(y * 64) + (x) + (i * 4) + (j * 512) + (s * 2048)] = + (char)((pixdata << 4) | pixdata2); + } + } + } + } + } + + if (isbpp3[s]) { + sheetPosition += Core::Constants::Uncompressed3BPPSize; + } else { + sheetPosition += Core::Constants::UncompressedSheetSize; + } + } + + char *allgfx16Data = (char *)allgfx16Ptr; + + for (int i = 0; i < 0x6F800; i++) { + allgfx16Data[i] = newData[i]; + } +} + +} // namespace Graphics +} // namespace application +} // namespace yaze diff --git a/src/application/Graphics/bitmap.h b/src/application/Graphics/bitmap.h new file mode 100644 index 00000000..79cad488 --- /dev/null +++ b/src/application/Graphics/bitmap.h @@ -0,0 +1,37 @@ +#ifndef YAZE_APPLICATION_UTILS_BITMAP_H +#define YAZE_APPLICATION_UTILS_BITMAP_H + +#include + +#include "Core/constants.h" + +namespace yaze { +namespace application { +namespace Graphics { + +class Bitmap { + public: + Bitmap() = default; + Bitmap(int width, int height, char *data) + : width_(width), height_(height), pixel_data_(data) {} + + int GetWidth() const { return width_; } + int GetHeight() const { return height_; } + + private: + int width_; + int height_; + char *pixel_data_; +}; + +static bool isbpp3[Core::Constants::NumberOfSheets]; + +int GetPCGfxAddress(char *romData, char id); +char *CreateAllGfxDataRaw(char *romData); +void CreateAllGfxData(char *romData, char *allgfx16Ptr); + +} // namespace Graphics +} // namespace application +} // namespace yaze + +#endif \ No newline at end of file diff --git a/src/application/Graphics/icons.h b/src/application/Graphics/icons.h new file mode 100644 index 00000000..6aac5f1c --- /dev/null +++ b/src/application/Graphics/icons.h @@ -0,0 +1,2192 @@ +// Generated by https://github.com/juliettef/IconFontCppHeaders script GenerateIconFontCppHeaders.py for languages C and C++ +// from https://github.com/google/material-design-icons/raw/master/font/MaterialIcons-Regular.codepoints +// for use with https://github.com/google/material-design-icons/blob/master/font/MaterialIcons-Regular.ttf +#pragma once + +#define FONT_ICON_FILE_NAME_MD "assets/Fonts/MaterialIcons-Regular.ttf" + +#define ICON_MIN_MD 0xe000 +#define ICON_MAX_MD 0x10fffd +#define ICON_MD_10K "\xee\xa5\x91" // U+e951 +#define ICON_MD_10MP "\xee\xa5\x92" // U+e952 +#define ICON_MD_11MP "\xee\xa5\x93" // U+e953 +#define ICON_MD_123 "\xee\xae\x8d" // U+eb8d +#define ICON_MD_12MP "\xee\xa5\x94" // U+e954 +#define ICON_MD_13MP "\xee\xa5\x95" // U+e955 +#define ICON_MD_14MP "\xee\xa5\x96" // U+e956 +#define ICON_MD_15MP "\xee\xa5\x97" // U+e957 +#define ICON_MD_16MP "\xee\xa5\x98" // U+e958 +#define ICON_MD_17MP "\xee\xa5\x99" // U+e959 +#define ICON_MD_18_UP_RATING "\xef\xa3\xbd" // U+f8fd +#define ICON_MD_18MP "\xee\xa5\x9a" // U+e95a +#define ICON_MD_19MP "\xee\xa5\x9b" // U+e95b +#define ICON_MD_1K "\xee\xa5\x9c" // U+e95c +#define ICON_MD_1K_PLUS "\xee\xa5\x9d" // U+e95d +#define ICON_MD_1X_MOBILEDATA "\xee\xbf\x8d" // U+efcd +#define ICON_MD_20MP "\xee\xa5\x9e" // U+e95e +#define ICON_MD_21MP "\xee\xa5\x9f" // U+e95f +#define ICON_MD_22MP "\xee\xa5\xa0" // U+e960 +#define ICON_MD_23MP "\xee\xa5\xa1" // U+e961 +#define ICON_MD_24MP "\xee\xa5\xa2" // U+e962 +#define ICON_MD_2K "\xee\xa5\xa3" // U+e963 +#define ICON_MD_2K_PLUS "\xee\xa5\xa4" // U+e964 +#define ICON_MD_2MP "\xee\xa5\xa5" // U+e965 +#define ICON_MD_30FPS "\xee\xbf\x8e" // U+efce +#define ICON_MD_30FPS_SELECT "\xee\xbf\x8f" // U+efcf +#define ICON_MD_360 "\xee\x95\xb7" // U+e577 +#define ICON_MD_3D_ROTATION "\xee\xa1\x8d" // U+e84d +#define ICON_MD_3G_MOBILEDATA "\xee\xbf\x90" // U+efd0 +#define ICON_MD_3K "\xee\xa5\xa6" // U+e966 +#define ICON_MD_3K_PLUS "\xee\xa5\xa7" // U+e967 +#define ICON_MD_3MP "\xee\xa5\xa8" // U+e968 +#define ICON_MD_3P "\xee\xbf\x91" // U+efd1 +#define ICON_MD_4G_MOBILEDATA "\xee\xbf\x92" // U+efd2 +#define ICON_MD_4G_PLUS_MOBILEDATA "\xee\xbf\x93" // U+efd3 +#define ICON_MD_4K "\xee\x81\xb2" // U+e072 +#define ICON_MD_4K_PLUS "\xee\xa5\xa9" // U+e969 +#define ICON_MD_4MP "\xee\xa5\xaa" // U+e96a +#define ICON_MD_5G "\xee\xbc\xb8" // U+ef38 +#define ICON_MD_5K "\xee\xa5\xab" // U+e96b +#define ICON_MD_5K_PLUS "\xee\xa5\xac" // U+e96c +#define ICON_MD_5MP "\xee\xa5\xad" // U+e96d +#define ICON_MD_60FPS "\xee\xbf\x94" // U+efd4 +#define ICON_MD_60FPS_SELECT "\xee\xbf\x95" // U+efd5 +#define ICON_MD_6_FT_APART "\xef\x88\x9e" // U+f21e +#define ICON_MD_6K "\xee\xa5\xae" // U+e96e +#define ICON_MD_6K_PLUS "\xee\xa5\xaf" // U+e96f +#define ICON_MD_6MP "\xee\xa5\xb0" // U+e970 +#define ICON_MD_7K "\xee\xa5\xb1" // U+e971 +#define ICON_MD_7K_PLUS "\xee\xa5\xb2" // U+e972 +#define ICON_MD_7MP "\xee\xa5\xb3" // U+e973 +#define ICON_MD_8K "\xee\xa5\xb4" // U+e974 +#define ICON_MD_8K_PLUS "\xee\xa5\xb5" // U+e975 +#define ICON_MD_8MP "\xee\xa5\xb6" // U+e976 +#define ICON_MD_9K "\xee\xa5\xb7" // U+e977 +#define ICON_MD_9K_PLUS "\xee\xa5\xb8" // U+e978 +#define ICON_MD_9MP "\xee\xa5\xb9" // U+e979 +#define ICON_MD_ABC "\xee\xae\x94" // U+eb94 +#define ICON_MD_AC_UNIT "\xee\xac\xbb" // U+eb3b +#define ICON_MD_ACCESS_ALARM "\xee\x86\x90" // U+e190 +#define ICON_MD_ACCESS_ALARMS "\xee\x86\x91" // U+e191 +#define ICON_MD_ACCESS_TIME "\xee\x86\x92" // U+e192 +#define ICON_MD_ACCESS_TIME_FILLED "\xee\xbf\x96" // U+efd6 +#define ICON_MD_ACCESSIBILITY "\xee\xa1\x8e" // U+e84e +#define ICON_MD_ACCESSIBILITY_NEW "\xee\xa4\xac" // U+e92c +#define ICON_MD_ACCESSIBLE "\xee\xa4\x94" // U+e914 +#define ICON_MD_ACCESSIBLE_FORWARD "\xee\xa4\xb4" // U+e934 +#define ICON_MD_ACCOUNT_BALANCE "\xee\xa1\x8f" // U+e84f +#define ICON_MD_ACCOUNT_BALANCE_WALLET "\xee\xa1\x90" // U+e850 +#define ICON_MD_ACCOUNT_BOX "\xee\xa1\x91" // U+e851 +#define ICON_MD_ACCOUNT_CIRCLE "\xee\xa1\x93" // U+e853 +#define ICON_MD_ACCOUNT_TREE "\xee\xa5\xba" // U+e97a +#define ICON_MD_AD_UNITS "\xee\xbc\xb9" // U+ef39 +#define ICON_MD_ADB "\xee\x98\x8e" // U+e60e +#define ICON_MD_ADD "\xee\x85\x85" // U+e145 +#define ICON_MD_ADD_A_PHOTO "\xee\x90\xb9" // U+e439 +#define ICON_MD_ADD_ALARM "\xee\x86\x93" // U+e193 +#define ICON_MD_ADD_ALERT "\xee\x80\x83" // U+e003 +#define ICON_MD_ADD_BOX "\xee\x85\x86" // U+e146 +#define ICON_MD_ADD_BUSINESS "\xee\x9c\xa9" // U+e729 +#define ICON_MD_ADD_CALL "\xee\x83\xa8" // U+e0e8 +#define ICON_MD_ADD_CARD "\xee\xae\x86" // U+eb86 +#define ICON_MD_ADD_CHART "\xee\xa5\xbb" // U+e97b +#define ICON_MD_ADD_CIRCLE "\xee\x85\x87" // U+e147 +#define ICON_MD_ADD_CIRCLE_OUTLINE "\xee\x85\x88" // U+e148 +#define ICON_MD_ADD_COMMENT "\xee\x89\xa6" // U+e266 +#define ICON_MD_ADD_IC_CALL "\xee\xa5\xbc" // U+e97c +#define ICON_MD_ADD_LINK "\xee\x85\xb8" // U+e178 +#define ICON_MD_ADD_LOCATION "\xee\x95\xa7" // U+e567 +#define ICON_MD_ADD_LOCATION_ALT "\xee\xbc\xba" // U+ef3a +#define ICON_MD_ADD_MODERATOR "\xee\xa5\xbd" // U+e97d +#define ICON_MD_ADD_PHOTO_ALTERNATE "\xee\x90\xbe" // U+e43e +#define ICON_MD_ADD_REACTION "\xee\x87\x93" // U+e1d3 +#define ICON_MD_ADD_ROAD "\xee\xbc\xbb" // U+ef3b +#define ICON_MD_ADD_SHOPPING_CART "\xee\xa1\x94" // U+e854 +#define ICON_MD_ADD_TASK "\xef\x88\xba" // U+f23a +#define ICON_MD_ADD_TO_DRIVE "\xee\x99\x9c" // U+e65c +#define ICON_MD_ADD_TO_HOME_SCREEN "\xee\x87\xbe" // U+e1fe +#define ICON_MD_ADD_TO_PHOTOS "\xee\x8e\x9d" // U+e39d +#define ICON_MD_ADD_TO_QUEUE "\xee\x81\x9c" // U+e05c +#define ICON_MD_ADDCHART "\xee\xbc\xbc" // U+ef3c +#define ICON_MD_ADF_SCANNER "\xee\xab\x9a" // U+eada +#define ICON_MD_ADJUST "\xee\x8e\x9e" // U+e39e +#define ICON_MD_ADMIN_PANEL_SETTINGS "\xee\xbc\xbd" // U+ef3d +#define ICON_MD_ADOBE "\xee\xaa\x96" // U+ea96 +#define ICON_MD_ADS_CLICK "\xee\x9d\xa2" // U+e762 +#define ICON_MD_AGRICULTURE "\xee\xa9\xb9" // U+ea79 +#define ICON_MD_AIR "\xee\xbf\x98" // U+efd8 +#define ICON_MD_AIRLINE_SEAT_FLAT "\xee\x98\xb0" // U+e630 +#define ICON_MD_AIRLINE_SEAT_FLAT_ANGLED "\xee\x98\xb1" // U+e631 +#define ICON_MD_AIRLINE_SEAT_INDIVIDUAL_SUITE "\xee\x98\xb2" // U+e632 +#define ICON_MD_AIRLINE_SEAT_LEGROOM_EXTRA "\xee\x98\xb3" // U+e633 +#define ICON_MD_AIRLINE_SEAT_LEGROOM_NORMAL "\xee\x98\xb4" // U+e634 +#define ICON_MD_AIRLINE_SEAT_LEGROOM_REDUCED "\xee\x98\xb5" // U+e635 +#define ICON_MD_AIRLINE_SEAT_RECLINE_EXTRA "\xee\x98\xb6" // U+e636 +#define ICON_MD_AIRLINE_SEAT_RECLINE_NORMAL "\xee\x98\xb7" // U+e637 +#define ICON_MD_AIRLINE_STOPS "\xee\x9f\x90" // U+e7d0 +#define ICON_MD_AIRLINES "\xee\x9f\x8a" // U+e7ca +#define ICON_MD_AIRPLANE_TICKET "\xee\xbf\x99" // U+efd9 +#define ICON_MD_AIRPLANEMODE_ACTIVE "\xee\x86\x95" // U+e195 +#define ICON_MD_AIRPLANEMODE_INACTIVE "\xee\x86\x94" // U+e194 +#define ICON_MD_AIRPLANEMODE_OFF "\xee\x86\x94" // U+e194 +#define ICON_MD_AIRPLANEMODE_ON "\xee\x86\x95" // U+e195 +#define ICON_MD_AIRPLAY "\xee\x81\x95" // U+e055 +#define ICON_MD_AIRPORT_SHUTTLE "\xee\xac\xbc" // U+eb3c +#define ICON_MD_ALARM "\xee\xa1\x95" // U+e855 +#define ICON_MD_ALARM_ADD "\xee\xa1\x96" // U+e856 +#define ICON_MD_ALARM_OFF "\xee\xa1\x97" // U+e857 +#define ICON_MD_ALARM_ON "\xee\xa1\x98" // U+e858 +#define ICON_MD_ALBUM "\xee\x80\x99" // U+e019 +#define ICON_MD_ALIGN_HORIZONTAL_CENTER "\xee\x80\x8f" // U+e00f +#define ICON_MD_ALIGN_HORIZONTAL_LEFT "\xee\x80\x8d" // U+e00d +#define ICON_MD_ALIGN_HORIZONTAL_RIGHT "\xee\x80\x90" // U+e010 +#define ICON_MD_ALIGN_VERTICAL_BOTTOM "\xee\x80\x95" // U+e015 +#define ICON_MD_ALIGN_VERTICAL_CENTER "\xee\x80\x91" // U+e011 +#define ICON_MD_ALIGN_VERTICAL_TOP "\xee\x80\x8c" // U+e00c +#define ICON_MD_ALL_INBOX "\xee\xa5\xbf" // U+e97f +#define ICON_MD_ALL_INCLUSIVE "\xee\xac\xbd" // U+eb3d +#define ICON_MD_ALL_OUT "\xee\xa4\x8b" // U+e90b +#define ICON_MD_ALT_ROUTE "\xef\x86\x84" // U+f184 +#define ICON_MD_ALTERNATE_EMAIL "\xee\x83\xa6" // U+e0e6 +#define ICON_MD_AMP_STORIES "\xee\xa8\x93" // U+ea13 +#define ICON_MD_ANALYTICS "\xee\xbc\xbe" // U+ef3e +#define ICON_MD_ANCHOR "\xef\x87\x8d" // U+f1cd +#define ICON_MD_ANDROID "\xee\xa1\x99" // U+e859 +#define ICON_MD_ANIMATION "\xee\x9c\x9c" // U+e71c +#define ICON_MD_ANNOUNCEMENT "\xee\xa1\x9a" // U+e85a +#define ICON_MD_AOD "\xee\xbf\x9a" // U+efda +#define ICON_MD_APARTMENT "\xee\xa9\x80" // U+ea40 +#define ICON_MD_API "\xef\x86\xb7" // U+f1b7 +#define ICON_MD_APP_BLOCKING "\xee\xbc\xbf" // U+ef3f +#define ICON_MD_APP_REGISTRATION "\xee\xbd\x80" // U+ef40 +#define ICON_MD_APP_SETTINGS_ALT "\xee\xbd\x81" // U+ef41 +#define ICON_MD_APP_SHORTCUT "\xee\xab\xa4" // U+eae4 +#define ICON_MD_APPLE "\xee\xaa\x80" // U+ea80 +#define ICON_MD_APPROVAL "\xee\xa6\x82" // U+e982 +#define ICON_MD_APPS "\xee\x97\x83" // U+e5c3 +#define ICON_MD_APPS_OUTAGE "\xee\x9f\x8c" // U+e7cc +#define ICON_MD_ARCHITECTURE "\xee\xa8\xbb" // U+ea3b +#define ICON_MD_ARCHIVE "\xee\x85\x89" // U+e149 +#define ICON_MD_AREA_CHART "\xee\x9d\xb0" // U+e770 +#define ICON_MD_ARROW_BACK "\xee\x97\x84" // U+e5c4 +#define ICON_MD_ARROW_BACK_IOS "\xee\x97\xa0" // U+e5e0 +#define ICON_MD_ARROW_BACK_IOS_NEW "\xee\x8b\xaa" // U+e2ea +#define ICON_MD_ARROW_CIRCLE_DOWN "\xef\x86\x81" // U+f181 +#define ICON_MD_ARROW_CIRCLE_LEFT "\xee\xaa\xa7" // U+eaa7 +#define ICON_MD_ARROW_CIRCLE_RIGHT "\xee\xaa\xaa" // U+eaaa +#define ICON_MD_ARROW_CIRCLE_UP "\xef\x86\x82" // U+f182 +#define ICON_MD_ARROW_DOWNWARD "\xee\x97\x9b" // U+e5db +#define ICON_MD_ARROW_DROP_DOWN "\xee\x97\x85" // U+e5c5 +#define ICON_MD_ARROW_DROP_DOWN_CIRCLE "\xee\x97\x86" // U+e5c6 +#define ICON_MD_ARROW_DROP_UP "\xee\x97\x87" // U+e5c7 +#define ICON_MD_ARROW_FORWARD "\xee\x97\x88" // U+e5c8 +#define ICON_MD_ARROW_FORWARD_IOS "\xee\x97\xa1" // U+e5e1 +#define ICON_MD_ARROW_LEFT "\xee\x97\x9e" // U+e5de +#define ICON_MD_ARROW_RIGHT "\xee\x97\x9f" // U+e5df +#define ICON_MD_ARROW_RIGHT_ALT "\xee\xa5\x81" // U+e941 +#define ICON_MD_ARROW_UPWARD "\xee\x97\x98" // U+e5d8 +#define ICON_MD_ART_TRACK "\xee\x81\xa0" // U+e060 +#define ICON_MD_ARTICLE "\xee\xbd\x82" // U+ef42 +#define ICON_MD_ASPECT_RATIO "\xee\xa1\x9b" // U+e85b +#define ICON_MD_ASSESSMENT "\xee\xa1\x9c" // U+e85c +#define ICON_MD_ASSIGNMENT "\xee\xa1\x9d" // U+e85d +#define ICON_MD_ASSIGNMENT_IND "\xee\xa1\x9e" // U+e85e +#define ICON_MD_ASSIGNMENT_LATE "\xee\xa1\x9f" // U+e85f +#define ICON_MD_ASSIGNMENT_RETURN "\xee\xa1\xa0" // U+e860 +#define ICON_MD_ASSIGNMENT_RETURNED "\xee\xa1\xa1" // U+e861 +#define ICON_MD_ASSIGNMENT_TURNED_IN "\xee\xa1\xa2" // U+e862 +#define ICON_MD_ASSISTANT "\xee\x8e\x9f" // U+e39f +#define ICON_MD_ASSISTANT_DIRECTION "\xee\xa6\x88" // U+e988 +#define ICON_MD_ASSISTANT_NAVIGATION "\xee\xa6\x89" // U+e989 +#define ICON_MD_ASSISTANT_PHOTO "\xee\x8e\xa0" // U+e3a0 +#define ICON_MD_ASSURED_WORKLOAD "\xee\xad\xaf" // U+eb6f +#define ICON_MD_ATM "\xee\x95\xb3" // U+e573 +#define ICON_MD_ATTACH_EMAIL "\xee\xa9\x9e" // U+ea5e +#define ICON_MD_ATTACH_FILE "\xee\x88\xa6" // U+e226 +#define ICON_MD_ATTACH_MONEY "\xee\x88\xa7" // U+e227 +#define ICON_MD_ATTACHMENT "\xee\x8a\xbc" // U+e2bc +#define ICON_MD_ATTRACTIONS "\xee\xa9\x92" // U+ea52 +#define ICON_MD_ATTRIBUTION "\xee\xbf\x9b" // U+efdb +#define ICON_MD_AUDIO_FILE "\xee\xae\x82" // U+eb82 +#define ICON_MD_AUDIOTRACK "\xee\x8e\xa1" // U+e3a1 +#define ICON_MD_AUTO_AWESOME "\xee\x99\x9f" // U+e65f +#define ICON_MD_AUTO_AWESOME_MOSAIC "\xee\x99\xa0" // U+e660 +#define ICON_MD_AUTO_AWESOME_MOTION "\xee\x99\xa1" // U+e661 +#define ICON_MD_AUTO_DELETE "\xee\xa9\x8c" // U+ea4c +#define ICON_MD_AUTO_FIX_HIGH "\xee\x99\xa3" // U+e663 +#define ICON_MD_AUTO_FIX_NORMAL "\xee\x99\xa4" // U+e664 +#define ICON_MD_AUTO_FIX_OFF "\xee\x99\xa5" // U+e665 +#define ICON_MD_AUTO_GRAPH "\xee\x93\xbb" // U+e4fb +#define ICON_MD_AUTO_MODE "\xee\xb0\xa0" // U+ec20 +#define ICON_MD_AUTO_STORIES "\xee\x99\xa6" // U+e666 +#define ICON_MD_AUTOFPS_SELECT "\xee\xbf\x9c" // U+efdc +#define ICON_MD_AUTORENEW "\xee\xa1\xa3" // U+e863 +#define ICON_MD_AV_TIMER "\xee\x80\x9b" // U+e01b +#define ICON_MD_BABY_CHANGING_STATION "\xef\x86\x9b" // U+f19b +#define ICON_MD_BACK_HAND "\xee\x9d\xa4" // U+e764 +#define ICON_MD_BACKPACK "\xef\x86\x9c" // U+f19c +#define ICON_MD_BACKSPACE "\xee\x85\x8a" // U+e14a +#define ICON_MD_BACKUP "\xee\xa1\xa4" // U+e864 +#define ICON_MD_BACKUP_TABLE "\xee\xbd\x83" // U+ef43 +#define ICON_MD_BADGE "\xee\xa9\xa7" // U+ea67 +#define ICON_MD_BAKERY_DINING "\xee\xa9\x93" // U+ea53 +#define ICON_MD_BALANCE "\xee\xab\xb6" // U+eaf6 +#define ICON_MD_BALCONY "\xee\x96\x8f" // U+e58f +#define ICON_MD_BALLOT "\xee\x85\xb2" // U+e172 +#define ICON_MD_BAR_CHART "\xee\x89\xab" // U+e26b +#define ICON_MD_BATCH_PREDICTION "\xef\x83\xb5" // U+f0f5 +#define ICON_MD_BATHROOM "\xee\xbf\x9d" // U+efdd +#define ICON_MD_BATHTUB "\xee\xa9\x81" // U+ea41 +#define ICON_MD_BATTERY_0_BAR "\xee\xaf\x9c" // U+ebdc +#define ICON_MD_BATTERY_1_BAR "\xee\xaf\x99" // U+ebd9 +#define ICON_MD_BATTERY_2_BAR "\xee\xaf\xa0" // U+ebe0 +#define ICON_MD_BATTERY_3_BAR "\xee\xaf\x9d" // U+ebdd +#define ICON_MD_BATTERY_4_BAR "\xee\xaf\xa2" // U+ebe2 +#define ICON_MD_BATTERY_5_BAR "\xee\xaf\x94" // U+ebd4 +#define ICON_MD_BATTERY_6_BAR "\xee\xaf\x92" // U+ebd2 +#define ICON_MD_BATTERY_ALERT "\xee\x86\x9c" // U+e19c +#define ICON_MD_BATTERY_CHARGING_FULL "\xee\x86\xa3" // U+e1a3 +#define ICON_MD_BATTERY_FULL "\xee\x86\xa4" // U+e1a4 +#define ICON_MD_BATTERY_SAVER "\xee\xbf\x9e" // U+efde +#define ICON_MD_BATTERY_STD "\xee\x86\xa5" // U+e1a5 +#define ICON_MD_BATTERY_UNKNOWN "\xee\x86\xa6" // U+e1a6 +#define ICON_MD_BEACH_ACCESS "\xee\xac\xbe" // U+eb3e +#define ICON_MD_BED "\xee\xbf\x9f" // U+efdf +#define ICON_MD_BEDROOM_BABY "\xee\xbf\xa0" // U+efe0 +#define ICON_MD_BEDROOM_CHILD "\xee\xbf\xa1" // U+efe1 +#define ICON_MD_BEDROOM_PARENT "\xee\xbf\xa2" // U+efe2 +#define ICON_MD_BEDTIME "\xee\xbd\x84" // U+ef44 +#define ICON_MD_BEDTIME_OFF "\xee\xad\xb6" // U+eb76 +#define ICON_MD_BEENHERE "\xee\x94\xad" // U+e52d +#define ICON_MD_BENTO "\xef\x87\xb4" // U+f1f4 +#define ICON_MD_BIKE_SCOOTER "\xee\xbd\x85" // U+ef45 +#define ICON_MD_BIOTECH "\xee\xa8\xba" // U+ea3a +#define ICON_MD_BLENDER "\xee\xbf\xa3" // U+efe3 +#define ICON_MD_BLINDS "\xee\x8a\x86" // U+e286 +#define ICON_MD_BLINDS_CLOSED "\xee\xb0\x9f" // U+ec1f +#define ICON_MD_BLOCK "\xee\x85\x8b" // U+e14b +#define ICON_MD_BLOCK_FLIPPED "\xee\xbd\x86" // U+ef46 +#define ICON_MD_BLOODTYPE "\xee\xbf\xa4" // U+efe4 +#define ICON_MD_BLUETOOTH "\xee\x86\xa7" // U+e1a7 +#define ICON_MD_BLUETOOTH_AUDIO "\xee\x98\x8f" // U+e60f +#define ICON_MD_BLUETOOTH_CONNECTED "\xee\x86\xa8" // U+e1a8 +#define ICON_MD_BLUETOOTH_DISABLED "\xee\x86\xa9" // U+e1a9 +#define ICON_MD_BLUETOOTH_DRIVE "\xee\xbf\xa5" // U+efe5 +#define ICON_MD_BLUETOOTH_SEARCHING "\xee\x86\xaa" // U+e1aa +#define ICON_MD_BLUR_CIRCULAR "\xee\x8e\xa2" // U+e3a2 +#define ICON_MD_BLUR_LINEAR "\xee\x8e\xa3" // U+e3a3 +#define ICON_MD_BLUR_OFF "\xee\x8e\xa4" // U+e3a4 +#define ICON_MD_BLUR_ON "\xee\x8e\xa5" // U+e3a5 +#define ICON_MD_BOLT "\xee\xa8\x8b" // U+ea0b +#define ICON_MD_BOOK "\xee\xa1\xa5" // U+e865 +#define ICON_MD_BOOK_ONLINE "\xef\x88\x97" // U+f217 +#define ICON_MD_BOOKMARK "\xee\xa1\xa6" // U+e866 +#define ICON_MD_BOOKMARK_ADD "\xee\x96\x98" // U+e598 +#define ICON_MD_BOOKMARK_ADDED "\xee\x96\x99" // U+e599 +#define ICON_MD_BOOKMARK_BORDER "\xee\xa1\xa7" // U+e867 +#define ICON_MD_BOOKMARK_OUTLINE "\xee\xa1\xa7" // U+e867 +#define ICON_MD_BOOKMARK_REMOVE "\xee\x96\x9a" // U+e59a +#define ICON_MD_BOOKMARKS "\xee\xa6\x8b" // U+e98b +#define ICON_MD_BORDER_ALL "\xee\x88\xa8" // U+e228 +#define ICON_MD_BORDER_BOTTOM "\xee\x88\xa9" // U+e229 +#define ICON_MD_BORDER_CLEAR "\xee\x88\xaa" // U+e22a +#define ICON_MD_BORDER_COLOR "\xee\x88\xab" // U+e22b +#define ICON_MD_BORDER_HORIZONTAL "\xee\x88\xac" // U+e22c +#define ICON_MD_BORDER_INNER "\xee\x88\xad" // U+e22d +#define ICON_MD_BORDER_LEFT "\xee\x88\xae" // U+e22e +#define ICON_MD_BORDER_OUTER "\xee\x88\xaf" // U+e22f +#define ICON_MD_BORDER_RIGHT "\xee\x88\xb0" // U+e230 +#define ICON_MD_BORDER_STYLE "\xee\x88\xb1" // U+e231 +#define ICON_MD_BORDER_TOP "\xee\x88\xb2" // U+e232 +#define ICON_MD_BORDER_VERTICAL "\xee\x88\xb3" // U+e233 +#define ICON_MD_BOY "\xee\xad\xa7" // U+eb67 +#define ICON_MD_BRANDING_WATERMARK "\xee\x81\xab" // U+e06b +#define ICON_MD_BREAKFAST_DINING "\xee\xa9\x94" // U+ea54 +#define ICON_MD_BRIGHTNESS_1 "\xee\x8e\xa6" // U+e3a6 +#define ICON_MD_BRIGHTNESS_2 "\xee\x8e\xa7" // U+e3a7 +#define ICON_MD_BRIGHTNESS_3 "\xee\x8e\xa8" // U+e3a8 +#define ICON_MD_BRIGHTNESS_4 "\xee\x8e\xa9" // U+e3a9 +#define ICON_MD_BRIGHTNESS_5 "\xee\x8e\xaa" // U+e3aa +#define ICON_MD_BRIGHTNESS_6 "\xee\x8e\xab" // U+e3ab +#define ICON_MD_BRIGHTNESS_7 "\xee\x8e\xac" // U+e3ac +#define ICON_MD_BRIGHTNESS_AUTO "\xee\x86\xab" // U+e1ab +#define ICON_MD_BRIGHTNESS_HIGH "\xee\x86\xac" // U+e1ac +#define ICON_MD_BRIGHTNESS_LOW "\xee\x86\xad" // U+e1ad +#define ICON_MD_BRIGHTNESS_MEDIUM "\xee\x86\xae" // U+e1ae +#define ICON_MD_BROADCAST_ON_HOME "\xef\xa3\xb8" // U+f8f8 +#define ICON_MD_BROADCAST_ON_PERSONAL "\xef\xa3\xb9" // U+f8f9 +#define ICON_MD_BROKEN_IMAGE "\xee\x8e\xad" // U+e3ad +#define ICON_MD_BROWSE_GALLERY "\xee\xaf\x91" // U+ebd1 +#define ICON_MD_BROWSER_NOT_SUPPORTED "\xee\xbd\x87" // U+ef47 +#define ICON_MD_BROWSER_UPDATED "\xee\x9f\x8f" // U+e7cf +#define ICON_MD_BRUNCH_DINING "\xee\xa9\xb3" // U+ea73 +#define ICON_MD_BRUSH "\xee\x8e\xae" // U+e3ae +#define ICON_MD_BUBBLE_CHART "\xee\x9b\x9d" // U+e6dd +#define ICON_MD_BUG_REPORT "\xee\xa1\xa8" // U+e868 +#define ICON_MD_BUILD "\xee\xa1\xa9" // U+e869 +#define ICON_MD_BUILD_CIRCLE "\xee\xbd\x88" // U+ef48 +#define ICON_MD_BUNGALOW "\xee\x96\x91" // U+e591 +#define ICON_MD_BURST_MODE "\xee\x90\xbc" // U+e43c +#define ICON_MD_BUS_ALERT "\xee\xa6\x8f" // U+e98f +#define ICON_MD_BUSINESS "\xee\x82\xaf" // U+e0af +#define ICON_MD_BUSINESS_CENTER "\xee\xac\xbf" // U+eb3f +#define ICON_MD_CABIN "\xee\x96\x89" // U+e589 +#define ICON_MD_CABLE "\xee\xbf\xa6" // U+efe6 +#define ICON_MD_CACHED "\xee\xa1\xaa" // U+e86a +#define ICON_MD_CAKE "\xee\x9f\xa9" // U+e7e9 +#define ICON_MD_CALCULATE "\xee\xa9\x9f" // U+ea5f +#define ICON_MD_CALENDAR_MONTH "\xee\xaf\x8c" // U+ebcc +#define ICON_MD_CALENDAR_TODAY "\xee\xa4\xb5" // U+e935 +#define ICON_MD_CALENDAR_VIEW_DAY "\xee\xa4\xb6" // U+e936 +#define ICON_MD_CALENDAR_VIEW_MONTH "\xee\xbf\xa7" // U+efe7 +#define ICON_MD_CALENDAR_VIEW_WEEK "\xee\xbf\xa8" // U+efe8 +#define ICON_MD_CALL "\xee\x82\xb0" // U+e0b0 +#define ICON_MD_CALL_END "\xee\x82\xb1" // U+e0b1 +#define ICON_MD_CALL_MADE "\xee\x82\xb2" // U+e0b2 +#define ICON_MD_CALL_MERGE "\xee\x82\xb3" // U+e0b3 +#define ICON_MD_CALL_MISSED "\xee\x82\xb4" // U+e0b4 +#define ICON_MD_CALL_MISSED_OUTGOING "\xee\x83\xa4" // U+e0e4 +#define ICON_MD_CALL_RECEIVED "\xee\x82\xb5" // U+e0b5 +#define ICON_MD_CALL_SPLIT "\xee\x82\xb6" // U+e0b6 +#define ICON_MD_CALL_TO_ACTION "\xee\x81\xac" // U+e06c +#define ICON_MD_CAMERA "\xee\x8e\xaf" // U+e3af +#define ICON_MD_CAMERA_ALT "\xee\x8e\xb0" // U+e3b0 +#define ICON_MD_CAMERA_ENHANCE "\xee\xa3\xbc" // U+e8fc +#define ICON_MD_CAMERA_FRONT "\xee\x8e\xb1" // U+e3b1 +#define ICON_MD_CAMERA_INDOOR "\xee\xbf\xa9" // U+efe9 +#define ICON_MD_CAMERA_OUTDOOR "\xee\xbf\xaa" // U+efea +#define ICON_MD_CAMERA_REAR "\xee\x8e\xb2" // U+e3b2 +#define ICON_MD_CAMERA_ROLL "\xee\x8e\xb3" // U+e3b3 +#define ICON_MD_CAMERASWITCH "\xee\xbf\xab" // U+efeb +#define ICON_MD_CAMPAIGN "\xee\xbd\x89" // U+ef49 +#define ICON_MD_CANCEL "\xee\x97\x89" // U+e5c9 +#define ICON_MD_CANCEL_PRESENTATION "\xee\x83\xa9" // U+e0e9 +#define ICON_MD_CANCEL_SCHEDULE_SEND "\xee\xa8\xb9" // U+ea39 +#define ICON_MD_CANDLESTICK_CHART "\xee\xab\x94" // U+ead4 +#define ICON_MD_CAR_CRASH "\xee\xaf\xb2" // U+ebf2 +#define ICON_MD_CAR_RENTAL "\xee\xa9\x95" // U+ea55 +#define ICON_MD_CAR_REPAIR "\xee\xa9\x96" // U+ea56 +#define ICON_MD_CARD_GIFTCARD "\xee\xa3\xb6" // U+e8f6 +#define ICON_MD_CARD_MEMBERSHIP "\xee\xa3\xb7" // U+e8f7 +#define ICON_MD_CARD_TRAVEL "\xee\xa3\xb8" // U+e8f8 +#define ICON_MD_CARPENTER "\xef\x87\xb8" // U+f1f8 +#define ICON_MD_CASES "\xee\xa6\x92" // U+e992 +#define ICON_MD_CASINO "\xee\xad\x80" // U+eb40 +#define ICON_MD_CAST "\xee\x8c\x87" // U+e307 +#define ICON_MD_CAST_CONNECTED "\xee\x8c\x88" // U+e308 +#define ICON_MD_CAST_FOR_EDUCATION "\xee\xbf\xac" // U+efec +#define ICON_MD_CASTLE "\xee\xaa\xb1" // U+eab1 +#define ICON_MD_CATCHING_POKEMON "\xee\x94\x88" // U+e508 +#define ICON_MD_CATEGORY "\xee\x95\xb4" // U+e574 +#define ICON_MD_CELEBRATION "\xee\xa9\xa5" // U+ea65 +#define ICON_MD_CELL_TOWER "\xee\xae\xba" // U+ebba +#define ICON_MD_CELL_WIFI "\xee\x83\xac" // U+e0ec +#define ICON_MD_CENTER_FOCUS_STRONG "\xee\x8e\xb4" // U+e3b4 +#define ICON_MD_CENTER_FOCUS_WEAK "\xee\x8e\xb5" // U+e3b5 +#define ICON_MD_CHAIR "\xee\xbf\xad" // U+efed +#define ICON_MD_CHAIR_ALT "\xee\xbf\xae" // U+efee +#define ICON_MD_CHALET "\xee\x96\x85" // U+e585 +#define ICON_MD_CHANGE_CIRCLE "\xee\x8b\xa7" // U+e2e7 +#define ICON_MD_CHANGE_HISTORY "\xee\xa1\xab" // U+e86b +#define ICON_MD_CHARGING_STATION "\xef\x86\x9d" // U+f19d +#define ICON_MD_CHAT "\xee\x82\xb7" // U+e0b7 +#define ICON_MD_CHAT_BUBBLE "\xee\x83\x8a" // U+e0ca +#define ICON_MD_CHAT_BUBBLE_OUTLINE "\xee\x83\x8b" // U+e0cb +#define ICON_MD_CHECK "\xee\x97\x8a" // U+e5ca +#define ICON_MD_CHECK_BOX "\xee\xa0\xb4" // U+e834 +#define ICON_MD_CHECK_BOX_OUTLINE_BLANK "\xee\xa0\xb5" // U+e835 +#define ICON_MD_CHECK_CIRCLE "\xee\xa1\xac" // U+e86c +#define ICON_MD_CHECK_CIRCLE_OUTLINE "\xee\xa4\xad" // U+e92d +#define ICON_MD_CHECKLIST "\xee\x9a\xb1" // U+e6b1 +#define ICON_MD_CHECKLIST_RTL "\xee\x9a\xb3" // U+e6b3 +#define ICON_MD_CHECKROOM "\xef\x86\x9e" // U+f19e +#define ICON_MD_CHEVRON_LEFT "\xee\x97\x8b" // U+e5cb +#define ICON_MD_CHEVRON_RIGHT "\xee\x97\x8c" // U+e5cc +#define ICON_MD_CHILD_CARE "\xee\xad\x81" // U+eb41 +#define ICON_MD_CHILD_FRIENDLY "\xee\xad\x82" // U+eb42 +#define ICON_MD_CHROME_READER_MODE "\xee\xa1\xad" // U+e86d +#define ICON_MD_CHURCH "\xee\xaa\xae" // U+eaae +#define ICON_MD_CIRCLE "\xee\xbd\x8a" // U+ef4a +#define ICON_MD_CIRCLE_NOTIFICATIONS "\xee\xa6\x94" // U+e994 +#define ICON_MD_CLASS "\xee\xa1\xae" // U+e86e +#define ICON_MD_CLEAN_HANDS "\xef\x88\x9f" // U+f21f +#define ICON_MD_CLEANING_SERVICES "\xef\x83\xbf" // U+f0ff +#define ICON_MD_CLEAR "\xee\x85\x8c" // U+e14c +#define ICON_MD_CLEAR_ALL "\xee\x82\xb8" // U+e0b8 +#define ICON_MD_CLOSE "\xee\x97\x8d" // U+e5cd +#define ICON_MD_CLOSE_FULLSCREEN "\xef\x87\x8f" // U+f1cf +#define ICON_MD_CLOSED_CAPTION "\xee\x80\x9c" // U+e01c +#define ICON_MD_CLOSED_CAPTION_DISABLED "\xef\x87\x9c" // U+f1dc +#define ICON_MD_CLOSED_CAPTION_OFF "\xee\xa6\x96" // U+e996 +#define ICON_MD_CLOUD "\xee\x8a\xbd" // U+e2bd +#define ICON_MD_CLOUD_CIRCLE "\xee\x8a\xbe" // U+e2be +#define ICON_MD_CLOUD_DONE "\xee\x8a\xbf" // U+e2bf +#define ICON_MD_CLOUD_DOWNLOAD "\xee\x8b\x80" // U+e2c0 +#define ICON_MD_CLOUD_OFF "\xee\x8b\x81" // U+e2c1 +#define ICON_MD_CLOUD_QUEUE "\xee\x8b\x82" // U+e2c2 +#define ICON_MD_CLOUD_SYNC "\xee\xad\x9a" // U+eb5a +#define ICON_MD_CLOUD_UPLOAD "\xee\x8b\x83" // U+e2c3 +#define ICON_MD_CLOUDY_SNOWING "\xee\xa0\x90" // U+e810 +#define ICON_MD_CO2 "\xee\x9e\xb0" // U+e7b0 +#define ICON_MD_CO_PRESENT "\xee\xab\xb0" // U+eaf0 +#define ICON_MD_CODE "\xee\xa1\xaf" // U+e86f +#define ICON_MD_CODE_OFF "\xee\x93\xb3" // U+e4f3 +#define ICON_MD_COFFEE "\xee\xbf\xaf" // U+efef +#define ICON_MD_COFFEE_MAKER "\xee\xbf\xb0" // U+eff0 +#define ICON_MD_COLLECTIONS "\xee\x8e\xb6" // U+e3b6 +#define ICON_MD_COLLECTIONS_BOOKMARK "\xee\x90\xb1" // U+e431 +#define ICON_MD_COLOR_LENS "\xee\x8e\xb7" // U+e3b7 +#define ICON_MD_COLORIZE "\xee\x8e\xb8" // U+e3b8 +#define ICON_MD_COMMENT "\xee\x82\xb9" // U+e0b9 +#define ICON_MD_COMMENT_BANK "\xee\xa9\x8e" // U+ea4e +#define ICON_MD_COMMENTS_DISABLED "\xee\x9e\xa2" // U+e7a2 +#define ICON_MD_COMMIT "\xee\xab\xb5" // U+eaf5 +#define ICON_MD_COMMUTE "\xee\xa5\x80" // U+e940 +#define ICON_MD_COMPARE "\xee\x8e\xb9" // U+e3b9 +#define ICON_MD_COMPARE_ARROWS "\xee\xa4\x95" // U+e915 +#define ICON_MD_COMPASS_CALIBRATION "\xee\x95\xbc" // U+e57c +#define ICON_MD_COMPOST "\xee\x9d\xa1" // U+e761 +#define ICON_MD_COMPRESS "\xee\xa5\x8d" // U+e94d +#define ICON_MD_COMPUTER "\xee\x8c\x8a" // U+e30a +#define ICON_MD_CONFIRMATION_NUM "\xee\x98\xb8" // U+e638 +#define ICON_MD_CONFIRMATION_NUMBER "\xee\x98\xb8" // U+e638 +#define ICON_MD_CONNECT_WITHOUT_CONTACT "\xef\x88\xa3" // U+f223 +#define ICON_MD_CONNECTED_TV "\xee\xa6\x98" // U+e998 +#define ICON_MD_CONNECTING_AIRPORTS "\xee\x9f\x89" // U+e7c9 +#define ICON_MD_CONSTRUCTION "\xee\xa8\xbc" // U+ea3c +#define ICON_MD_CONTACT_MAIL "\xee\x83\x90" // U+e0d0 +#define ICON_MD_CONTACT_PAGE "\xef\x88\xae" // U+f22e +#define ICON_MD_CONTACT_PHONE "\xee\x83\x8f" // U+e0cf +#define ICON_MD_CONTACT_SUPPORT "\xee\xa5\x8c" // U+e94c +#define ICON_MD_CONTACTLESS "\xee\xa9\xb1" // U+ea71 +#define ICON_MD_CONTACTS "\xee\x82\xba" // U+e0ba +#define ICON_MD_CONTENT_COPY "\xee\x85\x8d" // U+e14d +#define ICON_MD_CONTENT_CUT "\xee\x85\x8e" // U+e14e +#define ICON_MD_CONTENT_PASTE "\xee\x85\x8f" // U+e14f +#define ICON_MD_CONTENT_PASTE_GO "\xee\xaa\x8e" // U+ea8e +#define ICON_MD_CONTENT_PASTE_OFF "\xee\x93\xb8" // U+e4f8 +#define ICON_MD_CONTENT_PASTE_SEARCH "\xee\xaa\x9b" // U+ea9b +#define ICON_MD_CONTRAST "\xee\xac\xb7" // U+eb37 +#define ICON_MD_CONTROL_CAMERA "\xee\x81\xb4" // U+e074 +#define ICON_MD_CONTROL_POINT "\xee\x8e\xba" // U+e3ba +#define ICON_MD_CONTROL_POINT_DUPLICATE "\xee\x8e\xbb" // U+e3bb +#define ICON_MD_COOKIE "\xee\xaa\xac" // U+eaac +#define ICON_MD_COPY_ALL "\xee\x8b\xac" // U+e2ec +#define ICON_MD_COPYRIGHT "\xee\xa4\x8c" // U+e90c +#define ICON_MD_CORONAVIRUS "\xef\x88\xa1" // U+f221 +#define ICON_MD_CORPORATE_FARE "\xef\x87\x90" // U+f1d0 +#define ICON_MD_COTTAGE "\xee\x96\x87" // U+e587 +#define ICON_MD_COUNTERTOPS "\xef\x87\xb7" // U+f1f7 +#define ICON_MD_CREATE "\xee\x85\x90" // U+e150 +#define ICON_MD_CREATE_NEW_FOLDER "\xee\x8b\x8c" // U+e2cc +#define ICON_MD_CREDIT_CARD "\xee\xa1\xb0" // U+e870 +#define ICON_MD_CREDIT_CARD_OFF "\xee\x93\xb4" // U+e4f4 +#define ICON_MD_CREDIT_SCORE "\xee\xbf\xb1" // U+eff1 +#define ICON_MD_CRIB "\xee\x96\x88" // U+e588 +#define ICON_MD_CRISIS_ALERT "\xee\xaf\xa9" // U+ebe9 +#define ICON_MD_CROP "\xee\x8e\xbe" // U+e3be +#define ICON_MD_CROP_16_9 "\xee\x8e\xbc" // U+e3bc +#define ICON_MD_CROP_3_2 "\xee\x8e\xbd" // U+e3bd +#define ICON_MD_CROP_5_4 "\xee\x8e\xbf" // U+e3bf +#define ICON_MD_CROP_7_5 "\xee\x8f\x80" // U+e3c0 +#define ICON_MD_CROP_DIN "\xee\x8f\x81" // U+e3c1 +#define ICON_MD_CROP_FREE "\xee\x8f\x82" // U+e3c2 +#define ICON_MD_CROP_LANDSCAPE "\xee\x8f\x83" // U+e3c3 +#define ICON_MD_CROP_ORIGINAL "\xee\x8f\x84" // U+e3c4 +#define ICON_MD_CROP_PORTRAIT "\xee\x8f\x85" // U+e3c5 +#define ICON_MD_CROP_ROTATE "\xee\x90\xb7" // U+e437 +#define ICON_MD_CROP_SQUARE "\xee\x8f\x86" // U+e3c6 +#define ICON_MD_CRUELTY_FREE "\xee\x9e\x99" // U+e799 +#define ICON_MD_CSS "\xee\xae\x93" // U+eb93 +#define ICON_MD_CURRENCY_BITCOIN "\xee\xaf\x85" // U+ebc5 +#define ICON_MD_CURRENCY_EXCHANGE "\xee\xad\xb0" // U+eb70 +#define ICON_MD_CURRENCY_FRANC "\xee\xab\xba" // U+eafa +#define ICON_MD_CURRENCY_LIRA "\xee\xab\xaf" // U+eaef +#define ICON_MD_CURRENCY_POUND "\xee\xab\xb1" // U+eaf1 +#define ICON_MD_CURRENCY_RUBLE "\xee\xab\xac" // U+eaec +#define ICON_MD_CURRENCY_RUPEE "\xee\xab\xb7" // U+eaf7 +#define ICON_MD_CURRENCY_YEN "\xee\xab\xbb" // U+eafb +#define ICON_MD_CURRENCY_YUAN "\xee\xab\xb9" // U+eaf9 +#define ICON_MD_CURTAINS "\xee\xb0\x9e" // U+ec1e +#define ICON_MD_CURTAINS_CLOSED "\xee\xb0\x9d" // U+ec1d +#define ICON_MD_CYCLONE "\xee\xaf\x95" // U+ebd5 +#define ICON_MD_DANGEROUS "\xee\xa6\x9a" // U+e99a +#define ICON_MD_DARK_MODE "\xee\x94\x9c" // U+e51c +#define ICON_MD_DASHBOARD "\xee\xa1\xb1" // U+e871 +#define ICON_MD_DASHBOARD_CUSTOMIZE "\xee\xa6\x9b" // U+e99b +#define ICON_MD_DATA_ARRAY "\xee\xab\x91" // U+ead1 +#define ICON_MD_DATA_EXPLORATION "\xee\x9d\xaf" // U+e76f +#define ICON_MD_DATA_OBJECT "\xee\xab\x93" // U+ead3 +#define ICON_MD_DATA_SAVER_OFF "\xee\xbf\xb2" // U+eff2 +#define ICON_MD_DATA_SAVER_ON "\xee\xbf\xb3" // U+eff3 +#define ICON_MD_DATA_THRESHOLDING "\xee\xae\x9f" // U+eb9f +#define ICON_MD_DATA_USAGE "\xee\x86\xaf" // U+e1af +#define ICON_MD_DATE_RANGE "\xee\xa4\x96" // U+e916 +#define ICON_MD_DEBLUR "\xee\xad\xb7" // U+eb77 +#define ICON_MD_DECK "\xee\xa9\x82" // U+ea42 +#define ICON_MD_DEHAZE "\xee\x8f\x87" // U+e3c7 +#define ICON_MD_DELETE "\xee\xa1\xb2" // U+e872 +#define ICON_MD_DELETE_FOREVER "\xee\xa4\xab" // U+e92b +#define ICON_MD_DELETE_OUTLINE "\xee\xa4\xae" // U+e92e +#define ICON_MD_DELETE_SWEEP "\xee\x85\xac" // U+e16c +#define ICON_MD_DELIVERY_DINING "\xee\xa9\xb2" // U+ea72 +#define ICON_MD_DENSITY_LARGE "\xee\xae\xa9" // U+eba9 +#define ICON_MD_DENSITY_MEDIUM "\xee\xae\x9e" // U+eb9e +#define ICON_MD_DENSITY_SMALL "\xee\xae\xa8" // U+eba8 +#define ICON_MD_DEPARTURE_BOARD "\xee\x95\xb6" // U+e576 +#define ICON_MD_DESCRIPTION "\xee\xa1\xb3" // U+e873 +#define ICON_MD_DESELECT "\xee\xae\xb6" // U+ebb6 +#define ICON_MD_DESIGN_SERVICES "\xef\x84\x8a" // U+f10a +#define ICON_MD_DESK "\xef\xa3\xb4" // U+f8f4 +#define ICON_MD_DESKTOP_ACCESS_DISABLED "\xee\xa6\x9d" // U+e99d +#define ICON_MD_DESKTOP_MAC "\xee\x8c\x8b" // U+e30b +#define ICON_MD_DESKTOP_WINDOWS "\xee\x8c\x8c" // U+e30c +#define ICON_MD_DETAILS "\xee\x8f\x88" // U+e3c8 +#define ICON_MD_DEVELOPER_BOARD "\xee\x8c\x8d" // U+e30d +#define ICON_MD_DEVELOPER_BOARD_OFF "\xee\x93\xbf" // U+e4ff +#define ICON_MD_DEVELOPER_MODE "\xee\x86\xb0" // U+e1b0 +#define ICON_MD_DEVICE_HUB "\xee\x8c\xb5" // U+e335 +#define ICON_MD_DEVICE_THERMOSTAT "\xee\x87\xbf" // U+e1ff +#define ICON_MD_DEVICE_UNKNOWN "\xee\x8c\xb9" // U+e339 +#define ICON_MD_DEVICES "\xee\x86\xb1" // U+e1b1 +#define ICON_MD_DEVICES_FOLD "\xee\xaf\x9e" // U+ebde +#define ICON_MD_DEVICES_OTHER "\xee\x8c\xb7" // U+e337 +#define ICON_MD_DIALER_SIP "\xee\x82\xbb" // U+e0bb +#define ICON_MD_DIALPAD "\xee\x82\xbc" // U+e0bc +#define ICON_MD_DIAMOND "\xee\xab\x95" // U+ead5 +#define ICON_MD_DIFFERENCE "\xee\xad\xbd" // U+eb7d +#define ICON_MD_DINING "\xee\xbf\xb4" // U+eff4 +#define ICON_MD_DINNER_DINING "\xee\xa9\x97" // U+ea57 +#define ICON_MD_DIRECTIONS "\xee\x94\xae" // U+e52e +#define ICON_MD_DIRECTIONS_BIKE "\xee\x94\xaf" // U+e52f +#define ICON_MD_DIRECTIONS_BOAT "\xee\x94\xb2" // U+e532 +#define ICON_MD_DIRECTIONS_BOAT_FILLED "\xee\xbf\xb5" // U+eff5 +#define ICON_MD_DIRECTIONS_BUS "\xee\x94\xb0" // U+e530 +#define ICON_MD_DIRECTIONS_BUS_FILLED "\xee\xbf\xb6" // U+eff6 +#define ICON_MD_DIRECTIONS_CAR "\xee\x94\xb1" // U+e531 +#define ICON_MD_DIRECTIONS_CAR_FILLED "\xee\xbf\xb7" // U+eff7 +#define ICON_MD_DIRECTIONS_FERRY "\xee\x94\xb2" // U+e532 +#define ICON_MD_DIRECTIONS_OFF "\xef\x84\x8f" // U+f10f +#define ICON_MD_DIRECTIONS_RAILWAY "\xee\x94\xb4" // U+e534 +#define ICON_MD_DIRECTIONS_RAILWAY_FILLED "\xee\xbf\xb8" // U+eff8 +#define ICON_MD_DIRECTIONS_RUN "\xee\x95\xa6" // U+e566 +#define ICON_MD_DIRECTIONS_SUBWAY "\xee\x94\xb3" // U+e533 +#define ICON_MD_DIRECTIONS_SUBWAY_FILLED "\xee\xbf\xb9" // U+eff9 +#define ICON_MD_DIRECTIONS_TRAIN "\xee\x94\xb4" // U+e534 +#define ICON_MD_DIRECTIONS_TRANSIT "\xee\x94\xb5" // U+e535 +#define ICON_MD_DIRECTIONS_TRANSIT_FILLED "\xee\xbf\xba" // U+effa +#define ICON_MD_DIRECTIONS_WALK "\xee\x94\xb6" // U+e536 +#define ICON_MD_DIRTY_LENS "\xee\xbd\x8b" // U+ef4b +#define ICON_MD_DISABLED_BY_DEFAULT "\xef\x88\xb0" // U+f230 +#define ICON_MD_DISABLED_VISIBLE "\xee\x9d\xae" // U+e76e +#define ICON_MD_DISC_FULL "\xee\x98\x90" // U+e610 +#define ICON_MD_DISCORD "\xee\xa9\xac" // U+ea6c +#define ICON_MD_DISCOUNT "\xee\xaf\x89" // U+ebc9 +#define ICON_MD_DISPLAY_SETTINGS "\xee\xae\x97" // U+eb97 +#define ICON_MD_DND_FORWARDSLASH "\xee\x98\x91" // U+e611 +#define ICON_MD_DNS "\xee\xa1\xb5" // U+e875 +#define ICON_MD_DO_DISTURB "\xef\x82\x8c" // U+f08c +#define ICON_MD_DO_DISTURB_ALT "\xef\x82\x8d" // U+f08d +#define ICON_MD_DO_DISTURB_OFF "\xef\x82\x8e" // U+f08e +#define ICON_MD_DO_DISTURB_ON "\xef\x82\x8f" // U+f08f +#define ICON_MD_DO_NOT_DISTURB "\xee\x98\x92" // U+e612 +#define ICON_MD_DO_NOT_DISTURB_ALT "\xee\x98\x91" // U+e611 +#define ICON_MD_DO_NOT_DISTURB_OFF "\xee\x99\x83" // U+e643 +#define ICON_MD_DO_NOT_DISTURB_ON "\xee\x99\x84" // U+e644 +#define ICON_MD_DO_NOT_DISTURB_ON_TOTAL_SILENCE "\xee\xbf\xbb" // U+effb +#define ICON_MD_DO_NOT_STEP "\xef\x86\x9f" // U+f19f +#define ICON_MD_DO_NOT_TOUCH "\xef\x86\xb0" // U+f1b0 +#define ICON_MD_DOCK "\xee\x8c\x8e" // U+e30e +#define ICON_MD_DOCUMENT_SCANNER "\xee\x97\xba" // U+e5fa +#define ICON_MD_DOMAIN "\xee\x9f\xae" // U+e7ee +#define ICON_MD_DOMAIN_ADD "\xee\xad\xa2" // U+eb62 +#define ICON_MD_DOMAIN_DISABLED "\xee\x83\xaf" // U+e0ef +#define ICON_MD_DOMAIN_VERIFICATION "\xee\xbd\x8c" // U+ef4c +#define ICON_MD_DONE "\xee\xa1\xb6" // U+e876 +#define ICON_MD_DONE_ALL "\xee\xa1\xb7" // U+e877 +#define ICON_MD_DONE_OUTLINE "\xee\xa4\xaf" // U+e92f +#define ICON_MD_DONUT_LARGE "\xee\xa4\x97" // U+e917 +#define ICON_MD_DONUT_SMALL "\xee\xa4\x98" // U+e918 +#define ICON_MD_DOOR_BACK "\xee\xbf\xbc" // U+effc +#define ICON_MD_DOOR_FRONT "\xee\xbf\xbd" // U+effd +#define ICON_MD_DOOR_SLIDING "\xee\xbf\xbe" // U+effe +#define ICON_MD_DOORBELL "\xee\xbf\xbf" // U+efff +#define ICON_MD_DOUBLE_ARROW "\xee\xa9\x90" // U+ea50 +#define ICON_MD_DOWNHILL_SKIING "\xee\x94\x89" // U+e509 +#define ICON_MD_DOWNLOAD "\xef\x82\x90" // U+f090 +#define ICON_MD_DOWNLOAD_DONE "\xef\x82\x91" // U+f091 +#define ICON_MD_DOWNLOAD_FOR_OFFLINE "\xef\x80\x80" // U+f000 +#define ICON_MD_DOWNLOADING "\xef\x80\x81" // U+f001 +#define ICON_MD_DRAFTS "\xee\x85\x91" // U+e151 +#define ICON_MD_DRAG_HANDLE "\xee\x89\x9d" // U+e25d +#define ICON_MD_DRAG_INDICATOR "\xee\xa5\x85" // U+e945 +#define ICON_MD_DRAW "\xee\x9d\x86" // U+e746 +#define ICON_MD_DRIVE_ETA "\xee\x98\x93" // U+e613 +#define ICON_MD_DRIVE_FILE_MOVE "\xee\x99\xb5" // U+e675 +#define ICON_MD_DRIVE_FILE_MOVE_OUTLINE "\xee\xa6\xa1" // U+e9a1 +#define ICON_MD_DRIVE_FILE_MOVE_RTL "\xee\x9d\xad" // U+e76d +#define ICON_MD_DRIVE_FILE_RENAME_OUTLINE "\xee\xa6\xa2" // U+e9a2 +#define ICON_MD_DRIVE_FOLDER_UPLOAD "\xee\xa6\xa3" // U+e9a3 +#define ICON_MD_DRY "\xef\x86\xb3" // U+f1b3 +#define ICON_MD_DRY_CLEANING "\xee\xa9\x98" // U+ea58 +#define ICON_MD_DUO "\xee\xa6\xa5" // U+e9a5 +#define ICON_MD_DVR "\xee\x86\xb2" // U+e1b2 +#define ICON_MD_DYNAMIC_FEED "\xee\xa8\x94" // U+ea14 +#define ICON_MD_DYNAMIC_FORM "\xef\x86\xbf" // U+f1bf +#define ICON_MD_E_MOBILEDATA "\xef\x80\x82" // U+f002 +#define ICON_MD_EARBUDS "\xef\x80\x83" // U+f003 +#define ICON_MD_EARBUDS_BATTERY "\xef\x80\x84" // U+f004 +#define ICON_MD_EAST "\xef\x87\x9f" // U+f1df +#define ICON_MD_ECO "\xee\xa8\xb5" // U+ea35 +#define ICON_MD_EDGESENSOR_HIGH "\xef\x80\x85" // U+f005 +#define ICON_MD_EDGESENSOR_LOW "\xef\x80\x86" // U+f006 +#define ICON_MD_EDIT "\xee\x8f\x89" // U+e3c9 +#define ICON_MD_EDIT_ATTRIBUTES "\xee\x95\xb8" // U+e578 +#define ICON_MD_EDIT_CALENDAR "\xee\x9d\x82" // U+e742 +#define ICON_MD_EDIT_LOCATION "\xee\x95\xa8" // U+e568 +#define ICON_MD_EDIT_LOCATION_ALT "\xee\x87\x85" // U+e1c5 +#define ICON_MD_EDIT_NOTE "\xee\x9d\x85" // U+e745 +#define ICON_MD_EDIT_NOTIFICATIONS "\xee\x94\xa5" // U+e525 +#define ICON_MD_EDIT_OFF "\xee\xa5\x90" // U+e950 +#define ICON_MD_EDIT_ROAD "\xee\xbd\x8d" // U+ef4d +#define ICON_MD_EGG "\xee\xab\x8c" // U+eacc +#define ICON_MD_EGG_ALT "\xee\xab\x88" // U+eac8 +#define ICON_MD_EJECT "\xee\xa3\xbb" // U+e8fb +#define ICON_MD_ELDERLY "\xef\x88\x9a" // U+f21a +#define ICON_MD_ELDERLY_WOMAN "\xee\xad\xa9" // U+eb69 +#define ICON_MD_ELECTRIC_BIKE "\xee\xac\x9b" // U+eb1b +#define ICON_MD_ELECTRIC_BOLT "\xee\xb0\x9c" // U+ec1c +#define ICON_MD_ELECTRIC_CAR "\xee\xac\x9c" // U+eb1c +#define ICON_MD_ELECTRIC_METER "\xee\xb0\x9b" // U+ec1b +#define ICON_MD_ELECTRIC_MOPED "\xee\xac\x9d" // U+eb1d +#define ICON_MD_ELECTRIC_RICKSHAW "\xee\xac\x9e" // U+eb1e +#define ICON_MD_ELECTRIC_SCOOTER "\xee\xac\x9f" // U+eb1f +#define ICON_MD_ELECTRICAL_SERVICES "\xef\x84\x82" // U+f102 +#define ICON_MD_ELEVATOR "\xef\x86\xa0" // U+f1a0 +#define ICON_MD_EMAIL "\xee\x82\xbe" // U+e0be +#define ICON_MD_EMERGENCY "\xee\x87\xab" // U+e1eb +#define ICON_MD_EMERGENCY_RECORDING "\xee\xaf\xb4" // U+ebf4 +#define ICON_MD_EMERGENCY_SHARE "\xee\xaf\xb6" // U+ebf6 +#define ICON_MD_EMOJI_EMOTIONS "\xee\xa8\xa2" // U+ea22 +#define ICON_MD_EMOJI_EVENTS "\xee\xa8\xa3" // U+ea23 +#define ICON_MD_EMOJI_FLAGS "\xee\xa8\x9a" // U+ea1a +#define ICON_MD_EMOJI_FOOD_BEVERAGE "\xee\xa8\x9b" // U+ea1b +#define ICON_MD_EMOJI_NATURE "\xee\xa8\x9c" // U+ea1c +#define ICON_MD_EMOJI_OBJECTS "\xee\xa8\xa4" // U+ea24 +#define ICON_MD_EMOJI_PEOPLE "\xee\xa8\x9d" // U+ea1d +#define ICON_MD_EMOJI_SYMBOLS "\xee\xa8\x9e" // U+ea1e +#define ICON_MD_EMOJI_TRANSPORTATION "\xee\xa8\x9f" // U+ea1f +#define ICON_MD_ENERGY_SAVINGS_LEAF "\xee\xb0\x9a" // U+ec1a +#define ICON_MD_ENGINEERING "\xee\xa8\xbd" // U+ea3d +#define ICON_MD_ENHANCE_PHOTO_TRANSLATE "\xee\xa3\xbc" // U+e8fc +#define ICON_MD_ENHANCED_ENCRYPTION "\xee\x98\xbf" // U+e63f +#define ICON_MD_EQUALIZER "\xee\x80\x9d" // U+e01d +#define ICON_MD_ERROR "\xee\x80\x80" // U+e000 +#define ICON_MD_ERROR_OUTLINE "\xee\x80\x81" // U+e001 +#define ICON_MD_ESCALATOR "\xef\x86\xa1" // U+f1a1 +#define ICON_MD_ESCALATOR_WARNING "\xef\x86\xac" // U+f1ac +#define ICON_MD_EURO "\xee\xa8\x95" // U+ea15 +#define ICON_MD_EURO_SYMBOL "\xee\xa4\xa6" // U+e926 +#define ICON_MD_EV_STATION "\xee\x95\xad" // U+e56d +#define ICON_MD_EVENT "\xee\xa1\xb8" // U+e878 +#define ICON_MD_EVENT_AVAILABLE "\xee\x98\x94" // U+e614 +#define ICON_MD_EVENT_BUSY "\xee\x98\x95" // U+e615 +#define ICON_MD_EVENT_NOTE "\xee\x98\x96" // U+e616 +#define ICON_MD_EVENT_REPEAT "\xee\xad\xbb" // U+eb7b +#define ICON_MD_EVENT_SEAT "\xee\xa4\x83" // U+e903 +#define ICON_MD_EXIT_TO_APP "\xee\xa1\xb9" // U+e879 +#define ICON_MD_EXPAND "\xee\xa5\x8f" // U+e94f +#define ICON_MD_EXPAND_CIRCLE_DOWN "\xee\x9f\x8d" // U+e7cd +#define ICON_MD_EXPAND_LESS "\xee\x97\x8e" // U+e5ce +#define ICON_MD_EXPAND_MORE "\xee\x97\x8f" // U+e5cf +#define ICON_MD_EXPLICIT "\xee\x80\x9e" // U+e01e +#define ICON_MD_EXPLORE "\xee\xa1\xba" // U+e87a +#define ICON_MD_EXPLORE_OFF "\xee\xa6\xa8" // U+e9a8 +#define ICON_MD_EXPOSURE "\xee\x8f\x8a" // U+e3ca +#define ICON_MD_EXPOSURE_MINUS_1 "\xee\x8f\x8b" // U+e3cb +#define ICON_MD_EXPOSURE_MINUS_2 "\xee\x8f\x8c" // U+e3cc +#define ICON_MD_EXPOSURE_NEG_1 "\xee\x8f\x8b" // U+e3cb +#define ICON_MD_EXPOSURE_NEG_2 "\xee\x8f\x8c" // U+e3cc +#define ICON_MD_EXPOSURE_PLUS_1 "\xee\x8f\x8d" // U+e3cd +#define ICON_MD_EXPOSURE_PLUS_2 "\xee\x8f\x8e" // U+e3ce +#define ICON_MD_EXPOSURE_ZERO "\xee\x8f\x8f" // U+e3cf +#define ICON_MD_EXTENSION "\xee\xa1\xbb" // U+e87b +#define ICON_MD_EXTENSION_OFF "\xee\x93\xb5" // U+e4f5 +#define ICON_MD_FACE "\xee\xa1\xbc" // U+e87c +#define ICON_MD_FACE_RETOUCHING_NATURAL "\xee\xbd\x8e" // U+ef4e +#define ICON_MD_FACE_RETOUCHING_OFF "\xef\x80\x87" // U+f007 +#define ICON_MD_FACEBOOK "\xef\x88\xb4" // U+f234 +#define ICON_MD_FACT_CHECK "\xef\x83\x85" // U+f0c5 +#define ICON_MD_FACTORY "\xee\xae\xbc" // U+ebbc +#define ICON_MD_FAMILY_RESTROOM "\xef\x86\xa2" // U+f1a2 +#define ICON_MD_FAST_FORWARD "\xee\x80\x9f" // U+e01f +#define ICON_MD_FAST_REWIND "\xee\x80\xa0" // U+e020 +#define ICON_MD_FASTFOOD "\xee\x95\xba" // U+e57a +#define ICON_MD_FAVORITE "\xee\xa1\xbd" // U+e87d +#define ICON_MD_FAVORITE_BORDER "\xee\xa1\xbe" // U+e87e +#define ICON_MD_FAVORITE_OUTLINE "\xee\xa1\xbe" // U+e87e +#define ICON_MD_FAX "\xee\xab\x98" // U+ead8 +#define ICON_MD_FEATURED_PLAY_LIST "\xee\x81\xad" // U+e06d +#define ICON_MD_FEATURED_VIDEO "\xee\x81\xae" // U+e06e +#define ICON_MD_FEED "\xef\x80\x89" // U+f009 +#define ICON_MD_FEEDBACK "\xee\xa1\xbf" // U+e87f +#define ICON_MD_FEMALE "\xee\x96\x90" // U+e590 +#define ICON_MD_FENCE "\xef\x87\xb6" // U+f1f6 +#define ICON_MD_FESTIVAL "\xee\xa9\xa8" // U+ea68 +#define ICON_MD_FIBER_DVR "\xee\x81\x9d" // U+e05d +#define ICON_MD_FIBER_MANUAL_RECORD "\xee\x81\xa1" // U+e061 +#define ICON_MD_FIBER_NEW "\xee\x81\x9e" // U+e05e +#define ICON_MD_FIBER_PIN "\xee\x81\xaa" // U+e06a +#define ICON_MD_FIBER_SMART_RECORD "\xee\x81\xa2" // U+e062 +#define ICON_MD_FILE_COPY "\xee\x85\xb3" // U+e173 +#define ICON_MD_FILE_DOWNLOAD "\xee\x8b\x84" // U+e2c4 +#define ICON_MD_FILE_DOWNLOAD_DONE "\xee\xa6\xaa" // U+e9aa +#define ICON_MD_FILE_DOWNLOAD_OFF "\xee\x93\xbe" // U+e4fe +#define ICON_MD_FILE_OPEN "\xee\xab\xb3" // U+eaf3 +#define ICON_MD_FILE_PRESENT "\xee\xa8\x8e" // U+ea0e +#define ICON_MD_FILE_UPLOAD "\xee\x8b\x86" // U+e2c6 +#define ICON_MD_FILTER "\xee\x8f\x93" // U+e3d3 +#define ICON_MD_FILTER_1 "\xee\x8f\x90" // U+e3d0 +#define ICON_MD_FILTER_2 "\xee\x8f\x91" // U+e3d1 +#define ICON_MD_FILTER_3 "\xee\x8f\x92" // U+e3d2 +#define ICON_MD_FILTER_4 "\xee\x8f\x94" // U+e3d4 +#define ICON_MD_FILTER_5 "\xee\x8f\x95" // U+e3d5 +#define ICON_MD_FILTER_6 "\xee\x8f\x96" // U+e3d6 +#define ICON_MD_FILTER_7 "\xee\x8f\x97" // U+e3d7 +#define ICON_MD_FILTER_8 "\xee\x8f\x98" // U+e3d8 +#define ICON_MD_FILTER_9 "\xee\x8f\x99" // U+e3d9 +#define ICON_MD_FILTER_9_PLUS "\xee\x8f\x9a" // U+e3da +#define ICON_MD_FILTER_ALT "\xee\xbd\x8f" // U+ef4f +#define ICON_MD_FILTER_ALT_OFF "\xee\xac\xb2" // U+eb32 +#define ICON_MD_FILTER_B_AND_W "\xee\x8f\x9b" // U+e3db +#define ICON_MD_FILTER_CENTER_FOCUS "\xee\x8f\x9c" // U+e3dc +#define ICON_MD_FILTER_DRAMA "\xee\x8f\x9d" // U+e3dd +#define ICON_MD_FILTER_FRAMES "\xee\x8f\x9e" // U+e3de +#define ICON_MD_FILTER_HDR "\xee\x8f\x9f" // U+e3df +#define ICON_MD_FILTER_LIST "\xee\x85\x92" // U+e152 +#define ICON_MD_FILTER_LIST_ALT "\xee\xa5\x8e" // U+e94e +#define ICON_MD_FILTER_LIST_OFF "\xee\xad\x97" // U+eb57 +#define ICON_MD_FILTER_NONE "\xee\x8f\xa0" // U+e3e0 +#define ICON_MD_FILTER_TILT_SHIFT "\xee\x8f\xa2" // U+e3e2 +#define ICON_MD_FILTER_VINTAGE "\xee\x8f\xa3" // U+e3e3 +#define ICON_MD_FIND_IN_PAGE "\xee\xa2\x80" // U+e880 +#define ICON_MD_FIND_REPLACE "\xee\xa2\x81" // U+e881 +#define ICON_MD_FINGERPRINT "\xee\xa4\x8d" // U+e90d +#define ICON_MD_FIRE_EXTINGUISHER "\xef\x87\x98" // U+f1d8 +#define ICON_MD_FIRE_HYDRANT "\xef\x86\xa3" // U+f1a3 +#define ICON_MD_FIREPLACE "\xee\xa9\x83" // U+ea43 +#define ICON_MD_FIRST_PAGE "\xee\x97\x9c" // U+e5dc +#define ICON_MD_FIT_SCREEN "\xee\xa8\x90" // U+ea10 +#define ICON_MD_FITBIT "\xee\xa0\xab" // U+e82b +#define ICON_MD_FITNESS_CENTER "\xee\xad\x83" // U+eb43 +#define ICON_MD_FLAG "\xee\x85\x93" // U+e153 +#define ICON_MD_FLAG_CIRCLE "\xee\xab\xb8" // U+eaf8 +#define ICON_MD_FLAKY "\xee\xbd\x90" // U+ef50 +#define ICON_MD_FLARE "\xee\x8f\xa4" // U+e3e4 +#define ICON_MD_FLASH_AUTO "\xee\x8f\xa5" // U+e3e5 +#define ICON_MD_FLASH_OFF "\xee\x8f\xa6" // U+e3e6 +#define ICON_MD_FLASH_ON "\xee\x8f\xa7" // U+e3e7 +#define ICON_MD_FLASHLIGHT_OFF "\xef\x80\x8a" // U+f00a +#define ICON_MD_FLASHLIGHT_ON "\xef\x80\x8b" // U+f00b +#define ICON_MD_FLATWARE "\xef\x80\x8c" // U+f00c +#define ICON_MD_FLIGHT "\xee\x94\xb9" // U+e539 +#define ICON_MD_FLIGHT_CLASS "\xee\x9f\x8b" // U+e7cb +#define ICON_MD_FLIGHT_LAND "\xee\xa4\x84" // U+e904 +#define ICON_MD_FLIGHT_TAKEOFF "\xee\xa4\x85" // U+e905 +#define ICON_MD_FLIP "\xee\x8f\xa8" // U+e3e8 +#define ICON_MD_FLIP_CAMERA_ANDROID "\xee\xa8\xb7" // U+ea37 +#define ICON_MD_FLIP_CAMERA_IOS "\xee\xa8\xb8" // U+ea38 +#define ICON_MD_FLIP_TO_BACK "\xee\xa2\x82" // U+e882 +#define ICON_MD_FLIP_TO_FRONT "\xee\xa2\x83" // U+e883 +#define ICON_MD_FLOOD "\xee\xaf\xa6" // U+ebe6 +#define ICON_MD_FLOURESCENT "\xef\x80\x8d" // U+f00d +#define ICON_MD_FLUTTER_DASH "\xee\x80\x8b" // U+e00b +#define ICON_MD_FMD_BAD "\xef\x80\x8e" // U+f00e +#define ICON_MD_FMD_GOOD "\xef\x80\x8f" // U+f00f +#define ICON_MD_FOGGY "\xee\xa0\x98" // U+e818 +#define ICON_MD_FOLDER "\xee\x8b\x87" // U+e2c7 +#define ICON_MD_FOLDER_COPY "\xee\xae\xbd" // U+ebbd +#define ICON_MD_FOLDER_DELETE "\xee\xac\xb4" // U+eb34 +#define ICON_MD_FOLDER_OFF "\xee\xae\x83" // U+eb83 +#define ICON_MD_FOLDER_OPEN "\xee\x8b\x88" // U+e2c8 +#define ICON_MD_FOLDER_SHARED "\xee\x8b\x89" // U+e2c9 +#define ICON_MD_FOLDER_SPECIAL "\xee\x98\x97" // U+e617 +#define ICON_MD_FOLDER_ZIP "\xee\xac\xac" // U+eb2c +#define ICON_MD_FOLLOW_THE_SIGNS "\xef\x88\xa2" // U+f222 +#define ICON_MD_FONT_DOWNLOAD "\xee\x85\xa7" // U+e167 +#define ICON_MD_FONT_DOWNLOAD_OFF "\xee\x93\xb9" // U+e4f9 +#define ICON_MD_FOOD_BANK "\xef\x87\xb2" // U+f1f2 +#define ICON_MD_FOREST "\xee\xaa\x99" // U+ea99 +#define ICON_MD_FORK_LEFT "\xee\xae\xa0" // U+eba0 +#define ICON_MD_FORK_RIGHT "\xee\xae\xac" // U+ebac +#define ICON_MD_FORMAT_ALIGN_CENTER "\xee\x88\xb4" // U+e234 +#define ICON_MD_FORMAT_ALIGN_JUSTIFY "\xee\x88\xb5" // U+e235 +#define ICON_MD_FORMAT_ALIGN_LEFT "\xee\x88\xb6" // U+e236 +#define ICON_MD_FORMAT_ALIGN_RIGHT "\xee\x88\xb7" // U+e237 +#define ICON_MD_FORMAT_BOLD "\xee\x88\xb8" // U+e238 +#define ICON_MD_FORMAT_CLEAR "\xee\x88\xb9" // U+e239 +#define ICON_MD_FORMAT_COLOR_FILL "\xee\x88\xba" // U+e23a +#define ICON_MD_FORMAT_COLOR_RESET "\xee\x88\xbb" // U+e23b +#define ICON_MD_FORMAT_COLOR_TEXT "\xee\x88\xbc" // U+e23c +#define ICON_MD_FORMAT_INDENT_DECREASE "\xee\x88\xbd" // U+e23d +#define ICON_MD_FORMAT_INDENT_INCREASE "\xee\x88\xbe" // U+e23e +#define ICON_MD_FORMAT_ITALIC "\xee\x88\xbf" // U+e23f +#define ICON_MD_FORMAT_LINE_SPACING "\xee\x89\x80" // U+e240 +#define ICON_MD_FORMAT_LIST_BULLETED "\xee\x89\x81" // U+e241 +#define ICON_MD_FORMAT_LIST_NUMBERED "\xee\x89\x82" // U+e242 +#define ICON_MD_FORMAT_LIST_NUMBERED_RTL "\xee\x89\xa7" // U+e267 +#define ICON_MD_FORMAT_OVERLINE "\xee\xad\xa5" // U+eb65 +#define ICON_MD_FORMAT_PAINT "\xee\x89\x83" // U+e243 +#define ICON_MD_FORMAT_QUOTE "\xee\x89\x84" // U+e244 +#define ICON_MD_FORMAT_SHAPES "\xee\x89\x9e" // U+e25e +#define ICON_MD_FORMAT_SIZE "\xee\x89\x85" // U+e245 +#define ICON_MD_FORMAT_STRIKETHROUGH "\xee\x89\x86" // U+e246 +#define ICON_MD_FORMAT_TEXTDIRECTION_L_TO_R "\xee\x89\x87" // U+e247 +#define ICON_MD_FORMAT_TEXTDIRECTION_R_TO_L "\xee\x89\x88" // U+e248 +#define ICON_MD_FORMAT_UNDERLINE "\xee\x89\x89" // U+e249 +#define ICON_MD_FORMAT_UNDERLINED "\xee\x89\x89" // U+e249 +#define ICON_MD_FORT "\xee\xaa\xad" // U+eaad +#define ICON_MD_FORUM "\xee\x82\xbf" // U+e0bf +#define ICON_MD_FORWARD "\xee\x85\x94" // U+e154 +#define ICON_MD_FORWARD_10 "\xee\x81\x96" // U+e056 +#define ICON_MD_FORWARD_30 "\xee\x81\x97" // U+e057 +#define ICON_MD_FORWARD_5 "\xee\x81\x98" // U+e058 +#define ICON_MD_FORWARD_TO_INBOX "\xef\x86\x87" // U+f187 +#define ICON_MD_FOUNDATION "\xef\x88\x80" // U+f200 +#define ICON_MD_FREE_BREAKFAST "\xee\xad\x84" // U+eb44 +#define ICON_MD_FREE_CANCELLATION "\xee\x9d\x88" // U+e748 +#define ICON_MD_FRONT_HAND "\xee\x9d\xa9" // U+e769 +#define ICON_MD_FULLSCREEN "\xee\x97\x90" // U+e5d0 +#define ICON_MD_FULLSCREEN_EXIT "\xee\x97\x91" // U+e5d1 +#define ICON_MD_FUNCTIONS "\xee\x89\x8a" // U+e24a +#define ICON_MD_G_MOBILEDATA "\xef\x80\x90" // U+f010 +#define ICON_MD_G_TRANSLATE "\xee\xa4\xa7" // U+e927 +#define ICON_MD_GAMEPAD "\xee\x8c\x8f" // U+e30f +#define ICON_MD_GAMES "\xee\x80\xa1" // U+e021 +#define ICON_MD_GARAGE "\xef\x80\x91" // U+f011 +#define ICON_MD_GAS_METER "\xee\xb0\x99" // U+ec19 +#define ICON_MD_GAVEL "\xee\xa4\x8e" // U+e90e +#define ICON_MD_GENERATING_TOKENS "\xee\x9d\x89" // U+e749 +#define ICON_MD_GESTURE "\xee\x85\x95" // U+e155 +#define ICON_MD_GET_APP "\xee\xa2\x84" // U+e884 +#define ICON_MD_GIF "\xee\xa4\x88" // U+e908 +#define ICON_MD_GIF_BOX "\xee\x9e\xa3" // U+e7a3 +#define ICON_MD_GIRL "\xee\xad\xa8" // U+eb68 +#define ICON_MD_GITE "\xee\x96\x8b" // U+e58b +// #define ICON_MD_GOAT "\xf4\x8f\xbf\xbd" // U+10fffd +#define ICON_MD_GOLF_COURSE "\xee\xad\x85" // U+eb45 +#define ICON_MD_GPP_BAD "\xef\x80\x92" // U+f012 +#define ICON_MD_GPP_GOOD "\xef\x80\x93" // U+f013 +#define ICON_MD_GPP_MAYBE "\xef\x80\x94" // U+f014 +#define ICON_MD_GPS_FIXED "\xee\x86\xb3" // U+e1b3 +#define ICON_MD_GPS_NOT_FIXED "\xee\x86\xb4" // U+e1b4 +#define ICON_MD_GPS_OFF "\xee\x86\xb5" // U+e1b5 +#define ICON_MD_GRADE "\xee\xa2\x85" // U+e885 +#define ICON_MD_GRADIENT "\xee\x8f\xa9" // U+e3e9 +#define ICON_MD_GRADING "\xee\xa9\x8f" // U+ea4f +#define ICON_MD_GRAIN "\xee\x8f\xaa" // U+e3ea +#define ICON_MD_GRAPHIC_EQ "\xee\x86\xb8" // U+e1b8 +#define ICON_MD_GRASS "\xef\x88\x85" // U+f205 +#define ICON_MD_GRID_3X3 "\xef\x80\x95" // U+f015 +#define ICON_MD_GRID_4X4 "\xef\x80\x96" // U+f016 +#define ICON_MD_GRID_GOLDENRATIO "\xef\x80\x97" // U+f017 +#define ICON_MD_GRID_OFF "\xee\x8f\xab" // U+e3eb +#define ICON_MD_GRID_ON "\xee\x8f\xac" // U+e3ec +#define ICON_MD_GRID_VIEW "\xee\xa6\xb0" // U+e9b0 +#define ICON_MD_GROUP "\xee\x9f\xaf" // U+e7ef +#define ICON_MD_GROUP_ADD "\xee\x9f\xb0" // U+e7f0 +#define ICON_MD_GROUP_OFF "\xee\x9d\x87" // U+e747 +#define ICON_MD_GROUP_REMOVE "\xee\x9e\xad" // U+e7ad +#define ICON_MD_GROUP_WORK "\xee\xa2\x86" // U+e886 +#define ICON_MD_GROUPS "\xef\x88\xb3" // U+f233 +#define ICON_MD_H_MOBILEDATA "\xef\x80\x98" // U+f018 +#define ICON_MD_H_PLUS_MOBILEDATA "\xef\x80\x99" // U+f019 +#define ICON_MD_HAIL "\xee\xa6\xb1" // U+e9b1 +#define ICON_MD_HANDSHAKE "\xee\xaf\x8b" // U+ebcb +#define ICON_MD_HANDYMAN "\xef\x84\x8b" // U+f10b +#define ICON_MD_HARDWARE "\xee\xa9\x99" // U+ea59 +#define ICON_MD_HD "\xee\x81\x92" // U+e052 +#define ICON_MD_HDR_AUTO "\xef\x80\x9a" // U+f01a +#define ICON_MD_HDR_AUTO_SELECT "\xef\x80\x9b" // U+f01b +#define ICON_MD_HDR_ENHANCED_SELECT "\xee\xbd\x91" // U+ef51 +#define ICON_MD_HDR_OFF "\xee\x8f\xad" // U+e3ed +#define ICON_MD_HDR_OFF_SELECT "\xef\x80\x9c" // U+f01c +#define ICON_MD_HDR_ON "\xee\x8f\xae" // U+e3ee +#define ICON_MD_HDR_ON_SELECT "\xef\x80\x9d" // U+f01d +#define ICON_MD_HDR_PLUS "\xef\x80\x9e" // U+f01e +#define ICON_MD_HDR_STRONG "\xee\x8f\xb1" // U+e3f1 +#define ICON_MD_HDR_WEAK "\xee\x8f\xb2" // U+e3f2 +#define ICON_MD_HEADPHONES "\xef\x80\x9f" // U+f01f +#define ICON_MD_HEADPHONES_BATTERY "\xef\x80\xa0" // U+f020 +#define ICON_MD_HEADSET "\xee\x8c\x90" // U+e310 +#define ICON_MD_HEADSET_MIC "\xee\x8c\x91" // U+e311 +#define ICON_MD_HEADSET_OFF "\xee\x8c\xba" // U+e33a +#define ICON_MD_HEALING "\xee\x8f\xb3" // U+e3f3 +#define ICON_MD_HEALTH_AND_SAFETY "\xee\x87\x95" // U+e1d5 +#define ICON_MD_HEARING "\xee\x80\xa3" // U+e023 +#define ICON_MD_HEARING_DISABLED "\xef\x84\x84" // U+f104 +#define ICON_MD_HEART_BROKEN "\xee\xab\x82" // U+eac2 +#define ICON_MD_HEAT_PUMP "\xee\xb0\x98" // U+ec18 +#define ICON_MD_HEIGHT "\xee\xa8\x96" // U+ea16 +#define ICON_MD_HELP "\xee\xa2\x87" // U+e887 +#define ICON_MD_HELP_CENTER "\xef\x87\x80" // U+f1c0 +#define ICON_MD_HELP_OUTLINE "\xee\xa3\xbd" // U+e8fd +#define ICON_MD_HEVC "\xef\x80\xa1" // U+f021 +#define ICON_MD_HEXAGON "\xee\xac\xb9" // U+eb39 +#define ICON_MD_HIDE_IMAGE "\xef\x80\xa2" // U+f022 +#define ICON_MD_HIDE_SOURCE "\xef\x80\xa3" // U+f023 +#define ICON_MD_HIGH_QUALITY "\xee\x80\xa4" // U+e024 +#define ICON_MD_HIGHLIGHT "\xee\x89\x9f" // U+e25f +#define ICON_MD_HIGHLIGHT_ALT "\xee\xbd\x92" // U+ef52 +#define ICON_MD_HIGHLIGHT_OFF "\xee\xa2\x88" // U+e888 +#define ICON_MD_HIGHLIGHT_REMOVE "\xee\xa2\x88" // U+e888 +#define ICON_MD_HIKING "\xee\x94\x8a" // U+e50a +#define ICON_MD_HISTORY "\xee\xa2\x89" // U+e889 +#define ICON_MD_HISTORY_EDU "\xee\xa8\xbe" // U+ea3e +#define ICON_MD_HISTORY_TOGGLE_OFF "\xef\x85\xbd" // U+f17d +#define ICON_MD_HIVE "\xee\xaa\xa6" // U+eaa6 +#define ICON_MD_HLS "\xee\xae\x8a" // U+eb8a +#define ICON_MD_HLS_OFF "\xee\xae\x8c" // U+eb8c +#define ICON_MD_HOLIDAY_VILLAGE "\xee\x96\x8a" // U+e58a +#define ICON_MD_HOME "\xee\xa2\x8a" // U+e88a +#define ICON_MD_HOME_FILLED "\xee\xa6\xb2" // U+e9b2 +#define ICON_MD_HOME_MAX "\xef\x80\xa4" // U+f024 +#define ICON_MD_HOME_MINI "\xef\x80\xa5" // U+f025 +#define ICON_MD_HOME_REPAIR_SERVICE "\xef\x84\x80" // U+f100 +#define ICON_MD_HOME_WORK "\xee\xa8\x89" // U+ea09 +#define ICON_MD_HORIZONTAL_DISTRIBUTE "\xee\x80\x94" // U+e014 +#define ICON_MD_HORIZONTAL_RULE "\xef\x84\x88" // U+f108 +#define ICON_MD_HORIZONTAL_SPLIT "\xee\xa5\x87" // U+e947 +#define ICON_MD_HOT_TUB "\xee\xad\x86" // U+eb46 +#define ICON_MD_HOTEL "\xee\x94\xba" // U+e53a +#define ICON_MD_HOTEL_CLASS "\xee\x9d\x83" // U+e743 +#define ICON_MD_HOURGLASS_BOTTOM "\xee\xa9\x9c" // U+ea5c +#define ICON_MD_HOURGLASS_DISABLED "\xee\xbd\x93" // U+ef53 +#define ICON_MD_HOURGLASS_EMPTY "\xee\xa2\x8b" // U+e88b +#define ICON_MD_HOURGLASS_FULL "\xee\xa2\x8c" // U+e88c +#define ICON_MD_HOURGLASS_TOP "\xee\xa9\x9b" // U+ea5b +#define ICON_MD_HOUSE "\xee\xa9\x84" // U+ea44 +#define ICON_MD_HOUSE_SIDING "\xef\x88\x82" // U+f202 +#define ICON_MD_HOUSEBOAT "\xee\x96\x84" // U+e584 +#define ICON_MD_HOW_TO_REG "\xee\x85\xb4" // U+e174 +#define ICON_MD_HOW_TO_VOTE "\xee\x85\xb5" // U+e175 +#define ICON_MD_HTML "\xee\xad\xbe" // U+eb7e +#define ICON_MD_HTTP "\xee\xa4\x82" // U+e902 +#define ICON_MD_HTTPS "\xee\xa2\x8d" // U+e88d +#define ICON_MD_HUB "\xee\xa7\xb4" // U+e9f4 +#define ICON_MD_HVAC "\xef\x84\x8e" // U+f10e +#define ICON_MD_ICE_SKATING "\xee\x94\x8b" // U+e50b +#define ICON_MD_ICECREAM "\xee\xa9\xa9" // U+ea69 +#define ICON_MD_IMAGE "\xee\x8f\xb4" // U+e3f4 +#define ICON_MD_IMAGE_ASPECT_RATIO "\xee\x8f\xb5" // U+e3f5 +#define ICON_MD_IMAGE_NOT_SUPPORTED "\xef\x84\x96" // U+f116 +#define ICON_MD_IMAGE_SEARCH "\xee\x90\xbf" // U+e43f +#define ICON_MD_IMAGESEARCH_ROLLER "\xee\xa6\xb4" // U+e9b4 +#define ICON_MD_IMPORT_CONTACTS "\xee\x83\xa0" // U+e0e0 +#define ICON_MD_IMPORT_EXPORT "\xee\x83\x83" // U+e0c3 +#define ICON_MD_IMPORTANT_DEVICES "\xee\xa4\x92" // U+e912 +#define ICON_MD_INBOX "\xee\x85\x96" // U+e156 +#define ICON_MD_INCOMPLETE_CIRCLE "\xee\x9e\x9b" // U+e79b +#define ICON_MD_INDETERMINATE_CHECK_BOX "\xee\xa4\x89" // U+e909 +#define ICON_MD_INFO "\xee\xa2\x8e" // U+e88e +#define ICON_MD_INFO_OUTLINE "\xee\xa2\x8f" // U+e88f +#define ICON_MD_INPUT "\xee\xa2\x90" // U+e890 +#define ICON_MD_INSERT_CHART "\xee\x89\x8b" // U+e24b +#define ICON_MD_INSERT_CHART_OUTLINED "\xee\x89\xaa" // U+e26a +#define ICON_MD_INSERT_COMMENT "\xee\x89\x8c" // U+e24c +#define ICON_MD_INSERT_DRIVE_FILE "\xee\x89\x8d" // U+e24d +#define ICON_MD_INSERT_EMOTICON "\xee\x89\x8e" // U+e24e +#define ICON_MD_INSERT_INVITATION "\xee\x89\x8f" // U+e24f +#define ICON_MD_INSERT_LINK "\xee\x89\x90" // U+e250 +#define ICON_MD_INSERT_PAGE_BREAK "\xee\xab\x8a" // U+eaca +#define ICON_MD_INSERT_PHOTO "\xee\x89\x91" // U+e251 +#define ICON_MD_INSIGHTS "\xef\x82\x92" // U+f092 +#define ICON_MD_INSTALL_DESKTOP "\xee\xad\xb1" // U+eb71 +#define ICON_MD_INSTALL_MOBILE "\xee\xad\xb2" // U+eb72 +#define ICON_MD_INTEGRATION_INSTRUCTIONS "\xee\xbd\x94" // U+ef54 +#define ICON_MD_INTERESTS "\xee\x9f\x88" // U+e7c8 +#define ICON_MD_INTERPRETER_MODE "\xee\xa0\xbb" // U+e83b +#define ICON_MD_INVENTORY "\xee\x85\xb9" // U+e179 +#define ICON_MD_INVENTORY_2 "\xee\x86\xa1" // U+e1a1 +#define ICON_MD_INVERT_COLORS "\xee\xa2\x91" // U+e891 +#define ICON_MD_INVERT_COLORS_OFF "\xee\x83\x84" // U+e0c4 +#define ICON_MD_INVERT_COLORS_ON "\xee\xa2\x91" // U+e891 +#define ICON_MD_IOS_SHARE "\xee\x9a\xb8" // U+e6b8 +#define ICON_MD_IRON "\xee\x96\x83" // U+e583 +#define ICON_MD_ISO "\xee\x8f\xb6" // U+e3f6 +#define ICON_MD_JAVASCRIPT "\xee\xad\xbc" // U+eb7c +#define ICON_MD_JOIN_FULL "\xee\xab\xab" // U+eaeb +#define ICON_MD_JOIN_INNER "\xee\xab\xb4" // U+eaf4 +#define ICON_MD_JOIN_LEFT "\xee\xab\xb2" // U+eaf2 +#define ICON_MD_JOIN_RIGHT "\xee\xab\xaa" // U+eaea +#define ICON_MD_KAYAKING "\xee\x94\x8c" // U+e50c +#define ICON_MD_KEBAB_DINING "\xee\xa1\x82" // U+e842 +#define ICON_MD_KEY "\xee\x9c\xbc" // U+e73c +#define ICON_MD_KEY_OFF "\xee\xae\x84" // U+eb84 +#define ICON_MD_KEYBOARD "\xee\x8c\x92" // U+e312 +#define ICON_MD_KEYBOARD_ALT "\xef\x80\xa8" // U+f028 +#define ICON_MD_KEYBOARD_ARROW_DOWN "\xee\x8c\x93" // U+e313 +#define ICON_MD_KEYBOARD_ARROW_LEFT "\xee\x8c\x94" // U+e314 +#define ICON_MD_KEYBOARD_ARROW_RIGHT "\xee\x8c\x95" // U+e315 +#define ICON_MD_KEYBOARD_ARROW_UP "\xee\x8c\x96" // U+e316 +#define ICON_MD_KEYBOARD_BACKSPACE "\xee\x8c\x97" // U+e317 +#define ICON_MD_KEYBOARD_CAPSLOCK "\xee\x8c\x98" // U+e318 +#define ICON_MD_KEYBOARD_COMMAND "\xee\xab\xa0" // U+eae0 +#define ICON_MD_KEYBOARD_COMMAND_KEY "\xee\xab\xa7" // U+eae7 +#define ICON_MD_KEYBOARD_CONTROL "\xee\x97\x93" // U+e5d3 +#define ICON_MD_KEYBOARD_CONTROL_KEY "\xee\xab\xa6" // U+eae6 +#define ICON_MD_KEYBOARD_DOUBLE_ARROW_DOWN "\xee\xab\x90" // U+ead0 +#define ICON_MD_KEYBOARD_DOUBLE_ARROW_LEFT "\xee\xab\x83" // U+eac3 +#define ICON_MD_KEYBOARD_DOUBLE_ARROW_RIGHT "\xee\xab\x89" // U+eac9 +#define ICON_MD_KEYBOARD_DOUBLE_ARROW_UP "\xee\xab\x8f" // U+eacf +#define ICON_MD_KEYBOARD_HIDE "\xee\x8c\x9a" // U+e31a +#define ICON_MD_KEYBOARD_OPTION "\xee\xab\x9f" // U+eadf +#define ICON_MD_KEYBOARD_OPTION_KEY "\xee\xab\xa8" // U+eae8 +#define ICON_MD_KEYBOARD_RETURN "\xee\x8c\x9b" // U+e31b +#define ICON_MD_KEYBOARD_TAB "\xee\x8c\x9c" // U+e31c +#define ICON_MD_KEYBOARD_VOICE "\xee\x8c\x9d" // U+e31d +#define ICON_MD_KING_BED "\xee\xa9\x85" // U+ea45 +#define ICON_MD_KITCHEN "\xee\xad\x87" // U+eb47 +#define ICON_MD_KITESURFING "\xee\x94\x8d" // U+e50d +#define ICON_MD_LABEL "\xee\xa2\x92" // U+e892 +#define ICON_MD_LABEL_IMPORTANT "\xee\xa4\xb7" // U+e937 +#define ICON_MD_LABEL_IMPORTANT_OUTLINE "\xee\xa5\x88" // U+e948 +#define ICON_MD_LABEL_OFF "\xee\xa6\xb6" // U+e9b6 +#define ICON_MD_LABEL_OUTLINE "\xee\xa2\x93" // U+e893 +#define ICON_MD_LAN "\xee\xac\xaf" // U+eb2f +#define ICON_MD_LANDSCAPE "\xee\x8f\xb7" // U+e3f7 +#define ICON_MD_LANDSLIDE "\xee\xaf\x97" // U+ebd7 +#define ICON_MD_LANGUAGE "\xee\xa2\x94" // U+e894 +#define ICON_MD_LAPTOP "\xee\x8c\x9e" // U+e31e +#define ICON_MD_LAPTOP_CHROMEBOOK "\xee\x8c\x9f" // U+e31f +#define ICON_MD_LAPTOP_MAC "\xee\x8c\xa0" // U+e320 +#define ICON_MD_LAPTOP_WINDOWS "\xee\x8c\xa1" // U+e321 +#define ICON_MD_LAST_PAGE "\xee\x97\x9d" // U+e5dd +#define ICON_MD_LAUNCH "\xee\xa2\x95" // U+e895 +#define ICON_MD_LAYERS "\xee\x94\xbb" // U+e53b +#define ICON_MD_LAYERS_CLEAR "\xee\x94\xbc" // U+e53c +#define ICON_MD_LEADERBOARD "\xef\x88\x8c" // U+f20c +#define ICON_MD_LEAK_ADD "\xee\x8f\xb8" // U+e3f8 +#define ICON_MD_LEAK_REMOVE "\xee\x8f\xb9" // U+e3f9 +#define ICON_MD_LEAVE_BAGS_AT_HOME "\xef\x88\x9b" // U+f21b +#define ICON_MD_LEGEND_TOGGLE "\xef\x84\x9b" // U+f11b +#define ICON_MD_LENS "\xee\x8f\xba" // U+e3fa +#define ICON_MD_LENS_BLUR "\xef\x80\xa9" // U+f029 +#define ICON_MD_LIBRARY_ADD "\xee\x80\xae" // U+e02e +#define ICON_MD_LIBRARY_ADD_CHECK "\xee\xa6\xb7" // U+e9b7 +#define ICON_MD_LIBRARY_BOOKS "\xee\x80\xaf" // U+e02f +#define ICON_MD_LIBRARY_MUSIC "\xee\x80\xb0" // U+e030 +#define ICON_MD_LIGHT "\xef\x80\xaa" // U+f02a +#define ICON_MD_LIGHT_MODE "\xee\x94\x98" // U+e518 +#define ICON_MD_LIGHTBULB "\xee\x83\xb0" // U+e0f0 +#define ICON_MD_LIGHTBULB_CIRCLE "\xee\xaf\xbe" // U+ebfe +#define ICON_MD_LIGHTBULB_OUTLINE "\xee\xa4\x8f" // U+e90f +#define ICON_MD_LINE_AXIS "\xee\xaa\x9a" // U+ea9a +#define ICON_MD_LINE_STYLE "\xee\xa4\x99" // U+e919 +#define ICON_MD_LINE_WEIGHT "\xee\xa4\x9a" // U+e91a +#define ICON_MD_LINEAR_SCALE "\xee\x89\xa0" // U+e260 +#define ICON_MD_LINK "\xee\x85\x97" // U+e157 +#define ICON_MD_LINK_OFF "\xee\x85\xaf" // U+e16f +#define ICON_MD_LINKED_CAMERA "\xee\x90\xb8" // U+e438 +#define ICON_MD_LIQUOR "\xee\xa9\xa0" // U+ea60 +#define ICON_MD_LIST "\xee\xa2\x96" // U+e896 +#define ICON_MD_LIST_ALT "\xee\x83\xae" // U+e0ee +#define ICON_MD_LIVE_HELP "\xee\x83\x86" // U+e0c6 +#define ICON_MD_LIVE_TV "\xee\x98\xb9" // U+e639 +#define ICON_MD_LIVING "\xef\x80\xab" // U+f02b +#define ICON_MD_LOCAL_ACTIVITY "\xee\x94\xbf" // U+e53f +#define ICON_MD_LOCAL_AIRPORT "\xee\x94\xbd" // U+e53d +#define ICON_MD_LOCAL_ATM "\xee\x94\xbe" // U+e53e +#define ICON_MD_LOCAL_ATTRACTION "\xee\x94\xbf" // U+e53f +#define ICON_MD_LOCAL_BAR "\xee\x95\x80" // U+e540 +#define ICON_MD_LOCAL_CAFE "\xee\x95\x81" // U+e541 +#define ICON_MD_LOCAL_CAR_WASH "\xee\x95\x82" // U+e542 +#define ICON_MD_LOCAL_CONVENIENCE_STORE "\xee\x95\x83" // U+e543 +#define ICON_MD_LOCAL_DINING "\xee\x95\x96" // U+e556 +#define ICON_MD_LOCAL_DRINK "\xee\x95\x84" // U+e544 +#define ICON_MD_LOCAL_FIRE_DEPARTMENT "\xee\xbd\x95" // U+ef55 +#define ICON_MD_LOCAL_FLORIST "\xee\x95\x85" // U+e545 +#define ICON_MD_LOCAL_GAS_STATION "\xee\x95\x86" // U+e546 +#define ICON_MD_LOCAL_GROCERY_STORE "\xee\x95\x87" // U+e547 +#define ICON_MD_LOCAL_HOSPITAL "\xee\x95\x88" // U+e548 +#define ICON_MD_LOCAL_HOTEL "\xee\x95\x89" // U+e549 +#define ICON_MD_LOCAL_LAUNDRY_SERVICE "\xee\x95\x8a" // U+e54a +#define ICON_MD_LOCAL_LIBRARY "\xee\x95\x8b" // U+e54b +#define ICON_MD_LOCAL_MALL "\xee\x95\x8c" // U+e54c +#define ICON_MD_LOCAL_MOVIES "\xee\x95\x8d" // U+e54d +#define ICON_MD_LOCAL_OFFER "\xee\x95\x8e" // U+e54e +#define ICON_MD_LOCAL_PARKING "\xee\x95\x8f" // U+e54f +#define ICON_MD_LOCAL_PHARMACY "\xee\x95\x90" // U+e550 +#define ICON_MD_LOCAL_PHONE "\xee\x95\x91" // U+e551 +#define ICON_MD_LOCAL_PIZZA "\xee\x95\x92" // U+e552 +#define ICON_MD_LOCAL_PLAY "\xee\x95\x93" // U+e553 +#define ICON_MD_LOCAL_POLICE "\xee\xbd\x96" // U+ef56 +#define ICON_MD_LOCAL_POST_OFFICE "\xee\x95\x94" // U+e554 +#define ICON_MD_LOCAL_PRINT_SHOP "\xee\x95\x95" // U+e555 +#define ICON_MD_LOCAL_PRINTSHOP "\xee\x95\x95" // U+e555 +#define ICON_MD_LOCAL_RESTAURANT "\xee\x95\x96" // U+e556 +#define ICON_MD_LOCAL_SEE "\xee\x95\x97" // U+e557 +#define ICON_MD_LOCAL_SHIPPING "\xee\x95\x98" // U+e558 +#define ICON_MD_LOCAL_TAXI "\xee\x95\x99" // U+e559 +#define ICON_MD_LOCATION_CITY "\xee\x9f\xb1" // U+e7f1 +#define ICON_MD_LOCATION_DISABLED "\xee\x86\xb6" // U+e1b6 +#define ICON_MD_LOCATION_HISTORY "\xee\x95\x9a" // U+e55a +#define ICON_MD_LOCATION_OFF "\xee\x83\x87" // U+e0c7 +#define ICON_MD_LOCATION_ON "\xee\x83\x88" // U+e0c8 +#define ICON_MD_LOCATION_PIN "\xef\x87\x9b" // U+f1db +#define ICON_MD_LOCATION_SEARCHING "\xee\x86\xb7" // U+e1b7 +#define ICON_MD_LOCK "\xee\xa2\x97" // U+e897 +#define ICON_MD_LOCK_CLOCK "\xee\xbd\x97" // U+ef57 +#define ICON_MD_LOCK_OPEN "\xee\xa2\x98" // U+e898 +#define ICON_MD_LOCK_OUTLINE "\xee\xa2\x99" // U+e899 +#define ICON_MD_LOCK_PERSON "\xef\xa3\xb3" // U+f8f3 +#define ICON_MD_LOCK_RESET "\xee\xab\x9e" // U+eade +#define ICON_MD_LOGIN "\xee\xa9\xb7" // U+ea77 +#define ICON_MD_LOGO_DEV "\xee\xab\x96" // U+ead6 +#define ICON_MD_LOGOUT "\xee\xa6\xba" // U+e9ba +#define ICON_MD_LOOKS "\xee\x8f\xbc" // U+e3fc +#define ICON_MD_LOOKS_3 "\xee\x8f\xbb" // U+e3fb +#define ICON_MD_LOOKS_4 "\xee\x8f\xbd" // U+e3fd +#define ICON_MD_LOOKS_5 "\xee\x8f\xbe" // U+e3fe +#define ICON_MD_LOOKS_6 "\xee\x8f\xbf" // U+e3ff +#define ICON_MD_LOOKS_ONE "\xee\x90\x80" // U+e400 +#define ICON_MD_LOOKS_TWO "\xee\x90\x81" // U+e401 +#define ICON_MD_LOOP "\xee\x80\xa8" // U+e028 +#define ICON_MD_LOUPE "\xee\x90\x82" // U+e402 +#define ICON_MD_LOW_PRIORITY "\xee\x85\xad" // U+e16d +#define ICON_MD_LOYALTY "\xee\xa2\x9a" // U+e89a +#define ICON_MD_LTE_MOBILEDATA "\xef\x80\xac" // U+f02c +#define ICON_MD_LTE_PLUS_MOBILEDATA "\xef\x80\xad" // U+f02d +#define ICON_MD_LUGGAGE "\xef\x88\xb5" // U+f235 +#define ICON_MD_LUNCH_DINING "\xee\xa9\xa1" // U+ea61 +#define ICON_MD_LYRICS "\xee\xb0\x8b" // U+ec0b +#define ICON_MD_MAIL "\xee\x85\x98" // U+e158 +#define ICON_MD_MAIL_LOCK "\xee\xb0\x8a" // U+ec0a +#define ICON_MD_MAIL_OUTLINE "\xee\x83\xa1" // U+e0e1 +#define ICON_MD_MALE "\xee\x96\x8e" // U+e58e +#define ICON_MD_MAN "\xee\x93\xab" // U+e4eb +#define ICON_MD_MANAGE_ACCOUNTS "\xef\x80\xae" // U+f02e +#define ICON_MD_MANAGE_HISTORY "\xee\xaf\xa7" // U+ebe7 +#define ICON_MD_MANAGE_SEARCH "\xef\x80\xaf" // U+f02f +#define ICON_MD_MAP "\xee\x95\x9b" // U+e55b +#define ICON_MD_MAPS_HOME_WORK "\xef\x80\xb0" // U+f030 +#define ICON_MD_MAPS_UGC "\xee\xbd\x98" // U+ef58 +#define ICON_MD_MARGIN "\xee\xa6\xbb" // U+e9bb +#define ICON_MD_MARK_AS_UNREAD "\xee\xa6\xbc" // U+e9bc +#define ICON_MD_MARK_CHAT_READ "\xef\x86\x8b" // U+f18b +#define ICON_MD_MARK_CHAT_UNREAD "\xef\x86\x89" // U+f189 +#define ICON_MD_MARK_EMAIL_READ "\xef\x86\x8c" // U+f18c +#define ICON_MD_MARK_EMAIL_UNREAD "\xef\x86\x8a" // U+f18a +#define ICON_MD_MARK_UNREAD_CHAT_ALT "\xee\xae\x9d" // U+eb9d +#define ICON_MD_MARKUNREAD "\xee\x85\x99" // U+e159 +#define ICON_MD_MARKUNREAD_MAILBOX "\xee\xa2\x9b" // U+e89b +#define ICON_MD_MASKS "\xef\x88\x98" // U+f218 +#define ICON_MD_MAXIMIZE "\xee\xa4\xb0" // U+e930 +#define ICON_MD_MEDIA_BLUETOOTH_OFF "\xef\x80\xb1" // U+f031 +#define ICON_MD_MEDIA_BLUETOOTH_ON "\xef\x80\xb2" // U+f032 +#define ICON_MD_MEDIATION "\xee\xbe\xa7" // U+efa7 +#define ICON_MD_MEDICAL_INFORMATION "\xee\xaf\xad" // U+ebed +#define ICON_MD_MEDICAL_SERVICES "\xef\x84\x89" // U+f109 +#define ICON_MD_MEDICATION "\xef\x80\xb3" // U+f033 +#define ICON_MD_MEDICATION_LIQUID "\xee\xaa\x87" // U+ea87 +#define ICON_MD_MEETING_ROOM "\xee\xad\x8f" // U+eb4f +#define ICON_MD_MEMORY "\xee\x8c\xa2" // U+e322 +#define ICON_MD_MENU "\xee\x97\x92" // U+e5d2 +#define ICON_MD_MENU_BOOK "\xee\xa8\x99" // U+ea19 +#define ICON_MD_MENU_OPEN "\xee\xa6\xbd" // U+e9bd +#define ICON_MD_MERGE "\xee\xae\x98" // U+eb98 +#define ICON_MD_MERGE_TYPE "\xee\x89\x92" // U+e252 +#define ICON_MD_MESSAGE "\xee\x83\x89" // U+e0c9 +#define ICON_MD_MESSENGER "\xee\x83\x8a" // U+e0ca +#define ICON_MD_MESSENGER_OUTLINE "\xee\x83\x8b" // U+e0cb +#define ICON_MD_MIC "\xee\x80\xa9" // U+e029 +#define ICON_MD_MIC_EXTERNAL_OFF "\xee\xbd\x99" // U+ef59 +#define ICON_MD_MIC_EXTERNAL_ON "\xee\xbd\x9a" // U+ef5a +#define ICON_MD_MIC_NONE "\xee\x80\xaa" // U+e02a +#define ICON_MD_MIC_OFF "\xee\x80\xab" // U+e02b +#define ICON_MD_MICROWAVE "\xef\x88\x84" // U+f204 +#define ICON_MD_MILITARY_TECH "\xee\xa8\xbf" // U+ea3f +#define ICON_MD_MINIMIZE "\xee\xa4\xb1" // U+e931 +#define ICON_MD_MINOR_CRASH "\xee\xaf\xb1" // U+ebf1 +#define ICON_MD_MISCELLANEOUS_SERVICES "\xef\x84\x8c" // U+f10c +#define ICON_MD_MISSED_VIDEO_CALL "\xee\x81\xb3" // U+e073 +#define ICON_MD_MMS "\xee\x98\x98" // U+e618 +#define ICON_MD_MOBILE_FRIENDLY "\xee\x88\x80" // U+e200 +#define ICON_MD_MOBILE_OFF "\xee\x88\x81" // U+e201 +#define ICON_MD_MOBILE_SCREEN_SHARE "\xee\x83\xa7" // U+e0e7 +#define ICON_MD_MOBILEDATA_OFF "\xef\x80\xb4" // U+f034 +#define ICON_MD_MODE "\xef\x82\x97" // U+f097 +#define ICON_MD_MODE_COMMENT "\xee\x89\x93" // U+e253 +#define ICON_MD_MODE_EDIT "\xee\x89\x94" // U+e254 +#define ICON_MD_MODE_EDIT_OUTLINE "\xef\x80\xb5" // U+f035 +#define ICON_MD_MODE_FAN_OFF "\xee\xb0\x97" // U+ec17 +#define ICON_MD_MODE_NIGHT "\xef\x80\xb6" // U+f036 +#define ICON_MD_MODE_OF_TRAVEL "\xee\x9f\x8e" // U+e7ce +#define ICON_MD_MODE_STANDBY "\xef\x80\xb7" // U+f037 +#define ICON_MD_MODEL_TRAINING "\xef\x83\x8f" // U+f0cf +#define ICON_MD_MONETIZATION_ON "\xee\x89\xa3" // U+e263 +#define ICON_MD_MONEY "\xee\x95\xbd" // U+e57d +#define ICON_MD_MONEY_OFF "\xee\x89\x9c" // U+e25c +#define ICON_MD_MONEY_OFF_CSRED "\xef\x80\xb8" // U+f038 +#define ICON_MD_MONITOR "\xee\xbd\x9b" // U+ef5b +#define ICON_MD_MONITOR_HEART "\xee\xaa\xa2" // U+eaa2 +#define ICON_MD_MONITOR_WEIGHT "\xef\x80\xb9" // U+f039 +#define ICON_MD_MONOCHROME_PHOTOS "\xee\x90\x83" // U+e403 +#define ICON_MD_MOOD "\xee\x9f\xb2" // U+e7f2 +#define ICON_MD_MOOD_BAD "\xee\x9f\xb3" // U+e7f3 +#define ICON_MD_MOPED "\xee\xac\xa8" // U+eb28 +#define ICON_MD_MORE "\xee\x98\x99" // U+e619 +#define ICON_MD_MORE_HORIZ "\xee\x97\x93" // U+e5d3 +#define ICON_MD_MORE_TIME "\xee\xa9\x9d" // U+ea5d +#define ICON_MD_MORE_VERT "\xee\x97\x94" // U+e5d4 +#define ICON_MD_MOSQUE "\xee\xaa\xb2" // U+eab2 +#define ICON_MD_MOTION_PHOTOS_AUTO "\xef\x80\xba" // U+f03a +#define ICON_MD_MOTION_PHOTOS_OFF "\xee\xa7\x80" // U+e9c0 +#define ICON_MD_MOTION_PHOTOS_ON "\xee\xa7\x81" // U+e9c1 +#define ICON_MD_MOTION_PHOTOS_PAUSE "\xef\x88\xa7" // U+f227 +#define ICON_MD_MOTION_PHOTOS_PAUSED "\xee\xa7\x82" // U+e9c2 +#define ICON_MD_MOTORCYCLE "\xee\xa4\x9b" // U+e91b +#define ICON_MD_MOUSE "\xee\x8c\xa3" // U+e323 +#define ICON_MD_MOVE_DOWN "\xee\xad\xa1" // U+eb61 +#define ICON_MD_MOVE_TO_INBOX "\xee\x85\xa8" // U+e168 +#define ICON_MD_MOVE_UP "\xee\xad\xa4" // U+eb64 +#define ICON_MD_MOVIE "\xee\x80\xac" // U+e02c +#define ICON_MD_MOVIE_CREATION "\xee\x90\x84" // U+e404 +#define ICON_MD_MOVIE_FILTER "\xee\x90\xba" // U+e43a +#define ICON_MD_MOVING "\xee\x94\x81" // U+e501 +#define ICON_MD_MP "\xee\xa7\x83" // U+e9c3 +#define ICON_MD_MULTILINE_CHART "\xee\x9b\x9f" // U+e6df +#define ICON_MD_MULTIPLE_STOP "\xef\x86\xb9" // U+f1b9 +#define ICON_MD_MULTITRACK_AUDIO "\xee\x86\xb8" // U+e1b8 +#define ICON_MD_MUSEUM "\xee\xa8\xb6" // U+ea36 +#define ICON_MD_MUSIC_NOTE "\xee\x90\x85" // U+e405 +#define ICON_MD_MUSIC_OFF "\xee\x91\x80" // U+e440 +#define ICON_MD_MUSIC_VIDEO "\xee\x81\xa3" // U+e063 +#define ICON_MD_MY_LIBRARY_ADD "\xee\x80\xae" // U+e02e +#define ICON_MD_MY_LIBRARY_BOOKS "\xee\x80\xaf" // U+e02f +#define ICON_MD_MY_LIBRARY_MUSIC "\xee\x80\xb0" // U+e030 +#define ICON_MD_MY_LOCATION "\xee\x95\x9c" // U+e55c +#define ICON_MD_NAT "\xee\xbd\x9c" // U+ef5c +#define ICON_MD_NATURE "\xee\x90\x86" // U+e406 +#define ICON_MD_NATURE_PEOPLE "\xee\x90\x87" // U+e407 +#define ICON_MD_NAVIGATE_BEFORE "\xee\x90\x88" // U+e408 +#define ICON_MD_NAVIGATE_NEXT "\xee\x90\x89" // U+e409 +#define ICON_MD_NAVIGATION "\xee\x95\x9d" // U+e55d +#define ICON_MD_NEAR_ME "\xee\x95\xa9" // U+e569 +#define ICON_MD_NEAR_ME_DISABLED "\xef\x87\xaf" // U+f1ef +#define ICON_MD_NEARBY_ERROR "\xef\x80\xbb" // U+f03b +#define ICON_MD_NEARBY_OFF "\xef\x80\xbc" // U+f03c +#define ICON_MD_NEST_CAM_WIRED_STAND "\xee\xb0\x96" // U+ec16 +#define ICON_MD_NETWORK_CELL "\xee\x86\xb9" // U+e1b9 +#define ICON_MD_NETWORK_CHECK "\xee\x99\x80" // U+e640 +#define ICON_MD_NETWORK_LOCKED "\xee\x98\x9a" // U+e61a +#define ICON_MD_NETWORK_PING "\xee\xaf\x8a" // U+ebca +#define ICON_MD_NETWORK_WIFI "\xee\x86\xba" // U+e1ba +#define ICON_MD_NETWORK_WIFI_1_BAR "\xee\xaf\xa4" // U+ebe4 +#define ICON_MD_NETWORK_WIFI_2_BAR "\xee\xaf\x96" // U+ebd6 +#define ICON_MD_NETWORK_WIFI_3_BAR "\xee\xaf\xa1" // U+ebe1 +#define ICON_MD_NEW_LABEL "\xee\x98\x89" // U+e609 +#define ICON_MD_NEW_RELEASES "\xee\x80\xb1" // U+e031 +#define ICON_MD_NEWSPAPER "\xee\xae\x81" // U+eb81 +#define ICON_MD_NEXT_PLAN "\xee\xbd\x9d" // U+ef5d +#define ICON_MD_NEXT_WEEK "\xee\x85\xaa" // U+e16a +#define ICON_MD_NFC "\xee\x86\xbb" // U+e1bb +#define ICON_MD_NIGHT_SHELTER "\xef\x87\xb1" // U+f1f1 +#define ICON_MD_NIGHTLIFE "\xee\xa9\xa2" // U+ea62 +#define ICON_MD_NIGHTLIGHT "\xef\x80\xbd" // U+f03d +#define ICON_MD_NIGHTLIGHT_ROUND "\xee\xbd\x9e" // U+ef5e +#define ICON_MD_NIGHTS_STAY "\xee\xa9\x86" // U+ea46 +#define ICON_MD_NO_ACCOUNTS "\xef\x80\xbe" // U+f03e +#define ICON_MD_NO_ADULT_CONTENT "\xef\xa3\xbe" // U+f8fe +#define ICON_MD_NO_BACKPACK "\xef\x88\xb7" // U+f237 +#define ICON_MD_NO_CELL "\xef\x86\xa4" // U+f1a4 +#define ICON_MD_NO_CRASH "\xee\xaf\xb0" // U+ebf0 +#define ICON_MD_NO_DRINKS "\xef\x86\xa5" // U+f1a5 +#define ICON_MD_NO_ENCRYPTION "\xee\x99\x81" // U+e641 +#define ICON_MD_NO_ENCRYPTION_GMAILERRORRED "\xef\x80\xbf" // U+f03f +#define ICON_MD_NO_FLASH "\xef\x86\xa6" // U+f1a6 +#define ICON_MD_NO_FOOD "\xef\x86\xa7" // U+f1a7 +#define ICON_MD_NO_LUGGAGE "\xef\x88\xbb" // U+f23b +#define ICON_MD_NO_MEALS "\xef\x87\x96" // U+f1d6 +#define ICON_MD_NO_MEALS_OULINE "\xef\x88\xa9" // U+f229 +#define ICON_MD_NO_MEETING_ROOM "\xee\xad\x8e" // U+eb4e +#define ICON_MD_NO_PHOTOGRAPHY "\xef\x86\xa8" // U+f1a8 +#define ICON_MD_NO_SIM "\xee\x83\x8c" // U+e0cc +#define ICON_MD_NO_STROLLER "\xef\x86\xaf" // U+f1af +#define ICON_MD_NO_TRANSFER "\xef\x87\x95" // U+f1d5 +#define ICON_MD_NOISE_AWARE "\xee\xaf\xac" // U+ebec +#define ICON_MD_NOISE_CONTROL_OFF "\xee\xaf\xb3" // U+ebf3 +#define ICON_MD_NORDIC_WALKING "\xee\x94\x8e" // U+e50e +#define ICON_MD_NORTH "\xef\x87\xa0" // U+f1e0 +#define ICON_MD_NORTH_EAST "\xef\x87\xa1" // U+f1e1 +#define ICON_MD_NORTH_WEST "\xef\x87\xa2" // U+f1e2 +#define ICON_MD_NOT_ACCESSIBLE "\xef\x83\xbe" // U+f0fe +#define ICON_MD_NOT_INTERESTED "\xee\x80\xb3" // U+e033 +#define ICON_MD_NOT_LISTED_LOCATION "\xee\x95\xb5" // U+e575 +#define ICON_MD_NOT_STARTED "\xef\x83\x91" // U+f0d1 +#define ICON_MD_NOTE "\xee\x81\xaf" // U+e06f +#define ICON_MD_NOTE_ADD "\xee\xa2\x9c" // U+e89c +#define ICON_MD_NOTE_ALT "\xef\x81\x80" // U+f040 +#define ICON_MD_NOTES "\xee\x89\xac" // U+e26c +#define ICON_MD_NOTIFICATION_ADD "\xee\x8e\x99" // U+e399 +#define ICON_MD_NOTIFICATION_IMPORTANT "\xee\x80\x84" // U+e004 +#define ICON_MD_NOTIFICATIONS "\xee\x9f\xb4" // U+e7f4 +#define ICON_MD_NOTIFICATIONS_ACTIVE "\xee\x9f\xb7" // U+e7f7 +#define ICON_MD_NOTIFICATIONS_NONE "\xee\x9f\xb5" // U+e7f5 +#define ICON_MD_NOTIFICATIONS_OFF "\xee\x9f\xb6" // U+e7f6 +#define ICON_MD_NOTIFICATIONS_ON "\xee\x9f\xb7" // U+e7f7 +#define ICON_MD_NOTIFICATIONS_PAUSED "\xee\x9f\xb8" // U+e7f8 +#define ICON_MD_NOW_WALLPAPER "\xee\x86\xbc" // U+e1bc +#define ICON_MD_NOW_WIDGETS "\xee\x86\xbd" // U+e1bd +#define ICON_MD_NUMBERS "\xee\xab\x87" // U+eac7 +#define ICON_MD_OFFLINE_BOLT "\xee\xa4\xb2" // U+e932 +#define ICON_MD_OFFLINE_PIN "\xee\xa4\x8a" // U+e90a +#define ICON_MD_OFFLINE_SHARE "\xee\xa7\x85" // U+e9c5 +#define ICON_MD_OIL_BARREL "\xee\xb0\x95" // U+ec15 +#define ICON_MD_ON_DEVICE_TRAINING "\xee\xaf\xbd" // U+ebfd +#define ICON_MD_ONDEMAND_VIDEO "\xee\x98\xba" // U+e63a +#define ICON_MD_ONLINE_PREDICTION "\xef\x83\xab" // U+f0eb +#define ICON_MD_OPACITY "\xee\xa4\x9c" // U+e91c +#define ICON_MD_OPEN_IN_BROWSER "\xee\xa2\x9d" // U+e89d +#define ICON_MD_OPEN_IN_FULL "\xef\x87\x8e" // U+f1ce +#define ICON_MD_OPEN_IN_NEW "\xee\xa2\x9e" // U+e89e +#define ICON_MD_OPEN_IN_NEW_OFF "\xee\x93\xb6" // U+e4f6 +#define ICON_MD_OPEN_WITH "\xee\xa2\x9f" // U+e89f +#define ICON_MD_OTHER_HOUSES "\xee\x96\x8c" // U+e58c +#define ICON_MD_OUTBOND "\xef\x88\xa8" // U+f228 +#define ICON_MD_OUTBOUND "\xee\x87\x8a" // U+e1ca +#define ICON_MD_OUTBOX "\xee\xbd\x9f" // U+ef5f +#define ICON_MD_OUTDOOR_GRILL "\xee\xa9\x87" // U+ea47 +#define ICON_MD_OUTGOING_MAIL "\xef\x83\x92" // U+f0d2 +#define ICON_MD_OUTLET "\xef\x87\x94" // U+f1d4 +#define ICON_MD_OUTLINED_FLAG "\xee\x85\xae" // U+e16e +#define ICON_MD_OUTPUT "\xee\xae\xbe" // U+ebbe +#define ICON_MD_PADDING "\xee\xa7\x88" // U+e9c8 +#define ICON_MD_PAGES "\xee\x9f\xb9" // U+e7f9 +#define ICON_MD_PAGEVIEW "\xee\xa2\xa0" // U+e8a0 +#define ICON_MD_PAID "\xef\x81\x81" // U+f041 +#define ICON_MD_PALETTE "\xee\x90\x8a" // U+e40a +#define ICON_MD_PAN_TOOL "\xee\xa4\xa5" // U+e925 +#define ICON_MD_PAN_TOOL_ALT "\xee\xae\xb9" // U+ebb9 +#define ICON_MD_PANORAMA "\xee\x90\x8b" // U+e40b +#define ICON_MD_PANORAMA_FISH_EYE "\xee\x90\x8c" // U+e40c +#define ICON_MD_PANORAMA_FISHEYE "\xee\x90\x8c" // U+e40c +#define ICON_MD_PANORAMA_HORIZONTAL "\xee\x90\x8d" // U+e40d +#define ICON_MD_PANORAMA_HORIZONTAL_SELECT "\xee\xbd\xa0" // U+ef60 +#define ICON_MD_PANORAMA_PHOTOSPHERE "\xee\xa7\x89" // U+e9c9 +#define ICON_MD_PANORAMA_PHOTOSPHERE_SELECT "\xee\xa7\x8a" // U+e9ca +#define ICON_MD_PANORAMA_VERTICAL "\xee\x90\x8e" // U+e40e +#define ICON_MD_PANORAMA_VERTICAL_SELECT "\xee\xbd\xa1" // U+ef61 +#define ICON_MD_PANORAMA_WIDE_ANGLE "\xee\x90\x8f" // U+e40f +#define ICON_MD_PANORAMA_WIDE_ANGLE_SELECT "\xee\xbd\xa2" // U+ef62 +#define ICON_MD_PARAGLIDING "\xee\x94\x8f" // U+e50f +#define ICON_MD_PARK "\xee\xa9\xa3" // U+ea63 +#define ICON_MD_PARTY_MODE "\xee\x9f\xba" // U+e7fa +#define ICON_MD_PASSWORD "\xef\x81\x82" // U+f042 +#define ICON_MD_PATTERN "\xef\x81\x83" // U+f043 +#define ICON_MD_PAUSE "\xee\x80\xb4" // U+e034 +#define ICON_MD_PAUSE_CIRCLE "\xee\x86\xa2" // U+e1a2 +#define ICON_MD_PAUSE_CIRCLE_FILLED "\xee\x80\xb5" // U+e035 +#define ICON_MD_PAUSE_CIRCLE_OUTLINE "\xee\x80\xb6" // U+e036 +#define ICON_MD_PAUSE_PRESENTATION "\xee\x83\xaa" // U+e0ea +#define ICON_MD_PAYMENT "\xee\xa2\xa1" // U+e8a1 +#define ICON_MD_PAYMENTS "\xee\xbd\xa3" // U+ef63 +#define ICON_MD_PAYPAL "\xee\xaa\x8d" // U+ea8d +#define ICON_MD_PEDAL_BIKE "\xee\xac\xa9" // U+eb29 +#define ICON_MD_PENDING "\xee\xbd\xa4" // U+ef64 +#define ICON_MD_PENDING_ACTIONS "\xef\x86\xbb" // U+f1bb +#define ICON_MD_PENTAGON "\xee\xad\x90" // U+eb50 +#define ICON_MD_PEOPLE "\xee\x9f\xbb" // U+e7fb +#define ICON_MD_PEOPLE_ALT "\xee\xa8\xa1" // U+ea21 +#define ICON_MD_PEOPLE_OUTLINE "\xee\x9f\xbc" // U+e7fc +#define ICON_MD_PERCENT "\xee\xad\x98" // U+eb58 +#define ICON_MD_PERM_CAMERA_MIC "\xee\xa2\xa2" // U+e8a2 +#define ICON_MD_PERM_CONTACT_CAL "\xee\xa2\xa3" // U+e8a3 +#define ICON_MD_PERM_CONTACT_CALENDAR "\xee\xa2\xa3" // U+e8a3 +#define ICON_MD_PERM_DATA_SETTING "\xee\xa2\xa4" // U+e8a4 +#define ICON_MD_PERM_DEVICE_INFO "\xee\xa2\xa5" // U+e8a5 +#define ICON_MD_PERM_DEVICE_INFORMATION "\xee\xa2\xa5" // U+e8a5 +#define ICON_MD_PERM_IDENTITY "\xee\xa2\xa6" // U+e8a6 +#define ICON_MD_PERM_MEDIA "\xee\xa2\xa7" // U+e8a7 +#define ICON_MD_PERM_PHONE_MSG "\xee\xa2\xa8" // U+e8a8 +#define ICON_MD_PERM_SCAN_WIFI "\xee\xa2\xa9" // U+e8a9 +#define ICON_MD_PERSON "\xee\x9f\xbd" // U+e7fd +#define ICON_MD_PERSON_ADD "\xee\x9f\xbe" // U+e7fe +#define ICON_MD_PERSON_ADD_ALT "\xee\xa9\x8d" // U+ea4d +#define ICON_MD_PERSON_ADD_ALT_1 "\xee\xbd\xa5" // U+ef65 +#define ICON_MD_PERSON_ADD_DISABLED "\xee\xa7\x8b" // U+e9cb +#define ICON_MD_PERSON_OFF "\xee\x94\x90" // U+e510 +#define ICON_MD_PERSON_OUTLINE "\xee\x9f\xbf" // U+e7ff +#define ICON_MD_PERSON_PIN "\xee\x95\x9a" // U+e55a +#define ICON_MD_PERSON_PIN_CIRCLE "\xee\x95\xaa" // U+e56a +#define ICON_MD_PERSON_REMOVE "\xee\xbd\xa6" // U+ef66 +#define ICON_MD_PERSON_REMOVE_ALT_1 "\xee\xbd\xa7" // U+ef67 +#define ICON_MD_PERSON_SEARCH "\xef\x84\x86" // U+f106 +#define ICON_MD_PERSONAL_INJURY "\xee\x9b\x9a" // U+e6da +#define ICON_MD_PERSONAL_VIDEO "\xee\x98\xbb" // U+e63b +#define ICON_MD_PEST_CONTROL "\xef\x83\xba" // U+f0fa +#define ICON_MD_PEST_CONTROL_RODENT "\xef\x83\xbd" // U+f0fd +#define ICON_MD_PETS "\xee\xa4\x9d" // U+e91d +#define ICON_MD_PHISHING "\xee\xab\x97" // U+ead7 +#define ICON_MD_PHONE "\xee\x83\x8d" // U+e0cd +#define ICON_MD_PHONE_ANDROID "\xee\x8c\xa4" // U+e324 +#define ICON_MD_PHONE_BLUETOOTH_SPEAKER "\xee\x98\x9b" // U+e61b +#define ICON_MD_PHONE_CALLBACK "\xee\x99\x89" // U+e649 +#define ICON_MD_PHONE_DISABLED "\xee\xa7\x8c" // U+e9cc +#define ICON_MD_PHONE_ENABLED "\xee\xa7\x8d" // U+e9cd +#define ICON_MD_PHONE_FORWARDED "\xee\x98\x9c" // U+e61c +#define ICON_MD_PHONE_IN_TALK "\xee\x98\x9d" // U+e61d +#define ICON_MD_PHONE_IPHONE "\xee\x8c\xa5" // U+e325 +#define ICON_MD_PHONE_LOCKED "\xee\x98\x9e" // U+e61e +#define ICON_MD_PHONE_MISSED "\xee\x98\x9f" // U+e61f +#define ICON_MD_PHONE_PAUSED "\xee\x98\xa0" // U+e620 +#define ICON_MD_PHONELINK "\xee\x8c\xa6" // U+e326 +#define ICON_MD_PHONELINK_ERASE "\xee\x83\x9b" // U+e0db +#define ICON_MD_PHONELINK_LOCK "\xee\x83\x9c" // U+e0dc +#define ICON_MD_PHONELINK_OFF "\xee\x8c\xa7" // U+e327 +#define ICON_MD_PHONELINK_RING "\xee\x83\x9d" // U+e0dd +#define ICON_MD_PHONELINK_SETUP "\xee\x83\x9e" // U+e0de +#define ICON_MD_PHOTO "\xee\x90\x90" // U+e410 +#define ICON_MD_PHOTO_ALBUM "\xee\x90\x91" // U+e411 +#define ICON_MD_PHOTO_CAMERA "\xee\x90\x92" // U+e412 +#define ICON_MD_PHOTO_CAMERA_BACK "\xee\xbd\xa8" // U+ef68 +#define ICON_MD_PHOTO_CAMERA_FRONT "\xee\xbd\xa9" // U+ef69 +#define ICON_MD_PHOTO_FILTER "\xee\x90\xbb" // U+e43b +#define ICON_MD_PHOTO_LIBRARY "\xee\x90\x93" // U+e413 +#define ICON_MD_PHOTO_SIZE_SELECT_ACTUAL "\xee\x90\xb2" // U+e432 +#define ICON_MD_PHOTO_SIZE_SELECT_LARGE "\xee\x90\xb3" // U+e433 +#define ICON_MD_PHOTO_SIZE_SELECT_SMALL "\xee\x90\xb4" // U+e434 +#define ICON_MD_PHP "\xee\xae\x8f" // U+eb8f +#define ICON_MD_PIANO "\xee\x94\xa1" // U+e521 +#define ICON_MD_PIANO_OFF "\xee\x94\xa0" // U+e520 +#define ICON_MD_PICTURE_AS_PDF "\xee\x90\x95" // U+e415 +#define ICON_MD_PICTURE_IN_PICTURE "\xee\xa2\xaa" // U+e8aa +#define ICON_MD_PICTURE_IN_PICTURE_ALT "\xee\xa4\x91" // U+e911 +#define ICON_MD_PIE_CHART "\xee\x9b\x84" // U+e6c4 +#define ICON_MD_PIE_CHART_OUTLINE "\xef\x81\x84" // U+f044 +#define ICON_MD_PIE_CHART_OUTLINED "\xee\x9b\x85" // U+e6c5 +#define ICON_MD_PIN "\xef\x81\x85" // U+f045 +#define ICON_MD_PIN_DROP "\xee\x95\x9e" // U+e55e +#define ICON_MD_PIN_END "\xee\x9d\xa7" // U+e767 +#define ICON_MD_PIN_INVOKE "\xee\x9d\xa3" // U+e763 +#define ICON_MD_PINCH "\xee\xac\xb8" // U+eb38 +#define ICON_MD_PIVOT_TABLE_CHART "\xee\xa7\x8e" // U+e9ce +#define ICON_MD_PIX "\xee\xaa\xa3" // U+eaa3 +#define ICON_MD_PLACE "\xee\x95\x9f" // U+e55f +#define ICON_MD_PLAGIARISM "\xee\xa9\x9a" // U+ea5a +#define ICON_MD_PLAY_ARROW "\xee\x80\xb7" // U+e037 +#define ICON_MD_PLAY_CIRCLE "\xee\x87\x84" // U+e1c4 +#define ICON_MD_PLAY_CIRCLE_FILL "\xee\x80\xb8" // U+e038 +#define ICON_MD_PLAY_CIRCLE_FILLED "\xee\x80\xb8" // U+e038 +#define ICON_MD_PLAY_CIRCLE_OUTLINE "\xee\x80\xb9" // U+e039 +#define ICON_MD_PLAY_DISABLED "\xee\xbd\xaa" // U+ef6a +#define ICON_MD_PLAY_FOR_WORK "\xee\xa4\x86" // U+e906 +#define ICON_MD_PLAY_LESSON "\xef\x81\x87" // U+f047 +#define ICON_MD_PLAYLIST_ADD "\xee\x80\xbb" // U+e03b +#define ICON_MD_PLAYLIST_ADD_CHECK "\xee\x81\xa5" // U+e065 +#define ICON_MD_PLAYLIST_ADD_CHECK_CIRCLE "\xee\x9f\xa6" // U+e7e6 +#define ICON_MD_PLAYLIST_ADD_CIRCLE "\xee\x9f\xa5" // U+e7e5 +#define ICON_MD_PLAYLIST_PLAY "\xee\x81\x9f" // U+e05f +#define ICON_MD_PLAYLIST_REMOVE "\xee\xae\x80" // U+eb80 +#define ICON_MD_PLUMBING "\xef\x84\x87" // U+f107 +#define ICON_MD_PLUS_ONE "\xee\xa0\x80" // U+e800 +#define ICON_MD_PODCASTS "\xef\x81\x88" // U+f048 +#define ICON_MD_POINT_OF_SALE "\xef\x85\xbe" // U+f17e +#define ICON_MD_POLICY "\xee\xa8\x97" // U+ea17 +#define ICON_MD_POLL "\xee\xa0\x81" // U+e801 +#define ICON_MD_POLYLINE "\xee\xae\xbb" // U+ebbb +#define ICON_MD_POLYMER "\xee\xa2\xab" // U+e8ab +#define ICON_MD_POOL "\xee\xad\x88" // U+eb48 +#define ICON_MD_PORTABLE_WIFI_OFF "\xee\x83\x8e" // U+e0ce +#define ICON_MD_PORTRAIT "\xee\x90\x96" // U+e416 +#define ICON_MD_POST_ADD "\xee\xa8\xa0" // U+ea20 +#define ICON_MD_POWER "\xee\x98\xbc" // U+e63c +#define ICON_MD_POWER_INPUT "\xee\x8c\xb6" // U+e336 +#define ICON_MD_POWER_OFF "\xee\x99\x86" // U+e646 +#define ICON_MD_POWER_SETTINGS_NEW "\xee\xa2\xac" // U+e8ac +#define ICON_MD_PRECISION_MANUFACTURING "\xef\x81\x89" // U+f049 +#define ICON_MD_PREGNANT_WOMAN "\xee\xa4\x9e" // U+e91e +#define ICON_MD_PRESENT_TO_ALL "\xee\x83\x9f" // U+e0df +#define ICON_MD_PREVIEW "\xef\x87\x85" // U+f1c5 +#define ICON_MD_PRICE_CHANGE "\xef\x81\x8a" // U+f04a +#define ICON_MD_PRICE_CHECK "\xef\x81\x8b" // U+f04b +#define ICON_MD_PRINT "\xee\xa2\xad" // U+e8ad +#define ICON_MD_PRINT_DISABLED "\xee\xa7\x8f" // U+e9cf +#define ICON_MD_PRIORITY_HIGH "\xee\x99\x85" // U+e645 +#define ICON_MD_PRIVACY_TIP "\xef\x83\x9c" // U+f0dc +#define ICON_MD_PRIVATE_CONNECTIVITY "\xee\x9d\x84" // U+e744 +#define ICON_MD_PRODUCTION_QUANTITY_LIMITS "\xee\x87\x91" // U+e1d1 +#define ICON_MD_PROPANE "\xee\xb0\x94" // U+ec14 +#define ICON_MD_PROPANE_TANK "\xee\xb0\x93" // U+ec13 +#define ICON_MD_PSYCHOLOGY "\xee\xa9\x8a" // U+ea4a +#define ICON_MD_PUBLIC "\xee\xa0\x8b" // U+e80b +#define ICON_MD_PUBLIC_OFF "\xef\x87\x8a" // U+f1ca +#define ICON_MD_PUBLISH "\xee\x89\x95" // U+e255 +#define ICON_MD_PUBLISHED_WITH_CHANGES "\xef\x88\xb2" // U+f232 +#define ICON_MD_PUNCH_CLOCK "\xee\xaa\xa8" // U+eaa8 +#define ICON_MD_PUSH_PIN "\xef\x84\x8d" // U+f10d +#define ICON_MD_QR_CODE "\xee\xbd\xab" // U+ef6b +#define ICON_MD_QR_CODE_2 "\xee\x80\x8a" // U+e00a +#define ICON_MD_QR_CODE_SCANNER "\xef\x88\x86" // U+f206 +#define ICON_MD_QUERY_BUILDER "\xee\xa2\xae" // U+e8ae +#define ICON_MD_QUERY_STATS "\xee\x93\xbc" // U+e4fc +#define ICON_MD_QUESTION_ANSWER "\xee\xa2\xaf" // U+e8af +#define ICON_MD_QUESTION_MARK "\xee\xae\x8b" // U+eb8b +#define ICON_MD_QUEUE "\xee\x80\xbc" // U+e03c +#define ICON_MD_QUEUE_MUSIC "\xee\x80\xbd" // U+e03d +#define ICON_MD_QUEUE_PLAY_NEXT "\xee\x81\xa6" // U+e066 +#define ICON_MD_QUICK_CONTACTS_DIALER "\xee\x83\x8f" // U+e0cf +#define ICON_MD_QUICK_CONTACTS_MAIL "\xee\x83\x90" // U+e0d0 +#define ICON_MD_QUICKREPLY "\xee\xbd\xac" // U+ef6c +#define ICON_MD_QUIZ "\xef\x81\x8c" // U+f04c +#define ICON_MD_QUORA "\xee\xaa\x98" // U+ea98 +#define ICON_MD_R_MOBILEDATA "\xef\x81\x8d" // U+f04d +#define ICON_MD_RADAR "\xef\x81\x8e" // U+f04e +#define ICON_MD_RADIO "\xee\x80\xbe" // U+e03e +#define ICON_MD_RADIO_BUTTON_CHECKED "\xee\xa0\xb7" // U+e837 +#define ICON_MD_RADIO_BUTTON_OFF "\xee\xa0\xb6" // U+e836 +#define ICON_MD_RADIO_BUTTON_ON "\xee\xa0\xb7" // U+e837 +#define ICON_MD_RADIO_BUTTON_UNCHECKED "\xee\xa0\xb6" // U+e836 +#define ICON_MD_RAILWAY_ALERT "\xee\xa7\x91" // U+e9d1 +#define ICON_MD_RAMEN_DINING "\xee\xa9\xa4" // U+ea64 +#define ICON_MD_RAMP_LEFT "\xee\xae\x9c" // U+eb9c +#define ICON_MD_RAMP_RIGHT "\xee\xae\x96" // U+eb96 +#define ICON_MD_RATE_REVIEW "\xee\x95\xa0" // U+e560 +#define ICON_MD_RAW_OFF "\xef\x81\x8f" // U+f04f +#define ICON_MD_RAW_ON "\xef\x81\x90" // U+f050 +#define ICON_MD_READ_MORE "\xee\xbd\xad" // U+ef6d +#define ICON_MD_REAL_ESTATE_AGENT "\xee\x9c\xba" // U+e73a +#define ICON_MD_RECEIPT "\xee\xa2\xb0" // U+e8b0 +#define ICON_MD_RECEIPT_LONG "\xee\xbd\xae" // U+ef6e +#define ICON_MD_RECENT_ACTORS "\xee\x80\xbf" // U+e03f +#define ICON_MD_RECOMMEND "\xee\xa7\x92" // U+e9d2 +#define ICON_MD_RECORD_VOICE_OVER "\xee\xa4\x9f" // U+e91f +#define ICON_MD_RECTANGLE "\xee\xad\x94" // U+eb54 +#define ICON_MD_RECYCLING "\xee\x9d\xa0" // U+e760 +#define ICON_MD_REDDIT "\xee\xaa\xa0" // U+eaa0 +#define ICON_MD_REDEEM "\xee\xa2\xb1" // U+e8b1 +#define ICON_MD_REDO "\xee\x85\x9a" // U+e15a +#define ICON_MD_REDUCE_CAPACITY "\xef\x88\x9c" // U+f21c +#define ICON_MD_REFRESH "\xee\x97\x95" // U+e5d5 +#define ICON_MD_REMEMBER_ME "\xef\x81\x91" // U+f051 +#define ICON_MD_REMOVE "\xee\x85\x9b" // U+e15b +#define ICON_MD_REMOVE_CIRCLE "\xee\x85\x9c" // U+e15c +#define ICON_MD_REMOVE_CIRCLE_OUTLINE "\xee\x85\x9d" // U+e15d +#define ICON_MD_REMOVE_DONE "\xee\xa7\x93" // U+e9d3 +#define ICON_MD_REMOVE_FROM_QUEUE "\xee\x81\xa7" // U+e067 +#define ICON_MD_REMOVE_MODERATOR "\xee\xa7\x94" // U+e9d4 +#define ICON_MD_REMOVE_RED_EYE "\xee\x90\x97" // U+e417 +#define ICON_MD_REMOVE_ROAD "\xee\xaf\xbc" // U+ebfc +#define ICON_MD_REMOVE_SHOPPING_CART "\xee\xa4\xa8" // U+e928 +#define ICON_MD_REORDER "\xee\xa3\xbe" // U+e8fe +#define ICON_MD_REPEAT "\xee\x81\x80" // U+e040 +#define ICON_MD_REPEAT_ON "\xee\xa7\x96" // U+e9d6 +#define ICON_MD_REPEAT_ONE "\xee\x81\x81" // U+e041 +#define ICON_MD_REPEAT_ONE_ON "\xee\xa7\x97" // U+e9d7 +#define ICON_MD_REPLAY "\xee\x81\x82" // U+e042 +#define ICON_MD_REPLAY_10 "\xee\x81\x99" // U+e059 +#define ICON_MD_REPLAY_30 "\xee\x81\x9a" // U+e05a +#define ICON_MD_REPLAY_5 "\xee\x81\x9b" // U+e05b +#define ICON_MD_REPLAY_CIRCLE_FILLED "\xee\xa7\x98" // U+e9d8 +#define ICON_MD_REPLY "\xee\x85\x9e" // U+e15e +#define ICON_MD_REPLY_ALL "\xee\x85\x9f" // U+e15f +#define ICON_MD_REPORT "\xee\x85\xa0" // U+e160 +#define ICON_MD_REPORT_GMAILERRORRED "\xef\x81\x92" // U+f052 +#define ICON_MD_REPORT_OFF "\xee\x85\xb0" // U+e170 +#define ICON_MD_REPORT_PROBLEM "\xee\xa2\xb2" // U+e8b2 +#define ICON_MD_REQUEST_PAGE "\xef\x88\xac" // U+f22c +#define ICON_MD_REQUEST_QUOTE "\xef\x86\xb6" // U+f1b6 +#define ICON_MD_RESET_TV "\xee\xa7\x99" // U+e9d9 +#define ICON_MD_RESTART_ALT "\xef\x81\x93" // U+f053 +#define ICON_MD_RESTAURANT "\xee\x95\xac" // U+e56c +#define ICON_MD_RESTAURANT_MENU "\xee\x95\xa1" // U+e561 +#define ICON_MD_RESTORE "\xee\xa2\xb3" // U+e8b3 +#define ICON_MD_RESTORE_FROM_TRASH "\xee\xa4\xb8" // U+e938 +#define ICON_MD_RESTORE_PAGE "\xee\xa4\xa9" // U+e929 +#define ICON_MD_REVIEWS "\xef\x81\x94" // U+f054 +#define ICON_MD_RICE_BOWL "\xef\x87\xb5" // U+f1f5 +#define ICON_MD_RING_VOLUME "\xee\x83\x91" // U+e0d1 +#define ICON_MD_ROCKET "\xee\xae\xa5" // U+eba5 +#define ICON_MD_ROCKET_LAUNCH "\xee\xae\x9b" // U+eb9b +#define ICON_MD_ROLLER_SHADES "\xee\xb0\x92" // U+ec12 +#define ICON_MD_ROLLER_SHADES_CLOSED "\xee\xb0\x91" // U+ec11 +#define ICON_MD_ROLLER_SKATING "\xee\xaf\x8d" // U+ebcd +#define ICON_MD_ROOFING "\xef\x88\x81" // U+f201 +#define ICON_MD_ROOM "\xee\xa2\xb4" // U+e8b4 +#define ICON_MD_ROOM_PREFERENCES "\xef\x86\xb8" // U+f1b8 +#define ICON_MD_ROOM_SERVICE "\xee\xad\x89" // U+eb49 +#define ICON_MD_ROTATE_90_DEGREES_CCW "\xee\x90\x98" // U+e418 +#define ICON_MD_ROTATE_90_DEGREES_CW "\xee\xaa\xab" // U+eaab +#define ICON_MD_ROTATE_LEFT "\xee\x90\x99" // U+e419 +#define ICON_MD_ROTATE_RIGHT "\xee\x90\x9a" // U+e41a +#define ICON_MD_ROUNDABOUT_LEFT "\xee\xae\x99" // U+eb99 +#define ICON_MD_ROUNDABOUT_RIGHT "\xee\xae\xa3" // U+eba3 +#define ICON_MD_ROUNDED_CORNER "\xee\xa4\xa0" // U+e920 +#define ICON_MD_ROUTE "\xee\xab\x8d" // U+eacd +#define ICON_MD_ROUTER "\xee\x8c\xa8" // U+e328 +#define ICON_MD_ROWING "\xee\xa4\xa1" // U+e921 +#define ICON_MD_RSS_FEED "\xee\x83\xa5" // U+e0e5 +#define ICON_MD_RSVP "\xef\x81\x95" // U+f055 +#define ICON_MD_RTT "\xee\xa6\xad" // U+e9ad +#define ICON_MD_RULE "\xef\x87\x82" // U+f1c2 +#define ICON_MD_RULE_FOLDER "\xef\x87\x89" // U+f1c9 +#define ICON_MD_RUN_CIRCLE "\xee\xbd\xaf" // U+ef6f +#define ICON_MD_RUNNING_WITH_ERRORS "\xee\x94\x9d" // U+e51d +#define ICON_MD_RV_HOOKUP "\xee\x99\x82" // U+e642 +#define ICON_MD_SAFETY_CHECK "\xee\xaf\xaf" // U+ebef +#define ICON_MD_SAFETY_DIVIDER "\xee\x87\x8c" // U+e1cc +#define ICON_MD_SAILING "\xee\x94\x82" // U+e502 +#define ICON_MD_SANITIZER "\xef\x88\x9d" // U+f21d +#define ICON_MD_SATELLITE "\xee\x95\xa2" // U+e562 +#define ICON_MD_SATELLITE_ALT "\xee\xac\xba" // U+eb3a +#define ICON_MD_SAVE "\xee\x85\xa1" // U+e161 +#define ICON_MD_SAVE_ALT "\xee\x85\xb1" // U+e171 +#define ICON_MD_SAVE_AS "\xee\xad\xa0" // U+eb60 +#define ICON_MD_SAVED_SEARCH "\xee\xa8\x91" // U+ea11 +#define ICON_MD_SAVINGS "\xee\x8b\xab" // U+e2eb +#define ICON_MD_SCALE "\xee\xad\x9f" // U+eb5f +#define ICON_MD_SCANNER "\xee\x8c\xa9" // U+e329 +#define ICON_MD_SCATTER_PLOT "\xee\x89\xa8" // U+e268 +#define ICON_MD_SCHEDULE "\xee\xa2\xb5" // U+e8b5 +#define ICON_MD_SCHEDULE_SEND "\xee\xa8\x8a" // U+ea0a +#define ICON_MD_SCHEMA "\xee\x93\xbd" // U+e4fd +#define ICON_MD_SCHOOL "\xee\xa0\x8c" // U+e80c +#define ICON_MD_SCIENCE "\xee\xa9\x8b" // U+ea4b +#define ICON_MD_SCORE "\xee\x89\xa9" // U+e269 +#define ICON_MD_SCOREBOARD "\xee\xaf\x90" // U+ebd0 +#define ICON_MD_SCREEN_LOCK_LANDSCAPE "\xee\x86\xbe" // U+e1be +#define ICON_MD_SCREEN_LOCK_PORTRAIT "\xee\x86\xbf" // U+e1bf +#define ICON_MD_SCREEN_LOCK_ROTATION "\xee\x87\x80" // U+e1c0 +#define ICON_MD_SCREEN_ROTATION "\xee\x87\x81" // U+e1c1 +#define ICON_MD_SCREEN_ROTATION_ALT "\xee\xaf\xae" // U+ebee +#define ICON_MD_SCREEN_SEARCH_DESKTOP "\xee\xbd\xb0" // U+ef70 +#define ICON_MD_SCREEN_SHARE "\xee\x83\xa2" // U+e0e2 +#define ICON_MD_SCREENSHOT "\xef\x81\x96" // U+f056 +#define ICON_MD_SCREENSHOT_MONITOR "\xee\xb0\x88" // U+ec08 +#define ICON_MD_SCUBA_DIVING "\xee\xaf\x8e" // U+ebce +#define ICON_MD_SD "\xee\xa7\x9d" // U+e9dd +#define ICON_MD_SD_CARD "\xee\x98\xa3" // U+e623 +#define ICON_MD_SD_CARD_ALERT "\xef\x81\x97" // U+f057 +#define ICON_MD_SD_STORAGE "\xee\x87\x82" // U+e1c2 +#define ICON_MD_SEARCH "\xee\xa2\xb6" // U+e8b6 +#define ICON_MD_SEARCH_OFF "\xee\xa9\xb6" // U+ea76 +#define ICON_MD_SECURITY "\xee\x8c\xaa" // U+e32a +#define ICON_MD_SECURITY_UPDATE "\xef\x81\x98" // U+f058 +#define ICON_MD_SECURITY_UPDATE_GOOD "\xef\x81\x99" // U+f059 +#define ICON_MD_SECURITY_UPDATE_WARNING "\xef\x81\x9a" // U+f05a +#define ICON_MD_SEGMENT "\xee\xa5\x8b" // U+e94b +#define ICON_MD_SELECT_ALL "\xee\x85\xa2" // U+e162 +#define ICON_MD_SELF_IMPROVEMENT "\xee\xa9\xb8" // U+ea78 +#define ICON_MD_SELL "\xef\x81\x9b" // U+f05b +#define ICON_MD_SEND "\xee\x85\xa3" // U+e163 +#define ICON_MD_SEND_AND_ARCHIVE "\xee\xa8\x8c" // U+ea0c +#define ICON_MD_SEND_TIME_EXTENSION "\xee\xab\x9b" // U+eadb +#define ICON_MD_SEND_TO_MOBILE "\xef\x81\x9c" // U+f05c +#define ICON_MD_SENSOR_DOOR "\xef\x86\xb5" // U+f1b5 +#define ICON_MD_SENSOR_OCCUPIED "\xee\xb0\x90" // U+ec10 +#define ICON_MD_SENSOR_WINDOW "\xef\x86\xb4" // U+f1b4 +#define ICON_MD_SENSORS "\xee\x94\x9e" // U+e51e +#define ICON_MD_SENSORS_OFF "\xee\x94\x9f" // U+e51f +#define ICON_MD_SENTIMENT_DISSATISFIED "\xee\xa0\x91" // U+e811 +#define ICON_MD_SENTIMENT_NEUTRAL "\xee\xa0\x92" // U+e812 +#define ICON_MD_SENTIMENT_SATISFIED "\xee\xa0\x93" // U+e813 +#define ICON_MD_SENTIMENT_SATISFIED_ALT "\xee\x83\xad" // U+e0ed +#define ICON_MD_SENTIMENT_VERY_DISSATISFIED "\xee\xa0\x94" // U+e814 +#define ICON_MD_SENTIMENT_VERY_SATISFIED "\xee\xa0\x95" // U+e815 +#define ICON_MD_SET_MEAL "\xef\x87\xaa" // U+f1ea +#define ICON_MD_SETTINGS "\xee\xa2\xb8" // U+e8b8 +#define ICON_MD_SETTINGS_ACCESSIBILITY "\xef\x81\x9d" // U+f05d +#define ICON_MD_SETTINGS_applicationS "\xee\xa2\xb9" // U+e8b9 +#define ICON_MD_SETTINGS_BACKUP_RESTORE "\xee\xa2\xba" // U+e8ba +#define ICON_MD_SETTINGS_BLUETOOTH "\xee\xa2\xbb" // U+e8bb +#define ICON_MD_SETTINGS_BRIGHTNESS "\xee\xa2\xbd" // U+e8bd +#define ICON_MD_SETTINGS_CELL "\xee\xa2\xbc" // U+e8bc +#define ICON_MD_SETTINGS_DISPLAY "\xee\xa2\xbd" // U+e8bd +#define ICON_MD_SETTINGS_ETHERNET "\xee\xa2\xbe" // U+e8be +#define ICON_MD_SETTINGS_INPUT_ANTENNA "\xee\xa2\xbf" // U+e8bf +#define ICON_MD_SETTINGS_INPUT_COMPONENT "\xee\xa3\x80" // U+e8c0 +#define ICON_MD_SETTINGS_INPUT_COMPOSITE "\xee\xa3\x81" // U+e8c1 +#define ICON_MD_SETTINGS_INPUT_HDMI "\xee\xa3\x82" // U+e8c2 +#define ICON_MD_SETTINGS_INPUT_SVIDEO "\xee\xa3\x83" // U+e8c3 +#define ICON_MD_SETTINGS_OVERSCAN "\xee\xa3\x84" // U+e8c4 +#define ICON_MD_SETTINGS_PHONE "\xee\xa3\x85" // U+e8c5 +#define ICON_MD_SETTINGS_POWER "\xee\xa3\x86" // U+e8c6 +#define ICON_MD_SETTINGS_REMOTE "\xee\xa3\x87" // U+e8c7 +#define ICON_MD_SETTINGS_SUGGEST "\xef\x81\x9e" // U+f05e +#define ICON_MD_SETTINGS_SYSTEM_DAYDREAM "\xee\x87\x83" // U+e1c3 +#define ICON_MD_SETTINGS_VOICE "\xee\xa3\x88" // U+e8c8 +#define ICON_MD_SEVERE_COLD "\xee\xaf\x93" // U+ebd3 +#define ICON_MD_SHARE "\xee\xa0\x8d" // U+e80d +#define ICON_MD_SHARE_ARRIVAL_TIME "\xee\x94\xa4" // U+e524 +#define ICON_MD_SHARE_LOCATION "\xef\x81\x9f" // U+f05f +#define ICON_MD_SHIELD "\xee\xa7\xa0" // U+e9e0 +#define ICON_MD_SHIELD_MOON "\xee\xaa\xa9" // U+eaa9 +#define ICON_MD_SHOP "\xee\xa3\x89" // U+e8c9 +#define ICON_MD_SHOP_2 "\xee\x86\x9e" // U+e19e +#define ICON_MD_SHOP_TWO "\xee\xa3\x8a" // U+e8ca +#define ICON_MD_SHOPIFY "\xee\xaa\x9d" // U+ea9d +#define ICON_MD_SHOPPING_BAG "\xef\x87\x8c" // U+f1cc +#define ICON_MD_SHOPPING_BASKET "\xee\xa3\x8b" // U+e8cb +#define ICON_MD_SHOPPING_CART "\xee\xa3\x8c" // U+e8cc +#define ICON_MD_SHOPPING_CART_CHECKOUT "\xee\xae\x88" // U+eb88 +#define ICON_MD_SHORT_TEXT "\xee\x89\xa1" // U+e261 +#define ICON_MD_SHORTCUT "\xef\x81\xa0" // U+f060 +#define ICON_MD_SHOW_CHART "\xee\x9b\xa1" // U+e6e1 +#define ICON_MD_SHOWER "\xef\x81\xa1" // U+f061 +#define ICON_MD_SHUFFLE "\xee\x81\x83" // U+e043 +#define ICON_MD_SHUFFLE_ON "\xee\xa7\xa1" // U+e9e1 +#define ICON_MD_SHUTTER_SPEED "\xee\x90\xbd" // U+e43d +#define ICON_MD_SICK "\xef\x88\xa0" // U+f220 +#define ICON_MD_SIGN_LANGUAGE "\xee\xaf\xa5" // U+ebe5 +#define ICON_MD_SIGNAL_CELLULAR_0_BAR "\xef\x82\xa8" // U+f0a8 +#define ICON_MD_SIGNAL_CELLULAR_4_BAR "\xee\x87\x88" // U+e1c8 +#define ICON_MD_SIGNAL_CELLULAR_ALT "\xee\x88\x82" // U+e202 +#define ICON_MD_SIGNAL_CELLULAR_ALT_1_BAR "\xee\xaf\x9f" // U+ebdf +#define ICON_MD_SIGNAL_CELLULAR_ALT_2_BAR "\xee\xaf\xa3" // U+ebe3 +#define ICON_MD_SIGNAL_CELLULAR_CONNECTED_NO_INTERNET_0_BAR "\xef\x82\xac" // U+f0ac +#define ICON_MD_SIGNAL_CELLULAR_CONNECTED_NO_INTERNET_4_BAR "\xee\x87\x8d" // U+e1cd +#define ICON_MD_SIGNAL_CELLULAR_NO_SIM "\xee\x87\x8e" // U+e1ce +#define ICON_MD_SIGNAL_CELLULAR_NODATA "\xef\x81\xa2" // U+f062 +#define ICON_MD_SIGNAL_CELLULAR_NULL "\xee\x87\x8f" // U+e1cf +#define ICON_MD_SIGNAL_CELLULAR_OFF "\xee\x87\x90" // U+e1d0 +#define ICON_MD_SIGNAL_WIFI_0_BAR "\xef\x82\xb0" // U+f0b0 +#define ICON_MD_SIGNAL_WIFI_4_BAR "\xee\x87\x98" // U+e1d8 +#define ICON_MD_SIGNAL_WIFI_4_BAR_LOCK "\xee\x87\x99" // U+e1d9 +#define ICON_MD_SIGNAL_WIFI_BAD "\xef\x81\xa3" // U+f063 +#define ICON_MD_SIGNAL_WIFI_CONNECTED_NO_INTERNET_4 "\xef\x81\xa4" // U+f064 +#define ICON_MD_SIGNAL_WIFI_OFF "\xee\x87\x9a" // U+e1da +#define ICON_MD_SIGNAL_WIFI_STATUSBAR_4_BAR "\xef\x81\xa5" // U+f065 +#define ICON_MD_SIGNAL_WIFI_STATUSBAR_CONNECTED_NO_INTERNET_4 "\xef\x81\xa6" // U+f066 +#define ICON_MD_SIGNAL_WIFI_STATUSBAR_NULL "\xef\x81\xa7" // U+f067 +#define ICON_MD_SIGNPOST "\xee\xae\x91" // U+eb91 +#define ICON_MD_SIM_CARD "\xee\x8c\xab" // U+e32b +#define ICON_MD_SIM_CARD_ALERT "\xee\x98\xa4" // U+e624 +#define ICON_MD_SIM_CARD_DOWNLOAD "\xef\x81\xa8" // U+f068 +#define ICON_MD_SINGLE_BED "\xee\xa9\x88" // U+ea48 +#define ICON_MD_SIP "\xef\x81\xa9" // U+f069 +#define ICON_MD_SKATEBOARDING "\xee\x94\x91" // U+e511 +#define ICON_MD_SKIP_NEXT "\xee\x81\x84" // U+e044 +#define ICON_MD_SKIP_PREVIOUS "\xee\x81\x85" // U+e045 +#define ICON_MD_SLEDDING "\xee\x94\x92" // U+e512 +#define ICON_MD_SLIDESHOW "\xee\x90\x9b" // U+e41b +#define ICON_MD_SLOW_MOTION_VIDEO "\xee\x81\xa8" // U+e068 +#define ICON_MD_SMART_BUTTON "\xef\x87\x81" // U+f1c1 +#define ICON_MD_SMART_DISPLAY "\xef\x81\xaa" // U+f06a +#define ICON_MD_SMART_SCREEN "\xef\x81\xab" // U+f06b +#define ICON_MD_SMART_TOY "\xef\x81\xac" // U+f06c +#define ICON_MD_SMARTPHONE "\xee\x8c\xac" // U+e32c +#define ICON_MD_SMOKE_FREE "\xee\xad\x8a" // U+eb4a +#define ICON_MD_SMOKING_ROOMS "\xee\xad\x8b" // U+eb4b +#define ICON_MD_SMS "\xee\x98\xa5" // U+e625 +#define ICON_MD_SMS_FAILED "\xee\x98\xa6" // U+e626 +#define ICON_MD_SNAPCHAT "\xee\xa9\xae" // U+ea6e +#define ICON_MD_SNIPPET_FOLDER "\xef\x87\x87" // U+f1c7 +#define ICON_MD_SNOOZE "\xee\x81\x86" // U+e046 +#define ICON_MD_SNOWBOARDING "\xee\x94\x93" // U+e513 +#define ICON_MD_SNOWING "\xee\xa0\x8f" // U+e80f +#define ICON_MD_SNOWMOBILE "\xee\x94\x83" // U+e503 +#define ICON_MD_SNOWSHOEING "\xee\x94\x94" // U+e514 +#define ICON_MD_SOAP "\xef\x86\xb2" // U+f1b2 +#define ICON_MD_SOCIAL_DISTANCE "\xee\x87\x8b" // U+e1cb +#define ICON_MD_SOLAR_POWER "\xee\xb0\x8f" // U+ec0f +#define ICON_MD_SORT "\xee\x85\xa4" // U+e164 +#define ICON_MD_SORT_BY_ALPHA "\xee\x81\x93" // U+e053 +#define ICON_MD_SOS "\xee\xaf\xb7" // U+ebf7 +#define ICON_MD_SOUP_KITCHEN "\xee\x9f\x93" // U+e7d3 +#define ICON_MD_SOURCE "\xef\x87\x84" // U+f1c4 +#define ICON_MD_SOUTH "\xef\x87\xa3" // U+f1e3 +#define ICON_MD_SOUTH_AMERICA "\xee\x9f\xa4" // U+e7e4 +#define ICON_MD_SOUTH_EAST "\xef\x87\xa4" // U+f1e4 +#define ICON_MD_SOUTH_WEST "\xef\x87\xa5" // U+f1e5 +#define ICON_MD_SPA "\xee\xad\x8c" // U+eb4c +#define ICON_MD_SPACE_BAR "\xee\x89\x96" // U+e256 +#define ICON_MD_SPACE_DASHBOARD "\xee\x99\xab" // U+e66b +#define ICON_MD_SPATIAL_AUDIO "\xee\xaf\xab" // U+ebeb +#define ICON_MD_SPATIAL_AUDIO_OFF "\xee\xaf\xa8" // U+ebe8 +#define ICON_MD_SPATIAL_TRACKING "\xee\xaf\xaa" // U+ebea +#define ICON_MD_SPEAKER "\xee\x8c\xad" // U+e32d +#define ICON_MD_SPEAKER_GROUP "\xee\x8c\xae" // U+e32e +#define ICON_MD_SPEAKER_NOTES "\xee\xa3\x8d" // U+e8cd +#define ICON_MD_SPEAKER_NOTES_OFF "\xee\xa4\xaa" // U+e92a +#define ICON_MD_SPEAKER_PHONE "\xee\x83\x92" // U+e0d2 +#define ICON_MD_SPEED "\xee\xa7\xa4" // U+e9e4 +#define ICON_MD_SPELLCHECK "\xee\xa3\x8e" // U+e8ce +#define ICON_MD_SPLITSCREEN "\xef\x81\xad" // U+f06d +#define ICON_MD_SPOKE "\xee\xa6\xa7" // U+e9a7 +#define ICON_MD_SPORTS "\xee\xa8\xb0" // U+ea30 +#define ICON_MD_SPORTS_BAR "\xef\x87\xb3" // U+f1f3 +#define ICON_MD_SPORTS_BASEBALL "\xee\xa9\x91" // U+ea51 +#define ICON_MD_SPORTS_BASKETBALL "\xee\xa8\xa6" // U+ea26 +#define ICON_MD_SPORTS_CRICKET "\xee\xa8\xa7" // U+ea27 +#define ICON_MD_SPORTS_ESPORTS "\xee\xa8\xa8" // U+ea28 +#define ICON_MD_SPORTS_FOOTBALL "\xee\xa8\xa9" // U+ea29 +#define ICON_MD_SPORTS_GOLF "\xee\xa8\xaa" // U+ea2a +#define ICON_MD_SPORTS_GYMNASTICS "\xee\xaf\x84" // U+ebc4 +#define ICON_MD_SPORTS_HANDBALL "\xee\xa8\xb3" // U+ea33 +#define ICON_MD_SPORTS_HOCKEY "\xee\xa8\xab" // U+ea2b +#define ICON_MD_SPORTS_KABADDI "\xee\xa8\xb4" // U+ea34 +#define ICON_MD_SPORTS_MARTIAL_ARTS "\xee\xab\xa9" // U+eae9 +#define ICON_MD_SPORTS_MMA "\xee\xa8\xac" // U+ea2c +#define ICON_MD_SPORTS_MOTORSPORTS "\xee\xa8\xad" // U+ea2d +#define ICON_MD_SPORTS_RUGBY "\xee\xa8\xae" // U+ea2e +#define ICON_MD_SPORTS_SCORE "\xef\x81\xae" // U+f06e +#define ICON_MD_SPORTS_SOCCER "\xee\xa8\xaf" // U+ea2f +#define ICON_MD_SPORTS_TENNIS "\xee\xa8\xb2" // U+ea32 +#define ICON_MD_SPORTS_VOLLEYBALL "\xee\xa8\xb1" // U+ea31 +#define ICON_MD_SQUARE "\xee\xac\xb6" // U+eb36 +#define ICON_MD_SQUARE_FOOT "\xee\xa9\x89" // U+ea49 +#define ICON_MD_SSID_CHART "\xee\xad\xa6" // U+eb66 +#define ICON_MD_STACKED_BAR_CHART "\xee\xa7\xa6" // U+e9e6 +#define ICON_MD_STACKED_LINE_CHART "\xef\x88\xab" // U+f22b +#define ICON_MD_STADIUM "\xee\xae\x90" // U+eb90 +#define ICON_MD_STAIRS "\xef\x86\xa9" // U+f1a9 +#define ICON_MD_STAR "\xee\xa0\xb8" // U+e838 +#define ICON_MD_STAR_BORDER "\xee\xa0\xba" // U+e83a +#define ICON_MD_STAR_BORDER_PURPLE500 "\xef\x82\x99" // U+f099 +#define ICON_MD_STAR_HALF "\xee\xa0\xb9" // U+e839 +#define ICON_MD_STAR_OUTLINE "\xef\x81\xaf" // U+f06f +#define ICON_MD_STAR_PURPLE500 "\xef\x82\x9a" // U+f09a +#define ICON_MD_STAR_RATE "\xef\x83\xac" // U+f0ec +#define ICON_MD_STARS "\xee\xa3\x90" // U+e8d0 +#define ICON_MD_START "\xee\x82\x89" // U+e089 +#define ICON_MD_STAY_CURRENT_LANDSCAPE "\xee\x83\x93" // U+e0d3 +#define ICON_MD_STAY_CURRENT_PORTRAIT "\xee\x83\x94" // U+e0d4 +#define ICON_MD_STAY_PRIMARY_LANDSCAPE "\xee\x83\x95" // U+e0d5 +#define ICON_MD_STAY_PRIMARY_PORTRAIT "\xee\x83\x96" // U+e0d6 +#define ICON_MD_STICKY_NOTE_2 "\xef\x87\xbc" // U+f1fc +#define ICON_MD_STOP "\xee\x81\x87" // U+e047 +#define ICON_MD_STOP_CIRCLE "\xee\xbd\xb1" // U+ef71 +#define ICON_MD_STOP_SCREEN_SHARE "\xee\x83\xa3" // U+e0e3 +#define ICON_MD_STORAGE "\xee\x87\x9b" // U+e1db +#define ICON_MD_STORE "\xee\xa3\x91" // U+e8d1 +#define ICON_MD_STORE_MALL_DIRECTORY "\xee\x95\xa3" // U+e563 +#define ICON_MD_STOREFRONT "\xee\xa8\x92" // U+ea12 +#define ICON_MD_STORM "\xef\x81\xb0" // U+f070 +#define ICON_MD_STRAIGHT "\xee\xae\x95" // U+eb95 +#define ICON_MD_STRAIGHTEN "\xee\x90\x9c" // U+e41c +#define ICON_MD_STREAM "\xee\xa7\xa9" // U+e9e9 +#define ICON_MD_STREETVIEW "\xee\x95\xae" // U+e56e +#define ICON_MD_STRIKETHROUGH_S "\xee\x89\x97" // U+e257 +#define ICON_MD_STROLLER "\xef\x86\xae" // U+f1ae +#define ICON_MD_STYLE "\xee\x90\x9d" // U+e41d +#define ICON_MD_SUBDIRECTORY_ARROW_LEFT "\xee\x97\x99" // U+e5d9 +#define ICON_MD_SUBDIRECTORY_ARROW_RIGHT "\xee\x97\x9a" // U+e5da +#define ICON_MD_SUBJECT "\xee\xa3\x92" // U+e8d2 +#define ICON_MD_SUBSCRIPT "\xef\x84\x91" // U+f111 +#define ICON_MD_SUBSCRIPTIONS "\xee\x81\xa4" // U+e064 +#define ICON_MD_SUBTITLES "\xee\x81\x88" // U+e048 +#define ICON_MD_SUBTITLES_OFF "\xee\xbd\xb2" // U+ef72 +#define ICON_MD_SUBWAY "\xee\x95\xaf" // U+e56f +#define ICON_MD_SUMMARIZE "\xef\x81\xb1" // U+f071 +#define ICON_MD_SUNNY "\xee\xa0\x9a" // U+e81a +#define ICON_MD_SUNNY_SNOWING "\xee\xa0\x99" // U+e819 +#define ICON_MD_SUPERSCRIPT "\xef\x84\x92" // U+f112 +#define ICON_MD_SUPERVISED_USER_CIRCLE "\xee\xa4\xb9" // U+e939 +#define ICON_MD_SUPERVISOR_ACCOUNT "\xee\xa3\x93" // U+e8d3 +#define ICON_MD_SUPPORT "\xee\xbd\xb3" // U+ef73 +#define ICON_MD_SUPPORT_AGENT "\xef\x83\xa2" // U+f0e2 +#define ICON_MD_SURFING "\xee\x94\x95" // U+e515 +#define ICON_MD_SURROUND_SOUND "\xee\x81\x89" // U+e049 +#define ICON_MD_SWAP_CALLS "\xee\x83\x97" // U+e0d7 +#define ICON_MD_SWAP_HORIZ "\xee\xa3\x94" // U+e8d4 +#define ICON_MD_SWAP_HORIZONTAL_CIRCLE "\xee\xa4\xb3" // U+e933 +#define ICON_MD_SWAP_VERT "\xee\xa3\x95" // U+e8d5 +#define ICON_MD_SWAP_VERT_CIRCLE "\xee\xa3\x96" // U+e8d6 +#define ICON_MD_SWAP_VERTICAL_CIRCLE "\xee\xa3\x96" // U+e8d6 +#define ICON_MD_SWIPE "\xee\xa7\xac" // U+e9ec +#define ICON_MD_SWIPE_DOWN "\xee\xad\x93" // U+eb53 +#define ICON_MD_SWIPE_DOWN_ALT "\xee\xac\xb0" // U+eb30 +#define ICON_MD_SWIPE_LEFT "\xee\xad\x99" // U+eb59 +#define ICON_MD_SWIPE_LEFT_ALT "\xee\xac\xb3" // U+eb33 +#define ICON_MD_SWIPE_RIGHT "\xee\xad\x92" // U+eb52 +#define ICON_MD_SWIPE_RIGHT_ALT "\xee\xad\x96" // U+eb56 +#define ICON_MD_SWIPE_UP "\xee\xac\xae" // U+eb2e +#define ICON_MD_SWIPE_UP_ALT "\xee\xac\xb5" // U+eb35 +#define ICON_MD_SWIPE_VERTICAL "\xee\xad\x91" // U+eb51 +#define ICON_MD_SWITCH_ACCESS_SHORTCUT "\xee\x9f\xa1" // U+e7e1 +#define ICON_MD_SWITCH_ACCESS_SHORTCUT_ADD "\xee\x9f\xa2" // U+e7e2 +#define ICON_MD_SWITCH_ACCOUNT "\xee\xa7\xad" // U+e9ed +#define ICON_MD_SWITCH_CAMERA "\xee\x90\x9e" // U+e41e +#define ICON_MD_SWITCH_LEFT "\xef\x87\x91" // U+f1d1 +#define ICON_MD_SWITCH_RIGHT "\xef\x87\x92" // U+f1d2 +#define ICON_MD_SWITCH_VIDEO "\xee\x90\x9f" // U+e41f +#define ICON_MD_SYNAGOGUE "\xee\xaa\xb0" // U+eab0 +#define ICON_MD_SYNC "\xee\x98\xa7" // U+e627 +#define ICON_MD_SYNC_ALT "\xee\xa8\x98" // U+ea18 +#define ICON_MD_SYNC_DISABLED "\xee\x98\xa8" // U+e628 +#define ICON_MD_SYNC_LOCK "\xee\xab\xae" // U+eaee +#define ICON_MD_SYNC_PROBLEM "\xee\x98\xa9" // U+e629 +#define ICON_MD_SYSTEM_SECURITY_UPDATE "\xef\x81\xb2" // U+f072 +#define ICON_MD_SYSTEM_SECURITY_UPDATE_GOOD "\xef\x81\xb3" // U+f073 +#define ICON_MD_SYSTEM_SECURITY_UPDATE_WARNING "\xef\x81\xb4" // U+f074 +#define ICON_MD_SYSTEM_UPDATE "\xee\x98\xaa" // U+e62a +#define ICON_MD_SYSTEM_UPDATE_ALT "\xee\xa3\x97" // U+e8d7 +#define ICON_MD_SYSTEM_UPDATE_TV "\xee\xa3\x97" // U+e8d7 +#define ICON_MD_TAB "\xee\xa3\x98" // U+e8d8 +#define ICON_MD_TAB_UNSELECTED "\xee\xa3\x99" // U+e8d9 +#define ICON_MD_TABLE_BAR "\xee\xab\x92" // U+ead2 +#define ICON_MD_TABLE_CHART "\xee\x89\xa5" // U+e265 +#define ICON_MD_TABLE_RESTAURANT "\xee\xab\x86" // U+eac6 +#define ICON_MD_TABLE_ROWS "\xef\x84\x81" // U+f101 +#define ICON_MD_TABLE_VIEW "\xef\x86\xbe" // U+f1be +#define ICON_MD_TABLET "\xee\x8c\xaf" // U+e32f +#define ICON_MD_TABLET_ANDROID "\xee\x8c\xb0" // U+e330 +#define ICON_MD_TABLET_MAC "\xee\x8c\xb1" // U+e331 +#define ICON_MD_TAG "\xee\xa7\xaf" // U+e9ef +#define ICON_MD_TAG_FACES "\xee\x90\xa0" // U+e420 +#define ICON_MD_TAKEOUT_DINING "\xee\xa9\xb4" // U+ea74 +#define ICON_MD_TAP_AND_PLAY "\xee\x98\xab" // U+e62b +#define ICON_MD_TAPAS "\xef\x87\xa9" // U+f1e9 +#define ICON_MD_TASK "\xef\x81\xb5" // U+f075 +#define ICON_MD_TASK_ALT "\xee\x8b\xa6" // U+e2e6 +#define ICON_MD_TAXI_ALERT "\xee\xbd\xb4" // U+ef74 +#define ICON_MD_TELEGRAM "\xee\xa9\xab" // U+ea6b +#define ICON_MD_TEMPLE_BUDDHIST "\xee\xaa\xb3" // U+eab3 +#define ICON_MD_TEMPLE_HINDU "\xee\xaa\xaf" // U+eaaf +#define ICON_MD_TERMINAL "\xee\xae\x8e" // U+eb8e +#define ICON_MD_TERRAIN "\xee\x95\xa4" // U+e564 +#define ICON_MD_TEXT_DECREASE "\xee\xab\x9d" // U+eadd +#define ICON_MD_TEXT_FIELDS "\xee\x89\xa2" // U+e262 +#define ICON_MD_TEXT_FORMAT "\xee\x85\xa5" // U+e165 +#define ICON_MD_TEXT_INCREASE "\xee\xab\xa2" // U+eae2 +#define ICON_MD_TEXT_ROTATE_UP "\xee\xa4\xba" // U+e93a +#define ICON_MD_TEXT_ROTATE_VERTICAL "\xee\xa4\xbb" // U+e93b +#define ICON_MD_TEXT_ROTATION_ANGLEDOWN "\xee\xa4\xbc" // U+e93c +#define ICON_MD_TEXT_ROTATION_ANGLEUP "\xee\xa4\xbd" // U+e93d +#define ICON_MD_TEXT_ROTATION_DOWN "\xee\xa4\xbe" // U+e93e +#define ICON_MD_TEXT_ROTATION_NONE "\xee\xa4\xbf" // U+e93f +#define ICON_MD_TEXT_SNIPPET "\xef\x87\x86" // U+f1c6 +#define ICON_MD_TEXTSMS "\xee\x83\x98" // U+e0d8 +#define ICON_MD_TEXTURE "\xee\x90\xa1" // U+e421 +#define ICON_MD_THEATER_COMEDY "\xee\xa9\xa6" // U+ea66 +#define ICON_MD_THEATERS "\xee\xa3\x9a" // U+e8da +#define ICON_MD_THERMOSTAT "\xef\x81\xb6" // U+f076 +#define ICON_MD_THERMOSTAT_AUTO "\xef\x81\xb7" // U+f077 +#define ICON_MD_THUMB_DOWN "\xee\xa3\x9b" // U+e8db +#define ICON_MD_THUMB_DOWN_ALT "\xee\xa0\x96" // U+e816 +#define ICON_MD_THUMB_DOWN_OFF_ALT "\xee\xa7\xb2" // U+e9f2 +#define ICON_MD_THUMB_UP "\xee\xa3\x9c" // U+e8dc +#define ICON_MD_THUMB_UP_ALT "\xee\xa0\x97" // U+e817 +#define ICON_MD_THUMB_UP_OFF_ALT "\xee\xa7\xb3" // U+e9f3 +#define ICON_MD_THUMBS_UP_DOWN "\xee\xa3\x9d" // U+e8dd +#define ICON_MD_THUNDERSTORM "\xee\xaf\x9b" // U+ebdb +#define ICON_MD_TIKTOK "\xee\xa9\xbe" // U+ea7e +#define ICON_MD_TIME_TO_LEAVE "\xee\x98\xac" // U+e62c +#define ICON_MD_TIMELAPSE "\xee\x90\xa2" // U+e422 +#define ICON_MD_TIMELINE "\xee\xa4\xa2" // U+e922 +#define ICON_MD_TIMER "\xee\x90\xa5" // U+e425 +#define ICON_MD_TIMER_10 "\xee\x90\xa3" // U+e423 +#define ICON_MD_TIMER_10_SELECT "\xef\x81\xba" // U+f07a +#define ICON_MD_TIMER_3 "\xee\x90\xa4" // U+e424 +#define ICON_MD_TIMER_3_SELECT "\xef\x81\xbb" // U+f07b +#define ICON_MD_TIMER_OFF "\xee\x90\xa6" // U+e426 +#define ICON_MD_TIPS_AND_UPDATES "\xee\x9e\x9a" // U+e79a +#define ICON_MD_TIRE_REPAIR "\xee\xaf\x88" // U+ebc8 +#define ICON_MD_TITLE "\xee\x89\xa4" // U+e264 +#define ICON_MD_TOC "\xee\xa3\x9e" // U+e8de +#define ICON_MD_TODAY "\xee\xa3\x9f" // U+e8df +#define ICON_MD_TOGGLE_OFF "\xee\xa7\xb5" // U+e9f5 +#define ICON_MD_TOGGLE_ON "\xee\xa7\xb6" // U+e9f6 +#define ICON_MD_TOKEN "\xee\xa8\xa5" // U+ea25 +#define ICON_MD_TOLL "\xee\xa3\xa0" // U+e8e0 +#define ICON_MD_TONALITY "\xee\x90\xa7" // U+e427 +#define ICON_MD_TOPIC "\xef\x87\x88" // U+f1c8 +#define ICON_MD_TORNADO "\xee\x86\x99" // U+e199 +#define ICON_MD_TOUCH_APP "\xee\xa4\x93" // U+e913 +#define ICON_MD_TOUR "\xee\xbd\xb5" // U+ef75 +#define ICON_MD_TOYS "\xee\x8c\xb2" // U+e332 +#define ICON_MD_TRACK_CHANGES "\xee\xa3\xa1" // U+e8e1 +#define ICON_MD_TRAFFIC "\xee\x95\xa5" // U+e565 +#define ICON_MD_TRAIN "\xee\x95\xb0" // U+e570 +#define ICON_MD_TRAM "\xee\x95\xb1" // U+e571 +#define ICON_MD_TRANSFER_WITHIN_A_STATION "\xee\x95\xb2" // U+e572 +#define ICON_MD_TRANSFORM "\xee\x90\xa8" // U+e428 +#define ICON_MD_TRANSGENDER "\xee\x96\x8d" // U+e58d +#define ICON_MD_TRANSIT_ENTEREXIT "\xee\x95\xb9" // U+e579 +#define ICON_MD_TRANSLATE "\xee\xa3\xa2" // U+e8e2 +#define ICON_MD_TRAVEL_EXPLORE "\xee\x8b\x9b" // U+e2db +#define ICON_MD_TRENDING_DOWN "\xee\xa3\xa3" // U+e8e3 +#define ICON_MD_TRENDING_FLAT "\xee\xa3\xa4" // U+e8e4 +#define ICON_MD_TRENDING_NEUTRAL "\xee\xa3\xa4" // U+e8e4 +#define ICON_MD_TRENDING_UP "\xee\xa3\xa5" // U+e8e5 +#define ICON_MD_TRIP_ORIGIN "\xee\x95\xbb" // U+e57b +#define ICON_MD_TROUBLESHOOT "\xee\x87\x92" // U+e1d2 +#define ICON_MD_TRY "\xef\x81\xbc" // U+f07c +#define ICON_MD_TSUNAMI "\xee\xaf\x98" // U+ebd8 +#define ICON_MD_TTY "\xef\x86\xaa" // U+f1aa +#define ICON_MD_TUNE "\xee\x90\xa9" // U+e429 +#define ICON_MD_TUNGSTEN "\xef\x81\xbd" // U+f07d +#define ICON_MD_TURN_LEFT "\xee\xae\xa6" // U+eba6 +#define ICON_MD_TURN_RIGHT "\xee\xae\xab" // U+ebab +#define ICON_MD_TURN_SHARP_LEFT "\xee\xae\xa7" // U+eba7 +#define ICON_MD_TURN_SHARP_RIGHT "\xee\xae\xaa" // U+ebaa +#define ICON_MD_TURN_SLIGHT_LEFT "\xee\xae\xa4" // U+eba4 +#define ICON_MD_TURN_SLIGHT_RIGHT "\xee\xae\x9a" // U+eb9a +#define ICON_MD_TURNED_IN "\xee\xa3\xa6" // U+e8e6 +#define ICON_MD_TURNED_IN_NOT "\xee\xa3\xa7" // U+e8e7 +#define ICON_MD_TV "\xee\x8c\xb3" // U+e333 +#define ICON_MD_TV_OFF "\xee\x99\x87" // U+e647 +#define ICON_MD_TWO_WHEELER "\xee\xa7\xb9" // U+e9f9 +#define ICON_MD_U_TURN_LEFT "\xee\xae\xa1" // U+eba1 +#define ICON_MD_U_TURN_RIGHT "\xee\xae\xa2" // U+eba2 +#define ICON_MD_UMBRELLA "\xef\x86\xad" // U+f1ad +#define ICON_MD_UNARCHIVE "\xee\x85\xa9" // U+e169 +#define ICON_MD_UNDO "\xee\x85\xa6" // U+e166 +#define ICON_MD_UNFOLD_LESS "\xee\x97\x96" // U+e5d6 +#define ICON_MD_UNFOLD_MORE "\xee\x97\x97" // U+e5d7 +#define ICON_MD_UNPUBLISHED "\xef\x88\xb6" // U+f236 +#define ICON_MD_UNSUBSCRIBE "\xee\x83\xab" // U+e0eb +#define ICON_MD_UPCOMING "\xef\x81\xbe" // U+f07e +#define ICON_MD_UPDATE "\xee\xa4\xa3" // U+e923 +#define ICON_MD_UPDATE_DISABLED "\xee\x81\xb5" // U+e075 +#define ICON_MD_UPGRADE "\xef\x83\xbb" // U+f0fb +#define ICON_MD_UPLOAD "\xef\x82\x9b" // U+f09b +#define ICON_MD_UPLOAD_FILE "\xee\xa7\xbc" // U+e9fc +#define ICON_MD_USB "\xee\x87\xa0" // U+e1e0 +#define ICON_MD_USB_OFF "\xee\x93\xba" // U+e4fa +#define ICON_MD_VACCINES "\xee\x84\xb8" // U+e138 +#define ICON_MD_VAPE_FREE "\xee\xaf\x86" // U+ebc6 +#define ICON_MD_VAPING_ROOMS "\xee\xaf\x8f" // U+ebcf +#define ICON_MD_VERIFIED "\xee\xbd\xb6" // U+ef76 +#define ICON_MD_VERIFIED_USER "\xee\xa3\xa8" // U+e8e8 +#define ICON_MD_VERTICAL_ALIGN_BOTTOM "\xee\x89\x98" // U+e258 +#define ICON_MD_VERTICAL_ALIGN_CENTER "\xee\x89\x99" // U+e259 +#define ICON_MD_VERTICAL_ALIGN_TOP "\xee\x89\x9a" // U+e25a +#define ICON_MD_VERTICAL_DISTRIBUTE "\xee\x81\xb6" // U+e076 +#define ICON_MD_VERTICAL_SHADES "\xee\xb0\x8e" // U+ec0e +#define ICON_MD_VERTICAL_SHADES_CLOSED "\xee\xb0\x8d" // U+ec0d +#define ICON_MD_VERTICAL_SPLIT "\xee\xa5\x89" // U+e949 +#define ICON_MD_VIBRATION "\xee\x98\xad" // U+e62d +#define ICON_MD_VIDEO_CALL "\xee\x81\xb0" // U+e070 +#define ICON_MD_VIDEO_CAMERA_BACK "\xef\x81\xbf" // U+f07f +#define ICON_MD_VIDEO_CAMERA_FRONT "\xef\x82\x80" // U+f080 +#define ICON_MD_VIDEO_COLLECTION "\xee\x81\x8a" // U+e04a +#define ICON_MD_VIDEO_FILE "\xee\xae\x87" // U+eb87 +#define ICON_MD_VIDEO_LABEL "\xee\x81\xb1" // U+e071 +#define ICON_MD_VIDEO_LIBRARY "\xee\x81\x8a" // U+e04a +#define ICON_MD_VIDEO_SETTINGS "\xee\xa9\xb5" // U+ea75 +#define ICON_MD_VIDEO_STABLE "\xef\x82\x81" // U+f081 +#define ICON_MD_VIDEOCAM "\xee\x81\x8b" // U+e04b +#define ICON_MD_VIDEOCAM_OFF "\xee\x81\x8c" // U+e04c +#define ICON_MD_VIDEOGAME_ASSET "\xee\x8c\xb8" // U+e338 +#define ICON_MD_VIDEOGAME_ASSET_OFF "\xee\x94\x80" // U+e500 +#define ICON_MD_VIEW_AGENDA "\xee\xa3\xa9" // U+e8e9 +#define ICON_MD_VIEW_ARRAY "\xee\xa3\xaa" // U+e8ea +#define ICON_MD_VIEW_CAROUSEL "\xee\xa3\xab" // U+e8eb +#define ICON_MD_VIEW_COLUMN "\xee\xa3\xac" // U+e8ec +#define ICON_MD_VIEW_COMFORTABLE "\xee\x90\xaa" // U+e42a +#define ICON_MD_VIEW_COMFY "\xee\x90\xaa" // U+e42a +#define ICON_MD_VIEW_COMFY_ALT "\xee\xad\xb3" // U+eb73 +#define ICON_MD_VIEW_COMPACT "\xee\x90\xab" // U+e42b +#define ICON_MD_VIEW_COMPACT_ALT "\xee\xad\xb4" // U+eb74 +#define ICON_MD_VIEW_COZY "\xee\xad\xb5" // U+eb75 +#define ICON_MD_VIEW_DAY "\xee\xa3\xad" // U+e8ed +#define ICON_MD_VIEW_HEADLINE "\xee\xa3\xae" // U+e8ee +#define ICON_MD_VIEW_IN_AR "\xee\xa7\xbe" // U+e9fe +#define ICON_MD_VIEW_KANBAN "\xee\xad\xbf" // U+eb7f +#define ICON_MD_VIEW_LIST "\xee\xa3\xaf" // U+e8ef +#define ICON_MD_VIEW_MODULE "\xee\xa3\xb0" // U+e8f0 +#define ICON_MD_VIEW_QUILT "\xee\xa3\xb1" // U+e8f1 +#define ICON_MD_VIEW_SIDEBAR "\xef\x84\x94" // U+f114 +#define ICON_MD_VIEW_STREAM "\xee\xa3\xb2" // U+e8f2 +#define ICON_MD_VIEW_TIMELINE "\xee\xae\x85" // U+eb85 +#define ICON_MD_VIEW_WEEK "\xee\xa3\xb3" // U+e8f3 +#define ICON_MD_VIGNETTE "\xee\x90\xb5" // U+e435 +#define ICON_MD_VILLA "\xee\x96\x86" // U+e586 +#define ICON_MD_VISIBILITY "\xee\xa3\xb4" // U+e8f4 +#define ICON_MD_VISIBILITY_OFF "\xee\xa3\xb5" // U+e8f5 +#define ICON_MD_VOICE_CHAT "\xee\x98\xae" // U+e62e +#define ICON_MD_VOICE_OVER_OFF "\xee\xa5\x8a" // U+e94a +#define ICON_MD_VOICEMAIL "\xee\x83\x99" // U+e0d9 +#define ICON_MD_VOLCANO "\xee\xaf\x9a" // U+ebda +#define ICON_MD_VOLUME_DOWN "\xee\x81\x8d" // U+e04d +#define ICON_MD_VOLUME_DOWN_ALT "\xee\x9e\x9c" // U+e79c +#define ICON_MD_VOLUME_MUTE "\xee\x81\x8e" // U+e04e +#define ICON_MD_VOLUME_OFF "\xee\x81\x8f" // U+e04f +#define ICON_MD_VOLUME_UP "\xee\x81\x90" // U+e050 +#define ICON_MD_VOLUNTEER_ACTIVISM "\xee\xa9\xb0" // U+ea70 +#define ICON_MD_VPN_KEY "\xee\x83\x9a" // U+e0da +#define ICON_MD_VPN_KEY_OFF "\xee\xad\xba" // U+eb7a +#define ICON_MD_VPN_LOCK "\xee\x98\xaf" // U+e62f +#define ICON_MD_VRPANO "\xef\x82\x82" // U+f082 +#define ICON_MD_WALLET "\xef\xa3\xbf" // U+f8ff +#define ICON_MD_WALLET_GIFTCARD "\xee\xa3\xb6" // U+e8f6 +#define ICON_MD_WALLET_MEMBERSHIP "\xee\xa3\xb7" // U+e8f7 +#define ICON_MD_WALLET_TRAVEL "\xee\xa3\xb8" // U+e8f8 +#define ICON_MD_WALLPAPER "\xee\x86\xbc" // U+e1bc +#define ICON_MD_WAREHOUSE "\xee\xae\xb8" // U+ebb8 +#define ICON_MD_WARNING "\xee\x80\x82" // U+e002 +#define ICON_MD_WARNING_AMBER "\xef\x82\x83" // U+f083 +#define ICON_MD_WASH "\xef\x86\xb1" // U+f1b1 +#define ICON_MD_WATCH "\xee\x8c\xb4" // U+e334 +#define ICON_MD_WATCH_LATER "\xee\xa4\xa4" // U+e924 +#define ICON_MD_WATCH_OFF "\xee\xab\xa3" // U+eae3 +#define ICON_MD_WATER "\xef\x82\x84" // U+f084 +#define ICON_MD_WATER_DAMAGE "\xef\x88\x83" // U+f203 +#define ICON_MD_WATER_DROP "\xee\x9e\x98" // U+e798 +#define ICON_MD_WATERFALL_CHART "\xee\xa8\x80" // U+ea00 +#define ICON_MD_WAVES "\xee\x85\xb6" // U+e176 +#define ICON_MD_WAVING_HAND "\xee\x9d\xa6" // U+e766 +#define ICON_MD_WB_AUTO "\xee\x90\xac" // U+e42c +#define ICON_MD_WB_CLOUDY "\xee\x90\xad" // U+e42d +#define ICON_MD_WB_INCANDESCENT "\xee\x90\xae" // U+e42e +#define ICON_MD_WB_IRIDESCENT "\xee\x90\xb6" // U+e436 +#define ICON_MD_WB_SHADE "\xee\xa8\x81" // U+ea01 +#define ICON_MD_WB_SUNNY "\xee\x90\xb0" // U+e430 +#define ICON_MD_WB_TWIGHLIGHT "\xee\xa8\x82" // U+ea02 +#define ICON_MD_WB_TWILIGHT "\xee\x87\x86" // U+e1c6 +#define ICON_MD_WC "\xee\x98\xbd" // U+e63d +#define ICON_MD_WEB "\xee\x81\x91" // U+e051 +#define ICON_MD_WEB_ASSET "\xee\x81\xa9" // U+e069 +#define ICON_MD_WEB_ASSET_OFF "\xee\x93\xb7" // U+e4f7 +#define ICON_MD_WEB_STORIES "\xee\x96\x95" // U+e595 +#define ICON_MD_WEBHOOK "\xee\xae\x92" // U+eb92 +#define ICON_MD_WECHAT "\xee\xaa\x81" // U+ea81 +#define ICON_MD_WEEKEND "\xee\x85\xab" // U+e16b +#define ICON_MD_WEST "\xef\x87\xa6" // U+f1e6 +#define ICON_MD_WHATSAPP "\xee\xaa\x9c" // U+ea9c +#define ICON_MD_WHATSHOT "\xee\xa0\x8e" // U+e80e +#define ICON_MD_WHEELCHAIR_PICKUP "\xef\x86\xab" // U+f1ab +#define ICON_MD_WHERE_TO_VOTE "\xee\x85\xb7" // U+e177 +#define ICON_MD_WIDGETS "\xee\x86\xbd" // U+e1bd +#define ICON_MD_WIDTH_FULL "\xef\xa3\xb5" // U+f8f5 +#define ICON_MD_WIDTH_NORMAL "\xef\xa3\xb6" // U+f8f6 +#define ICON_MD_WIDTH_WIDE "\xef\xa3\xb7" // U+f8f7 +#define ICON_MD_WIFI "\xee\x98\xbe" // U+e63e +#define ICON_MD_WIFI_1_BAR "\xee\x93\x8a" // U+e4ca +#define ICON_MD_WIFI_2_BAR "\xee\x93\x99" // U+e4d9 +#define ICON_MD_WIFI_CALLING "\xee\xbd\xb7" // U+ef77 +#define ICON_MD_WIFI_CALLING_3 "\xef\x82\x85" // U+f085 +#define ICON_MD_WIFI_CHANNEL "\xee\xad\xaa" // U+eb6a +#define ICON_MD_WIFI_FIND "\xee\xac\xb1" // U+eb31 +#define ICON_MD_WIFI_LOCK "\xee\x87\xa1" // U+e1e1 +#define ICON_MD_WIFI_OFF "\xee\x99\x88" // U+e648 +#define ICON_MD_WIFI_PASSWORD "\xee\xad\xab" // U+eb6b +#define ICON_MD_WIFI_PROTECTED_SETUP "\xef\x83\xbc" // U+f0fc +#define ICON_MD_WIFI_TETHERING "\xee\x87\xa2" // U+e1e2 +#define ICON_MD_WIFI_TETHERING_ERROR "\xee\xab\x99" // U+ead9 +#define ICON_MD_WIFI_TETHERING_ERROR_ROUNDED "\xef\x82\x86" // U+f086 +#define ICON_MD_WIFI_TETHERING_OFF "\xef\x82\x87" // U+f087 +#define ICON_MD_WIND_POWER "\xee\xb0\x8c" // U+ec0c +#define ICON_MD_WINDOW "\xef\x82\x88" // U+f088 +#define ICON_MD_WINE_BAR "\xef\x87\xa8" // U+f1e8 +#define ICON_MD_WOMAN "\xee\x84\xbe" // U+e13e +#define ICON_MD_WOO_COMMERCE "\xee\xa9\xad" // U+ea6d +#define ICON_MD_WORDPRESS "\xee\xaa\x9f" // U+ea9f +#define ICON_MD_WORK "\xee\xa3\xb9" // U+e8f9 +#define ICON_MD_WORK_HISTORY "\xee\xb0\x89" // U+ec09 +#define ICON_MD_WORK_OFF "\xee\xa5\x82" // U+e942 +#define ICON_MD_WORK_OUTLINE "\xee\xa5\x83" // U+e943 +#define ICON_MD_WORKSPACE_PREMIUM "\xee\x9e\xaf" // U+e7af +#define ICON_MD_WORKSPACES "\xee\x86\xa0" // U+e1a0 +#define ICON_MD_WORKSPACES_FILLED "\xee\xa8\x8d" // U+ea0d +#define ICON_MD_WORKSPACES_OUTLINE "\xee\xa8\x8f" // U+ea0f +#define ICON_MD_WRAP_TEXT "\xee\x89\x9b" // U+e25b +#define ICON_MD_WRONG_LOCATION "\xee\xbd\xb8" // U+ef78 +#define ICON_MD_WYSIWYG "\xef\x87\x83" // U+f1c3 +#define ICON_MD_YARD "\xef\x82\x89" // U+f089 +#define ICON_MD_YOUTUBE_SEARCHED_FOR "\xee\xa3\xba" // U+e8fa +#define ICON_MD_ZOOM_IN "\xee\xa3\xbf" // U+e8ff +#define ICON_MD_ZOOM_IN_MAP "\xee\xac\xad" // U+eb2d +#define ICON_MD_ZOOM_OUT "\xee\xa4\x80" // U+e900 +#define ICON_MD_ZOOM_OUT_MAP "\xee\x95\xab" // U+e56b diff --git a/src/application/Graphics/palette.cc b/src/application/Graphics/palette.cc new file mode 100644 index 00000000..299f78ef --- /dev/null +++ b/src/application/Graphics/palette.cc @@ -0,0 +1,113 @@ +#include "palette.h" + +#include +#include + +namespace yaze { +namespace application { +namespace Graphics { + +SNESColor::SNESColor() : rgb(ImVec4(0.f, 0.f, 0.f, 0.f)) {} + +SNESColor::SNESColor(ImVec4 val) : rgb(val) { + m_color col; + col.red = (uchar)val.x; + col.blue = (uchar)val.y; + col.green = (uchar)val.z; + snes = convertcolor_rgb_to_snes(col); +} + +void SNESColor::setRgb(ImVec4 val) { + rgb = val; + m_color col; + col.red = val.x; + col.blue = val.y; + col.green = val.z; + snes = convertcolor_rgb_to_snes(col); +} + +void SNESColor::setSNES(uint16_t val) { + snes = val; + m_color col = convertcolor_snes_to_rgb(val); + rgb = ImVec4(col.red, col.green, col.blue, 1.f); +} + +SNESPalette::SNESPalette(uint8_t mSize) : size_(mSize) { + for (unsigned int i = 0; i < mSize; i++) { + SNESColor col; + colors.push_back(col); + } +} + +SNESPalette::SNESPalette(char* data) { + assert((sizeof(data) % 4 == 0) && (sizeof(data) <= 32)); + size_ = sizeof(data) / 2; + for (unsigned i = 0; i < sizeof(data); i += 2) { + SNESColor col; + col.snes = static_cast(data[i + 1]) << 8; + col.snes = col.snes | static_cast(data[i]); + m_color mColor = convertcolor_snes_to_rgb(col.snes); + col.rgb = ImVec4(mColor.red, mColor.green, mColor.blue, 1.f); + colors.push_back(col); + } +} + +SNESPalette::SNESPalette(const unsigned char* snes_pal) { + assert((sizeof(snes_pal) % 4 == 0) && (sizeof(snes_pal) <= 32)); + size_ = sizeof(snes_pal) / 2; + for (unsigned i = 0; i < sizeof(snes_pal); i += 2) { + SNESColor col; + col.snes = snes_pal[i + 1] << (uint16_t) 8; + col.snes = col.snes | snes_pal[i]; + m_color mColor = convertcolor_snes_to_rgb(col.snes); + col.rgb = ImVec4(mColor.red, mColor.green, mColor.blue, 1.f); + colors.push_back(col); + } +} + +SNESPalette::SNESPalette(std::vector cols) { + for (const auto& each : cols) { + SNESColor scol; + scol.setRgb(each); + colors.push_back(scol); + } + size_ = cols.size(); +} + +char* SNESPalette::encode() { + // char* data(size * 2, 0); + char* data = new char[size_ * 2]; + for (unsigned int i = 0; i < size_; i++) { + // std::cout << QString::number(colors[i].snes, 16); + data[i * 2] = (char)(colors[i].snes & 0xFF); + data[i * 2 + 1] = (char)(colors[i].snes >> 8); + } + return data; +} + +SDL_Palette* SNESPalette::GetSDL_Palette() { + std::cout << "Converting SNESPalette to SDL_Palette" << std::endl; + auto sdl_palette = std::make_shared(); + sdl_palette->ncolors = size_; + + auto* sdl_colors = new SDL_Color[size_]; + for (int i = 0; i < size_; i++) { + sdl_colors[i].r = (uint8_t)colors[i].rgb.x * 100; + sdl_colors[i].g = (uint8_t)colors[i].rgb.y * 100; + sdl_colors[i].b = (uint8_t)colors[i].rgb.z * 100; + std::cout << "Color " << i << " added (R:" << sdl_colors[i].r + << " G:" << sdl_colors[i].g << " B:" << sdl_colors[i].b << ")" + << std::endl; + } + sdl_palette->colors = sdl_colors; + + // store the pointers to free them later + sdl_palettes_.push_back(sdl_palette); + colors_arrays_.push_back(sdl_colors); + + return sdl_palette.get(); +} + +} // namespace Graphics +} // namespace application +} // namespace yaze \ No newline at end of file diff --git a/src/application/Graphics/palette.h b/src/application/Graphics/palette.h new file mode 100644 index 00000000..789a34cb --- /dev/null +++ b/src/application/Graphics/palette.h @@ -0,0 +1,50 @@ +#ifndef YAZE_APPLICATION_GRAPHICS_PALETTE_H +#define YAZE_APPLICATION_GRAPHICS_PALETTE_H + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace yaze { +namespace application { +namespace Graphics { + +struct SNESColor { + SNESColor(); + explicit SNESColor(ImVec4); + uint16_t snes = 0; + ImVec4 rgb; + void setRgb(ImVec4); + void setSNES(uint16_t); + uint8_t approxSNES(); + ImVec4 approxRGB(); +}; + +class SNESPalette { + public: + SNESPalette() = default; + explicit SNESPalette(uint8_t mSize); + explicit SNESPalette(char* snesPal); + explicit SNESPalette(const unsigned char* snes_pal); + explicit SNESPalette(std::vector); + + char* encode(); + SDL_Palette* GetSDL_Palette(); + + int size_ = 0; + std::vector colors; + std::vector> sdl_palettes_; + std::vector colors_arrays_; +}; + +} // namespace Graphics +} // namespace application +} // namespace yaze + +#endif // YAZE_APPLICATION_GRAPHICS_PALETTE_H \ No newline at end of file diff --git a/src/application/Graphics/scene.cc b/src/application/Graphics/scene.cc new file mode 100644 index 00000000..68d21710 --- /dev/null +++ b/src/application/Graphics/scene.cc @@ -0,0 +1,78 @@ +#include "scene.h" + +#include +#include + +#include +#include + +#include "Graphics/tile.h" + +namespace yaze { +namespace application { +namespace Graphics { + +void Scene::buildSurface(const std::vector& tiles, SNESPalette& mPalette, + const TilesPattern& tp) { + arrangedTiles = TilesPattern::transform(tp, tiles); + tilesPattern = tp; + allTiles = tiles; + + for (unsigned int j = 0; j < arrangedTiles.size(); j++) { + for (unsigned int i = 0; i < arrangedTiles[0].size(); i++) { + tile8 tile = arrangedTiles[j][i]; + // SDL_PIXELFORMAT_RGB888 ? + SDL_Surface* surface = SDL_CreateRGBSurfaceWithFormat( + 0, 8, 8, SDL_BITSPERPIXEL(3), SDL_PIXELFORMAT_RGB444); + if (surface == nullptr) { + SDL_Log("SDL_CreateRGBSurfaceWithFormat() failed: %s", SDL_GetError()); + exit(1); + } + SDL_PixelFormat* format = surface->format; + format->palette = mPalette.GetSDL_Palette(); + char* ptr = (char*)surface->pixels; + + for (int k = 0; k < 8; k++) { + for (int l = 0; l < 8; l++) { + ptr[k * 8 + l] = tile.data[k * 8 + l]; + } + } + + // SDL_Texture* texture = + // SDL_CreateTextureFromSurface(Core::renderer, surface); + // if (texture == nullptr) { + // std::cout << "Error: " << SDL_GetError() << std::endl; + // } + // imagesCache[tile.id] = texture; + } + } +} + +void Scene::updateScene() { + std::cout << "Update scene"; + unsigned int itemCpt = 0; + for (unsigned int j = 0; j < arrangedTiles.size(); j++) { + for (unsigned int i = 0; i < arrangedTiles[0].size(); i++) { + tile8 tile = arrangedTiles[j][i]; + // QPixmap m = imagesCache[tile.id]; + // GraphicsTileItem *tileItem = (GraphicsTileItem *)items()[itemCpt]; + // tileItem->image = m; + // tileItem->rawTile = tile; + // tileItem->setTileZoom(tilesZoom); + // tileItem->setPos(i * tileItem->boundingRect().width() + i, + // j * tileItem->boundingRect().width() + j); + itemCpt++; + } + } +} + +void Scene::setTilesZoom(unsigned int tileZoom) { + tilesZoom = tileZoom; + // if (!items().isEmpty()) updateScene(); +} + +void Scene::setTilesPattern(TilesPattern tp) { tilesPattern = tp; } + +} // namespace Graphics +} // namespace application +} // namespace yaze diff --git a/src/application/Graphics/scene.h b/src/application/Graphics/scene.h new file mode 100644 index 00000000..759303ab --- /dev/null +++ b/src/application/Graphics/scene.h @@ -0,0 +1,39 @@ +#ifndef YAZE_APPLICATION_GRAPHICS_SCENE_H +#define YAZE_APPLICATION_GRAPHICS_SCENE_H + +#include +#include + +#include +#include + +#include "Graphics/tile.h" + +namespace yaze { +namespace application { +namespace Graphics { + +class Scene { + public: + Scene() = default; + void buildSurface(const std::vector& tiles, SNESPalette& mPalette, + const TilesPattern& tp); + + void updateScene(); + void setTilesZoom(unsigned int tileZoom); + void setTilesPattern(TilesPattern tp); + + std::unordered_map imagesCache; + + private: + unsigned int tilesZoom; + TilesPattern tilesPattern; + std::vector allTiles; + std::vector> arrangedTiles; +}; + +} // namespace Graphics +} // namespace application +} // namespace yaze + +#endif \ No newline at end of file diff --git a/src/application/Graphics/style.cc b/src/application/Graphics/style.cc new file mode 100644 index 00000000..0ac2b50a --- /dev/null +++ b/src/application/Graphics/style.cc @@ -0,0 +1,113 @@ +#include "style.h" + +#include "imgui/imgui.h" +#include "imgui/imgui_internal.h" + +namespace yaze { +namespace application { +namespace Core { +namespace Style { + +void ColorsYaze() { + ImGuiStyle *style = &ImGui::GetStyle(); + ImVec4 *colors = style->Colors; + + style->WindowPadding = ImVec2(10.f, 10.f); + style->FramePadding = ImVec2(10.f, 3.f); + style->CellPadding = ImVec2(4.f, 5.f); + style->ItemSpacing = ImVec2(10.f, 5.f); + style->ItemInnerSpacing = ImVec2(5.f, 5.f); + style->TouchExtraPadding = ImVec2(0.f, 0.f); + style->IndentSpacing = 20.f; + style->ScrollbarSize = 14.f; + style->GrabMinSize = 15.f; + + style->WindowBorderSize = 0.f; + style->ChildBorderSize = 1.f; + style->PopupBorderSize = 1.f; + style->FrameBorderSize = 0.f; + style->TabBorderSize = 0.f; + + style->WindowRounding = 0.f; + style->ChildRounding = 0.f; + style->FrameRounding = 5.f; + style->PopupRounding = 0.f; + style->ScrollbarRounding = 5.f; + + auto alttpDarkGreen = ImVec4(0.18f, 0.26f, 0.18f, 1.0f); + auto alttpMidGreen = ImVec4(0.28f, 0.36f, 0.28f, 1.0f); + auto allttpLightGreen = ImVec4(0.36f, 0.45f, 0.36f, 1.0f); + auto allttpLightestGreen = ImVec4(0.49f, 0.57f, 0.49f, 1.0f); + + colors[ImGuiCol_MenuBarBg] = alttpDarkGreen; + colors[ImGuiCol_TitleBg] = alttpMidGreen; + + colors[ImGuiCol_Header] = alttpDarkGreen; + colors[ImGuiCol_HeaderHovered] = allttpLightGreen; + colors[ImGuiCol_HeaderActive] = alttpMidGreen; + + colors[ImGuiCol_TitleBgActive] = alttpDarkGreen; + colors[ImGuiCol_TitleBgCollapsed] = alttpMidGreen; + + colors[ImGuiCol_Tab] = alttpDarkGreen; + colors[ImGuiCol_TabHovered] = alttpMidGreen; + colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], + colors[ImGuiCol_TitleBgActive], 0.60f); + + colors[ImGuiCol_Button] = alttpMidGreen; + colors[ImGuiCol_ButtonHovered] = allttpLightestGreen; + colors[ImGuiCol_ButtonActive] = allttpLightGreen; + + colors[ImGuiCol_ScrollbarBg] = ImVec4(0.36f, 0.45f, 0.36f, 0.60f); + colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.36f, 0.45f, 0.36f, 0.30f); + colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.36f, 0.45f, 0.36f, 0.40f); + colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.36f, 0.45f, 0.36f, 0.60f); + + colors[ImGuiCol_Text] = ImVec4(0.90f, 0.90f, 0.90f, 1.00f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.60f, 0.60f, 0.60f, 1.00f); + colors[ImGuiCol_WindowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.85f); + colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_PopupBg] = ImVec4(0.11f, 0.11f, 0.14f, 0.92f); + colors[ImGuiCol_Border] = allttpLightGreen; + colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + + colors[ImGuiCol_FrameBg] = ImVec4(0.43f, 0.43f, 0.43f, 0.39f); + colors[ImGuiCol_FrameBgHovered] = ImVec4(0.28f, 0.36f, 0.28f, 0.40f); + colors[ImGuiCol_FrameBgActive] = ImVec4(0.28f, 0.36f, 0.28f, 0.69f); + + colors[ImGuiCol_CheckMark] = ImVec4(0.90f, 0.90f, 0.90f, 0.50f); + colors[ImGuiCol_SliderGrab] = ImVec4(1.00f, 1.00f, 1.00f, 0.30f); + colors[ImGuiCol_SliderGrabActive] = ImVec4(0.36f, 0.45f, 0.36f, 0.60f); + + colors[ImGuiCol_Separator] = ImVec4(0.50f, 0.50f, 0.50f, 0.60f); + colors[ImGuiCol_SeparatorHovered] = ImVec4(0.60f, 0.60f, 0.70f, 1.00f); + colors[ImGuiCol_SeparatorActive] = ImVec4(0.70f, 0.70f, 0.90f, 1.00f); + colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.10f); + colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.78f, 0.82f, 1.00f, 0.60f); + colors[ImGuiCol_ResizeGripActive] = ImVec4(0.78f, 0.82f, 1.00f, 0.90f); + + colors[ImGuiCol_TabUnfocused] = + ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f); + colors[ImGuiCol_TabUnfocusedActive] = + ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f); + colors[ImGuiCol_PlotLines] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); + colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = alttpDarkGreen; + colors[ImGuiCol_TableBorderStrong] = alttpMidGreen; + colors[ImGuiCol_TableBorderLight] = + ImVec4(0.26f, 0.26f, 0.28f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.07f); + colors[ImGuiCol_TextSelectedBg] = ImVec4(0.00f, 0.00f, 1.00f, 0.35f); + colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); + colors[ImGuiCol_NavHighlight] = colors[ImGuiCol_HeaderHovered]; + colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f); + colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f); + colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f); +} +} // namespace Style +} // namespace Core +} // namespace application +} // namespace yaze \ No newline at end of file diff --git a/src/application/Graphics/style.h b/src/application/Graphics/style.h new file mode 100644 index 00000000..6a3fca1f --- /dev/null +++ b/src/application/Graphics/style.h @@ -0,0 +1,19 @@ +#ifndef YAZE_APPLICATION_CORE_STYLE_H +#define YAZE_APPLICATION_CORE_STYLE_H + +#include +#include + +namespace yaze { +namespace application { +namespace Core { +namespace Style { + +void ColorsYaze(); + +} // namespace Style +} // namespace Core +} // namespace application +} // namespace yaze + +#endif \ No newline at end of file diff --git a/src/application/Graphics/tile.cc b/src/application/Graphics/tile.cc new file mode 100644 index 00000000..d8a640e9 --- /dev/null +++ b/src/application/Graphics/tile.cc @@ -0,0 +1,152 @@ +#include "tile.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace yaze { +namespace application { +namespace Graphics { + +TilesPattern::TilesPattern() { + tiles_per_row_ = 16; + number_of_tiles_ = 16; + // std::vector{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 9, 11, 12, 13, 14, 15, + // 16}); + + transform_vector_.push_back(std::vector{0, 1, 2, 3}); + transform_vector_.push_back(std::vector{4, 5, 6, 7}); + transform_vector_.push_back(std::vector{8, 9, 11, 12}); + transform_vector_.push_back(std::vector{13, 14, 15, 16}); + + // "[0, 1, 4, 5], [2, 3, 6, 7], [8, 9, C, D], [A, B, E, F]" +} + +// [pattern] +// name = "32x32 B (4x4)" +// number_of_tile = 16 +// pattern = +void TilesPattern::default_settings() { + number_of_tiles_ = 16; + std::string patternString = + "[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, A, B], [C, D, E, F]"; + + transform_vector_.clear(); + + std::smatch cm; + std::regex arrayRegExp("(\\[[\\s|0-F|a-f|,]+\\])"); + + int pos = 0; + while (std::regex_search(patternString, cm, arrayRegExp)) { + std::string arrayString = cm[1]; + std::vector tmpVect; + uint stringPos = 1; + + while (arrayString[stringPos] != ']') { + while (arrayString[stringPos] == ' ') stringPos++; + std::smatch cm_; + std::regex hex("([0-F|a-f]+)"); + bool ok; + + std::regex_search(arrayString, cm, hex); + if (cm[1] == stringPos) { + std::cout << "here" << std::endl; + // tmpVect.push_back(stoi(cm[1])); + } + while (arrayString[stringPos] == ' ') stringPos++; + stringPos++; // should be the comma + } + + pos += cm.size(); + transform_vector_.push_back(tmpVect); + } + std::cout << transform_vector_.size() << std::endl; +} + +std::vector > TilesPattern::transform( + const std::vector &tiles) const { + uint repeatOffsetY = 0; + uint repeatOffsetX = 0; + uint tVectHeight = transform_vector_.size(); + uint tVectWidth = transform_vector_[0].size(); + uint repeat = 0; + std::vector > toret; + uint transPerRow = tiles_per_row_ / tVectWidth; + uint nbTransform = tiles.size() / number_of_tiles_; + printf("Tiles size : %d\nnbtransform : %d\npattern number of tiles : %d\n", + tiles.size(), nbTransform, number_of_tiles_); + + if (transPerRow > nbTransform) + toret.resize(tVectHeight); + else + toret.resize(((uint)(((double)nbTransform / (double)transPerRow) + 0.5)) * + tVectHeight); + + for (auto &each : toret) { + each.resize(tiles_per_row_); + } + + std::cout << toret[0].size() << " x " << toret.size(); + while (repeat != nbTransform) { + std::cout << "repeat" << repeat; + for (uint j = 0; j < tVectHeight; j++) { + for (uint i = 0; i < tVectWidth; i++) { + uint posTile = transform_vector_[j][i] + number_of_tiles_ * repeat; + uint posX = i + repeatOffsetX; + uint posY = j + repeatOffsetY; + printf("X: %d - Y: %d - posTile : %d \n", posX, posY, posTile); + toret.at(posY).at(posX) = tiles[posTile]; + } + } + if (repeatOffsetX + tVectWidth == tiles_per_row_) { + repeatOffsetX = 0; + repeatOffsetY += tVectHeight; + } else + repeatOffsetX += tVectWidth; + repeat++; + } + std::cout << "End of transform" << std::endl; + return toret; +} + +std::vector TilesPattern::reverse( + const std::vector &tiles) const { + uint repeatOffsetY = 0; + uint repeatOffsetX = 0; + uint tVectHeight = transform_vector_.size(); + uint tVectWidth = transform_vector_[0].size(); + uint repeat = 0; + uint nbTransPerRow = tiles_per_row_ / tVectWidth; + uint nbTiles = tiles.size(); + std::vector toretVec(tiles.size()); + + for (uint i = 0; i < nbTiles; i++) { + uint lineNb = i / tiles_per_row_; + uint lineInTab = lineNb % tVectHeight; + uint colInTab = i % tVectWidth; + uint tileNb = transform_vector_[lineInTab][colInTab]; + + uint lineBlock = i / (nbTransPerRow * number_of_tiles_); + uint blockNB = + (i % (nbTransPerRow * number_of_tiles_) % tiles_per_row_) / tVectWidth; + + std::cout << colInTab << lineInTab << " = " << tileNb; + uint pos = tileNb + (lineBlock + blockNB) * number_of_tiles_; + std::cout << i << "Goes to : " << pos; + toretVec[pos] = tiles[i]; + } + return toretVec; +} + +std::vector > TilesPattern::transform( + const TilesPattern &pattern, const std::vector &tiles) { + return pattern.transform(tiles); +} + +} // namespace Graphics +} // namespace application +} // namespace yaze diff --git a/src/application/Graphics/tile.h b/src/application/Graphics/tile.h new file mode 100644 index 00000000..56d0122e --- /dev/null +++ b/src/application/Graphics/tile.h @@ -0,0 +1,106 @@ +#ifndef YAZE_APPLICATION_DATA_TILE_H +#define YAZE_APPLICATION_DATA_TILE_H + +#include + +#include +#include +#include +#include + +#include "Core/constants.h" +#include "Graphics/palette.h" + +namespace yaze { +namespace application { +namespace Graphics { + +// vhopppcc cccccccc +// [0, 1] +// [2, 3] +class TileInfo { + public: + ushort id_; + ushort over_; + ushort vertical_mirror_; + ushort horizontal_mirror_; + uchar palette_; + TileInfo() = default; + TileInfo(ushort id, uchar palette, ushort v, ushort h, ushort o) + : id_(id), + over_(o), + vertical_mirror_(v), + horizontal_mirror_(h), + palette_(palette) {} +}; + +class Tile32 { + public: + ushort tile0_; + ushort tile1_; + ushort tile2_; + ushort tile3_; + + Tile32(ushort t0, ushort t1, ushort t2, ushort t3) + : tile0_(t0), tile1_(t1), tile2_(t2), tile3_(t3) {} +}; + +class Tile16 { + public: + TileInfo tile0_; + TileInfo tile1_; + TileInfo tile2_; + TileInfo tile3_; + std::vector tiles_info; + + Tile16(TileInfo t0, TileInfo t1, TileInfo t2, TileInfo t3) + : tile0_(t0), tile1_(t1), tile2_(t2), tile3_(t3) { + tiles_info.push_back(tile0_); + tiles_info.push_back(tile1_); + tiles_info.push_back(tile2_); + tiles_info.push_back(tile3_); + } +}; + +class TilesPattern { + public: + TilesPattern(); + std::string name; + std::string description; + bool custom; + unsigned int tiles_per_row_; + unsigned int number_of_tiles_; + + void default_settings(); + + static TilesPattern pattern(std::string name); + static std::vector> transform( + const TilesPattern& pattern, const std::vector& tiles); + + protected: + std::vector> transform( + const std::vector& tiles) const; + std::vector reverse(const std::vector& tiles) const; + + private: + std::vector> transform_vector_; +}; + +class TilePreset { + public: + TilePreset() = default; + TilesPattern tilesPattern; + bool no_zero_color_ = false; + int pc_tiles_location_ = 0; + int pc_palette_location_ = 0; + int bits_per_pixel_ = 0; + int length_ = 0; + int SNESTilesLocation = 0; + int SNESPaletteLocation = 0; +}; + +} // namespace Graphics +} // namespace application +} // namespace yaze + +#endif \ No newline at end of file diff --git a/src/yaze.h b/src/yaze.h index 1ccc8f5a..d7298d9d 100644 --- a/src/yaze.h +++ b/src/yaze.h @@ -1,7 +1,7 @@ #ifndef YAZE_YAZE_H #define YAZE_YAZE_H -#include "Application/Core/controller.h" -#include "Application/Core/entry_point.h" +#include "application/Core/controller.h" +#include "application/Core/entry_point.h" #endif // YAZE_YAZE_H \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index bbab5229..c41e14ef 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -17,10 +17,10 @@ add_executable( yaze_test yaze_test.cc rom_test.cc - ../src/Application/Data/rom.cc - ../src/Application/Graphics/tile.cc - ../src/Application/Graphics/tile.cc - ../src/Application/Graphics/palette.cc + ../src/application/Data/rom.cc + ../src/application/Graphics/tile.cc + ../src/application/Graphics/tile.cc + ../src/application/Graphics/palette.cc ${SNESHACKING_PATH}/compressions/alttpcompression.c ${SNESHACKING_PATH}/compressions/stdnintendo.c ${SNESHACKING_PATH}/tile.c @@ -33,7 +33,7 @@ add_executable( target_include_directories( yaze_test PUBLIC ../src/Library/ - ../src/Application/ + ../src/application/ ${SNESHACKING_PATH} ) diff --git a/test/rom_test.cc b/test/rom_test.cc index afa617c2..befbbc29 100644 --- a/test/rom_test.cc +++ b/test/rom_test.cc @@ -35,8 +35,8 @@ class DecompressionTest : public ::testing::Test { void TearDown() override {} unsigned int c_size_; - yaze::Application::Data::ROM rom_; - yaze::Application::Graphics::TilePreset tile_preset_; + yaze::application::Data::ROM rom_; + yaze::application::Graphics::TilePreset tile_preset_; }; TEST_F(DecompressionTest, test_valid_command_decompress) { @@ -93,7 +93,7 @@ TEST_F(DecompressionTest, test_compress_decompress) { TEST_F(DecompressionTest, basic_test) { rom_.LoadFromFile("assets/alttp.sfc"); - tile_preset_.bpp_ = 4; + tile_preset_.bits_per_pixel_ = 4; tile_preset_.length_ = 28672; tile_preset_.pc_tiles_location_ = 0x80000; tile_preset_.SNESTilesLocation = 0x0000; diff --git a/test/yaze_test.cc b/test/yaze_test.cc index 9e6df403..49e89f45 100644 --- a/test/yaze_test.cc +++ b/test/yaze_test.cc @@ -3,7 +3,7 @@ namespace YazeTests { -TEST(YazeApplicationTests, TemplateTest) { +TEST(YazeapplicationTests, TemplateTest) { int i = 0; ASSERT_EQ(i, 0); }