diff --git a/CHANGELOG.md b/CHANGELOG.md index af4d4a9f2..b31116484 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,16 +14,23 @@ * Populated the bundled es_systems.xml files with alternative emulator entries for most RetroArch cores * Added a virtual keyboard, partly based on code from batocera-emulationstation * Added badges that indicate favorite/completed/broken games as well as games suitable for children and those with a selected alternative emulator -* Added game-specific controller images that are selectable via the metadata editor and displayed as a controller badge +* Added game-specific controllers that are selectable via the metadata editor and displayed as a controller badge +* Added scraping of title screens, box back covers and physical media images +* Updated the media viewer to display title screens and box back cover images +* Added physical media images to the generated miximages +* Added an option to rotate horizontally oriented game boxes when generating miximages +* Added size options (small/medium/large) for the boxes/covers and physical media images when generating miximages * Added the ability to make complementary game system customizations without having to replace the entire bundled es_systems.xml file * Added support for an optional \ tag for es_systems.xml that can be used to override the default \ systems sorting * Added menu scroll indicators showing if there are additional entries available below or above what's currently shown on screen +* Added scraping of controller metadata (only for ScreenScraper and only for arcade systems) * Improved the layout of the scraper GUIs (single-game scraper and multi-scraper) * Added horizontal scrolling of long game names to the scraper GUIs +* Removed the "Scrape" text prefix from the scraper content settings * Improved the gamelist filter screen to not allow filtering of values where there is no actual data to filter, e.g. Favorites for a system with no favorite games * Grayed out all fields in the gamelist filter screen where there is no data to filter, previously some fields were removed entirely and some could still be used * Added the ability to filter on blank/unknown values for Genre, Player, Developer, Publisher and Alternative emulator. -* Added filters for "Alternative emulator" and "Controller badges" and sorted the filters in the same order as the metadata editor fields +* Added filters for "Controller" and "Alternative emulator" and sorted the filters in the same order as the metadata editor fields * Added a menu option to change the application exit key combination * Added an option to preload the gamelists on startup which leads to smoother navigation when first entering each gamelist * Lowered the minimum supported screen resolution from 640x480 to 224x224 to support arcade cabinet displays such as those running at 384x224 and 224x384 @@ -81,6 +88,7 @@ * When scraping in interactive mode, the game counter was not decreased when skipping games, making it impossible to skip the final games in the queue * When scraping in interactive mode, "No games found" results could be accepted using the "A" button * When scraping in interactive mode, any refining done using the "Y" button shortcut would not be shown when doing another refine using the "Refine search" button +* The multi-scraper did not update the filter index * Fixed multiple minor rendering issues where graphics would be slightly cut off or incorrectly resized * Under some circumstances ScrollableContainer (used for the game descriptions) would contain a partially rendered bottom line * If the TextListComponent height was not evenly dividable by the font height + line spacing, a partial bottom row would get rendered @@ -104,6 +112,8 @@ * Really long theme set names would not get abbreviated in the UI settings menu, leading to a garbled "Theme set" setting row * Disabling a collection while its gamelist was displayed would lead to a slide transition from a black screen if a gamelist on startup had been set * When marking a game to not be counted in the metadata editor and the game was part of a custom collection, no collection disabling notification was displayed +* When running really low on texture memory, the menu texture would not get rendered correctly +* There was a tiny and randomly occuring gap between the system carousel and systemInfo bar during slide transitions between the System and Gamelist views * SliderComponent had very inconsistent widths at different screen aspect ratios * SliderComponent did not properly align the knob and bar vertically * Resizing in SwitchComponent did not reposition the image properly leading to a non-centered image diff --git a/THEMES-DEV.md b/THEMES-DEV.md index b94cd4bc8..4b0870d4c 100644 --- a/THEMES-DEV.md +++ b/THEMES-DEV.md @@ -958,7 +958,7 @@ It's strongly recommended to use the same image dimensions for all badges as var - A badge icon override. Specify the badge type in the attribute `badge`. The available badges are the ones listed above. * `customControllerIcon` - type: PATH. - A controller icon override. Specify the controller type in the attribute `controller`. These are the available types: - - `gamepad_generic`, `gamepad_xbox`, `gamepad_playstation`, `gamepad_nintendo_nes`, `gamepad_nintendo_snes`, `gamepad_nintendo_64`, `joystick_generic`, `joystick_arcade_2_buttons`, `joystick_arcade_3_buttons`, `joystick_arcade_4_buttons`, `joystick_arcade_6_buttons`, `trackball_generic`, `lightgun_generic`, `lightgun_nintendo`, `keyboard_generic`, `mouse_generic`, `mouse_amiga`, `keyboard_mouse_generic`, `steering_wheel_generic`, `wii_remote_nintendo`, `wii_remote_nunchuck_nintendo`, `joycon_left_or_right_nintendo`, `joycon_pair_nintendo`, `unknown`. + - `gamepad_generic`, `gamepad_xbox`, `gamepad_playstation`, `gamepad_nintendo_nes`, `gamepad_nintendo_snes`, `gamepad_nintendo_64`, `joystick_generic`, `joystick_arcade_no_buttons`, `joystick_arcade_1_button`, `joystick_arcade_2_buttons`, `joystick_arcade_3_buttons`, `joystick_arcade_4_buttons`, `joystick_arcade_5_buttons`, `joystick_arcade_6_buttons`, `flight_stick_generic`, `spinner_generic`, `trackball_generic`, `lightgun_generic`, `lightgun_nintendo`, `keyboard_generic`, `mouse_generic`, `mouse_amiga`, `keyboard_and_mouse_generic`, `steering_wheel_generic`, `wii_remote_nintendo`, `wii_remote_and_nunchuk_nintendo`, `joycon_left_or_right_nintendo`, `joycon_pair_nintendo`, `unknown`. * `visible` - type: BOOLEAN. - If true, component will be rendered, otherwise rendering will be skipped. Can be used to hide elements from a particular view. * `zIndex` - type: FLOAT. @@ -998,6 +998,8 @@ It's strongly recommended to use the same image dimensions for all badges as var - Default is 3 * `zIndex` - type: FLOAT. - z-index value for component. Components will be rendered in order of z-index value from low to high. +* `legacyZIndexMode` - type: BOOLEAN + - If true, the carousel will ignore zIndex and always render on top of other components. Default is `true`. The help system is a special element that displays a context-sensitive list of actions the user can take at any time. You should try and keep the position constant throughout every screen. Keep in mind the "default" settings (including position) are used whenever the user opens a menu. diff --git a/USERGUIDE-DEV.md b/USERGUIDE-DEV.md index d56306a2a..61e8be362 100644 --- a/USERGUIDE-DEV.md +++ b/USERGUIDE-DEV.md @@ -626,23 +626,31 @@ ES-DE supports the two scrapers [ScreenScraper.fr](https://www.screenscraper.fr) Here's an overview of what's supported when using these scrapers: -| Media type or option | ScreenScraper | TheGamesDB | -| :----------------------- | :-----------: | :--------: | -| Region (EU/JP/US/WOR) | Yes | No | -| Multi-language | Yes | No | -| Game names | Yes | Yes | -| Ratings | Yes | No | -| Other game metadata | Yes | Yes | -| Videos | Yes | No | -| Screenshots | Yes | Yes | -| Box covers (2D) | Yes | Yes | -| Marquees/wheels | Yes | Yes | -| 3D boxes | Yes | No | +| Media type or option | ScreenScraper | TheGamesDB | +| :-------------------------------- | :-----------: | :--------: | +| Region (EU/JP/US/WOR) | Yes | No | +| Multi-language | Yes | No | +| Game names | Yes | Yes | +| Ratings | Yes | No | +| Controllers (arcade systems only) | Yes | No | +| Other game metadata | Yes | Yes | +| Videos | Yes | No | +| Screenshots | Yes | Yes | +| Title screens | Yes | Yes | +| Box covers | Yes | Yes | +| Box back covers | Yes | No | +| Marquees/wheels | Yes | Yes | +| 3D boxes | Yes | No | +| Physical media | Yes | No | The category **Other game metadata** includes Description, Release date, Developer, Publisher, Genre and Players. The **Multi-language** support includes translated game genres and game descriptions for a number of languages. +**Controllers** is metadata indicating the controller type (it's not images of controllers). + +**Physical media** means images of cartridges, diskettes, tapes, CD-ROMs etc. that were used to distribute the games. + There are two approaches to scraping, either for a single game from the metadata editor, or for many games and systems using the multi-scraper. ![alt text](images/es-de_scraper_running.png "ES-DE Scraper Running") @@ -694,10 +702,13 @@ C:\Users\Myusername\.emulationstation\downloaded_media\c64\screenshots\ The media directories per game system are: * 3dboxes +* backcovers * covers * marquees * miximages +* physicalmedia * screenshots +* titlescreens * videos The miximages are generated by ES-DE. Normally that takes place automatically when scraping, but in this example of manually copying existing media files, the miximage offline generator should be used instead. This tool can generate the miximages for the complete game collection in one go. How that works is explained elsewhere in this guide. @@ -770,37 +781,53 @@ The password as registered on screenscraper.fr. This is masked using asterisks o Describes the content types to include in the scraping. -**Scrape game names** +**Game names** Whether to scrape the names of the games. This does not affect the actual files on the filesystem and the game name is primarily used for appearance and sorting purposes. The downloaded media files are matched against the physical game files on the filesystem, and not against this metadata. See the comments under _Overwrite files and data_ below to understand some additional implications regarding game names. -**Scrape ratings** _(ScreenScraper only)_ +**Ratings** _(ScreenScraper only)_ Downloads game ratings. -**Scrape other metadata** +**Controllers (arcade systems only)** _(ScreenScraper only)_ + +Scrapes controller metadata which is used to set the correct controller badge. This is only available for MAME arcade games, for systems such as _arcade_, _mame_, _neogeo_, _fba_ etc. This is so because ScreenScraper does not seem to provide controller information for other platforms. The type of controllers that are scraped are _joystick_ (separated into entries from no buttons up to 6 buttons), _steering wheel_, _flight stick_, _spinner_, _trackball_ and _lightgun_. + +**Other metadata** This includes the game description, release date, developer, publisher, genre and the number of players. -**Scrape videos** _(ScreenScraper only)_ +**Videos** _(ScreenScraper only)_ Videos of actual gameplay. -**Scrape screenshot images** +**Screenshot images** Screenshot images of actual gameplay. -**Scrape box cover images** +**Title screen images** -Cover art. +Screenshot images of the title screen. -**Scrape marquee (wheel) images** +**Box cover images** + +Cover art, front of box/case. + +**Box back cover images** _(ScreenScraper only)_ + +Back of box/case. + +**Marquee (wheel) images** Logotype for the game. -**Scrape 3D box images** _(ScreenScraper only)_ +**3D box images** _(ScreenScraper only)_ -These are primarily used for generating miximages. +These are only used for generating miximages. + +**Physical media images** _(ScreenScraper only)_ + +Images of cartridges, diskettes, tapes, CD-ROMs etc. that were used to distribute the games. These are only used for generating miximages. #### Miximage settings @@ -814,6 +841,14 @@ It's possible to select betweeen the 1280x960, 1920x1440 and 640x480 resolutions The _sharp_ scaling method uses nearest-neighbor interpolation which retains sharp pixels and looks better for most low-resolution retro games. The _smooth_ scaling method uses the Lanczos algorithm and produces smoother pixels. This may look better on some more modern games at higher resolutions. If unsure, use the _sharp_ method. +**Box size** + +The size of the 3D game box, or the cover image if there is no 3D box and the _Use cover image if 3D box is missing_ setting has been enabled. The available options are _medium, small_ and _large_. + +**Physical media size** + +The size of the physical media image. The available options are _medium, small_ and _large_. + **Generate miximages when scraping** Enables or disables the miximage generator when scraping. Applies to both the single-game scraper and the multi-scraper. @@ -830,6 +865,10 @@ With this option enabled, any horizontal pure black areas at the top and bottom With this option enabled, any vertical pure black areas at the left and right sides of the screenshots are automatically cropped. +**Rotate horizontally oriented boxes** + +Some consoles such as Super Nintendo have game boxes with the cover printed horizontally rather than using the more common vertical format. If enabling this setting, those images will be rotated 90 degrees so they stand up like the box images for most other systems. + **Incude marquee image** Whether to include the marquee (wheel) image in the composite miximage. @@ -842,6 +881,10 @@ Whether to include the box image in the composite miximage. If a 3D box exists f Whether to use the 2D box cover as fallback if the 3D box image is missing for the game. +**Include physical media image** + +Whether to include the image of the physical media used to distribute the game, for example a cartridge, diskette, tape, CD-ROM etc. + **Offline generator** This is not a setting, but instead a GUI to generate miximages offline without going via the scraper. This tool uses the same game system selections as the scraper, so you need to select at least one system on the scraper menu before attempting to run it. All the miximage settings are applied in the same way as when generating images via the scraper. The prerequisite is that at least a screenshot exists for each game. If there is no screenshot, or if the screenshot is unreadable for some reason, the generation for that specific game will fail. There is statistics shown in the tool displaying the number of generated, overwritten, skipped and failed images. Any error message is also shown on screen as well as being saved to the es_log.txt file. @@ -1022,9 +1065,9 @@ Whether to use a shader to render scanlines for the videos. Be aware that this i Whether to use a shader to render a slight horizontal blur which somewhat simulates a well-used CRT monitor. Be aware that this is quite demanding for the GPU. -**Render scanlines for screenshots** _(OpenGL renderer only)_ +**Render scanlines for screenshots and titles** _(OpenGL renderer only)_ -Whether to use a shader to render scanlines for the screenshot images. +Whether to use a shader to render scanlines for the screenshot and title screen images. #### Screensaver settings @@ -1376,7 +1419,7 @@ The following filters can be applied: **Broken** -**Controller badge** +**Controller** **Alternative emulator** @@ -1482,7 +1525,7 @@ This option will hide most metadata fields as well as any badges. The intention A statistics counter that tracks how many times you have played the game. You normally don't need to touch this, but if you want to, the possibility is there. -**Controller badge** +**Controller** This entry provides a selection of controller icons that are built into ES-DE (although the theme set can override the actual graphics files). The selected icon will be displayed as a badge if the current theme set support badges. This functionality is only cosmetic and will not affect the actual emulators. diff --git a/es-app/src/FileData.cpp b/es-app/src/FileData.cpp index cc205a940..8174cdde2 100644 --- a/es-app/src/FileData.cpp +++ b/es-app/src/FileData.cpp @@ -208,7 +208,7 @@ const std::string FileData::getMediaDirectory() return mediaDirPath; } -const std::string FileData::getMediafilePath(std::string subdirectory, std::string mediatype) const +const std::string FileData::getMediafilePath(std::string subdirectory) const { const std::vector extList = {".png", ".jpg"}; std::string subFolders; @@ -234,53 +234,76 @@ const std::string FileData::getMediafilePath(std::string subdirectory, std::stri const std::string FileData::getImagePath() const { // Look for a mix image (a combination of screenshot, 2D/3D box and marquee). - std::string image = getMediafilePath("miximages", "miximage"); + std::string image = getMediafilePath("miximages"); if (image != "") return image; // If no mix image was found, try screenshot instead. - image = getMediafilePath("screenshots", "screenshot"); + image = getMediafilePath("screenshots"); + if (image != "") + return image; + + // If no screenshot image was found, try title screen instead. + image = getMediafilePath("titlescreens"); if (image != "") return image; // If no screenshot was found either, try cover. - return getMediafilePath("covers", "cover"); + return getMediafilePath("covers"); } const std::string FileData::get3DBoxPath() const { // Return path to the 3D box image. - return getMediafilePath("3dboxes", "3dbox"); + return getMediafilePath("3dboxes"); +} + +const std::string FileData::getBackCoverPath() const +{ + // Return path to the box back cover image. + return getMediafilePath("backcovers"); } const std::string FileData::getCoverPath() const { - // Return path to the cover image. - return getMediafilePath("covers", "cover"); + // Return path to the box cover image. + return getMediafilePath("covers"); } const std::string FileData::getMarqueePath() const { // Return path to the marquee image. - return getMediafilePath("marquees", "marquee"); + return getMediafilePath("marquees"); +} + +const std::string FileData::getPhysicalMediaPath() const +{ + // Return path to the physical media image. + return getMediafilePath("physicalmedia"); } const std::string FileData::getMiximagePath() const { // Return path to the miximage. - return getMediafilePath("miximages", "miximage"); + return getMediafilePath("miximages"); } const std::string FileData::getScreenshotPath() const { // Return path to the screenshot image. - return getMediafilePath("screenshots", "screenshot"); + return getMediafilePath("screenshots"); +} + +const std::string FileData::getTitleScreenPath() const +{ + // Return path to the title screen image. + return getMediafilePath("titlescreens"); } const std::string FileData::getThumbnailPath() const { // Return path to the thumbnail image. - return getMediafilePath("thumbnails", "thumbnail"); + return getMediafilePath("thumbnails"); } const std::string FileData::getVideoPath() const diff --git a/es-app/src/FileData.h b/es-app/src/FileData.h index 9621fd006..2411a4dd6 100644 --- a/es-app/src/FileData.h +++ b/es-app/src/FileData.h @@ -60,13 +60,16 @@ public: const bool getHasFoldersFlag() { return mHasFolders; } static const std::string getROMDirectory(); static const std::string getMediaDirectory(); - const std::string getMediafilePath(std::string subdirectory, std::string mediatype) const; + const std::string getMediafilePath(std::string subdirectory) const; const std::string getImagePath() const; const std::string get3DBoxPath() const; + const std::string getBackCoverPath() const; const std::string getCoverPath() const; const std::string getMarqueePath() const; + const std::string getPhysicalMediaPath() const; const std::string getMiximagePath() const; const std::string getScreenshotPath() const; + const std::string getTitleScreenPath() const; const std::string getThumbnailPath() const; const std::string getVideoPath() const; diff --git a/es-app/src/FileFilterIndex.cpp b/es-app/src/FileFilterIndex.cpp index ec4384c18..b7a0bb5fa 100644 --- a/es-app/src/FileFilterIndex.cpp +++ b/es-app/src/FileFilterIndex.cpp @@ -51,7 +51,7 @@ FileFilterIndex::FileFilterIndex() {KIDGAME_FILTER, &mKidGameIndexAllKeys, &mFilterByKidGame, &mKidGameIndexFilteredKeys, "kidgame", false, "", "KIDGAME"}, {HIDDEN_FILTER, &mHiddenIndexAllKeys, &mFilterByHidden, &mHiddenIndexFilteredKeys, "hidden", false, "", "HIDDEN"}, {BROKEN_FILTER, &mBrokenIndexAllKeys, &mFilterByBroken, &mBrokenIndexFilteredKeys, "broken", false, "", "BROKEN"}, - {CONTROLLER_FILTER, &mControllerIndexAllKeys, &mFilterByController, &mControllerIndexFilteredKeys, "controller", false, "", "CONTROLLER BADGE"}, + {CONTROLLER_FILTER, &mControllerIndexAllKeys, &mFilterByController, &mControllerIndexFilteredKeys, "controller", false, "", "CONTROLLER"}, {ALTEMULATOR_FILTER, &mAltemulatorIndexAllKeys, &mFilterByAltemulator, &mAltemulatorIndexFilteredKeys, "altemulator", false, "", "ALTERNATIVE EMULATOR"} }; // clang-format on diff --git a/es-app/src/MediaViewer.cpp b/es-app/src/MediaViewer.cpp index 06f59e515..c24e9cf1c 100644 --- a/es-app/src/MediaViewer.cpp +++ b/es-app/src/MediaViewer.cpp @@ -41,7 +41,8 @@ bool MediaViewer::startMediaViewer(FileData* game) mHasVideo = false; mHasImages = false; mCurrentImageIndex = 0; - mScreenShotIndex = -1; + mScreenshotIndex = -1; + mTitleScreenIndex = -1; mGame = game; @@ -125,9 +126,12 @@ void MediaViewer::render(const glm::mat4& /*parentTrans*/) mImage->render(trans); #if defined(USE_OPENGL_21) - if (mCurrentImageIndex == mScreenShotIndex && + if (mCurrentImageIndex == mScreenshotIndex && Settings::getInstance()->getBool("MediaViewerScreenshotScanlines")) Renderer::shaderPostprocessing(Renderer::SHADER_SCANLINES); + else if (mCurrentImageIndex == mTitleScreenIndex && + Settings::getInstance()->getBool("MediaViewerScreenshotScanlines")) + Renderer::shaderPostprocessing(Renderer::SHADER_SCANLINES); #endif // This is necessary so that the video loops if viewing an image when @@ -164,15 +168,23 @@ void MediaViewer::findMedia() if (!mHasVideo && (mediaFile = mGame->getScreenshotPath()) != "") { mImageFiles.push_back(mediaFile); - mScreenShotIndex = 0; + mScreenshotIndex = 0; } if ((mediaFile = mGame->getCoverPath()) != "") mImageFiles.push_back(mediaFile); + if ((mediaFile = mGame->getBackCoverPath()) != "") + mImageFiles.push_back(mediaFile); + + if ((mediaFile = mGame->getTitleScreenPath()) != "") { + mImageFiles.push_back(mediaFile); + mTitleScreenIndex = static_cast(mImageFiles.size() - 1); + } + if (mHasVideo && (mediaFile = mGame->getScreenshotPath()) != "") { mImageFiles.push_back(mediaFile); - mScreenShotIndex = static_cast(mImageFiles.size() - 1); + mScreenshotIndex = static_cast(mImageFiles.size() - 1); } if ((mediaFile = mGame->getMiximagePath()) != "") diff --git a/es-app/src/MediaViewer.h b/es-app/src/MediaViewer.h index d60481a27..e84c696e0 100644 --- a/es-app/src/MediaViewer.h +++ b/es-app/src/MediaViewer.h @@ -44,7 +44,8 @@ private: bool mDisplayingImage; int mCurrentImageIndex; - int mScreenShotIndex; + int mScreenshotIndex; + int mTitleScreenIndex; std::string mVideoFile; std::vector mImageFiles; diff --git a/es-app/src/MetaData.cpp b/es-app/src/MetaData.cpp index 1dc7a10e1..ed52670fd 100644 --- a/es-app/src/MetaData.cpp +++ b/es-app/src/MetaData.cpp @@ -37,7 +37,7 @@ MetaDataDecl gameDecls[] = { {"nomultiscrape", MD_BOOL, "false", false, "exclude from multi-scraper", "enter no multi-scrape off/on", false}, {"hidemetadata", MD_BOOL, "false", false, "hide metadata fields", "enter hide metadata off/on", false}, {"playcount", MD_INT, "0", false, "times played", "enter number of times played", false}, -{"controller", MD_CONTROLLER, "", false, "controller badge", "select controller badge", false}, +{"controller", MD_CONTROLLER, "", false, "controller", "select controller", true}, {"altemulator", MD_ALT_EMULATOR, "", false, "alternative emulator", "select alternative emulator", false}, {"lastplayed", MD_TIME, "0", true, "last played", "enter last played date", false} }; @@ -58,7 +58,7 @@ MetaDataDecl folderDecls[] = { {"broken", MD_BOOL, "false", false, "broken/not working", "enter broken off/on", false}, {"nomultiscrape", MD_BOOL, "false", false, "exclude from multi-scraper", "enter no multi-scrape off/on", false}, {"hidemetadata", MD_BOOL, "false", false, "hide metadata fields", "enter hide metadata off/on", false}, -{"controller", MD_CONTROLLER, "", false, "controller badge", "select controller badge", false}, +{"controller", MD_CONTROLLER, "", false, "controller", "select controller", true}, {"lastplayed", MD_TIME, "0", true, "last played", "enter last played date", false} }; // clang-format on diff --git a/es-app/src/MiximageGenerator.cpp b/es-app/src/MiximageGenerator.cpp index 1d52a78a4..20eee9b2b 100644 --- a/es-app/src/MiximageGenerator.cpp +++ b/es-app/src/MiximageGenerator.cpp @@ -17,13 +17,14 @@ #include MiximageGenerator::MiximageGenerator(FileData* game, std::string& resultMessage) - : mGame(game) - , mResultMessage(resultMessage) - , mWidth(1280) - , mHeight(960) - , mMarquee(false) - , mBox3D(false) - , mCover(false) + : mGame{game} + , mResultMessage{resultMessage} + , mWidth{1280} + , mHeight{960} + , mMarquee{false} + , mBox3D{false} + , mCover{false} + , mPhysicalMedia{false} { } @@ -79,6 +80,16 @@ void MiximageGenerator::startThread(std::promise* miximagePromise) } } + if (Settings::getInstance()->getBool("MiximageIncludePhysicalMedia")) { + if ((mPhysicalMediaPath = mGame->getPhysicalMediaPath()) != "") { + mPhysicalMedia = true; + } + else { + LOG(LogDebug) + << "MiximageGenerator::MiximageGenerator(): No physical media image found"; + } + } + const auto startTime = std::chrono::system_clock::now(); if (generateImage()) { @@ -106,6 +117,7 @@ bool MiximageGenerator::generateImage() FIBITMAP* screenshotFile = nullptr; FIBITMAP* marqueeFile = nullptr; FIBITMAP* boxFile = nullptr; + FIBITMAP* physicalMediaFile = nullptr; unsigned int fileWidth = 0; unsigned int fileHeight = 0; @@ -269,6 +281,46 @@ bool MiximageGenerator::generateImage() } } + if (mPhysicalMedia) { +#if defined(_WIN64) + fileFormat = + FreeImage_GetFileTypeU(Utils::String::stringToWideString(mPhysicalMediaPath).c_str()); +#else + fileFormat = FreeImage_GetFileType(mPhysicalMediaPath.c_str()); +#endif + + if (fileFormat == FIF_UNKNOWN) +#if defined(_WIN64) + fileFormat = FreeImage_GetFIFFromFilenameU( + Utils::String::stringToWideString(mPhysicalMediaPath).c_str()); +#else + fileFormat = FreeImage_GetFIFFromFilename(mPhysicalMediaPath.c_str()); +#endif + + if (fileFormat == FIF_UNKNOWN) { + LOG(LogDebug) << "Physical media in unknown format, skipping image"; + mPhysicalMedia = false; + } + + if (!FreeImage_FIFSupportsReading(fileFormat)) { + LOG(LogDebug) << "Physical media file format not supported, skipping image"; + mPhysicalMedia = false; + } + else { +#if defined(_WIN64) + physicalMediaFile = FreeImage_LoadU( + fileFormat, Utils::String::stringToWideString(mPhysicalMediaPath).c_str()); +#else + physicalMediaFile = FreeImage_Load(fileFormat, mPhysicalMediaPath.c_str()); +#endif + if (!physicalMediaFile) { + LOG(LogError) << "Couldn't load physical media image, corrupt file?"; + mMessage = "Error loading physical media image, corrupt file?"; + mPhysicalMedia = false; + } + } + } + unsigned int resolutionMultiplier = 0; if (Settings::getInstance()->getString("MiximageResolution") == "640x480") { @@ -295,12 +347,44 @@ bool MiximageGenerator::generateImage() // These sizes are increased slightly when adding the drop shadow. const unsigned int marqueeTargetWidth = 310 * resolutionMultiplier; const unsigned int marqueeTargetHeight = 230 * resolutionMultiplier; - const unsigned int boxTargetWidth = 330 * resolutionMultiplier; - const unsigned int boxTargetHeight = 300 * resolutionMultiplier; - const unsigned int coverTargetWidth = 250 * resolutionMultiplier; + unsigned int boxTargetWidth = 0; + unsigned int boxTargetHeight = 0; + unsigned int coverTargetWidth = 0; + unsigned int physicalMediaTargetWidth = 0; + unsigned int physicalMediaTargetHeight = 0; + + if (Settings::getInstance()->getString("MiximageBoxSize") == "small") { + boxTargetWidth = 264 * resolutionMultiplier; + boxTargetHeight = 254 * resolutionMultiplier; + coverTargetWidth = 212 * resolutionMultiplier; + } + else if (Settings::getInstance()->getString("MiximageBoxSize") == "large") { + boxTargetWidth = 372 * resolutionMultiplier; + boxTargetHeight = 360 * resolutionMultiplier; + coverTargetWidth = 300 * resolutionMultiplier; + } + else { // Medium size. + boxTargetWidth = 310 * resolutionMultiplier; + boxTargetHeight = 300 * resolutionMultiplier; + coverTargetWidth = 250 * resolutionMultiplier; + } + + if (Settings::getInstance()->getString("MiximagePhysicalMediaSize") == "small") { + physicalMediaTargetWidth = 120 * resolutionMultiplier; + physicalMediaTargetHeight = 96 * resolutionMultiplier; + } + else if (Settings::getInstance()->getString("MiximagePhysicalMediaSize") == "large") { + physicalMediaTargetWidth = 196 * resolutionMultiplier; + physicalMediaTargetHeight = 156 * resolutionMultiplier; + } + else { // Medium size. + physicalMediaTargetWidth = 150 * resolutionMultiplier; + physicalMediaTargetHeight = 120 * resolutionMultiplier; + } const unsigned int marqueeShadowSize = 6 * resolutionMultiplier; const unsigned int boxShadowSize = 6 * resolutionMultiplier; + const unsigned int physicalMediaShadowSize = 6 * resolutionMultiplier; if (FreeImage_GetBPP(screenshotFile) != 32) { FIBITMAP* screenshotTemp = FreeImage_ConvertTo32Bits(screenshotFile); @@ -354,6 +438,9 @@ bool MiximageGenerator::generateImage() int xPosBox = 0; int yPosBox = 0; + int xPosPhysicalMedia = 0; + int yPosPhysicalMedia = 0; + CImg canvasImage(mWidth, mHeight, 1, 4, 0); CImg marqueeImage; @@ -364,6 +451,10 @@ bool MiximageGenerator::generateImage() CImg boxImageRGB; CImg boxImageAlpha; + CImg physicalMediaImage; + CImg physicalMediaImageRGB; + CImg physicalMediaImageAlpha; + CImg frameImage(mWidth, mHeight, 1, 4, 0); xPosScreenshot = canvasImage.width() / 2 - screenshotImage.width() / 2 + screenshotOffset; @@ -433,6 +524,12 @@ bool MiximageGenerator::generateImage() Utils::CImg::convertRGBAToCImg(boxVector, boxImage); Utils::CImg::removeTransparentPadding(boxImage); + float sizeRatio = + static_cast(boxImage.width()) / static_cast(boxImage.height()); + + if (sizeRatio > 1.14f && Settings::getInstance()->getBool("MiximageRotateHorizontalBoxes")) + boxImage.rotate(90.0f); + float scaleFactor = static_cast(boxTargetHeight) / static_cast(boxImage.height()); unsigned int width = static_cast(static_cast(boxImage.width()) * scaleFactor); @@ -466,8 +563,60 @@ bool MiximageGenerator::generateImage() boxImageAlpha = CImg(boxImage.get_shared_channel(3)); } + if (mPhysicalMedia) { + if (FreeImage_GetBPP(physicalMediaFile) != 32) { + FIBITMAP* physicalMediaTemp = FreeImage_ConvertTo32Bits(physicalMediaFile); + FreeImage_Unload(physicalMediaFile); + physicalMediaFile = physicalMediaTemp; + } + + fileWidth = FreeImage_GetWidth(physicalMediaFile); + fileHeight = FreeImage_GetHeight(physicalMediaFile); + filePitch = FreeImage_GetPitch(physicalMediaFile); + + std::vector physicalMediaVector(fileWidth * fileHeight * 4); + + FreeImage_ConvertToRawBits(reinterpret_cast(&physicalMediaVector.at(0)), + physicalMediaFile, filePitch, 32, FI_RGBA_RED, FI_RGBA_GREEN, + FI_RGBA_BLUE, 1); + + physicalMediaImage = CImg(FreeImage_GetWidth(physicalMediaFile), + FreeImage_GetHeight(physicalMediaFile), 1, 4, 0); + + Utils::CImg::convertRGBAToCImg(physicalMediaVector, physicalMediaImage); + Utils::CImg::removeTransparentPadding(physicalMediaImage); + + // Make sure the image size is not exceeding either the target width or height. + float scaleFactorX = static_cast(physicalMediaTargetWidth) / + static_cast(physicalMediaImage.width()); + float scaleFactorY = static_cast(physicalMediaTargetHeight) / + static_cast(physicalMediaImage.height()); + float scaleFactor = std::min(scaleFactorX, scaleFactorY); + + unsigned int width = + static_cast(static_cast(physicalMediaImage.width()) * scaleFactor); + unsigned int height = + static_cast(static_cast(physicalMediaImage.height()) * scaleFactor); + + // We use Lanczos3 which is the highest quality resampling method available. + physicalMediaImage.resize(width, height, 1, 4, 6); + + // Add a drop shadow using 4 iterations of box blur. + Utils::CImg::addDropShadow(physicalMediaImage, physicalMediaShadowSize, 0.6f, 4); + + // Place it to the right of the 3D box or cover with a small margin in between. + xPosPhysicalMedia = xPosBox + boxImage.width() + 16 * resolutionMultiplier; + yPosPhysicalMedia = canvasImage.height() - physicalMediaImage.height(); + + // Only RGB channels for the image. + physicalMediaImageRGB = CImg(physicalMediaImage.get_shared_channels(0, 2)); + // Only alpha channel for the image. + physicalMediaImageAlpha = CImg(physicalMediaImage.get_shared_channel(3)); + } + CImg frameImageAlpha(frameImage.get_shared_channel(3)); frameImageAlpha.draw_image(xPosBox, yPosBox, boxImageAlpha); + frameImageAlpha.draw_image(xPosPhysicalMedia, yPosPhysicalMedia, physicalMediaImageAlpha); frameImageAlpha.draw_image(xPosMarquee, yPosMarquee, marqueeImageAlpha); // Set a frame color based on an average of the screenshot contents. @@ -515,6 +664,10 @@ bool MiximageGenerator::generateImage() if (mBox3D || mCover) canvasImage.draw_image(xPosBox, yPosBox, boxImageRGB, boxImageAlpha, 1, 255); + if (mPhysicalMedia) + canvasImage.draw_image(xPosPhysicalMedia, yPosPhysicalMedia, physicalMediaImageRGB, + physicalMediaImageAlpha, 1, 255); + std::vector canvasVector; // Convert the image from CImg internal format. @@ -540,6 +693,7 @@ bool MiximageGenerator::generateImage() FreeImage_Unload(screenshotFile); FreeImage_Unload(marqueeFile); FreeImage_Unload(boxFile); + FreeImage_Unload(physicalMediaFile); FreeImage_Unload(mixImage); // Success. @@ -645,7 +799,7 @@ void MiximageGenerator::sampleFrameColor(CImg& screenshotImage, frameColor[3] = 255; } -std::string MiximageGenerator::getSavePath() +std::string MiximageGenerator::getSavePath() const { const std::string name = Utils::FileSystem::getStem(mGame->getPath()); std::string subFolders; diff --git a/es-app/src/MiximageGenerator.h b/es-app/src/MiximageGenerator.h index 5da3dbca8..805cc825e 100644 --- a/es-app/src/MiximageGenerator.h +++ b/es-app/src/MiximageGenerator.h @@ -35,7 +35,7 @@ private: unsigned int& height); void sampleFrameColor(CImg& screenshotImage, unsigned char (&frameColor)[4]); - std::string getSavePath(); + std::string getSavePath() const; FileData* mGame; std::string& mResultMessage; @@ -46,6 +46,7 @@ private: std::string mMarqueePath; std::string mBox3DPath; std::string mCoverPath; + std::string mPhysicalMediaPath; int mWidth; int mHeight; @@ -53,6 +54,7 @@ private: bool mMarquee; bool mBox3D; bool mCover; + bool mPhysicalMedia; }; #endif // ES_APP_SCRAPERS_MIXIMAGE_GENERATOR_H diff --git a/es-app/src/PlatformId.cpp b/es-app/src/PlatformId.cpp index 73d6a9249..3077cdc30 100644 --- a/es-app/src/PlatformId.cpp +++ b/es-app/src/PlatformId.cpp @@ -22,6 +22,7 @@ namespace PlatformIds "amiga", // Commodore Amiga "amigacd32", // Commodore Amiga CD32 "amstradcpc", // Amstrad CPC + "android", // Google Android "apple2", // Apple II "apple2gs", // Apple IIGS "arcade", // Arcade @@ -39,6 +40,7 @@ namespace PlatformIds "bbcmicro", // BBC Micro "c64", // Commodore 64 "cavestory", // Cave Story (NXEngine) + "cdimono1", // Philips CD-i "cdtv", // Commodore CDTV "channelf", // Fairchild Channel F "coco", // Tandy Color Computer @@ -116,6 +118,7 @@ namespace PlatformIds "trs-80", // Tandy TRS-80 "uzebox", // Uzebox "vectrex", // Vectrex + "vic20", // Commodore VIC-20 "videopac", // Philips Videopac G7000 (Magnavox Odyssey2) "virtualboy", // Nintendo Virtual Boy "wii", // Nintendo Wii diff --git a/es-app/src/PlatformId.h b/es-app/src/PlatformId.h index dd596682d..892e5eb0d 100644 --- a/es-app/src/PlatformId.h +++ b/es-app/src/PlatformId.h @@ -21,6 +21,7 @@ namespace PlatformIds COMMODORE_AMIGA, COMMODORE_AMIGA_CD32, AMSTRAD_CPC, + GOOGLE_ANDROID, APPLE_II, APPLE_IIGS, ARCADE, @@ -38,6 +39,7 @@ namespace PlatformIds BBC_MICRO, COMMODORE_64, CAVESTORY, + PHILIPS_CDI, COMMODORE_CDTV, FAIRCHILD_CHANNELF, TANDY_COLOR_COMPUTER, @@ -115,6 +117,7 @@ namespace PlatformIds TANDY_TRS80, UZEBOX, VECTREX, + COMMODORE_VIC20, PHILIPS_VIDEOPAC, NINTENDO_VIRTUAL_BOY, NINTENDO_WII, diff --git a/es-app/src/guis/GuiMediaViewerOptions.cpp b/es-app/src/guis/GuiMediaViewerOptions.cpp index 38468beca..8732b7359 100644 --- a/es-app/src/guis/GuiMediaViewerOptions.cpp +++ b/es-app/src/guis/GuiMediaViewerOptions.cpp @@ -66,11 +66,11 @@ GuiMediaViewerOptions::GuiMediaViewerOptions(Window* window, const std::string& } }); - // Render scanlines for screenshots using a shader. + // Render scanlines for screenshots and title screens using a shader. auto screenshot_scanlines = std::make_shared(mWindow); screenshot_scanlines->setState( Settings::getInstance()->getBool("MediaViewerScreenshotScanlines")); - addWithLabel("RENDER SCANLINES FOR SCREENSHOTS", screenshot_scanlines); + addWithLabel("RENDER SCANLINES FOR SCREENSHOTS AND TITLES", screenshot_scanlines); addSaveFunc([screenshot_scanlines, this] { if (screenshot_scanlines->getState() != Settings::getInstance()->getBool("MediaViewerScreenshotScanlines")) { diff --git a/es-app/src/guis/GuiMenu.cpp b/es-app/src/guis/GuiMenu.cpp index ebcfee71a..7ca851bb6 100644 --- a/es-app/src/guis/GuiMenu.cpp +++ b/es-app/src/guis/GuiMenu.cpp @@ -129,7 +129,7 @@ void GuiMenu::openUIOptions() gamelist_view_style->add("basic", "basic", selectedViewStyle == "basic"); gamelist_view_style->add("detailed", "detailed", selectedViewStyle == "detailed"); gamelist_view_style->add("video", "video", selectedViewStyle == "video"); - gamelist_view_style->add("grid (experimental)", "grid", selectedViewStyle == "grid"); + gamelist_view_style->add("grid (deprecated)", "grid", selectedViewStyle == "grid"); // If there are no objects returned, then there must be a manually modified entry in the // configuration file. Simply set the view style to Automatic in this case. if (gamelist_view_style->getSelectedObjects().size() == 0) diff --git a/es-app/src/guis/GuiMetaDataEd.cpp b/es-app/src/guis/GuiMetaDataEd.cpp index 02d713c42..2e71a64d6 100644 --- a/es-app/src/guis/GuiMetaDataEd.cpp +++ b/es-app/src/guis/GuiMetaDataEd.cpp @@ -741,6 +741,12 @@ void GuiMetaDataEd::fetchDone(const ScraperSearchResult& result) // Update the list with the scraped metadata values. for (unsigned int i = 0; i < mEditors.size(); i++) { const std::string& key = mMetaDataDecl.at(i).key; + if (key == "controller" && metadata->get(key) != "") { + std::string displayName = BadgeComponent::getDisplayName(metadata->get(key)); + if (displayName != "unknown") + metadata->set(key, displayName); + } + if (mEditors.at(i)->getValue() != metadata->get(key)) { if (key == "rating") mEditors.at(i)->setOriginalColor(ICONCOLOR_SCRAPERMARKED); diff --git a/es-app/src/guis/GuiScraperMenu.cpp b/es-app/src/guis/GuiScraperMenu.cpp index 7507b0a73..17a2526f7 100644 --- a/es-app/src/guis/GuiScraperMenu.cpp +++ b/es-app/src/guis/GuiScraperMenu.cpp @@ -221,7 +221,7 @@ void GuiScraperMenu::openContentOptions() // Scrape game names. auto scrape_game_names = std::make_shared(mWindow); scrape_game_names->setState(Settings::getInstance()->getBool("ScrapeGameNames")); - s->addWithLabel("SCRAPE GAME NAMES", scrape_game_names); + s->addWithLabel("GAME NAMES", scrape_game_names); s->addSaveFunc([scrape_game_names, s] { if (scrape_game_names->getState() != Settings::getInstance()->getBool("ScrapeGameNames")) { Settings::getInstance()->setBool("ScrapeGameNames", scrape_game_names->getState()); @@ -232,7 +232,7 @@ void GuiScraperMenu::openContentOptions() // Scrape ratings. auto scrape_ratings = std::make_shared(mWindow); scrape_ratings->setState(Settings::getInstance()->getBool("ScrapeRatings")); - s->addWithLabel("SCRAPE RATINGS", scrape_ratings); + s->addWithLabel("RATINGS", scrape_ratings); s->addSaveFunc([scrape_ratings, s] { if (scrape_ratings->getState() != Settings::getInstance()->getBool("ScrapeRatings")) { Settings::getInstance()->setBool("ScrapeRatings", scrape_ratings->getState()); @@ -249,10 +249,32 @@ void GuiScraperMenu::openContentOptions() ->setOpacity(DISABLED_OPACITY); } + // Scrape controllers (arcade systems only). + auto scrapeControllers = std::make_shared(mWindow); + scrapeControllers->setState(Settings::getInstance()->getBool("ScrapeControllers")); + s->addWithLabel("CONTROLLERS (ARCADE SYSTEMS ONLY)", scrapeControllers); + s->addSaveFunc([scrapeControllers, s] { + if (scrapeControllers->getState() != + Settings::getInstance()->getBool("ScrapeControllers")) { + Settings::getInstance()->setBool("ScrapeControllers", scrapeControllers->getState()); + s->setNeedsSaving(); + } + }); + + // Controllers are not supported by TheGamesDB, so gray out the option if this scraper is + // selected. + if (Settings::getInstance()->getString("Scraper") == "thegamesdb") { + scrapeControllers->setEnabled(false); + scrapeControllers->setOpacity(DISABLED_OPACITY); + scrapeControllers->getParent() + ->getChild(scrapeControllers->getChildIndex() - 1) + ->setOpacity(DISABLED_OPACITY); + } + // Scrape other metadata. auto scrape_metadata = std::make_shared(mWindow); scrape_metadata->setState(Settings::getInstance()->getBool("ScrapeMetadata")); - s->addWithLabel("SCRAPE OTHER METADATA", scrape_metadata); + s->addWithLabel("OTHER METADATA", scrape_metadata); s->addSaveFunc([scrape_metadata, s] { if (scrape_metadata->getState() != Settings::getInstance()->getBool("ScrapeMetadata")) { Settings::getInstance()->setBool("ScrapeMetadata", scrape_metadata->getState()); @@ -263,7 +285,7 @@ void GuiScraperMenu::openContentOptions() // Scrape videos. auto scrape_videos = std::make_shared(mWindow); scrape_videos->setState(Settings::getInstance()->getBool("ScrapeVideos")); - s->addWithLabel("SCRAPE VIDEOS", scrape_videos); + s->addWithLabel("VIDEOS", scrape_videos); s->addSaveFunc([scrape_videos, s] { if (scrape_videos->getState() != Settings::getInstance()->getBool("ScrapeVideos")) { Settings::getInstance()->setBool("ScrapeVideos", scrape_videos->getState()); @@ -283,7 +305,7 @@ void GuiScraperMenu::openContentOptions() // Scrape screenshots images. auto scrape_screenshots = std::make_shared(mWindow); scrape_screenshots->setState(Settings::getInstance()->getBool("ScrapeScreenshots")); - s->addWithLabel("SCRAPE SCREENSHOT IMAGES", scrape_screenshots); + s->addWithLabel("SCREENSHOT IMAGES", scrape_screenshots); s->addSaveFunc([scrape_screenshots, s] { if (scrape_screenshots->getState() != Settings::getInstance()->getBool("ScrapeScreenshots")) { @@ -292,10 +314,22 @@ void GuiScraperMenu::openContentOptions() } }); - // Scrape cover images. + // Scrape title screen images. + auto scrapeTitleScreens = std::make_shared(mWindow); + scrapeTitleScreens->setState(Settings::getInstance()->getBool("ScrapeTitleScreens")); + s->addWithLabel("TITLE SCREEN IMAGES", scrapeTitleScreens); + s->addSaveFunc([scrapeTitleScreens, s] { + if (scrapeTitleScreens->getState() != + Settings::getInstance()->getBool("ScrapeTitleScreens")) { + Settings::getInstance()->setBool("ScrapeTitleScreens", scrapeTitleScreens->getState()); + s->setNeedsSaving(); + } + }); + + // Scrape box cover images. auto scrape_covers = std::make_shared(mWindow); scrape_covers->setState(Settings::getInstance()->getBool("ScrapeCovers")); - s->addWithLabel("SCRAPE BOX COVER IMAGES", scrape_covers); + s->addWithLabel("BOX COVER IMAGES", scrape_covers); s->addSaveFunc([scrape_covers, s] { if (scrape_covers->getState() != Settings::getInstance()->getBool("ScrapeCovers")) { Settings::getInstance()->setBool("ScrapeCovers", scrape_covers->getState()); @@ -303,10 +337,31 @@ void GuiScraperMenu::openContentOptions() } }); + // Scrape box back cover images. + auto scrapeBackCovers = std::make_shared(mWindow); + scrapeBackCovers->setState(Settings::getInstance()->getBool("ScrapeBackCovers")); + s->addWithLabel("BOX BACK COVER IMAGES", scrapeBackCovers); + s->addSaveFunc([scrapeBackCovers, s] { + if (scrapeBackCovers->getState() != Settings::getInstance()->getBool("ScrapeBackCovers")) { + Settings::getInstance()->setBool("ScrapeBackCovers", scrapeBackCovers->getState()); + s->setNeedsSaving(); + } + }); + + // Box back cover images are not supported by TheGamesDB, so gray out the option if this + // scraper is selected. + if (Settings::getInstance()->getString("Scraper") == "thegamesdb") { + scrapeBackCovers->setEnabled(false); + scrapeBackCovers->setOpacity(DISABLED_OPACITY); + scrapeBackCovers->getParent() + ->getChild(scrapeBackCovers->getChildIndex() - 1) + ->setOpacity(DISABLED_OPACITY); + } + // Scrape marquee images. auto scrape_marquees = std::make_shared(mWindow); scrape_marquees->setState(Settings::getInstance()->getBool("ScrapeMarquees")); - s->addWithLabel("SCRAPE MARQUEE (WHEEL) IMAGES", scrape_marquees); + s->addWithLabel("MARQUEE (WHEEL) IMAGES", scrape_marquees); s->addSaveFunc([scrape_marquees, s] { if (scrape_marquees->getState() != Settings::getInstance()->getBool("ScrapeMarquees")) { Settings::getInstance()->setBool("ScrapeMarquees", scrape_marquees->getState()); @@ -317,7 +372,7 @@ void GuiScraperMenu::openContentOptions() // Scrape 3D box images. auto scrape_3dboxes = std::make_shared(mWindow); scrape_3dboxes->setState(Settings::getInstance()->getBool("Scrape3DBoxes")); - s->addWithLabel("SCRAPE 3D BOX IMAGES", scrape_3dboxes); + s->addWithLabel("3D BOX IMAGES", scrape_3dboxes); s->addSaveFunc([scrape_3dboxes, s] { if (scrape_3dboxes->getState() != Settings::getInstance()->getBool("Scrape3DBoxes")) { Settings::getInstance()->setBool("Scrape3DBoxes", scrape_3dboxes->getState()); @@ -335,6 +390,29 @@ void GuiScraperMenu::openContentOptions() ->setOpacity(DISABLED_OPACITY); } + // Scrape physical media images. + auto scrapePhysicalMedia = std::make_shared(mWindow); + scrapePhysicalMedia->setState(Settings::getInstance()->getBool("ScrapePhysicalMedia")); + s->addWithLabel("PHYSICAL MEDIA IMAGES", scrapePhysicalMedia); + s->addSaveFunc([scrapePhysicalMedia, s] { + if (scrapePhysicalMedia->getState() != + Settings::getInstance()->getBool("ScrapePhysicalMedia")) { + Settings::getInstance()->setBool("ScrapePhysicalMedia", + scrapePhysicalMedia->getState()); + s->setNeedsSaving(); + } + }); + + // Physical media images are not supported by TheGamesDB, so gray out the option if this + // scraper is selected. + if (Settings::getInstance()->getString("Scraper") == "thegamesdb") { + scrapePhysicalMedia->setEnabled(false); + scrapePhysicalMedia->setOpacity(DISABLED_OPACITY); + scrapePhysicalMedia->getParent() + ->getChild(scrapePhysicalMedia->getChildIndex() - 1) + ->setOpacity(DISABLED_OPACITY); + } + mWindow->pushGui(s); } @@ -383,6 +461,48 @@ void GuiScraperMenu::openMiximageOptions() } }); + // Box/cover size. + auto miximageBoxSize = std::make_shared>( + mWindow, getHelpStyle(), "BOX SIZE", false); + std::string selectedBoxSize = Settings::getInstance()->getString("MiximageBoxSize"); + miximageBoxSize->add("small", "small", selectedBoxSize == "small"); + miximageBoxSize->add("medium", "medium", selectedBoxSize == "medium"); + miximageBoxSize->add("large", "large", selectedBoxSize == "large"); + // If there are no objects returned, then there must be a manually modified entry in the + // configuration file. Simply set the box size to "medium" in this case. + if (miximageBoxSize->getSelectedObjects().size() == 0) + miximageBoxSize->selectEntry(0); + s->addWithLabel("BOX SIZE", miximageBoxSize); + s->addSaveFunc([miximageBoxSize, s] { + if (miximageBoxSize->getSelected() != + Settings::getInstance()->getString("MiximageBoxSize")) { + Settings::getInstance()->setString("MiximageBoxSize", miximageBoxSize->getSelected()); + s->setNeedsSaving(); + } + }); + + // Physical media size. + auto miximagePhysicalMediaSize = std::make_shared>( + mWindow, getHelpStyle(), "PHYSICAL MEDIA SIZE", false); + std::string selectedPhysicalMediaSize = + Settings::getInstance()->getString("MiximagePhysicalMediaSize"); + miximagePhysicalMediaSize->add("small", "small", selectedPhysicalMediaSize == "small"); + miximagePhysicalMediaSize->add("medium", "medium", selectedPhysicalMediaSize == "medium"); + miximagePhysicalMediaSize->add("large", "large", selectedPhysicalMediaSize == "large"); + // If there are no objects returned, then there must be a manually modified entry in the + // configuration file. Simply set the physical media size to "medium" in this case. + if (miximagePhysicalMediaSize->getSelectedObjects().size() == 0) + miximagePhysicalMediaSize->selectEntry(0); + s->addWithLabel("PHYSICAL MEDIA SIZE", miximagePhysicalMediaSize); + s->addSaveFunc([miximagePhysicalMediaSize, s] { + if (miximagePhysicalMediaSize->getSelected() != + Settings::getInstance()->getString("MiximagePhysicalMediaSize")) { + Settings::getInstance()->setString("MiximagePhysicalMediaSize", + miximagePhysicalMediaSize->getSelected()); + s->setNeedsSaving(); + } + }); + // Whether to generate miximages when scraping. auto miximage_generate = std::make_shared(mWindow); miximage_generate->setState(Settings::getInstance()->getBool("MiximageGenerate")); @@ -432,6 +552,20 @@ void GuiScraperMenu::openMiximageOptions() } }); + // Whether to rotate horizontally oriented boxes. + auto miximageRotateBoxes = std::make_shared(mWindow); + miximageRotateBoxes->setState( + Settings::getInstance()->getBool("MiximageRotateHorizontalBoxes")); + s->addWithLabel("ROTATE HORIZONTALLY ORIENTED BOXES", miximageRotateBoxes); + s->addSaveFunc([miximageRotateBoxes, s] { + if (miximageRotateBoxes->getState() != + Settings::getInstance()->getBool("MiximageRotateHorizontalBoxes")) { + Settings::getInstance()->setBool("MiximageRotateHorizontalBoxes", + miximageRotateBoxes->getState()); + s->setNeedsSaving(); + } + }); + // Whether to include marquee images. auto miximage_marquee = std::make_shared(mWindow); miximage_marquee->setState(Settings::getInstance()->getBool("MiximageIncludeMarquee")); @@ -469,6 +603,20 @@ void GuiScraperMenu::openMiximageOptions() } }); + // Whether to include physical media images. + auto miximagePhysicalMedia = std::make_shared(mWindow); + miximagePhysicalMedia->setState( + Settings::getInstance()->getBool("MiximageIncludePhysicalMedia")); + s->addWithLabel("INCLUDE PHYSICAL MEDIA IMAGE", miximagePhysicalMedia); + s->addSaveFunc([miximagePhysicalMedia, s] { + if (miximagePhysicalMedia->getState() != + Settings::getInstance()->getBool("MiximageIncludePhysicalMedia")) { + Settings::getInstance()->setBool("MiximageIncludePhysicalMedia", + miximagePhysicalMedia->getState()); + s->setNeedsSaving(); + } + }); + // Miximage offline generator. ComponentListRow offline_generator_row; offline_generator_row.elements.clear(); @@ -488,7 +636,7 @@ void GuiScraperMenu::openOfflineGenerator(GuiSettings* settings) { if (mSystems->getSelectedObjects().empty()) { mWindow->pushGui(new GuiMsgBox(mWindow, getHelpStyle(), - "THE MIXIMAGE GENERATOR USES THE SAME SYSTEM\n" + "THE OFFLINE GENERATOR USES THE SAME SYSTEM\n" "SELECTIONS AS THE SCRAPER, SO PLEASE SELECT\n" "AT LEAST ONE SYSTEM TO GENERATE IMAGES FOR")); return; @@ -845,6 +993,11 @@ void GuiScraperMenu::start() contentToScrape = true; break; } + if (scraperService == "screenscraper" && + Settings::getInstance()->getBool("ScrapeControllers")) { + contentToScrape = true; + break; + } if (Settings::getInstance()->getBool("ScrapeMetadata")) { contentToScrape = true; break; @@ -857,10 +1010,19 @@ void GuiScraperMenu::start() contentToScrape = true; break; } + if (Settings::getInstance()->getBool("ScrapeTitleScreens")) { + contentToScrape = true; + break; + } if (Settings::getInstance()->getBool("ScrapeCovers")) { contentToScrape = true; break; } + if (scraperService == "screenscraper" && + Settings::getInstance()->getBool("ScrapeBackCovers")) { + contentToScrape = true; + break; + } if (Settings::getInstance()->getBool("ScrapeMarquees")) { contentToScrape = true; break; @@ -870,6 +1032,11 @@ void GuiScraperMenu::start() contentToScrape = true; break; } + if (scraperService == "screenscraper" && + Settings::getInstance()->getBool("ScrapePhysicalMedia")) { + contentToScrape = true; + break; + } } while (0); if (!contentToScrape) { diff --git a/es-app/src/guis/GuiScraperMulti.cpp b/es-app/src/guis/GuiScraperMulti.cpp index 50b8aab67..6c775baac 100644 --- a/es-app/src/guis/GuiScraperMulti.cpp +++ b/es-app/src/guis/GuiScraperMulti.cpp @@ -12,6 +12,7 @@ #include "guis/GuiScraperMulti.h" #include "CollectionSystemsManager.h" +#include "FileFilterIndex.h" #include "Gamelist.h" #include "MameNames.h" #include "SystemData.h" @@ -269,10 +270,13 @@ void GuiScraperMulti::acceptResult(const ScraperSearchResult& result) { ScraperSearchParams& search = mSearchQueue.front(); - GuiScraperSearch::saveMetadata(result, search.game->metadata, search.game); + search.system->getIndex()->removeFromIndex(search.game); + GuiScraperSearch::saveMetadata(result, search.game->metadata, search.game); updateGamelist(search.system); + search.system->getIndex()->addToIndex(search.game); + mSearchQueue.pop(); mCurrentGame++; mTotalSuccessful++; diff --git a/es-app/src/guis/GuiScraperSearch.cpp b/es-app/src/guis/GuiScraperSearch.cpp index bf7aba7b9..840fc2b4f 100644 --- a/es-app/src/guis/GuiScraperSearch.cpp +++ b/es-app/src/guis/GuiScraperSearch.cpp @@ -678,9 +678,12 @@ void GuiScraperSearch::update(int deltaTime) for (unsigned int i = 0; i < results_scrape.size(); i++) { if (results_scrape[i].gameID == it->gameID) { results_scrape[i].box3DUrl = it->box3DUrl; + results_scrape[i].backcoverUrl = it->backcoverUrl; results_scrape[i].coverUrl = it->coverUrl; results_scrape[i].marqueeUrl = it->marqueeUrl; results_scrape[i].screenshotUrl = it->screenshotUrl; + results_scrape[i].titlescreenUrl = it->titlescreenUrl; + results_scrape[i].physicalmediaUrl = it->physicalmediaUrl; results_scrape[i].videoUrl = it->videoUrl; results_scrape[i].scraperRequestAllowance = it->scraperRequestAllowance; results_scrape[i].mediaURLFetch = COMPLETED; @@ -873,15 +876,19 @@ bool GuiScraperSearch::saveMetadata(const ScraperSearchResult& result, const std::string& key = mMetaDataDecl.at(i).key; // Skip element if the setting to not scrape metadata has been set, - // unless its type is rating or name. + // unless its type is rating, controller or name. if (!Settings::getInstance()->getBool("ScrapeMetadata") && - (key != "rating" && key != "name")) + (key != "rating" && key != "controller" && key != "name")) continue; - // Skip saving of rating if the corresponding option has been set to false. + // Skip saving of rating metadata if the corresponding option has been set to false. if (key == "rating" && !Settings::getInstance()->getBool("ScrapeRatings")) continue; + // Skip saving of controller metadata if the corresponding option has been set to false. + if (key == "controller" && !Settings::getInstance()->getBool("ScrapeControllers")) + continue; + // Skip saving of game name if the corresponding option has been set to false. if (key == "name" && !Settings::getInstance()->getBool("ScrapeGameNames")) continue; diff --git a/es-app/src/scrapers/GamesDBJSONScraper.cpp b/es-app/src/scrapers/GamesDBJSONScraper.cpp index 12a4b7047..33b832acb 100644 --- a/es-app/src/scrapers/GamesDBJSONScraper.cpp +++ b/es-app/src/scrapers/GamesDBJSONScraper.cpp @@ -57,9 +57,11 @@ const std::map gamesdb_new_platformid_map{ {CAVESTORY, "1"}, {COLECOVISION, "31"}, {COMMODORE_64, "40"}, + {COMMODORE_VIC20, "4945"}, {DAPHNE, "23"}, {INTELLIVISION, "32"}, {APPLE_MACINTOSH, "37"}, + {GOOGLE_ANDROID, "4916"}, {MICROSOFT_XBOX, "14"}, {MICROSOFT_XBOX_360, "15"}, {MOONLIGHT, "1"}, @@ -92,6 +94,7 @@ const std::map gamesdb_new_platformid_map{ {PC, "1"}, {VALVE_STEAM, "1"}, {NEC_PCFX, "4930"}, + {PHILIPS_CDI, "4917"}, {SEGA_32X, "33"}, {SEGA_CD, "21"}, {SEGA_DREAMCAST, "16"}, @@ -378,6 +381,7 @@ void processMediaURLs(const Value& images, result.coverUrl = ""; result.marqueeUrl = ""; result.screenshotUrl = ""; + result.titlescreenUrl = ""; // Quite excessive testing for valid values, but you never know what the server has // returned and we don't want to crash the program due to malformed data. @@ -399,6 +403,9 @@ void processMediaURLs(const Value& images, if (mediatype == "screenshot") if (gameMedia[i]["filename"].IsString()) result.screenshotUrl = base_url + gameMedia[i]["filename"].GetString(); + if (mediatype == "titlescreen") + if (gameMedia[i]["filename"].IsString()) + result.titlescreenUrl = base_url + gameMedia[i]["filename"].GetString(); } } result.mediaURLFetch = COMPLETED; diff --git a/es-app/src/scrapers/Scraper.cpp b/es-app/src/scrapers/Scraper.cpp index c889f54b2..0b1e0c6fd 100644 --- a/es-app/src/scrapers/Scraper.cpp +++ b/es-app/src/scrapers/Scraper.cpp @@ -41,7 +41,9 @@ std::unique_ptr startScraperSearch(const ScraperSearchParam } else { LOG(LogDebug) << "Scraper::startScraperSearch(): Scraping system \"" - << params.system->getName() << "\", game file \"" + << params.system->getName() + << (params.game->getType() == FOLDER ? "\", folder \"" : + "\", game file \"") << params.game->getFileName() << "\""; scraper_request_funcs.at(name)(params, handle->mRequestQueue, handle->mResults); } @@ -185,6 +187,14 @@ MDResolveHandle::MDResolveHandle(const ScraperSearchResult& result, mediaFileInfo.resizeFile = true; scrapeFiles.push_back(mediaFileInfo); } + if (Settings::getInstance()->getBool("ScrapeBackCovers") && result.backcoverUrl != "") { + mediaFileInfo.fileURL = result.backcoverUrl; + mediaFileInfo.fileFormat = result.backcoverFormat; + mediaFileInfo.subDirectory = "backcovers"; + mediaFileInfo.existingMediaFile = search.game->getBackCoverPath(); + mediaFileInfo.resizeFile = true; + scrapeFiles.push_back(mediaFileInfo); + } if (Settings::getInstance()->getBool("ScrapeCovers") && result.coverUrl != "") { mediaFileInfo.fileURL = result.coverUrl; mediaFileInfo.fileFormat = result.coverFormat; @@ -193,6 +203,14 @@ MDResolveHandle::MDResolveHandle(const ScraperSearchResult& result, mediaFileInfo.resizeFile = true; scrapeFiles.push_back(mediaFileInfo); } + if (Settings::getInstance()->getBool("ScrapePhysicalMedia") && result.physicalmediaUrl != "") { + mediaFileInfo.fileURL = result.physicalmediaUrl; + mediaFileInfo.fileFormat = result.physicalmediaFormat; + mediaFileInfo.subDirectory = "physicalmedia"; + mediaFileInfo.existingMediaFile = search.game->getPhysicalMediaPath(); + mediaFileInfo.resizeFile = true; + scrapeFiles.push_back(mediaFileInfo); + } if (Settings::getInstance()->getBool("ScrapeMarquees") && result.marqueeUrl != "") { mediaFileInfo.fileURL = result.marqueeUrl; mediaFileInfo.fileFormat = result.marqueeFormat; @@ -209,6 +227,14 @@ MDResolveHandle::MDResolveHandle(const ScraperSearchResult& result, mediaFileInfo.resizeFile = true; scrapeFiles.push_back(mediaFileInfo); } + if (Settings::getInstance()->getBool("ScrapeTitleScreens") && result.titlescreenUrl != "") { + mediaFileInfo.fileURL = result.titlescreenUrl; + mediaFileInfo.fileFormat = result.titlescreenFormat; + mediaFileInfo.subDirectory = "titlescreens"; + mediaFileInfo.existingMediaFile = search.game->getTitleScreenPath(); + mediaFileInfo.resizeFile = true; + scrapeFiles.push_back(mediaFileInfo); + } if (Settings::getInstance()->getBool("ScrapeVideos") && result.videoUrl != "") { mediaFileInfo.fileURL = result.videoUrl; mediaFileInfo.fileFormat = result.videoFormat; @@ -401,6 +427,75 @@ void MediaDownloadHandle::update() // Download is done, save it to disk. + // There are multiple issues with box back covers at ScreenScraper. Some only contain a single + // color like pure black or more commonly pure green, and some are mostly transparent with just + // a few black lines at the bottom. The following code attempts to detect such broken images + // and skip them so they're not saved to disk. + if (Settings::getInstance()->getString("Scraper") == "screenscraper" && + mMediaType == "backcovers") { + bool emptyImage = false; + FREE_IMAGE_FORMAT imageFormat = FIF_UNKNOWN; + std::string imageData = mReq->getContent(); + FIMEMORY* memoryStream = FreeImage_OpenMemory(reinterpret_cast(&imageData.at(0)), + static_cast(imageData.size())); + imageFormat = FreeImage_GetFileTypeFromMemory(memoryStream, 0); + + if (imageFormat != FIF_UNKNOWN) { + emptyImage = true; + + FIBITMAP* tempImage = FreeImage_LoadFromMemory(imageFormat, memoryStream); + RGBQUAD firstPixel; + RGBQUAD currPixel; + + unsigned int width = FreeImage_GetWidth(tempImage); + unsigned int height = FreeImage_GetHeight(tempImage); + + // Skip really small images as they're obviously not valid. + if (width < 50) { + emptyImage = true; + } + else if (height < 50) { + emptyImage = true; + } + else { + // Remove the alpha channel which will convert fully transparent pixels to black. + if (FreeImage_GetBPP(tempImage) != 24) { + FIBITMAP* convertImage = FreeImage_ConvertTo24Bits(tempImage); + FreeImage_Unload(tempImage); + tempImage = convertImage; + } + + // Skip the first line as this can apparently lead to false positives. + FreeImage_GetPixelColor(tempImage, 0, 1, &firstPixel); + + for (unsigned int x = 0; x < width; x++) { + if (!emptyImage) + break; + // Skip the last line as well. + for (unsigned int y = 1; y < height - 1; y++) { + FreeImage_GetPixelColor(tempImage, x, y, &currPixel); + if (currPixel.rgbBlue != firstPixel.rgbBlue || + currPixel.rgbGreen != firstPixel.rgbGreen || + currPixel.rgbRed != firstPixel.rgbRed) { + emptyImage = false; + break; + } + } + } + } + FreeImage_Unload(tempImage); + } + FreeImage_CloseMemory(memoryStream); + + if (emptyImage) { + LOG(LogWarning) << "ScreenScraper: Image does not seem to contain any data, not saving " + "it to disk: \"" + << mSavePath << "\""; + setStatus(ASYNC_DONE); + return; + } + } + // This is just a temporary workaround to avoid saving media files to disk that are // actually just containing error messages from the scraper service. The proper solution // is to implement file checksum checks to determine if the server response contains valid diff --git a/es-app/src/scrapers/Scraper.h b/es-app/src/scrapers/Scraper.h index 4218effc4..81dde8c60 100644 --- a/es-app/src/scrapers/Scraper.h +++ b/es-app/src/scrapers/Scraper.h @@ -60,16 +60,22 @@ struct ScraperSearchResult { std::string thumbnailImageUrl; std::string box3DUrl; + std::string backcoverUrl; std::string coverUrl; std::string marqueeUrl; + std::string physicalmediaUrl; std::string screenshotUrl; + std::string titlescreenUrl; std::string videoUrl; // Needed to pre-set the image type. std::string box3DFormat; + std::string backcoverFormat; std::string coverFormat; std::string marqueeFormat; + std::string physicalmediaFormat; std::string screenshotFormat; + std::string titlescreenFormat; std::string videoFormat; // Indicates whether any new media files were downloaded and saved. diff --git a/es-app/src/scrapers/ScreenScraper.cpp b/es-app/src/scrapers/ScreenScraper.cpp index ea4cb1cab..99f2935cb 100644 --- a/es-app/src/scrapers/ScreenScraper.cpp +++ b/es-app/src/scrapers/ScreenScraper.cpp @@ -49,10 +49,12 @@ const std::map screenscraper_platformid_map{ {COLECOVISION, 48}, {COMMODORE_64, 66}, {COMMODORE_CDTV, 129}, + {COMMODORE_VIC20, 73}, {DAPHNE, 49}, {INTELLIVISION, 115}, {GAMEENGINE_LUTRO, 206}, {APPLE_MACINTOSH, 146}, + {GOOGLE_ANDROID, 63}, {MICROSOFT_XBOX, 32}, {MICROSOFT_XBOX_360, 33}, {MOONLIGHT, 138}, @@ -86,6 +88,7 @@ const std::map screenscraper_platformid_map{ {PC, 135}, {VALVE_STEAM, 135}, {NEC_PCFX, 72}, + {PHILIPS_CDI, 133}, {GAMEENGINE_OPENBOR, 214}, {TANGERINE_ORIC, 131}, {GAMEENGINE_SCUMMVM, 123}, @@ -426,6 +429,97 @@ void ScreenScraperRequest::processGame(const pugi::xml_document& xmldoc, << result.mdl.get("players"); } + // Controller (only for the Arcade and SNK Neo Geo systems). + pugi::xml_node system = game.child("systeme"); + int platformID = system.attribute("parentid").as_int(); + + if (platformID == 75 || platformID == 142) { + std::string controller = Utils::String::toLower(game.child("controles").text().get()); + if (!controller.empty()) { + std::string controllerDescription = "Other"; + // Place the steering wheel entry first as some games support both joysticks and + // and steering wheels and it's likely more interesting to capture the steering + // wheel option in this case. + if (controller.find("steering wheel") != std::string::npos || + controller.find("paddle") != std::string::npos || + controller.find("pedal") != std::string::npos) { + result.mdl.set("controller", "steering_wheel_generic"); + controllerDescription = "Steering wheel"; + } + else if (controller.find("control type=\"joy") != std::string::npos || + controller.find("joystick") != std::string::npos) { + std::string buttonEntry; + std::string buttonCount; + if (controller.find("p1numbuttons=") != std::string::npos) + buttonEntry = controller.substr(controller.find("p1numbuttons=") + 13, 4); + else if (controller.find("buttons=") != std::string::npos) + buttonEntry = controller.substr(controller.find("buttons=") + 8, 5); + + bool foundDigit = false; + for (unsigned char character : buttonEntry) { + if (std::isdigit(character)) { + buttonCount.push_back(character); + foundDigit = true; + } + else if (foundDigit == true) { + break; + } + } + + if (buttonCount == "0") { + result.mdl.set("controller", "joystick_arcade_no_buttons"); + controllerDescription = "Joystick (no buttons)"; + } + else if (buttonCount == "1") { + result.mdl.set("controller", "joystick_arcade_1_button"); + controllerDescription = "Joystick (1 button)"; + } + else if (buttonCount == "2") { + result.mdl.set("controller", "joystick_arcade_2_buttons"); + controllerDescription = "Joystick (2 buttons)"; + } + else if (buttonCount == "3") { + result.mdl.set("controller", "joystick_arcade_3_buttons"); + controllerDescription = "Joystick (3 buttons)"; + } + else if (buttonCount == "4") { + result.mdl.set("controller", "joystick_arcade_4_buttons"); + controllerDescription = "Joystick (4 buttons)"; + } + else if (buttonCount == "5") { + result.mdl.set("controller", "joystick_arcade_5_buttons"); + controllerDescription = "Joystick (5 buttons)"; + } + else if (buttonCount == "6") { + result.mdl.set("controller", "joystick_arcade_6_buttons"); + controllerDescription = "Joystick (6 buttons)"; + } + else { + controllerDescription = "Joystick (other)"; + } + } + else if (controller.find("spinner") != std::string::npos) { + result.mdl.set("controller", "spinner_generic"); + controllerDescription = "Spinner"; + } + else if (controller.find("trackball") != std::string::npos) { + result.mdl.set("controller", "trackball_generic"); + controllerDescription = "Trackball"; + } + else if (controller.find("gun") != std::string::npos) { + result.mdl.set("controller", "lightgun_generic"); + controllerDescription = "Lightgun"; + } + else if (controller.find("stick") != std::string::npos) { + result.mdl.set("controller", "flight_stick_generic"); + controllerDescription = "Flight stick"; + } + + LOG(LogDebug) << "ScreenScraperRequest::processGame(): Controller: " + << controllerDescription; + } + } + // Media super-node. pugi::xml_node media_list = game.child("medias"); @@ -433,15 +527,24 @@ void ScreenScraperRequest::processGame(const pugi::xml_document& xmldoc, // 3D box. processMedia(result, media_list, ssConfig.media_3dbox, result.box3DUrl, result.box3DFormat, region); - // Cover. + // Box back cover. + processMedia(result, media_list, ssConfig.media_backcover, result.backcoverUrl, + result.backcoverFormat, region); + // Box cover. processMedia(result, media_list, ssConfig.media_cover, result.coverUrl, result.coverFormat, region); // Marquee (wheel). processMedia(result, media_list, ssConfig.media_marquee, result.marqueeUrl, result.marqueeFormat, region); + // Physical media. + processMedia(result, media_list, ssConfig.media_physicalmedia, result.physicalmediaUrl, + result.physicalmediaFormat, region); // Screenshot. processMedia(result, media_list, ssConfig.media_screenshot, result.screenshotUrl, result.screenshotFormat, region); + // Title screen. + processMedia(result, media_list, ssConfig.media_titlescreen, result.titlescreenUrl, + result.titlescreenFormat, region); // Video. processMedia(result, media_list, ssConfig.media_video, result.videoUrl, result.videoFormat, region); diff --git a/es-app/src/scrapers/ScreenScraper.h b/es-app/src/scrapers/ScreenScraper.h index 3e07bf61b..68e509733 100644 --- a/es-app/src/scrapers/ScreenScraper.h +++ b/es-app/src/scrapers/ScreenScraper.h @@ -71,9 +71,12 @@ public: // std::string media_3dbox = "box-3D"; + std::string media_backcover = "box-2D-back"; std::string media_cover = "box-2D"; std::string media_marquee = "wheel"; + std::string media_physicalmedia = "support-2D"; std::string media_screenshot = "ss"; + std::string media_titlescreen = "sstitle"; std::string media_video = "video"; bool isArcadeSystem; diff --git a/es-app/src/views/SystemView.cpp b/es-app/src/views/SystemView.cpp index e42948fc4..fcd0c2695 100644 --- a/es-app/src/views/SystemView.cpp +++ b/es-app/src/views/SystemView.cpp @@ -467,16 +467,35 @@ void SystemView::render(const glm::mat4& parentTrans) glm::mat4 trans{getTransform() * parentTrans}; - renderExtras(trans, INT16_MIN, INT16_MAX); + if (mCarousel.legacyZIndexMode) { + // Render all extras. + renderExtras(trans, INT16_MIN, INT16_MAX); - // Fade the screen if we're using fade transitions and we're currently transitioning. - // This basically renders a black rectangle on top of the currently visible extras - // (and beneath the carousel and help prompts). - if (mExtrasFadeOpacity) - renderFade(trans); + // Fade the screen if we're using fade transitions and we're currently transitioning. + // This basically renders a black rectangle on top of the currently visible extras + // (and beneath the carousel and help prompts). + if (mExtrasFadeOpacity) + renderFade(trans); - // Always render the carousel on top so that it's not faded. - renderCarousel(trans); + // Always render the carousel on top so that it's not faded. + renderCarousel(trans); + } + else { + // Render the extras that are below the carousel. + renderExtras(trans, INT16_MIN, mCarousel.zIndex); + + // Fade the screen if we're using fade transitions and we're currently transitioning. + // This basically renders a black rectangle on top of the currently visible extras + // (and beneath the carousel and help prompts). + if (mExtrasFadeOpacity) + renderFade(trans); + + // Render the carousel. + renderCarousel(trans); + + // Render the rest of the extras. + renderExtras(trans, mCarousel.zIndex, INT16_MAX); + } } std::vector SystemView::getHelpPrompts() @@ -547,9 +566,10 @@ void SystemView::renderCarousel(const glm::mat4& trans) mCarousel.origin.y * mCarousel.size.y * -1.0f, 0.0f}); glm::vec2 clipPos{carouselTrans[3].x, carouselTrans[3].y}; - Renderer::pushClipRect( - glm::ivec2{static_cast(clipPos.x), static_cast(clipPos.y)}, - glm::ivec2{static_cast(mCarousel.size.x), static_cast(mCarousel.size.y)}); + Renderer::pushClipRect(glm::ivec2{static_cast(std::round(clipPos.x)), + static_cast(std::round(clipPos.y))}, + glm::ivec2{static_cast(std::round(mCarousel.size.x)), + static_cast(std::round(mCarousel.size.y))}); Renderer::setMatrix(carouselTrans); Renderer::drawRect(0.0f, 0.0f, mCarousel.size.x, mCarousel.size.y, mCarousel.color, @@ -653,6 +673,11 @@ void SystemView::renderCarousel(const glm::mat4& trans) comp->setRotationOrigin(mCarousel.logoRotationOrigin); } comp->setScale(scale); + // Partial workaround for single-pixel alignment issues at some resolutions and with + // some logos. + comp->setSize(comp->getSize().x, std::ceil(comp->getSize().y)); + comp->setPosition(comp->getPosition().x, std::round(comp->getPosition().y)); + comp->setOpacity(static_cast(opacity)); comp->render(logoTrans); @@ -743,6 +768,7 @@ void SystemView::getDefaultElements(void) mCarousel.logoSize.y = 0.155f * mSize.y; mCarousel.maxLogoCount = 3; mCarousel.zIndex = 40.0f; + mCarousel.legacyZIndexMode = true; // System info bar. mSystemInfo.setSize(mSize.x, mSystemInfo.getFont()->getLetterHeight() * 2.2f); @@ -806,4 +832,11 @@ void SystemView::getCarouselFromTheme(const ThemeData::ThemeElement* elem) else mCarousel.logoAlignment = ALIGN_CENTER; } + if (elem->has("legacyZIndexMode")) { + mCarousel.legacyZIndexMode = + elem->get("legacyZIndexMode").compare("true") == 0 ? true : false; + } + else { + mCarousel.legacyZIndexMode = true; + } } \ No newline at end of file diff --git a/es-app/src/views/SystemView.h b/es-app/src/views/SystemView.h index 5e5cff547..edf731903 100644 --- a/es-app/src/views/SystemView.h +++ b/es-app/src/views/SystemView.h @@ -48,6 +48,7 @@ struct SystemViewCarousel { int maxLogoCount; // Number of logos shown on the carousel. glm::vec2 logoSize; float zIndex; + bool legacyZIndexMode; }; class SystemView : public IList diff --git a/es-app/src/views/ViewController.cpp b/es-app/src/views/ViewController.cpp index 366c30a81..95acee4df 100644 --- a/es-app/src/views/ViewController.cpp +++ b/es-app/src/views/ViewController.cpp @@ -962,6 +962,9 @@ void ViewController::preload() } (*it)->getIndex()->resetFilters(); + // This makes sure we avoid texture pop-in when loading theme extras. + getSystemListView(); + if (Settings::getInstance()->getBool("PreloadGamelists")) getGameListView(*it)->preloadGamelist(); else @@ -1030,6 +1033,8 @@ void ViewController::reloadGameListView(IGameListView* view, bool reloadTheme) void ViewController::reloadAll() { + cancelViewTransitions(); + // Clear all GameListViews. std::map cursorMap; for (auto it = mGameListViews.cbegin(); it != mGameListViews.cend(); it++) diff --git a/es-app/src/views/gamelist/BasicGameListView.cpp b/es-app/src/views/gamelist/BasicGameListView.cpp index f6d2a4002..632b89d61 100644 --- a/es-app/src/views/gamelist/BasicGameListView.cpp +++ b/es-app/src/views/gamelist/BasicGameListView.cpp @@ -250,6 +250,13 @@ void BasicGameListView::removeMedia(FileData* game) removeEmptyDirFunc(systemMediaDir, mediaType, path); } + if (Utils::FileSystem::exists(game->getTitleScreenPath())) { + mediaType = "titlescreens"; + path = game->getTitleScreenPath(); + Utils::FileSystem::removeFile(path); + removeEmptyDirFunc(systemMediaDir, mediaType, path); + } + if (Utils::FileSystem::exists(game->getCoverPath())) { mediaType = "covers"; path = game->getCoverPath(); @@ -257,6 +264,13 @@ void BasicGameListView::removeMedia(FileData* game) removeEmptyDirFunc(systemMediaDir, mediaType, path); } + if (Utils::FileSystem::exists(game->getBackCoverPath())) { + mediaType = "backcovers"; + path = game->getBackCoverPath(); + Utils::FileSystem::removeFile(path); + removeEmptyDirFunc(systemMediaDir, mediaType, path); + } + if (Utils::FileSystem::exists(game->getMarqueePath())) { mediaType = "marquees"; path = game->getMarqueePath(); @@ -271,6 +285,13 @@ void BasicGameListView::removeMedia(FileData* game) removeEmptyDirFunc(systemMediaDir, mediaType, path); } + if (Utils::FileSystem::exists(game->getPhysicalMediaPath())) { + mediaType = "physicalmedia"; + path = game->getPhysicalMediaPath(); + Utils::FileSystem::removeFile(path); + removeEmptyDirFunc(systemMediaDir, mediaType, path); + } + if (Utils::FileSystem::exists(game->getThumbnailPath())) { mediaType = "thumbnails"; path = game->getThumbnailPath(); diff --git a/es-app/src/views/gamelist/GridGameListView.cpp b/es-app/src/views/gamelist/GridGameListView.cpp index 284762deb..af429a7ce 100644 --- a/es-app/src/views/gamelist/GridGameListView.cpp +++ b/es-app/src/views/gamelist/GridGameListView.cpp @@ -600,6 +600,13 @@ void GridGameListView::removeMedia(FileData* game) removeEmptyDirFunc(systemMediaDir, mediaType, path); } + if (Utils::FileSystem::exists(game->getTitleScreenPath())) { + mediaType = "titlescreens"; + path = game->getTitleScreenPath(); + Utils::FileSystem::removeFile(path); + removeEmptyDirFunc(systemMediaDir, mediaType, path); + } + if (Utils::FileSystem::exists(game->getCoverPath())) { mediaType = "covers"; path = game->getCoverPath(); @@ -607,6 +614,13 @@ void GridGameListView::removeMedia(FileData* game) removeEmptyDirFunc(systemMediaDir, mediaType, path); } + if (Utils::FileSystem::exists(game->getBackCoverPath())) { + mediaType = "backcovers"; + path = game->getBackCoverPath(); + Utils::FileSystem::removeFile(path); + removeEmptyDirFunc(systemMediaDir, mediaType, path); + } + if (Utils::FileSystem::exists(game->getMarqueePath())) { mediaType = "marquees"; path = game->getMarqueePath(); @@ -621,6 +635,13 @@ void GridGameListView::removeMedia(FileData* game) removeEmptyDirFunc(systemMediaDir, mediaType, path); } + if (Utils::FileSystem::exists(game->getPhysicalMediaPath())) { + mediaType = "physicalmedia"; + path = game->getPhysicalMediaPath(); + Utils::FileSystem::removeFile(path); + removeEmptyDirFunc(systemMediaDir, mediaType, path); + } + if (Utils::FileSystem::exists(game->getThumbnailPath())) { mediaType = "thumbnails"; path = game->getThumbnailPath(); diff --git a/es-core/src/Settings.cpp b/es-core/src/Settings.cpp index 34c3a8c8b..ea25a2dcb 100644 --- a/es-core/src/Settings.cpp +++ b/es-core/src/Settings.cpp @@ -104,22 +104,30 @@ void Settings::setDefaults() mBoolMap["ScrapeGameNames"] = {true, true}; mBoolMap["ScrapeRatings"] = {true, true}; + mBoolMap["ScrapeControllers"] = {true, true}; mBoolMap["ScrapeMetadata"] = {true, true}; mBoolMap["ScrapeVideos"] = {true, true}; mBoolMap["ScrapeScreenshots"] = {true, true}; + mBoolMap["ScrapeTitleScreens"] = {true, true}; mBoolMap["ScrapeCovers"] = {true, true}; + mBoolMap["ScrapeBackCovers"] = {true, true}; mBoolMap["ScrapeMarquees"] = {true, true}; mBoolMap["Scrape3DBoxes"] = {true, true}; + mBoolMap["ScrapePhysicalMedia"] = {true, true}; mStringMap["MiximageResolution"] = {"1280x960", "1280x960"}; mStringMap["MiximageScreenshotScaling"] = {"sharp", "sharp"}; + mStringMap["MiximageBoxSize"] = {"medium", "medium"}; + mStringMap["MiximagePhysicalMediaSize"] = {"medium", "medium"}; mBoolMap["MiximageGenerate"] = {true, true}; mBoolMap["MiximageOverwrite"] = {true, true}; mBoolMap["MiximageRemoveLetterboxes"] = {true, true}; mBoolMap["MiximageRemovePillarboxes"] = {true, true}; + mBoolMap["MiximageRotateHorizontalBoxes"] = {true, true}; mBoolMap["MiximageIncludeMarquee"] = {true, true}; mBoolMap["MiximageIncludeBox"] = {true, true}; mBoolMap["MiximageCoverFallback"] = {true, true}; + mBoolMap["MiximageIncludePhysicalMedia"] = {true, true}; mStringMap["ScraperRegion"] = {"eu", "eu"}; mStringMap["ScraperLanguage"] = {"en", "en"}; diff --git a/es-core/src/ThemeData.cpp b/es-core/src/ThemeData.cpp index 2a1c7f07f..6f9e2020c 100644 --- a/es-core/src/ThemeData.cpp +++ b/es-core/src/ThemeData.cpp @@ -213,7 +213,8 @@ std::map> The {"logoSize", NORMALIZED_PAIR}, {"logoAlignment", STRING}, {"maxLogoCount", FLOAT}, - {"zIndex", FLOAT}}}}; + {"zIndex", FLOAT}, + {"legacyZIndexMode", STRING}}}}; #define MINIMUM_THEME_FORMAT_VERSION 3 #define CURRENT_THEME_FORMAT_VERSION 7 diff --git a/es-core/src/components/BadgeComponent.cpp b/es-core/src/components/BadgeComponent.cpp index abe74f0d7..b7309c9d3 100644 --- a/es-core/src/components/BadgeComponent.cpp +++ b/es-core/src/components/BadgeComponent.cpp @@ -26,31 +26,38 @@ std::vector BadgeComponent::sGameControllers; // The "unknown" controller entry has to be placed last. GameControllers sControllerDefinitions [] = { - // shortName displayName fileName - {"gamepad_generic", "Gamepad (Generic)", ":/graphics/controllers/gamepad_generic.svg"}, - {"gamepad_xbox", "Gamepad (Xbox)", ":/graphics/controllers/gamepad_xbox.svg"}, - {"gamepad_playstation", "Gamepad (PlayStation)", ":/graphics/controllers/gamepad_playstation.svg"}, - {"gamepad_nintendo_nes", "Gamepad (Nintendo NES)", ":/graphics/controllers/gamepad_nintendo_nes.svg"}, - {"gamepad_nintendo_snes", "Gamepad (Nintendo SNES)", ":/graphics/controllers/gamepad_nintendo_snes.svg"}, - {"gamepad_nintendo_64", "Gamepad (Nintendo 64)", ":/graphics/controllers/gamepad_nintendo_64.svg"}, - {"joystick_generic", "Joystick (Generic)", ":/graphics/controllers/joystick_generic.svg"}, - {"joystick_arcade_2_buttons", "Joystick (Arcade 2 Buttons)", ":/graphics/controllers/joystick_arcade_2_buttons.svg"}, - {"joystick_arcade_3_buttons", "Joystick (Arcade 3 Buttons)", ":/graphics/controllers/joystick_arcade_3_buttons.svg"}, - {"joystick_arcade_4_buttons", "Joystick (Arcade 4 Buttons)", ":/graphics/controllers/joystick_arcade_4_buttons.svg"}, - {"joystick_arcade_6_buttons", "Joystick (Arcade 6 Buttons)", ":/graphics/controllers/joystick_arcade_6_buttons.svg"}, - {"trackball_generic", "Trackball (Generic)", ":/graphics/controllers/trackball_generic.svg"}, - {"lightgun_generic", "Lightgun (Generic)", ":/graphics/controllers/lightgun_generic.svg"}, - {"lightgun_nintendo", "Lightgun (Nintendo)", ":/graphics/controllers/lightgun_nintendo.svg"}, - {"keyboard_generic", "Keyboard (Generic)", ":/graphics/controllers/keyboard_generic.svg"}, - {"mouse_generic", "Mouse (Generic)", ":/graphics/controllers/mouse_generic.svg"}, - {"mouse_amiga", "Mouse (Amiga)", ":/graphics/controllers/mouse_amiga.svg"}, - {"keyboard_mouse_generic", "Keyboard and Mouse (Generic)", ":/graphics/controllers/keyboard_mouse_generic.svg"}, - {"steering_wheel_generic", "Steering Wheel (Generic)", ":/graphics/controllers/steering_wheel_generic.svg"}, - {"wii_remote_nintendo", "Wii Remote (Nintendo)", ":/graphics/controllers/wii_remote_nintendo.svg"}, - {"wii_remote_nunchuck_nintendo", "Wii Remote and Nunchuck (Nintendo)", ":/graphics/controllers/wii_remote_nunchuck_nintendo.svg"}, - {"joycon_left_or_right_nintendo", "Joy-Con Left or Right (Nintendo)", ":/graphics/controllers/joycon_left_or_right_nintendo.svg"}, - {"joycon_pair_nintendo", "Joy-Con Pair (Nintendo)", ":/graphics/controllers/joycon_pair_nintendo.svg"}, - {"unknown", "Unknown Controller", ":/graphics/controllers/unknown.svg"} + // shortName displayName fileName + {"gamepad_generic", "Gamepad (Generic)", ":/graphics/controllers/gamepad_generic.svg"}, + {"gamepad_nintendo_nes", "Gamepad (Nintendo NES)", ":/graphics/controllers/gamepad_nintendo_nes.svg"}, + {"gamepad_nintendo_snes", "Gamepad (Nintendo SNES)", ":/graphics/controllers/gamepad_nintendo_snes.svg"}, + {"gamepad_nintendo_64", "Gamepad (Nintendo 64)", ":/graphics/controllers/gamepad_nintendo_64.svg"}, + {"gamepad_playstation", "Gamepad (PlayStation)", ":/graphics/controllers/gamepad_playstation.svg"}, + {"gamepad_sega_md_3_buttons", "Gamepad (Sega Mega Drive/Genesis 3 Buttons)", ":/graphics/controllers/gamepad_sega_md_3_buttons.svg"}, + {"gamepad_sega_md_6_buttons", "Gamepad (Sega Mega Drive/Genesis 6 Buttons)", ":/graphics/controllers/gamepad_sega_md_6_buttons.svg"}, + {"gamepad_xbox", "Gamepad (Xbox)", ":/graphics/controllers/gamepad_xbox.svg"}, + {"joystick_generic", "Joystick (Generic)", ":/graphics/controllers/joystick_generic.svg"}, + {"joystick_arcade_no_buttons", "Joystick (Arcade No Buttons)", ":/graphics/controllers/joystick_arcade_no_buttons.svg"}, + {"joystick_arcade_1_button", "Joystick (Arcade 1 Button)", ":/graphics/controllers/joystick_arcade_1_button.svg"}, + {"joystick_arcade_2_buttons", "Joystick (Arcade 2 Buttons)", ":/graphics/controllers/joystick_arcade_2_buttons.svg"}, + {"joystick_arcade_3_buttons", "Joystick (Arcade 3 Buttons)", ":/graphics/controllers/joystick_arcade_3_buttons.svg"}, + {"joystick_arcade_4_buttons", "Joystick (Arcade 4 Buttons)", ":/graphics/controllers/joystick_arcade_4_buttons.svg"}, + {"joystick_arcade_5_buttons", "Joystick (Arcade 5 Buttons)", ":/graphics/controllers/joystick_arcade_5_buttons.svg"}, + {"joystick_arcade_6_buttons", "Joystick (Arcade 6 Buttons)", ":/graphics/controllers/joystick_arcade_6_buttons.svg"}, + {"keyboard_generic", "Keyboard (Generic)", ":/graphics/controllers/keyboard_generic.svg"}, + {"keyboard_and_mouse_generic", "Keyboard and Mouse (Generic)", ":/graphics/controllers/keyboard_and_mouse_generic.svg"}, + {"mouse_generic", "Mouse (Generic)", ":/graphics/controllers/mouse_generic.svg"}, + {"mouse_amiga", "Mouse (Amiga)", ":/graphics/controllers/mouse_amiga.svg"}, + {"lightgun_generic", "Lightgun (Generic)", ":/graphics/controllers/lightgun_generic.svg"}, + {"lightgun_nintendo", "Lightgun (Nintendo)", ":/graphics/controllers/lightgun_nintendo.svg"}, + {"steering_wheel_generic", "Steering Wheel (Generic)", ":/graphics/controllers/steering_wheel_generic.svg"}, + {"flight_stick_generic", "Flight Stick (Generic)", ":/graphics/controllers/flight_stick_generic.svg"}, + {"spinner_generic", "Spinner (Generic)", ":/graphics/controllers/spinner_generic.svg"}, + {"trackball_generic", "Trackball (Generic)", ":/graphics/controllers/trackball_generic.svg"}, + {"wii_remote_nintendo", "Wii Remote (Nintendo)", ":/graphics/controllers/wii_remote_nintendo.svg"}, + {"wii_remote_and_nunchuk_nintendo", "Wii Remote and Nunchuk (Nintendo)", ":/graphics/controllers/wii_remote_and_nunchuk_nintendo.svg"}, + {"joycon_left_or_right_nintendo", "Joy-Con Left or Right (Nintendo)", ":/graphics/controllers/joycon_left_or_right_nintendo.svg"}, + {"joycon_pair_nintendo", "Joy-Con Pair (Nintendo)", ":/graphics/controllers/joycon_pair_nintendo.svg"}, + {"unknown", "Unknown Controller", ":/graphics/controllers/unknown.svg"} }; // clang-format on diff --git a/es-core/src/components/ComponentList.cpp b/es-core/src/components/ComponentList.cpp index cee1ab3bb..c9d4d7b38 100644 --- a/es-core/src/components/ComponentList.cpp +++ b/es-core/src/components/ComponentList.cpp @@ -448,7 +448,7 @@ void ComponentList::updateElementPosition(const ComponentListRow& row) const auto comp = row.elements.at(i).component; // Center vertically. - comp->setPosition(x, (rowHeight - comp->getSize().y) / 2.0f + yOffset); + comp->setPosition(x, std::round((rowHeight - comp->getSize().y) / 2.0f + yOffset)); x += comp->getSize().x; } } diff --git a/es-core/src/components/NinePatchComponent.cpp b/es-core/src/components/NinePatchComponent.cpp index e1b62b366..0f28b8635 100644 --- a/es-core/src/components/NinePatchComponent.cpp +++ b/es-core/src/components/NinePatchComponent.cpp @@ -47,19 +47,29 @@ void NinePatchComponent::updateColors() void NinePatchComponent::buildVertices() { + if (mSize.x == 0.0f || mSize.y == 0.0f) + return; + if (mVertices != nullptr) delete[] mVertices; - // Scale the corner size relative to the screen resolution, but keep the scale factor - // within reason as extreme resolutions may cause artifacts. Any "normal" resolution - // (e.g. from 720p to 4K) will be within these boundaries though. - float scaleFactor; - if (Renderer::getScreenWidth() > Renderer::getScreenHeight()) - scaleFactor = glm::clamp(Renderer::getScreenHeightModifier(), 0.4f, 3.0f); - else - scaleFactor = glm::clamp(Renderer::getScreenWidthModifier(), 0.4f, 3.0f); + glm::vec2 relCornerSize{}; - mTexture = TextureResource::get(mPath, false, false, false, true, true, scaleFactor); + // Don't scale the rasterized version of the frame as it would look bad. + if (mPath.substr(mPath.size() - 4, std::string::npos) == ".png") { + relCornerSize = mCornerSize; + } + else { + // Scale the corner size relative to the screen resolution. + relCornerSize = glm::round( + mCornerSize * + ((Renderer::getScreenHeightModifier() + Renderer::getScreenWidthModifier()) / 2.0f)); + } + + mTexture = TextureResource::get(mPath, false, false, false); + glm::vec2 texSize = relCornerSize * 3.0f; + + mTexture->rasterizeAt(texSize.x, texSize.y); if (mTexture->getSize() == glm::ivec2{}) { mVertices = nullptr; @@ -69,19 +79,16 @@ void NinePatchComponent::buildVertices() mVertices = new Renderer::Vertex[6 * 9]; - glm::vec2 texSize{static_cast(mTexture->getSize().x), - static_cast(mTexture->getSize().y)}; - - const float imgSizeX[3]{mCornerSize.x, mSize.x - mCornerSize.x * 2.0f, mCornerSize.x}; - const float imgSizeY[3]{mCornerSize.y, mSize.y - mCornerSize.y * 2.0f, mCornerSize.y}; + const float imgSizeX[3]{relCornerSize.x, mSize.x - relCornerSize.x * 2.0f, relCornerSize.x}; + const float imgSizeY[3]{relCornerSize.y, mSize.y - relCornerSize.y * 2.0f, relCornerSize.y}; const float imgPosX[3]{0, imgSizeX[0], imgSizeX[0] + imgSizeX[1]}; const float imgPosY[3]{0, imgSizeY[0], imgSizeY[0] + imgSizeY[1]}; // The "1 +" in posY and "-" in sizeY is to deal with texture coordinates having a bottom // left corner origin vs. verticies having a top left origin. // clang-format off - const float texSizeX[3]{mCornerSize.x / texSize.x, (texSize.x - mCornerSize.x * 2.0f) / texSize.x, mCornerSize.x / texSize.x}; - const float texSizeY[3]{-mCornerSize.y / texSize.y, -(texSize.y - mCornerSize.y * 2.0f) / texSize.y, -mCornerSize.y / texSize.y}; + const float texSizeX[3]{relCornerSize.x / texSize.x, (texSize.x - relCornerSize.x * 2.0f) / texSize.x, relCornerSize.x / texSize.x}; + const float texSizeY[3]{-relCornerSize.y / texSize.y, -(texSize.y - relCornerSize.y * 2.0f) / texSize.y, -relCornerSize.y / texSize.y}; const float texPosX[3]{0.0f, texSizeX[0], texSizeX[0] + texSizeX[1]}; const float texPosY[3]{1.0f, 1.0f + texSizeY[0], 1.0f + texSizeY[0] + texSizeY[1]}; diff --git a/es-core/src/components/OptionListComponent.h b/es-core/src/components/OptionListComponent.h index 181b8693a..509235ad1 100644 --- a/es-core/src/components/OptionListComponent.h +++ b/es-core/src/components/OptionListComponent.h @@ -91,11 +91,11 @@ public: mText.getFont()->getHeight()); // Position. - mLeftArrow.setPosition(0.0f, (mSize.y - mLeftArrow.getSize().y) / 2.0f); + mLeftArrow.setPosition(0.0f, std::round((mSize.y - mLeftArrow.getSize().y) / 2.0f)); mText.setPosition(mLeftArrow.getPosition().x + mLeftArrow.getSize().x, (mSize.y - mText.getSize().y) / 2.0f); mRightArrow.setPosition(mText.getPosition().x + mText.getSize().x, - (mSize.y - mRightArrow.getSize().y) / 2.0f); + std::round((mSize.y - mRightArrow.getSize().y) / 2.0f)); } bool input(InputConfig* config, Input input) override diff --git a/es-core/src/resources/TextureData.cpp b/es-core/src/resources/TextureData.cpp index e9c05e198..e51908489 100644 --- a/es-core/src/resources/TextureData.cpp +++ b/es-core/src/resources/TextureData.cpp @@ -15,6 +15,7 @@ #include "Log.h" #include "renderers/Renderer.h" #include "resources/ResourceManager.h" +#include "utils/StringUtil.h" #include "nanosvg.h" #include "nanosvgrast.h" @@ -31,7 +32,6 @@ TextureData::TextureData(bool tile) , mHeight{0} , mSourceWidth{0.0f} , mSourceHeight{0.0f} - , mScaleDuringLoad{1.0f} , mScalable{false} , mLinearMagnify{false} , mForceRasterization{false} @@ -63,7 +63,7 @@ bool TextureData::initSVGFromMemory(const std::string& fileData) NSVGimage* svgImage{nsvgParse(const_cast(fileData.c_str()), "px", DPI)}; - if (!svgImage) { + if (!svgImage || svgImage->width == 0 || svgImage->height == 0) { LOG(LogError) << "Couldn't parse SVG image"; return false; } @@ -71,7 +71,7 @@ bool TextureData::initSVGFromMemory(const std::string& fileData) bool rasterize{true}; // If there is no image size defined yet, then don't rasterize unless mForceRasterization has - // been set (this is only used by NinePatchComponent to avoid flickering menus). + // been set. if (mSourceWidth == 0.0f && mSourceHeight == 0.0f) { if (!mForceRasterization) rasterize = false; @@ -80,8 +80,8 @@ bool TextureData::initSVGFromMemory(const std::string& fileData) mSourceHeight = 64.0f * (svgImage->height / svgImage->width); } - mWidth = static_cast(std::round(mSourceWidth * mScaleDuringLoad)); - mHeight = static_cast(std::round(mSourceHeight * mScaleDuringLoad)); + mWidth = static_cast(std::round(mSourceWidth)); + mHeight = static_cast(std::round(mSourceHeight)); if (mWidth == 0) { // Auto scale width to keep aspect ratio. @@ -176,7 +176,7 @@ bool TextureData::load() std::shared_ptr& rm = ResourceManager::getInstance(); const ResourceData& data = rm->getFileData(mPath); // Is it an SVG? - if (mPath.substr(mPath.size() - 4, std::string::npos) == ".svg") { + if (Utils::String::toLower(mPath.substr(mPath.size() - 4, std::string::npos)) == ".svg") { mScalable = true; std::string dataString; dataString.assign(std::string(reinterpret_cast(data.ptr.get()), data.length)); @@ -243,22 +243,14 @@ size_t TextureData::width() { if (mWidth == 0) load(); - // If it's an SVG image, the size was correctly set to the scaled-up values during the - // rasterization, so only multiply by the scale factor if it's a raster file. - if (!mScalable) - return static_cast(mWidth * mScaleDuringLoad); - else - return mWidth; + return static_cast(mWidth); } size_t TextureData::height() { if (mHeight == 0) load(); - if (!mScalable) - return static_cast(mHeight * mScaleDuringLoad); - else - return mHeight; + return static_cast(mHeight); } float TextureData::sourceWidth() diff --git a/es-core/src/resources/TextureData.h b/es-core/src/resources/TextureData.h index 1717bf101..6562643c1 100644 --- a/es-core/src/resources/TextureData.h +++ b/es-core/src/resources/TextureData.h @@ -57,8 +57,6 @@ public: void setSourceSize(float width, float height); glm::vec2 getSize() { return glm::vec2{mWidth, mHeight}; } - // Define a factor for scaling the file when loading it (1.0f = no scaling). - void setScaleDuringLoad(float scale) { mScaleDuringLoad = scale; } // Whether to use linear filtering when magnifying the texture. void setLinearMagnify(bool setting) { mLinearMagnify = setting; } // Whether to rasterize the image even if a size has not been set yet. @@ -81,7 +79,6 @@ private: int mHeight; float mSourceWidth; float mSourceHeight; - float mScaleDuringLoad; bool mScalable; bool mLinearMagnify; bool mReloadable; diff --git a/es-core/src/resources/TextureResource.cpp b/es-core/src/resources/TextureResource.cpp index 8217a9f58..8b1990100 100644 --- a/es-core/src/resources/TextureResource.cpp +++ b/es-core/src/resources/TextureResource.cpp @@ -16,12 +16,8 @@ std::map> TextureResource::sTextureMap; std::set TextureResource::sAllTextures; -TextureResource::TextureResource(const std::string& path, - bool tile, - bool dynamic, - bool linearMagnify, - bool forceRasterization, - float scaleDuringLoad) +TextureResource::TextureResource( + const std::string& path, bool tile, bool dynamic, bool linearMagnify, bool forceRasterization) : mTextureData(nullptr) , mForceLoad(false) { @@ -33,8 +29,6 @@ TextureResource::TextureResource(const std::string& path, if (dynamic) { data = sTextureDataManager.add(this, tile); data->initFromPath(path); - if (scaleDuringLoad != 1.0f) - data->setScaleDuringLoad(scaleDuringLoad); data->setLinearMagnify(linearMagnify); data->setForceRasterization(forceRasterization); // Force the texture manager to load it using a blocking load. @@ -44,8 +38,6 @@ TextureResource::TextureResource(const std::string& path, mTextureData = std::shared_ptr(new TextureData(tile)); data = mTextureData; data->initFromPath(path); - if (scaleDuringLoad != 1.0f) - data->setScaleDuringLoad(scaleDuringLoad); data->setLinearMagnify(linearMagnify); data->setForceRasterization(forceRasterization); // Load it so we can read the width/height. @@ -154,15 +146,14 @@ std::shared_ptr TextureResource::get(const std::string& path, bool forceLoad, bool dynamic, bool linearMagnify, - bool forceRasterization, - float scaleDuringLoad) + bool forceRasterization) { std::shared_ptr& rm = ResourceManager::getInstance(); const std::string canonicalPath = Utils::FileSystem::getCanonicalPath(path); if (canonicalPath.empty()) { - std::shared_ptr tex(new TextureResource( - "", tile, false, linearMagnify, forceRasterization, scaleDuringLoad)); + std::shared_ptr tex( + new TextureResource("", tile, false, linearMagnify, forceRasterization)); // Make sure we get properly deinitialized even though we do nothing on reinitialization. rm->addReloadable(tex); return tex; @@ -178,8 +169,8 @@ std::shared_ptr TextureResource::get(const std::string& path, // Need to create it. std::shared_ptr tex; - tex = std::shared_ptr(new TextureResource( - key.first, tile, dynamic, linearMagnify, forceRasterization, scaleDuringLoad)); + tex = std::shared_ptr( + new TextureResource(key.first, tile, dynamic, linearMagnify, forceRasterization)); std::shared_ptr data = sTextureDataManager.get(tex.get()); // Is it an SVG? diff --git a/es-core/src/resources/TextureResource.h b/es-core/src/resources/TextureResource.h index 7ae64728b..b36118f2f 100644 --- a/es-core/src/resources/TextureResource.h +++ b/es-core/src/resources/TextureResource.h @@ -31,8 +31,7 @@ public: bool forceLoad = false, bool dynamic = true, bool linearMagnify = false, - bool forceRasterization = false, - float scaleDuringLoad = 1.0f); + bool forceRasterization = false); void initFromPixels(const unsigned char* dataRGBA, size_t width, size_t height); virtual void initFromMemory(const char* data, size_t length); static void manualUnload(std::string path, bool tile); @@ -48,10 +47,6 @@ public: std::string getTextureFilePath(); - // For SVG graphics this function effectively rescales the image to the defined size. - // It does unload and re-rasterize the texture though which may cause flickering in some - // situations. An alternative is to set a scaling factor directly when loading the texture - // using get(), by using the scaleDuringLoad parameter (which also works for raster graphics). void rasterizeAt(float width, float height); glm::vec2 getSourceImageSize() const { return mSourceSize; } @@ -72,8 +67,7 @@ protected: bool tile, bool dynamic, bool linearMagnify, - bool forceRasterization, - float scaleDuringLoad); + bool forceRasterization); virtual void unload(std::shared_ptr& rm); virtual void reload(std::shared_ptr& rm); diff --git a/resources/graphics/controllers/flight_stick_generic.svg b/resources/graphics/controllers/flight_stick_generic.svg new file mode 100644 index 000000000..477d13c57 --- /dev/null +++ b/resources/graphics/controllers/flight_stick_generic.svg @@ -0,0 +1,537 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/gamepad_generic.svg b/resources/graphics/controllers/gamepad_generic.svg index b6b01c15a..6a0343579 100644 --- a/resources/graphics/controllers/gamepad_generic.svg +++ b/resources/graphics/controllers/gamepad_generic.svg @@ -9,15 +9,34 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="unknown.svg"> + sodipodi:docname="gamepad_generic.svg"> + id="defs4919"> + + + + + inkscape:window-maximized="1" + inkscape:snap-global="false" /> @@ -53,17 +73,216 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + id="g4010" + transform="matrix(0.28433921,0,0,0.28246003,-64.333532,229.1746)"> + + + + sodipodi:nodetypes="sssscccscccccccsccccs" + inkscape:connector-curvature="0" + id="path4759" + d="m 29.181122,245.34777 c -4.341201,0.0132 -9.211015,0.21165 -12.906706,1.17564 -0.675744,0.17626 -1.36604,0.40725 -1.925464,0.82527 -1.237993,0.92507 -2.273346,2.18427 -2.958993,3.56929 -2.4488935,4.94681 -3.1817478,10.64444 -3.7294877,16.1339 -0.1762514,3.71709 -0.6833116,8.43045 1.0555475,11.88232 0.8238667,2.06457 3.5909572,2.56777 5.3805502,1.40302 3.655352,-2.25203 6.000631,-7.93955 10.158755,-9.48085 2.948442,-1.09291 6.203568,-1.03412 9.33328,-1.11776 0.09937,0.003 0.20017,0.006 0.299722,0.009 0.09955,-0.003 0.200356,-0.006 0.299725,-0.009 3.129712,0.0836 6.356427,0.10479 9.333281,1.11776 4.127878,1.62056 6.383107,7.22882 10.038461,9.48085 1.789591,1.16475 4.556683,0.66155 5.380548,-1.40302 1.73886,-3.45187 1.352094,-8.16523 1.175842,-11.88232 -0.54774,-5.48946 -1.280594,-11.18709 -3.729487,-16.1339 -0.685646,-1.38502 -1.721001,-2.64422 -2.958994,-3.56929 -0.559422,-0.41802 -1.24972,-0.64901 -1.925463,-0.82527 -3.695692,-0.96399 -8.565504,-1.16244 -12.906705,-1.17564 -1.684235,-0.005 -3.270859,-0.0465 -4.696574,-0.0297 -1.425713,-0.0168 -3.033604,0.0246 -4.717838,0.0297 z" + style="fill:#373737;fill-opacity:1;stroke:#000000;stroke-width:0.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/gamepad_nintendo_64.svg b/resources/graphics/controllers/gamepad_nintendo_64.svg index 48c9bf4e8..df48b2125 100644 --- a/resources/graphics/controllers/gamepad_nintendo_64.svg +++ b/resources/graphics/controllers/gamepad_nintendo_64.svg @@ -9,9 +9,9 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733334 67.733334" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" @@ -50,9 +50,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="22.627417" - inkscape:cx="14.408843" - inkscape:cy="35.16371" + inkscape:zoom="2.4942087" + inkscape:cx="4.6339592" + inkscape:cy="120.56837" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" @@ -71,7 +71,7 @@ image/svg+xml - + @@ -79,216 +79,220 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26664)"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g4834" + transform="matrix(5.9344609,0,0,5.9344609,0.89331707,-1466.4279)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/gamepad_nintendo_nes.svg b/resources/graphics/controllers/gamepad_nintendo_nes.svg index e546a52eb..92259e8c8 100644 --- a/resources/graphics/controllers/gamepad_nintendo_nes.svg +++ b/resources/graphics/controllers/gamepad_nintendo_nes.svg @@ -9,9 +9,9 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733334 67.733334" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" @@ -25,9 +25,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="33.785627" - inkscape:cx="7.8454542" - inkscape:cy="25.685359" + inkscape:zoom="2.3222159" + inkscape:cx="-141.71258" + inkscape:cy="91.156289" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" @@ -46,7 +46,7 @@ image/svg+xml - + @@ -54,10 +54,10 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26664)"> + transform="matrix(5.9544334,0,0,5.9544334,0.78234597,-1472.249)"> image/svg+xml - + @@ -54,10 +54,10 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + transform="matrix(6.1525214,0,0,6.1525214,-0.31828098,-1529.9804)"> image/svg+xml - + @@ -78,9 +78,10 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + id="g6486" + transform="matrix(6.0251718,0,0,6.0251718,0.38930592,-1492.5651)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/gamepad_sega_md_6_buttons.svg b/resources/graphics/controllers/gamepad_sega_md_6_buttons.svg new file mode 100644 index 000000000..a2d924a69 --- /dev/null +++ b/resources/graphics/controllers/gamepad_sega_md_6_buttons.svg @@ -0,0 +1,862 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/gamepad_xbox.svg b/resources/graphics/controllers/gamepad_xbox.svg index b6b01c15a..d639c90b0 100644 --- a/resources/graphics/controllers/gamepad_xbox.svg +++ b/resources/graphics/controllers/gamepad_xbox.svg @@ -7,17 +7,80 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="unknown.svg"> + sodipodi:docname="gamepad_xbox.svg"> + id="defs4919"> + + + + + + + + + + + + + + + inkscape:window-maximized="1" + inkscape:snap-global="false" /> @@ -53,17 +117,596 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + id="g4010" + transform="matrix(0.28433921,0,0,0.28246003,-64.333532,229.1746)"> + + + + inkscape:connector-curvature="0" + id="path4759" + d="m 21.126876,246.08872 c -0.301103,-0.002 -0.605207,0.0105 -0.908988,0.0248 -1.098211,0.0791 -2.655197,0.5375 -3.899503,1.05368 -0.912215,0.42125 -2.971038,1.26942 -3.31401,1.6459 -0.365384,0.31876 -1.293988,2.34627 -1.766817,3.55275 -0.540745,1.37977 -0.935229,2.75314 -1.3130982,4.18683 -1.447945,5.49364 -2.4866023,12.07485 -2.1068482,18.12757 0.12714,2.02649 0.559386,4.19373 1.846399,5.80998 1.0444894,1.31168 2.9418964,1.36756 4.3263504,0.6997 2.261039,-1.09071 3.803235,-3.22117 5.6441,-4.88859 1.966195,-1.78095 4.027534,-3.53232 6.858496,-3.99459 1.820151,-0.29721 4.781206,-0.59796 7.340637,-0.59996 2.559431,0.002 5.520487,0.30275 7.340637,0.59996 2.830963,0.46227 4.892302,2.21364 6.858498,3.99459 1.840865,1.66742 3.38306,3.79788 5.644099,4.88859 1.384454,0.66786 3.28186,0.61198 4.32635,-0.6997 1.287013,-1.61625 1.71926,-3.78349 1.846398,-5.80998 0.379754,-6.05272 -0.658903,-12.63393 -2.106848,-18.12757 -0.37787,-1.43369 -0.772353,-2.80706 -1.313098,-4.18683 -0.472829,-1.20648 -1.401432,-3.23399 -1.766816,-3.55275 -0.342972,-0.37648 -2.401795,-1.22465 -3.31401,-1.6459 -1.244306,-0.51618 -2.801291,-0.97456 -3.899503,-1.05368 -0.303781,-0.0143 -0.607885,-0.0273 -0.908989,-0.0248 -0.903314,0.007 -1.781302,0.15 -2.555399,0.78703 -0.889307,0.84744 -1.769128,1.71057 -2.703711,2.50682 -1.739206,1.28628 -5.272889,1.08788 -7.447608,1.05678 -2.174719,0.0311 -5.708401,0.2295 -7.447607,-1.05678 -0.934582,-0.79625 -1.814404,-1.65938 -2.703711,-2.50682 -0.774096,-0.63703 -1.652085,-0.78003 -2.5554,-0.78703 z" + style="fill:#1c1c1c;fill-opacity:1;stroke:#000000;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/joycon_left_or_right_nintendo.svg b/resources/graphics/controllers/joycon_left_or_right_nintendo.svg index 3a8554f7d..59fbedbfa 100644 --- a/resources/graphics/controllers/joycon_left_or_right_nintendo.svg +++ b/resources/graphics/controllers/joycon_left_or_right_nintendo.svg @@ -9,15 +9,23 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="joycon_left_or_right_nintendo.svg"> + id="defs4919"> + + + transform="translate(0,-229.26665)"> + transform="matrix(6.6685423,0,0,6.6685423,-3.1854213,-1673.2278)"> @@ -162,7 +170,7 @@ + transform="matrix(6.6685423,0,0,6.6685423,-3.1854213,-1687.5153)"> diff --git a/resources/graphics/controllers/joycon_pair_nintendo.svg b/resources/graphics/controllers/joycon_pair_nintendo.svg index 649377f0a..71b1e8d15 100644 --- a/resources/graphics/controllers/joycon_pair_nintendo.svg +++ b/resources/graphics/controllers/joycon_pair_nintendo.svg @@ -9,9 +9,9 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" @@ -33,9 +33,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="14.109375" - inkscape:cx="3.8930481" - inkscape:cy="14.965158" + inkscape:zoom="2.1994829" + inkscape:cx="-13.449812" + inkscape:cy="145.73207" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" @@ -53,7 +53,7 @@ image/svg+xml - + @@ -61,10 +61,10 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + transform="matrix(6.6685423,0,0,6.6685423,-3.1854213,-1680.3715)"> @@ -170,7 +170,7 @@ + transform="matrix(6.6685423,0,0,6.6685423,-3.1854213,-1680.3715)"> diff --git a/resources/graphics/controllers/joystick_arcade_1_button.svg b/resources/graphics/controllers/joystick_arcade_1_button.svg new file mode 100644 index 000000000..8b6d63b38 --- /dev/null +++ b/resources/graphics/controllers/joystick_arcade_1_button.svg @@ -0,0 +1,271 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/joystick_arcade_2_buttons.svg b/resources/graphics/controllers/joystick_arcade_2_buttons.svg index b6b01c15a..a1b8bfa3f 100644 --- a/resources/graphics/controllers/joystick_arcade_2_buttons.svg +++ b/resources/graphics/controllers/joystick_arcade_2_buttons.svg @@ -9,13 +9,13 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="unknown.svg"> + sodipodi:docname="joystick_arcade_2_buttons.svg"> + transform="translate(0,-229.26665)"> + + id="g4928" + transform="matrix(0.99990441,0,0,1.0164462,0.00195324,-4.327527)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + id="path12-7" + d="m 20.507225,259.29748 c -2.123437,0 -3.844811,1.72138 -3.844811,3.84482 0,2.12343 1.721374,3.84481 3.844811,3.84481 2.123441,0 3.84481,-1.72138 3.84481,-3.84481 0,-2.12344 -1.721369,-3.84482 -3.84481,-3.84482 z m -0.04741,7.48263 c -2.035291,0 -3.685245,-1.64995 -3.685245,-3.68525 0,-2.03529 1.649954,-3.68524 3.685245,-3.68524 2.035292,0 3.685242,1.64995 3.685242,3.68524 0,2.0353 -1.64995,3.68525 -3.685242,3.68525 z" + inkscape:connector-curvature="0" + style="fill:#c9c9c7;stroke-width:0.13708451" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/joystick_arcade_3_buttons.svg b/resources/graphics/controllers/joystick_arcade_3_buttons.svg index b6b01c15a..6f5105f46 100644 --- a/resources/graphics/controllers/joystick_arcade_3_buttons.svg +++ b/resources/graphics/controllers/joystick_arcade_3_buttons.svg @@ -9,13 +9,13 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="unknown.svg"> + sodipodi:docname="joystick_arcade_3_buttons.svg"> + transform="translate(0,-229.26665)"> + + id="g4928" + transform="matrix(0.99992566,0,0,1.0164679,0.00174674,-4.333237)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + id="path12-7" + d="m 20.507225,259.29748 c -2.123437,0 -3.844811,1.72138 -3.844811,3.84482 0,2.12343 1.721374,3.84481 3.844811,3.84481 2.123441,0 3.84481,-1.72138 3.84481,-3.84481 0,-2.12344 -1.721369,-3.84482 -3.84481,-3.84482 z m -0.04741,7.48263 c -2.035291,0 -3.685245,-1.64995 -3.685245,-3.68525 0,-2.03529 1.649954,-3.68524 3.685245,-3.68524 2.035292,0 3.685242,1.64995 3.685242,3.68524 0,2.0353 -1.64995,3.68525 -3.685242,3.68525 z" + inkscape:connector-curvature="0" + style="fill:#c9c9c7;stroke-width:0.13708451" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/joystick_arcade_4_buttons.svg b/resources/graphics/controllers/joystick_arcade_4_buttons.svg index b6b01c15a..bff46e70a 100644 --- a/resources/graphics/controllers/joystick_arcade_4_buttons.svg +++ b/resources/graphics/controllers/joystick_arcade_4_buttons.svg @@ -9,13 +9,13 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="unknown.svg"> + sodipodi:docname="joystick_arcade_4_buttons.svg"> + transform="translate(0,-229.26665)"> + + id="g4928" + transform="matrix(0.99992566,0,0,1.0164679,0.00174674,-4.333237)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + id="path12-7" + d="m 20.507225,259.29748 c -2.123437,0 -3.844811,1.72138 -3.844811,3.84482 0,2.12343 1.721374,3.84481 3.844811,3.84481 2.123441,0 3.84481,-1.72138 3.84481,-3.84481 0,-2.12344 -1.721369,-3.84482 -3.84481,-3.84482 z m -0.04741,7.48263 c -2.035291,0 -3.685245,-1.64995 -3.685245,-3.68525 0,-2.03529 1.649954,-3.68524 3.685245,-3.68524 2.035292,0 3.685242,1.64995 3.685242,3.68524 0,2.0353 -1.64995,3.68525 -3.685242,3.68525 z" + inkscape:connector-curvature="0" + style="fill:#c9c9c7;stroke-width:0.13708451" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/joystick_arcade_5_buttons.svg b/resources/graphics/controllers/joystick_arcade_5_buttons.svg new file mode 100644 index 000000000..fa851a34f --- /dev/null +++ b/resources/graphics/controllers/joystick_arcade_5_buttons.svg @@ -0,0 +1,515 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/joystick_arcade_6_buttons.svg b/resources/graphics/controllers/joystick_arcade_6_buttons.svg index b6b01c15a..acf6a6726 100644 --- a/resources/graphics/controllers/joystick_arcade_6_buttons.svg +++ b/resources/graphics/controllers/joystick_arcade_6_buttons.svg @@ -9,13 +9,13 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="unknown.svg"> + sodipodi:docname="joystick_arcade_6_buttons.svg"> + transform="translate(0,-229.26665)"> + + + transform="matrix(0.88758869,0,0,0.90164635,0.54790817,25.880136)" + id="g4928"> + + + + + + + + + + + + + + + + + + + + + + + + + + + id="path12-7" + d="m 20.507225,259.29748 c -2.123437,0 -3.844811,1.72138 -3.844811,3.84482 0,2.12343 1.721374,3.84481 3.844811,3.84481 2.123441,0 3.84481,-1.72138 3.84481,-3.84481 0,-2.12344 -1.721369,-3.84482 -3.84481,-3.84482 z m -0.04741,7.48263 c -2.035291,0 -3.685245,-1.64995 -3.685245,-3.68525 0,-2.03529 1.649954,-3.68524 3.685245,-3.68524 2.035292,0 3.685242,1.64995 3.685242,3.68524 0,2.0353 -1.64995,3.68525 -3.685242,3.68525 z" + inkscape:connector-curvature="0" + style="fill:#c9c9c7;stroke-width:0.13708451" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/joystick_arcade_no_buttons.svg b/resources/graphics/controllers/joystick_arcade_no_buttons.svg new file mode 100644 index 000000000..740976fda --- /dev/null +++ b/resources/graphics/controllers/joystick_arcade_no_buttons.svg @@ -0,0 +1,215 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/joystick_generic.svg b/resources/graphics/controllers/joystick_generic.svg index ebabd7953..59da0c1b1 100644 --- a/resources/graphics/controllers/joystick_generic.svg +++ b/resources/graphics/controllers/joystick_generic.svg @@ -9,9 +9,9 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" @@ -25,9 +25,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="28.21875" - inkscape:cx="6.1924519" - inkscape:cy="24.290783" + inkscape:zoom="3.1105385" + inkscape:cx="-11.977398" + inkscape:cy="87.435969" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" @@ -45,7 +45,7 @@ image/svg+xml - + @@ -53,9 +53,10 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + id="g4868" + transform="matrix(6.1411819,0,0,6.1411819,-0.25527512,-1526.4204)"> + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/keyboard_generic.svg b/resources/graphics/controllers/keyboard_generic.svg index b6b01c15a..b0c7ec6cb 100644 --- a/resources/graphics/controllers/keyboard_generic.svg +++ b/resources/graphics/controllers/keyboard_generic.svg @@ -9,13 +9,13 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="unknown.svg"> + sodipodi:docname="keyboard_generic.svg"> + inkscape:window-maximized="1" + inkscape:snap-global="false" /> @@ -53,17 +54,1600 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + + + + + + + id="g8208" + transform="matrix(0.96071617,0,0,0.96071617,1.3663278,10.310258)"> + id="XMLID_348_" + d="m 16.571425,270.13769 h 16.041102 c 0.06096,0 0.106687,0.0588 0.106687,0.13724 v 1.94103 c 0,0.0784 -0.04572,0.13725 -0.106687,0.13725 H 16.571425 c -0.06096,0 -0.106686,-0.0588 -0.106686,-0.13725 v -1.94103 c 0,-0.0686 0.04572,-0.13724 0.106686,-0.13724 z" + inkscape:connector-curvature="0" + style="fill:#a1a1a1;fill-opacity:1;stroke-width:0.08643198" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/keyboard_mouse_generic.svg b/resources/graphics/controllers/keyboard_mouse_generic.svg deleted file mode 100644 index b6b01c15a..000000000 --- a/resources/graphics/controllers/keyboard_mouse_generic.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/resources/graphics/controllers/lightgun_generic.svg b/resources/graphics/controllers/lightgun_generic.svg index b6b01c15a..9def4cfca 100644 --- a/resources/graphics/controllers/lightgun_generic.svg +++ b/resources/graphics/controllers/lightgun_generic.svg @@ -7,17 +7,253 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" - version="1.1" - id="svg4925" + sodipodi:docname="lightgun_generic.svg" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="unknown.svg"> + id="svg4925" + version="1.1" + viewBox="0 0 67.733333 67.733333" + height="256" + width="256"> + id="defs4919"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:window-maximized="1" + inkscape:snap-global="true" /> @@ -53,17 +290,626 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + id="g5072" + transform="matrix(-1,0,0,1,67.733333,0.61876746)"> + inkscape:connector-curvature="0" + id="rect4842" + d="m 7.9993861,247.63193 v 2.70342 l 0.6200999,-0.0322 0.065274,-0.0574 c 0.093616,-0.0817 20.325922,-0.13697 29.221339,-0.13697 h 0.125108 1.908266 v -0.87477 h 12.424248 v -0.29571 h 0.514277 v -0.34021 h -0.514277 v -0.001 H 9.6786997 v -0.96427 z" + style="opacity:1;vector-effect:none;fill:#3d4e4e;fill-opacity:1;stroke:none;stroke-width:1.76429069;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/lightgun_nintendo.svg b/resources/graphics/controllers/lightgun_nintendo.svg index b6b01c15a..bdd3369d4 100644 --- a/resources/graphics/controllers/lightgun_nintendo.svg +++ b/resources/graphics/controllers/lightgun_nintendo.svg @@ -9,13 +9,13 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="unknown.svg"> + sodipodi:docname="lightgun_nintendo.svg"> + inkscape:window-maximized="1" + inkscape:snap-bbox="true" + inkscape:snap-global="false" + showguides="false" /> @@ -53,17 +56,166 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + id="g5776" + transform="matrix(1.0413714,0,0,1.0413714,-1.3431313,-10.886191)"> + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" + id="rect4757" + d="m 29.364774,252.27701 h 28.506047 l 2.234438,3.92733 H 29.364774 Z" + style="opacity:1;vector-effect:none;fill:#60615b;fill-opacity:1;stroke:#000000;stroke-width:0.13626042;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" /> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/mouse_amiga.svg b/resources/graphics/controllers/mouse_amiga.svg index 696cbd88d..56ef3ccf7 100644 --- a/resources/graphics/controllers/mouse_amiga.svg +++ b/resources/graphics/controllers/mouse_amiga.svg @@ -9,9 +9,9 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" @@ -25,9 +25,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="16.892814" - inkscape:cx="-25.122961" - inkscape:cy="12.292821" + inkscape:zoom="5.2667754" + inkscape:cx="88.764467" + inkscape:cy="125.56991" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" @@ -47,7 +47,7 @@ image/svg+xml - + @@ -55,9 +55,10 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + id="g5117" + transform="matrix(5.9358241,0,0,5.9358241,0.88574371,-1467.7111)"> + points="-217.8,362 -226.5,362 -227.8,365.6 -206.2,365.6 -207.6,362 -216.2,362 -216.2,360.4 -208.3,360.4 -209,358.4 -216.2,358.4 -216.2,356.8 -209.7,356.8 -210.6,354.4 -216.2,354.4 -216.2,352.8 -211.3,352.8 -212.2,350.4 -222.2,350.4 -223.1,352.8 -217.8,352.8 -217.8,354.4 -223.7,354.4 -224.6,356.8 -217.8,356.8 -217.8,358.4 -225.1,358.4 -225.9,360.4 -217.8,360.4 " /> + sodipodi:docname="mouse_generic.svg"> + id="defs4919"> + + + + + + + inkscape:window-maximized="1" + showguides="false" + inkscape:snap-bbox="false" + inkscape:snap-global="false" /> @@ -45,7 +71,7 @@ image/svg+xml - + @@ -53,17 +79,89 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> - + id="g7883"> + + + + + + + + + + + diff --git a/resources/graphics/controllers/spinner_generic.svg b/resources/graphics/controllers/spinner_generic.svg new file mode 100644 index 000000000..5b46cdcce --- /dev/null +++ b/resources/graphics/controllers/spinner_generic.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/steering_wheel_generic.svg b/resources/graphics/controllers/steering_wheel_generic.svg index b6b01c15a..2e1750a2b 100644 --- a/resources/graphics/controllers/steering_wheel_generic.svg +++ b/resources/graphics/controllers/steering_wheel_generic.svg @@ -7,17 +7,48 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="unknown.svg"> + sodipodi:docname="steering_wheel_generic.svg"> + id="defs4919"> + + + + + + + + inkscape:window-maximized="1" + inkscape:snap-global="false" + inkscape:snap-bbox="true" /> @@ -53,17 +86,514 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + id="g4902"> + transform="matrix(0.26458333,0,0,0.26458333,0,229.26665)" + inkscape:connector-curvature="0" + id="path5345" + d="M 128,29.265625 A 98.734643,98.734643 0 0 0 29.265625,128 98.734643,98.734643 0 0 0 128,226.73438 98.734643,98.734643 0 0 0 226.73438,128 98.734643,98.734643 0 0 0 128,29.265625 Z m 0,21.408203 A 77.326297,77.326297 0 0 1 205.32617,128 77.326297,77.326297 0 0 1 128,205.32617 77.326297,77.326297 0 0 1 50.673828,128 77.326297,77.326297 0 0 1 128,50.673828 Z" + style="opacity:1;vector-effect:none;fill:#1e1e1e;fill-opacity:1;stroke:#303030;stroke-width:1.877491;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/trackball_generic.svg b/resources/graphics/controllers/trackball_generic.svg index b6b01c15a..a491ee1f3 100644 --- a/resources/graphics/controllers/trackball_generic.svg +++ b/resources/graphics/controllers/trackball_generic.svg @@ -9,13 +9,13 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - sodipodi:docname="unknown.svg"> + sodipodi:docname="trackball_generic.svg"> - - - + transform="translate(0,-229.26665)"> + + + diff --git a/resources/graphics/controllers/unknown.svg b/resources/graphics/controllers/unknown.svg index e7b99fea2..2c32c71df 100644 --- a/resources/graphics/controllers/unknown.svg +++ b/resources/graphics/controllers/unknown.svg @@ -9,9 +9,9 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" @@ -25,9 +25,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="16.892814" - inkscape:cx="-37.558608" - inkscape:cy="23.448283" + inkscape:zoom="1.8620863" + inkscape:cx="-207.82219" + inkscape:cy="164.29106" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" @@ -45,7 +45,7 @@ image/svg+xml - + @@ -53,12 +53,12 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> + transform="matrix(4.7799158,0,0,4.7799158,14.931273,-1129.9431)"> + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/graphics/controllers/wii_remote_nintendo.svg b/resources/graphics/controllers/wii_remote_nintendo.svg index c8a5055c7..f3018f35a 100644 --- a/resources/graphics/controllers/wii_remote_nintendo.svg +++ b/resources/graphics/controllers/wii_remote_nintendo.svg @@ -9,9 +9,9 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="42" - height="42" - viewBox="0 0 11.1125 11.1125" + width="256" + height="256" + viewBox="0 0 67.733333 67.733333" version="1.1" id="svg4925" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" @@ -25,9 +25,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="22.627417" - inkscape:cx="-16.659924" - inkscape:cy="14.555913" + inkscape:zoom="3.5273438" + inkscape:cx="69.645015" + inkscape:cy="58.021923" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" @@ -45,7 +45,7 @@ image/svg+xml - + @@ -53,16 +53,12 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(0,-285.88748)"> + transform="translate(0,-229.26665)"> - + id="g5049" + transform="translate(-1.0794648,1.6666667e-6)"> - - - - - - - - - - - - - - - - - - - - - - + id="path6" + d="m 28.571974,234.34429 c -0.904753,0 -1.644646,0.74302 -1.644646,1.64775 v 54.28255 c 0,0.90472 0.739893,1.64775 1.644646,1.64775 h 12.748315 c 0.904753,0 1.644646,-0.74303 1.644646,-1.64775 v -54.28255 c 0,-0.90473 -0.739893,-1.64775 -1.644646,-1.64775 z" + style="fill:#f8f8f8;fill-opacity:1;stroke:#000000;stroke-width:0.47573891;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + d="m 30.669123,238.22896 c -0.801939,0 -1.439378,-0.63742 -1.439378,-1.43936 0,-0.80194 0.637439,-1.43935 1.439378,-1.43935 0.801939,0 1.439378,0.63741 1.439378,1.43935 0,0.80194 -0.637439,1.43936 -1.439378,1.43936 z" /> + r="1.3776903" + cy="236.76897" + cx="30.669123" /> + d="m 30.669123,237.59154 c -0.370126,0 -0.658001,-0.28769 -0.658001,-0.65797 0,-0.3704 0.287876,-0.65803 0.658001,-0.65803 0.370126,0 0.658001,0.28769 0.658001,0.65803 0,0.3704 -0.287876,0.65797 -0.658001,0.65797 z m 0,-1.11037 c -0.246749,0 -0.452376,0.20558 -0.452376,0.45252 0,0.24693 0.205627,0.45251 0.452376,0.45251 0.246749,0 0.452376,-0.20558 0.452376,-0.45251 0,-0.24694 -0.205627,-0.45252 -0.452376,-0.45252 z" /> + height="1.2131901" + width="0.45237595" + y="235.92593" + x="30.442936" /> + height="1.0075647" + width="0.20562541" + y="236.00824" + x="30.566309" /> + d="m 34.946132,254.96688 c -1.501065,0 -2.714256,-1.23372 -2.714256,-2.73481 0,-1.50108 1.213191,-2.7348 2.714256,-2.7348 1.501066,0 2.714256,1.23372 2.714256,2.7348 0,1.50109 -1.21319,2.73481 -2.714256,2.73481 z" /> + d="m 34.946131,261.85534 c -0.801939,0 -1.439377,-0.63742 -1.439377,-1.43936 0,-0.80194 0.637438,-1.43941 1.439377,-1.43941 0.801939,0 1.439379,0.63747 1.439379,1.43941 0,0.80194 -0.63744,1.43936 -1.439379,1.43936" /> + d="m 30.689685,261.85534 c -0.801939,0 -1.439378,-0.63742 -1.439378,-1.43936 0,-0.80194 0.637439,-1.43941 1.439378,-1.43941 0.801939,0 1.439378,0.63747 1.439378,1.43941 0,0.80194 -0.658001,1.43936 -1.439378,1.43936 z" /> + d="m 39.202578,261.85534 c -0.801939,0 -1.439378,-0.63742 -1.439378,-1.43936 0,-0.80194 0.637439,-1.43941 1.439378,-1.43941 0.801939,0 1.439378,0.63747 1.439378,1.43941 0,0.80194 -0.637439,1.43936 -1.439378,1.43936 z" /> + d="m 34.946131,277.95584 c -1.130939,0 -2.035691,-0.90479 -2.035691,-2.03571 0,-1.13093 0.904752,-2.03572 2.035691,-2.03572 1.13094,0 2.035692,0.90479 2.035692,2.03572 0,1.13092 -0.904752,2.03571 -2.035692,2.03571 z" /> + d="m 34.946131,283.52823 c -1.130939,0 -2.035691,-0.90473 -2.035691,-2.03565 0,-1.13093 0.904752,-2.03571 2.035691,-2.03571 1.13094,0 2.035692,0.90478 2.035692,2.03571 0,1.13092 -0.904752,2.03565 -2.035692,2.03565 z" /> + height="1.9945667" + width="0.41125083" + y="287.66138" + x="37.146324" /> + height="0.43181336" + width="0.41125083" + y="286.87997" + x="37.146324" /> + height="1.9945667" + width="0.41125083" + y="287.66138" + x="36.13876" /> + height="0.43181336" + width="0.41125083" + y="286.87997" + x="36.13876" /> - - + points="-218.9,516.1 -222.6,529.2 -224.5,529.2 -227.3,519.5 -230.1,529.2 -232,529.2 -235.7,516.1 -233.8,515.5 -231,525.3 -228.2,515.5 -226.3,515.5 -223.6,525.3 -220.8,515.5 " /> diff --git a/resources/graphics/controllers/wii_remote_nunchuck_nintendo.svg b/resources/graphics/controllers/wii_remote_nunchuck_nintendo.svg deleted file mode 100644 index d9699c383..000000000 --- a/resources/graphics/controllers/wii_remote_nunchuck_nintendo.svg +++ /dev/null @@ -1,368 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/systems/macos/es_systems.xml b/resources/systems/macos/es_systems.xml index ffe09a5d2..542f8943d 100644 --- a/resources/systems/macos/es_systems.xml +++ b/resources/systems/macos/es_systems.xml @@ -74,6 +74,15 @@ amstradcpc amstradcpc + + android + Google Android + %ROMPATH%/android + .7z .7Z .zip .ZIP + PLACEHOLDER %ROM% + android + android + apple2 Apple II @@ -238,6 +247,15 @@ cavestory cavestory + + cdimono1 + Philips CD-i + %ROMPATH%/cdimono1 + .7z .7Z .zip .ZIP + PLACEHOLDER %ROM% + cdimono1 + cdimono1 + cdtv Commodore CDTV @@ -339,6 +357,15 @@ dreamcast dreamcast + + epic + Epic Games Store + %ROMPATH%/epic + .sh + zsh %ROM% + pc + epic + famicom Nintendo Family Computer @@ -482,6 +509,15 @@ intellivision intellivision + + j2me + Java 2 Micro Edition (J2ME) + %ROMPATH%/j2me + .jar .JAR .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/squirreljme_libretro.dylib %ROM% + android + j2me + kodi Kodi home theatre software @@ -1152,6 +1188,15 @@ switch switch + + symbian + Symbian + %ROMPATH%/symbian + .jar .JAR .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/squirreljme_libretro.dylib %ROM% + android + symbian + tanodragon Tano Dragon @@ -1234,6 +1279,15 @@ vectrex vectrex + + vic20 + Commodore VIC-20 + %ROMPATH%/vic20 + .bin .BIN .cmd .CMD .crt .CRT .d2m .D2M .d4m .D4M .d64 .D64 .d6z .D6Z .d71 .D71 .d7z .D7Z .d80 .D80 .d81 .D81 .d82 .D82 .d8z .D8Z .g41 .G41 .g4z .G4Z .g64 .G64 .g6z .G6Z .gz .GZ .lnx .LNX .m3u .M3U .nbz .NBZ .nib .NIB .p00 .P00 .prg .PRG .t64 .T64 .tap .TAP .vfl .VFL .vsf .VSF .x64 .X64 .x6z .X6Z .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_xvic_libretro.dylib %ROM% + vic20 + vic20 + videopac Philips Videopac G7000 diff --git a/resources/systems/unix/es_systems.xml b/resources/systems/unix/es_systems.xml index fa1976071..eb8d8d90d 100644 --- a/resources/systems/unix/es_systems.xml +++ b/resources/systems/unix/es_systems.xml @@ -75,6 +75,15 @@ amstradcpc amstradcpc + + android + Google Android + %ROMPATH%/android + .7z .7Z .zip .ZIP + PLACEHOLDER %ROM% + android + android + apple2 Apple II @@ -239,6 +248,15 @@ cavestory cavestory + + cdimono1 + Philips CD-i + %ROMPATH%/cdimono1 + .7z .7Z .zip .ZIP + PLACEHOLDER %ROM% + cdimono1 + cdimono1 + cdtv Commodore CDTV @@ -340,6 +358,15 @@ dreamcast dreamcast + + epic + Epic Games Store + %ROMPATH%/epic + .sh + bash %ROM% + pc + epic + famicom Nintendo Family Computer @@ -483,6 +510,15 @@ intellivision intellivision + + j2me + Java 2 Micro Edition (J2ME) + %ROMPATH%/j2me + .jar .JAR .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/squirreljme_libretro.so %ROM% + android + j2me + kodi Kodi home theatre software @@ -1160,6 +1196,15 @@ switch switch + + symbian + Symbian + %ROMPATH%/symbian + .jar .JAR .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/squirreljme_libretro.so %ROM% + android + symbian + tanodragon Tano Dragon @@ -1243,6 +1288,15 @@ vectrex vectrex + + vic20 + Commodore VIC-20 + %ROMPATH%/vic20 + .bin .BIN .cmd .CMD .crt .CRT .d2m .D2M .d4m .D4M .d64 .D64 .d6z .D6Z .d71 .D71 .d7z .D7Z .d80 .D80 .d81 .D81 .d82 .D82 .d8z .D8Z .g41 .G41 .g4z .G4Z .g64 .G64 .g6z .G6Z .gz .GZ .lnx .LNX .m3u .M3U .nbz .NBZ .nib .NIB .p00 .P00 .prg .PRG .t64 .T64 .tap .TAP .vfl .VFL .vsf .VSF .x64 .X64 .x6z .X6Z .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/vice_xvic_libretro.so %ROM% + vic20 + vic20 + videopac Philips Videopac G7000 diff --git a/resources/systems/windows/es_systems.xml b/resources/systems/windows/es_systems.xml index 9dbbea775..c8e7b72f8 100644 --- a/resources/systems/windows/es_systems.xml +++ b/resources/systems/windows/es_systems.xml @@ -75,6 +75,15 @@ amstradcpc amstradcpc + + android + Google Android + %ROMPATH%\android + .7z .7Z .zip .ZIP + PLACEHOLDER %ROM% + android + android + apple2 Apple II @@ -239,6 +248,15 @@ cavestory cavestory + + cdimono1 + Philips CD-i + %ROMPATH%\cdimono1 + .7z .7Z .zip .ZIP + PLACEHOLDER %ROM% + cdimono1 + cdimono1 + cdtv Commodore CDTV @@ -340,6 +358,15 @@ dreamcast dreamcast + + epic + Epic Games Store + %ROMPATH%\epic + .bat + %HIDEWINDOW% cmd.exe /C %ROM% + pc + epic + famicom Nintendo Family Computer @@ -483,6 +510,15 @@ intellivision intellivision + + j2me + Java 2 Micro Edition (J2ME) + %ROMPATH%\j2me + .jar .JAR .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%\squirreljme_libretro.dll %ROM% + android + j2me + kodi Kodi home theatre software @@ -1160,6 +1196,15 @@ switch switch + + symbian + Symbian + %ROMPATH%\symbian + .jar .JAR .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%\squirreljme_libretro.dll %ROM% + android + symbian + tanodragon Tano Dragon @@ -1243,6 +1288,15 @@ vectrex vectrex + + vic20 + Commodore VIC-20 + %ROMPATH%\vic20 + .bin .BIN .cmd .CMD .crt .CRT .d2m .D2M .d4m .D4M .d64 .D64 .d6z .D6Z .d71 .D71 .d7z .D7Z .d80 .D80 .d81 .D81 .d82 .D82 .d8z .D8Z .g41 .G41 .g4z .G4Z .g64 .G64 .g6z .G6Z .gz .GZ .lnx .LNX .m3u .M3U .nbz .NBZ .nib .NIB .p00 .P00 .prg .PRG .t64 .T64 .tap .TAP .vfl .VFL .vsf .VSF .x64 .X64 .x6z .X6Z .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%\vice_xvic_libretro.dll %ROM% + vic20 + vic20 + videopac Philips Videopac G7000 diff --git a/themes/rbsimple-DE/android/colors.xml b/themes/rbsimple-DE/android/colors.xml new file mode 100644 index 000000000..fa70ad569 --- /dev/null +++ b/themes/rbsimple-DE/android/colors.xml @@ -0,0 +1,18 @@ + + 7 + + + + 4086F4 + + + EB4132 + + + FBBD00 + + + 31AA52 + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/android/images/console.svg b/themes/rbsimple-DE/android/images/console.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/android/images/console.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/android/images/consolegame.svg b/themes/rbsimple-DE/android/images/consolegame.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/android/images/consolegame.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/android/images/controller.svg b/themes/rbsimple-DE/android/images/controller.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/android/images/controller.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/android/images/logo.svg b/themes/rbsimple-DE/android/images/logo.svg new file mode 100644 index 000000000..b409a241f --- /dev/null +++ b/themes/rbsimple-DE/android/images/logo.svg @@ -0,0 +1,120 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/android/systeminfo.xml b/themes/rbsimple-DE/android/systeminfo.xml new file mode 100644 index 000000000..07b6637dd --- /dev/null +++ b/themes/rbsimple-DE/android/systeminfo.xml @@ -0,0 +1,27 @@ + + 7 + + + + The Android operating system, developed by + + + Android Inc. and later acquired by Google is by + + + far the most popular mobile OS in the world. + + + Due to the power of modern mobile devices and + + + the popularity of the platform there is a rich + + + library of games available, some even rivalling + + + those on dedicated game consoles. + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/android/theme.xml b/themes/rbsimple-DE/android/theme.xml new file mode 100644 index 000000000..077d05361 --- /dev/null +++ b/themes/rbsimple-DE/android/theme.xml @@ -0,0 +1,21 @@ + + 7 + ./../theme.xml + ./colors.xml + ./systeminfo.xml + + + + ./images/controller.svg + + + + + + ./images/logo.svg + + + ./images/consolegame.svg + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/arcade/images/controller.svg b/themes/rbsimple-DE/arcade/images/controller.svg index 81da54282..a1e6c6c55 100644 --- a/themes/rbsimple-DE/arcade/images/controller.svg +++ b/themes/rbsimple-DE/arcade/images/controller.svg @@ -1,4 +1,6 @@ + + + id="svg4925" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="controller.svg"> + + + id="metadata4922"> image/svg+xml + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/c64/images/controller.svg b/themes/rbsimple-DE/c64/images/controller.svg index c30aa519d..8d4806d87 100644 --- a/themes/rbsimple-DE/c64/images/controller.svg +++ b/themes/rbsimple-DE/c64/images/controller.svg @@ -62,16 +62,17 @@ inkscape:window-height="2065" id="namedview39" showgrid="true" - inkscape:zoom="5.1595302" - inkscape:cx="76.462702" - inkscape:cy="125.63998" + inkscape:zoom="4.5498592" + inkscape:cx="-97.4551" + inkscape:cy="154.4801" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="Layer_1" /> CPU : MOS Technology 6510/8500 @ 0.985 MHz (PAL version) - RAM : 64KB RAM + RAM : 64KB ROM : 20KB diff --git a/themes/rbsimple-DE/cdimono1/colors.xml b/themes/rbsimple-DE/cdimono1/colors.xml new file mode 100644 index 000000000..4010968d6 --- /dev/null +++ b/themes/rbsimple-DE/cdimono1/colors.xml @@ -0,0 +1,18 @@ + + 7 + + + + 000000 + + + E70000 + + + FFFFFF + + + 0B5ED8 + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/cdimono1/images/console.svg b/themes/rbsimple-DE/cdimono1/images/console.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/cdimono1/images/console.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/cdimono1/images/consolegame.svg b/themes/rbsimple-DE/cdimono1/images/consolegame.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/cdimono1/images/consolegame.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/cdimono1/images/controller.svg b/themes/rbsimple-DE/cdimono1/images/controller.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/cdimono1/images/controller.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/cdimono1/images/logo.svg b/themes/rbsimple-DE/cdimono1/images/logo.svg new file mode 100644 index 000000000..98e577835 --- /dev/null +++ b/themes/rbsimple-DE/cdimono1/images/logo.svg @@ -0,0 +1,66 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/themes/rbsimple-DE/cdimono1/systeminfo.xml b/themes/rbsimple-DE/cdimono1/systeminfo.xml new file mode 100644 index 000000000..07a7de30f --- /dev/null +++ b/themes/rbsimple-DE/cdimono1/systeminfo.xml @@ -0,0 +1,30 @@ + + 7 + + + + Manufacturer : Philips and others + + + Year of Release : 1990 + + + Units sold : 1 million + + + CPU : Philips SCC68070 (Motorola 68000-based) @ 15.5 MHz + + + Video : SCC66470, later MCD 212 + + + RAM : 1 MB + + + Audio : MCD 221, 16-bit stereo + + + Resolution : 384×280 to 768×560 + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/cdimono1/theme.xml b/themes/rbsimple-DE/cdimono1/theme.xml new file mode 100644 index 000000000..077d05361 --- /dev/null +++ b/themes/rbsimple-DE/cdimono1/theme.xml @@ -0,0 +1,21 @@ + + 7 + ./../theme.xml + ./colors.xml + ./systeminfo.xml + + + + ./images/controller.svg + + + + + + ./images/logo.svg + + + ./images/consolegame.svg + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/dos/images/console.svg b/themes/rbsimple-DE/dos/images/console.svg index a96aee5f6..c3b528830 100644 --- a/themes/rbsimple-DE/dos/images/console.svg +++ b/themes/rbsimple-DE/dos/images/console.svg @@ -1,170 +1,2051 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/dos/images/consolegame.svg b/themes/rbsimple-DE/dos/images/consolegame.svg index 21e89d697..b6d02a161 100644 --- a/themes/rbsimple-DE/dos/images/consolegame.svg +++ b/themes/rbsimple-DE/dos/images/consolegame.svg @@ -1,314 +1,2226 @@ + + + + + + + + + + + image/svg+xml + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file + d="m 113.86288,856.71208 h 28.8325 v 54.09 h -28.8325 z m -61.57,-11.055 v 67.1275 l 1.94375,1.49625 h 103.18625 l 1.71,-1.885 v -66.735 H 52.29663 l -0.004,-0.004 z" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/dos/images/controller.svg b/themes/rbsimple-DE/dos/images/controller.svg index 205361d74..6b24ff32c 100644 --- a/themes/rbsimple-DE/dos/images/controller.svg +++ b/themes/rbsimple-DE/dos/images/controller.svg @@ -1,120 +1,1295 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +image/svg+xml + + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/dos/images/game.svg b/themes/rbsimple-DE/dos/images/game.svg index 27dd5da99..965ebb914 100644 --- a/themes/rbsimple-DE/dos/images/game.svg +++ b/themes/rbsimple-DE/dos/images/game.svg @@ -1,107 +1,263 @@ + + + + + + + + + + - + inkscape:snap-global="false" + showguides="false" /> + id="metadata5"> image/svg+xml - + + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-247.78748)"> + transform="matrix(0.18439354,0,0,0.18439396,58.49949,102.93963)" + id="layer1-1"> + style="fill:#3b3b3b;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 181.76913,1030.0746 h 11.28375 v 7.3612 H 181.76913 Z M 2.1478797,845.89083 l -1.20499996,1.1075 -0.3875,1.39875 0.19375,201.53002 0.46624996,1.0325 1.03,0.6587 196.1087503,0.1738 1.305,-0.7338 0.65875,-1.225 -0.2725,-179.79497 h -1.39875 v -8.19875 l 1.10625,0.2725 v -2.7975 l -15.095,-13.25 -2.99125,-0.175 -0.9325,0.835 h -16.04625 l -1.39875,1.39875 -3.26375,0.0975 H 52.23163 l 10e-4,-0.9325 -26.5,-0.195 0.0962,-1.03 -23.6837503,-0.17375 0.002,10e-4 z" /> + transform="matrix(1.25,0,0,-1.25,0.56249974,848.4047)" + id="g988"> + style="fill:none;stroke:#424242;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + d="m 0,0 0.149,-161.224 0.373,-0.821 0.821,-0.522 156.897,-0.149 1.044,0.597 0.523,0.969 -0.224,143.841 h -1.119 v 6.566 l 0.895,-0.224 v 2.238 L 147.273,1.865 144.885,2.014 144.139,1.343 H 131.307 L 130.188,0.224 127.577,0.149 H 41.332 v 0.746 l -21.188,0.15 0.074,0.82 -18.95,0.149 -0.97,-0.895 z" /> + transform="matrix(1.25,0,0,-1.25,26.022,846.72595)" + id="g992"> + style="fill:none;stroke:#858586;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + d="m 0,0 v -52.896 l 0.373,-0.671 0.522,-0.224 h 23.128" /> + style="fill:#292929;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="M 6.9978797,1037.5321 H 18.28163 v -7.3675 H 6.9978797 Z" /> + transform="matrix(1.25,0,0,-1.25,176.16713,1046.6958)" + id="g998"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/themes/rbsimple-DE/dos/images/game2.svg b/themes/rbsimple-DE/dos/images/game2.svg deleted file mode 100644 index 0dda35361..000000000 --- a/themes/rbsimple-DE/dos/images/game2.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/themes/rbsimple-DE/epic/colors.xml b/themes/rbsimple-DE/epic/colors.xml new file mode 100644 index 000000000..3447a1eed --- /dev/null +++ b/themes/rbsimple-DE/epic/colors.xml @@ -0,0 +1,18 @@ + + 7 + + + + FFFFFF + + + 777777 + + + 343434 + + + 35C4EE + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/epic/images/console.svg b/themes/rbsimple-DE/epic/images/console.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/epic/images/console.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/epic/images/consolegame.svg b/themes/rbsimple-DE/epic/images/consolegame.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/epic/images/consolegame.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/epic/images/controller.svg b/themes/rbsimple-DE/epic/images/controller.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/epic/images/controller.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/epic/images/logo.svg b/themes/rbsimple-DE/epic/images/logo.svg new file mode 100644 index 000000000..d8a42cff0 --- /dev/null +++ b/themes/rbsimple-DE/epic/images/logo.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/epic/systeminfo.xml b/themes/rbsimple-DE/epic/systeminfo.xml new file mode 100644 index 000000000..9d1a46490 --- /dev/null +++ b/themes/rbsimple-DE/epic/systeminfo.xml @@ -0,0 +1,15 @@ + + 7 + + + + The Epic Games Store is a digital video game storefront + + + launched in 2018. It has native clients for Microsoft + + + Windows and macOS but can also be used on Linux. + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/epic/theme.xml b/themes/rbsimple-DE/epic/theme.xml new file mode 100644 index 000000000..077d05361 --- /dev/null +++ b/themes/rbsimple-DE/epic/theme.xml @@ -0,0 +1,21 @@ + + 7 + ./../theme.xml + ./colors.xml + ./systeminfo.xml + + + + ./images/controller.svg + + + + + + ./images/logo.svg + + + ./images/consolegame.svg + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/j2me/colors.xml b/themes/rbsimple-DE/j2me/colors.xml new file mode 100644 index 000000000..b153880d6 --- /dev/null +++ b/themes/rbsimple-DE/j2me/colors.xml @@ -0,0 +1,18 @@ + + 7 + + + + F58219 + + + 4E7896 + + + EE3537 + + + 1F4394 + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/j2me/images/console.svg b/themes/rbsimple-DE/j2me/images/console.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/j2me/images/console.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/j2me/images/consolegame.svg b/themes/rbsimple-DE/j2me/images/consolegame.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/j2me/images/consolegame.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/j2me/images/controller.svg b/themes/rbsimple-DE/j2me/images/controller.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/j2me/images/controller.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/j2me/images/logo.svg b/themes/rbsimple-DE/j2me/images/logo.svg new file mode 100644 index 000000000..fd47b22eb --- /dev/null +++ b/themes/rbsimple-DE/j2me/images/logo.svg @@ -0,0 +1,131 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/j2me/systeminfo.xml b/themes/rbsimple-DE/j2me/systeminfo.xml new file mode 100644 index 000000000..2c702b512 --- /dev/null +++ b/themes/rbsimple-DE/j2me/systeminfo.xml @@ -0,0 +1,24 @@ + + 7 + + + + The Java 2 Platform, Micro Edition (J2ME) is a + + + platform for portable code on embedded and + + + mobile devices. + + + It was popular for game development on early + + + mobile phones running Symbian, such as those + + + sold by Nokia, Motorola and Sony Ericsson. + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/j2me/theme.xml b/themes/rbsimple-DE/j2me/theme.xml new file mode 100644 index 000000000..077d05361 --- /dev/null +++ b/themes/rbsimple-DE/j2me/theme.xml @@ -0,0 +1,21 @@ + + 7 + ./../theme.xml + ./colors.xml + ./systeminfo.xml + + + + ./images/controller.svg + + + + + + ./images/logo.svg + + + ./images/consolegame.svg + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/megadrive/images/controller.svg b/themes/rbsimple-DE/megadrive/images/controller.svg index 93bf50f49..b51afe99f 100644 --- a/themes/rbsimple-DE/megadrive/images/controller.svg +++ b/themes/rbsimple-DE/megadrive/images/controller.svg @@ -13,7 +13,7 @@ xml:space="preserve" version="1.1" id="svg2" - inkscape:version="0.48.4 r9939" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="controller.svg">image/svg+xml \ No newline at end of file + id="g6184" + transform="rotate(-0.62514897,96.132474,208.54153)"> \ No newline at end of file diff --git a/themes/rbsimple-DE/pc/images/console.svg b/themes/rbsimple-DE/pc/images/console.svg index a96aee5f6..c3b528830 100644 --- a/themes/rbsimple-DE/pc/images/console.svg +++ b/themes/rbsimple-DE/pc/images/console.svg @@ -1,170 +1,2051 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/pc/images/consolegame.svg b/themes/rbsimple-DE/pc/images/consolegame.svg index c9c949c33..b6d02a161 100644 --- a/themes/rbsimple-DE/pc/images/consolegame.svg +++ b/themes/rbsimple-DE/pc/images/consolegame.svg @@ -1,314 +1,2226 @@ + + + + + + + + + + + image/svg+xml + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file + d="m 113.86288,856.71208 h 28.8325 v 54.09 h -28.8325 z m -61.57,-11.055 v 67.1275 l 1.94375,1.49625 h 103.18625 l 1.71,-1.885 v -66.735 H 52.29663 l -0.004,-0.004 z" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/pc/images/controller.svg b/themes/rbsimple-DE/pc/images/controller.svg index 205361d74..9a1d17455 100644 --- a/themes/rbsimple-DE/pc/images/controller.svg +++ b/themes/rbsimple-DE/pc/images/controller.svg @@ -1,120 +1,1292 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +image/svg+xml + + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/pc/images/game.svg b/themes/rbsimple-DE/pc/images/game.svg index 27dd5da99..965ebb914 100644 --- a/themes/rbsimple-DE/pc/images/game.svg +++ b/themes/rbsimple-DE/pc/images/game.svg @@ -1,107 +1,263 @@ + + + + + + + + + + - + inkscape:snap-global="false" + showguides="false" /> + id="metadata5"> image/svg+xml - + + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-247.78748)"> + transform="matrix(0.18439354,0,0,0.18439396,58.49949,102.93963)" + id="layer1-1"> + style="fill:#3b3b3b;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 181.76913,1030.0746 h 11.28375 v 7.3612 H 181.76913 Z M 2.1478797,845.89083 l -1.20499996,1.1075 -0.3875,1.39875 0.19375,201.53002 0.46624996,1.0325 1.03,0.6587 196.1087503,0.1738 1.305,-0.7338 0.65875,-1.225 -0.2725,-179.79497 h -1.39875 v -8.19875 l 1.10625,0.2725 v -2.7975 l -15.095,-13.25 -2.99125,-0.175 -0.9325,0.835 h -16.04625 l -1.39875,1.39875 -3.26375,0.0975 H 52.23163 l 10e-4,-0.9325 -26.5,-0.195 0.0962,-1.03 -23.6837503,-0.17375 0.002,10e-4 z" /> + transform="matrix(1.25,0,0,-1.25,0.56249974,848.4047)" + id="g988"> + style="fill:none;stroke:#424242;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + d="m 0,0 0.149,-161.224 0.373,-0.821 0.821,-0.522 156.897,-0.149 1.044,0.597 0.523,0.969 -0.224,143.841 h -1.119 v 6.566 l 0.895,-0.224 v 2.238 L 147.273,1.865 144.885,2.014 144.139,1.343 H 131.307 L 130.188,0.224 127.577,0.149 H 41.332 v 0.746 l -21.188,0.15 0.074,0.82 -18.95,0.149 -0.97,-0.895 z" /> + transform="matrix(1.25,0,0,-1.25,26.022,846.72595)" + id="g992"> + style="fill:none;stroke:#858586;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + d="m 0,0 v -52.896 l 0.373,-0.671 0.522,-0.224 h 23.128" /> + style="fill:#292929;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="M 6.9978797,1037.5321 H 18.28163 v -7.3675 H 6.9978797 Z" /> + transform="matrix(1.25,0,0,-1.25,176.16713,1046.6958)" + id="g998"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/themes/rbsimple-DE/pc/images/game2.svg b/themes/rbsimple-DE/pc/images/game2.svg deleted file mode 100644 index 0dda35361..000000000 --- a/themes/rbsimple-DE/pc/images/game2.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/themes/rbsimple-DE/residualvm/images/console.svg b/themes/rbsimple-DE/residualvm/images/console.svg index 345a518f0..c3b528830 100644 --- a/themes/rbsimple-DE/residualvm/images/console.svg +++ b/themes/rbsimple-DE/residualvm/images/console.svg @@ -1,3 +1,2051 @@ - - + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/residualvm/images/consolegame.svg b/themes/rbsimple-DE/residualvm/images/consolegame.svg index 345a518f0..be8b158df 100644 --- a/themes/rbsimple-DE/residualvm/images/consolegame.svg +++ b/themes/rbsimple-DE/residualvm/images/consolegame.svg @@ -1,3 +1,2345 @@ - - + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/residualvm/images/controller.svg b/themes/rbsimple-DE/residualvm/images/controller.svg index 345a518f0..6b24ff32c 100644 --- a/themes/rbsimple-DE/residualvm/images/controller.svg +++ b/themes/rbsimple-DE/residualvm/images/controller.svg @@ -1,3 +1,1295 @@ - - - + + + +image/svg+xml + + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/residualvm/images/game.svg b/themes/rbsimple-DE/residualvm/images/game.svg new file mode 100644 index 000000000..ff213643b --- /dev/null +++ b/themes/rbsimple-DE/residualvm/images/game.svg @@ -0,0 +1,375 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/scummvm/images/console.svg b/themes/rbsimple-DE/scummvm/images/console.svg index c2a6b940a..c3b528830 100644 --- a/themes/rbsimple-DE/scummvm/images/console.svg +++ b/themes/rbsimple-DE/scummvm/images/console.svg @@ -1,271 +1,2051 @@ + + image/svg+xml \ No newline at end of file + id="svg8" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="console.svg"> + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/scummvm/images/consolegame.svg b/themes/rbsimple-DE/scummvm/images/consolegame.svg index 77ab01cd7..3ded0f33e 100644 --- a/themes/rbsimple-DE/scummvm/images/consolegame.svg +++ b/themes/rbsimple-DE/scummvm/images/consolegame.svg @@ -1,457 +1,2220 @@ + + + + + + + + + + + + + + image/svg+xml + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 0,0 c -0.281,-0.058 -0.561,-0.116 -0.842,-0.171 -0.323,-0.063 -0.323,-0.062 -0.323,-0.395 -10e-4,-0.245 0.059,-0.503 -0.216,-0.667 -0.076,-0.046 -0.018,-0.166 -0.031,-0.25 -0.018,-0.113 0.059,-0.254 -0.047,-0.336 -0.196,-0.152 -0.219,-0.346 -0.208,-0.57 0.014,-0.282 -0.012,-0.566 0.009,-0.847 0.018,-0.243 -0.048,-0.414 -0.257,-0.551 -0.112,-0.074 -0.205,-0.132 -0.344,-0.123 -0.205,0.01 -0.411,-0.003 -0.617,0.004 -0.098,0.003 -0.132,-0.029 -0.144,-0.127 -0.003,-0.029 -0.007,-0.059 -0.011,-0.089 -0.055,-0.473 -0.114,-0.945 -0.178,-1.417 -0.111,-0.812 -0.226,-1.622 -0.339,-2.433 -0.009,-0.027 -0.023,-0.053 -0.028,-0.08 0,-0.001 -10e-4,-0.002 -10e-4,-0.004 -0.101,-0.742 -0.201,-1.483 -0.302,-2.224 -0.011,-0.077 0.013,-0.182 -0.105,-0.191 -0.093,-0.008 -0.107,0.088 -0.141,0.147 -0.335,0.597 -0.669,1.195 -0.997,1.796 -0.064,0.117 -0.105,0.128 -0.209,0.038 -0.366,-0.32 -0.741,-0.631 -1.115,-0.941 -0.059,-0.049 -0.102,-0.094 -0.079,-0.178 0.244,-0.865 0.256,-1.751 0.241,-2.64 -0.002,-0.079 0.015,-0.148 0.056,-0.217 0.254,-0.422 0.504,-0.846 0.753,-1.271 0.042,-0.072 0.089,-0.082 0.163,-0.053 0.553,0.206 1.105,0.41 1.658,0.613 0.068,0.024 0.101,0.058 0.1,0.133 -0.003,0.168 0,0.337 10e-4,0.506 10e-4,0.322 0.437,0.768 0.763,0.732 0.404,-0.043 0.728,0.068 0.999,0.36 0.045,0.049 0.102,0.087 0.157,0.123 0.075,0.049 0.106,0.119 0.121,0.204 0.099,0.59 0.198,1.179 0.302,1.768 0.017,0.095 0,0.13 -0.102,0.127 -0.215,-0.006 -0.432,0.007 -0.647,-0.005 -0.131,-0.006 -0.161,0.038 -0.163,0.164 -0.007,0.375 0.042,0.748 -10e-4,1.122 0.002,0.241 0.008,0.483 0.003,0.724 -0.003,0.096 0.018,0.175 0.099,0.225 0.247,0.148 0.201,0.381 0.164,0.599 -0.023,0.132 0.003,0.181 0.137,0.179 0.302,-0.003 0.606,0.002 0.909,-0.003 0.088,-10e-4 0.129,0.01 0.147,0.116 0.009,0.056 0.018,0.112 0.028,0.168 0.007,0.041 0.014,0.085 0.022,0.131 0.011,0.069 0.024,0.144 0.037,0.222 0.009,0.054 0.018,0.108 0.027,0.163 0.007,0.039 0.014,0.078 0.02,0.118 0.003,0.018 0.006,0.038 0.009,0.057 0.132,0.782 0.268,1.564 0.401,2.347 0.126,0.74 0.249,1.481 0.373,2.221 0.007,0.043 0.015,0.086 0.021,0.129 0.004,0.02 0.007,0.04 0.01,0.059 0.006,0.035 0.012,0.07 0.018,0.105 0.006,0.031 0.01,0.062 0.015,0.092 C 0.36,-0.024 0.271,0.056 0,0 m -5.361,-8.101 -0.163,0.254 c -0.19,0.341 -0.38,0.681 -0.57,1.022 -0.62,1.107 -1.253,2.209 -1.856,3.326 -0.15,0.279 -0.312,0.428 -0.632,0.362 -0.085,-0.018 -0.199,0.044 -0.25,-0.065 -0.094,-0.205 -0.258,-0.224 -0.452,-0.21 -0.159,0.012 -0.319,-0.004 -0.478,0.005 -0.099,0.007 -0.118,-0.03 -0.116,-0.12 0.005,-0.339 10e-4,-0.677 0.005,-1.015 10e-4,-0.098 -0.025,-0.135 -0.131,-0.132 -0.241,0.009 -0.482,-0.003 -0.723,0.006 -0.136,0.004 -0.125,-0.032 -0.067,-0.129 0.383,-0.635 0.763,-1.272 1.139,-1.912 0.054,-0.093 0.12,-0.138 0.225,-0.155 0.943,-0.154 1.742,-0.554 2.307,-1.353 0.178,-0.303 0.377,-0.596 0.469,-0.94 0.033,-0.121 0.071,-0.134 0.17,-0.049 0.342,0.292 0.686,0.582 1.039,0.86 0.11,0.087 0.141,0.161 0.084,0.245 m 3.576,-3.613 c -0.247,-0.281 -0.564,-0.345 -0.916,-0.301 -0.12,0.015 -0.208,-0.042 -0.311,-0.096 -0.305,-0.159 -0.389,-0.403 -0.342,-0.722 0.015,-0.106 -0.002,-0.216 0.005,-0.324 0.008,-0.11 -0.035,-0.16 -0.14,-0.198 -0.569,-0.204 -1.133,-0.42 -1.701,-0.627 -0.086,-0.032 -0.1,-0.057 -0.049,-0.137 0.148,-0.239 0.286,-0.486 0.434,-0.726 l 0.02,-0.041 0.032,-0.062 v -10e-4 l 0.403,-0.798 c 0,0 0.11,-0.26 0.343,-0.208 0.234,0.052 1.532,0.318 1.532,0.318 0,0 0.238,-0.007 0.285,0.403 0.041,0.359 0.06,0.55 0.064,0.591 10e-4,0.006 10e-4,0.01 10e-4,0.01 0.056,0.311 0.108,0.623 0.162,0.937 0.121,0.695 0.24,1.39 0.368,2.131 -0.087,-0.068 -0.148,-0.101 -0.19,-0.149 m -6.538,8.866 c -0.17,0.297 -0.33,0.6 -0.507,0.894 -0.098,0.162 -0.26,0.238 -0.449,0.2 -0.872,-0.177 -1.744,-0.36 -2.615,-0.543 -0.231,-0.049 -0.281,-0.17 -0.158,-0.377 0.278,-0.472 0.574,-0.934 0.832,-1.417 0.157,-0.295 0.33,-0.486 0.625,-0.38 0.187,0 0.31,0.002 0.434,-0.001 0.051,-10e-4 0.087,0.004 0.086,0.072 -0.005,0.298 0.009,0.596 -0.013,0.892 -0.019,0.235 0.014,0.299 0.245,0.299 0.216,0 0.432,10e-4 0.648,0 0.069,-10e-4 0.132,0.005 0.166,0.079 0.075,0.16 0.201,0.21 0.373,0.185 0.091,-0.014 0.185,0.002 0.277,-0.004 0.099,-0.006 0.099,0.026 0.056,0.101 m 6.972,2.046 c -0.01,0.144 -0.007,0.289 -0.001,0.432 0.003,0.079 -0.021,0.094 -0.095,0.078 -0.235,-0.052 -0.472,-0.095 -0.708,-0.146 -0.284,-0.061 -0.396,-0.193 -0.434,-0.478 -0.106,-0.792 -0.213,-1.584 -0.328,-2.375 -0.063,-0.43 -0.071,-0.429 0.362,-0.428 0.098,0 0.195,0 0.293,0 0.192,0.002 0.409,0.217 0.41,0.405 0,0.421 0.001,0.842 0.001,1.263 0,0.057 -0.01,0.114 0.046,0.153 0.191,0.135 0.23,0.327 0.199,0.542 -0.021,0.146 0.022,0.257 0.152,0.335 0.081,0.048 0.109,0.121 0.103,0.219 M -0.824,-6.43 C -1.05,-6.433 -1.276,-6.436 -1.501,-6.427 -1.611,-6.422 -1.634,-6.458 -1.636,-6.563 -1.64,-6.705 -1.561,-6.886 -1.7,-6.981 -1.909,-7.122 -1.922,-7.308 -1.909,-7.523 -1.9,-7.682 -1.906,-7.842 -1.906,-8 v -0.154 c -0.003,-0.261 -0.004,-0.522 -0.01,-0.782 -0.002,-0.081 0.041,-0.092 0.105,-0.091 0.185,0.002 0.369,0.002 0.553,10e-4 0.054,0 0.105,0.002 0.116,0.071 0.053,0.348 0.106,0.695 0.159,1.043 0.082,0.462 0.162,0.926 0.245,1.389 0.015,0.078 -0.012,0.095 -0.086,0.093" /> + + + + + diff --git a/themes/rbsimple-DE/scummvm/images/controller.svg b/themes/rbsimple-DE/scummvm/images/controller.svg index dd52e38b8..6b24ff32c 100644 --- a/themes/rbsimple-DE/scummvm/images/controller.svg +++ b/themes/rbsimple-DE/scummvm/images/controller.svg @@ -1,220 +1,1295 @@ + + image/svg+xml \ No newline at end of file + id="svg2" + sodipodi:docname="controller.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + x="0px" + y="0px" + viewBox="-194 147.4 221.6 488.8978" + enable-background="new -194 147.4 221.6 498.6" + xml:space="preserve" + width="236.37335" + height="521.49103">image/svg+xml + + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/scummvm/images/game.svg b/themes/rbsimple-DE/scummvm/images/game.svg index 7c6fab011..c493d0fd2 100644 --- a/themes/rbsimple-DE/scummvm/images/game.svg +++ b/themes/rbsimple-DE/scummvm/images/game.svg @@ -1,111 +1,250 @@ + + image/svg+xml + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file + d="m 0,0 c -0.281,-0.058 -0.561,-0.116 -0.842,-0.171 -0.323,-0.063 -0.323,-0.062 -0.323,-0.395 -10e-4,-0.245 0.059,-0.503 -0.216,-0.667 -0.076,-0.046 -0.018,-0.166 -0.031,-0.25 -0.018,-0.113 0.059,-0.254 -0.047,-0.336 -0.196,-0.152 -0.219,-0.346 -0.208,-0.57 0.014,-0.282 -0.012,-0.566 0.009,-0.847 0.018,-0.243 -0.048,-0.414 -0.257,-0.551 -0.112,-0.074 -0.205,-0.132 -0.344,-0.123 -0.205,0.01 -0.411,-0.003 -0.617,0.004 -0.098,0.003 -0.132,-0.029 -0.144,-0.127 -0.003,-0.029 -0.007,-0.059 -0.011,-0.089 -0.055,-0.473 -0.114,-0.945 -0.178,-1.417 -0.111,-0.812 -0.226,-1.622 -0.339,-2.433 -0.009,-0.027 -0.023,-0.053 -0.028,-0.08 0,-0.001 -10e-4,-0.002 -10e-4,-0.004 -0.101,-0.742 -0.201,-1.483 -0.302,-2.224 -0.011,-0.077 0.013,-0.182 -0.105,-0.191 -0.093,-0.008 -0.107,0.088 -0.141,0.147 -0.335,0.597 -0.669,1.195 -0.997,1.796 -0.064,0.117 -0.105,0.128 -0.209,0.038 -0.366,-0.32 -0.741,-0.631 -1.115,-0.941 -0.059,-0.049 -0.102,-0.094 -0.079,-0.178 0.244,-0.865 0.256,-1.751 0.241,-2.64 -0.002,-0.079 0.015,-0.148 0.056,-0.217 0.254,-0.422 0.504,-0.846 0.753,-1.271 0.042,-0.072 0.089,-0.082 0.163,-0.053 0.553,0.206 1.105,0.41 1.658,0.613 0.068,0.024 0.101,0.058 0.1,0.133 -0.003,0.168 0,0.337 10e-4,0.506 10e-4,0.322 0.437,0.768 0.763,0.732 0.404,-0.043 0.728,0.068 0.999,0.36 0.045,0.049 0.102,0.087 0.157,0.123 0.075,0.049 0.106,0.119 0.121,0.204 0.099,0.59 0.198,1.179 0.302,1.768 0.017,0.095 0,0.13 -0.102,0.127 -0.215,-0.006 -0.432,0.007 -0.647,-0.005 -0.131,-0.006 -0.161,0.038 -0.163,0.164 -0.007,0.375 0.042,0.748 -10e-4,1.122 0.002,0.241 0.008,0.483 0.003,0.724 -0.003,0.096 0.018,0.175 0.099,0.225 0.247,0.148 0.201,0.381 0.164,0.599 -0.023,0.132 0.003,0.181 0.137,0.179 0.302,-0.003 0.606,0.002 0.909,-0.003 0.088,-10e-4 0.129,0.01 0.147,0.116 0.009,0.056 0.018,0.112 0.028,0.168 0.007,0.041 0.014,0.085 0.022,0.131 0.011,0.069 0.024,0.144 0.037,0.222 0.009,0.054 0.018,0.108 0.027,0.163 0.007,0.039 0.014,0.078 0.02,0.118 0.003,0.018 0.006,0.038 0.009,0.057 0.132,0.782 0.268,1.564 0.401,2.347 0.126,0.74 0.249,1.481 0.373,2.221 0.007,0.043 0.015,0.086 0.021,0.129 0.004,0.02 0.007,0.04 0.01,0.059 0.006,0.035 0.012,0.07 0.018,0.105 0.006,0.031 0.01,0.062 0.015,0.092 C 0.36,-0.024 0.271,0.056 0,0 m -5.361,-8.101 -0.163,0.254 c -0.19,0.341 -0.38,0.681 -0.57,1.022 -0.62,1.107 -1.253,2.209 -1.856,3.326 -0.15,0.279 -0.312,0.428 -0.632,0.362 -0.085,-0.018 -0.199,0.044 -0.25,-0.065 -0.094,-0.205 -0.258,-0.224 -0.452,-0.21 -0.159,0.012 -0.319,-0.004 -0.478,0.005 -0.099,0.007 -0.118,-0.03 -0.116,-0.12 0.005,-0.339 10e-4,-0.677 0.005,-1.015 10e-4,-0.098 -0.025,-0.135 -0.131,-0.132 -0.241,0.009 -0.482,-0.003 -0.723,0.006 -0.136,0.004 -0.125,-0.032 -0.067,-0.129 0.383,-0.635 0.763,-1.272 1.139,-1.912 0.054,-0.093 0.12,-0.138 0.225,-0.155 0.943,-0.154 1.742,-0.554 2.307,-1.353 0.178,-0.303 0.377,-0.596 0.469,-0.94 0.033,-0.121 0.071,-0.134 0.17,-0.049 0.342,0.292 0.686,0.582 1.039,0.86 0.11,0.087 0.141,0.161 0.084,0.245 m 3.576,-3.613 c -0.247,-0.281 -0.564,-0.345 -0.916,-0.301 -0.12,0.015 -0.208,-0.042 -0.311,-0.096 -0.305,-0.159 -0.389,-0.403 -0.342,-0.722 0.015,-0.106 -0.002,-0.216 0.005,-0.324 0.008,-0.11 -0.035,-0.16 -0.14,-0.198 -0.569,-0.204 -1.133,-0.42 -1.701,-0.627 -0.086,-0.032 -0.1,-0.057 -0.049,-0.137 0.148,-0.239 0.286,-0.486 0.434,-0.726 l 0.02,-0.041 0.032,-0.062 v -10e-4 l 0.403,-0.798 c 0,0 0.11,-0.26 0.343,-0.208 0.234,0.052 1.532,0.318 1.532,0.318 0,0 0.238,-0.007 0.285,0.403 0.041,0.359 0.06,0.55 0.064,0.591 10e-4,0.006 10e-4,0.01 10e-4,0.01 0.056,0.311 0.108,0.623 0.162,0.937 0.121,0.695 0.24,1.39 0.368,2.131 -0.087,-0.068 -0.148,-0.101 -0.19,-0.149 m -6.538,8.866 c -0.17,0.297 -0.33,0.6 -0.507,0.894 -0.098,0.162 -0.26,0.238 -0.449,0.2 -0.872,-0.177 -1.744,-0.36 -2.615,-0.543 -0.231,-0.049 -0.281,-0.17 -0.158,-0.377 0.278,-0.472 0.574,-0.934 0.832,-1.417 0.157,-0.295 0.33,-0.486 0.625,-0.38 0.187,0 0.31,0.002 0.434,-0.001 0.051,-10e-4 0.087,0.004 0.086,0.072 -0.005,0.298 0.009,0.596 -0.013,0.892 -0.019,0.235 0.014,0.299 0.245,0.299 0.216,0 0.432,10e-4 0.648,0 0.069,-10e-4 0.132,0.005 0.166,0.079 0.075,0.16 0.201,0.21 0.373,0.185 0.091,-0.014 0.185,0.002 0.277,-0.004 0.099,-0.006 0.099,0.026 0.056,0.101 m 6.972,2.046 c -0.01,0.144 -0.007,0.289 -0.001,0.432 0.003,0.079 -0.021,0.094 -0.095,0.078 -0.235,-0.052 -0.472,-0.095 -0.708,-0.146 -0.284,-0.061 -0.396,-0.193 -0.434,-0.478 -0.106,-0.792 -0.213,-1.584 -0.328,-2.375 -0.063,-0.43 -0.071,-0.429 0.362,-0.428 0.098,0 0.195,0 0.293,0 0.192,0.002 0.409,0.217 0.41,0.405 0,0.421 0.001,0.842 0.001,1.263 0,0.057 -0.01,0.114 0.046,0.153 0.191,0.135 0.23,0.327 0.199,0.542 -0.021,0.146 0.022,0.257 0.152,0.335 0.081,0.048 0.109,0.121 0.103,0.219 M -0.824,-6.43 C -1.05,-6.433 -1.276,-6.436 -1.501,-6.427 -1.611,-6.422 -1.634,-6.458 -1.636,-6.563 -1.64,-6.705 -1.561,-6.886 -1.7,-6.981 -1.909,-7.122 -1.922,-7.308 -1.909,-7.523 -1.9,-7.682 -1.906,-7.842 -1.906,-8 v -0.154 c -0.003,-0.261 -0.004,-0.522 -0.01,-0.782 -0.002,-0.081 0.041,-0.092 0.105,-0.091 0.185,0.002 0.369,0.002 0.553,10e-4 0.054,0 0.105,0.002 0.116,0.071 0.053,0.348 0.106,0.695 0.159,1.043 0.082,0.462 0.162,0.926 0.245,1.389 0.015,0.078 -0.012,0.095 -0.086,0.093" /> + + + + + diff --git a/themes/rbsimple-DE/sega32x/images/controller.svg b/themes/rbsimple-DE/sega32x/images/controller.svg index 8e66b2744..3baa95304 100644 --- a/themes/rbsimple-DE/sega32x/images/controller.svg +++ b/themes/rbsimple-DE/sega32x/images/controller.svg @@ -5,15 +5,38 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 173.7225 329.69626" height="329.69626" width="173.7225" xml:space="preserve" version="1.1" - id="svg2">image/svg+xml \ No newline at end of file + d="m 60.0079,29.299 0.96,0 0,-0.94 -0.96,0 0,0.94 z" /> \ No newline at end of file diff --git a/themes/rbsimple-DE/switch/systeminfo.xml b/themes/rbsimple-DE/switch/systeminfo.xml index 5cc57bc49..8ca5802be 100644 --- a/themes/rbsimple-DE/switch/systeminfo.xml +++ b/themes/rbsimple-DE/switch/systeminfo.xml @@ -9,7 +9,7 @@ Year of Release : 2017 - Units sold : 84 million + Units sold : 89 million Best-selling game : Mario Kart 8 Deluxe @@ -24,7 +24,10 @@ Video : 256 Maxwell-based CUDA cores @ 307.2–768 MHz - Screen : 6.2-inch, 1280 × 720 LCD (237 ppi) + Screen (original version) : 6.2-inch, 1280 × 720 LCD (237 ppi) + + + Screen (OLED version) : 7-inch, 1280 × 720 OLED (209.8 ppi) \ No newline at end of file diff --git a/themes/rbsimple-DE/symbian/colors.xml b/themes/rbsimple-DE/symbian/colors.xml new file mode 100644 index 000000000..19d64d83e --- /dev/null +++ b/themes/rbsimple-DE/symbian/colors.xml @@ -0,0 +1,18 @@ + + 7 + + + + 0082B5 + + + FBAB18 + + + 1F4394 + + + EE3537 + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/symbian/images/console.svg b/themes/rbsimple-DE/symbian/images/console.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/symbian/images/console.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/symbian/images/consolegame.svg b/themes/rbsimple-DE/symbian/images/consolegame.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/symbian/images/consolegame.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/symbian/images/controller.svg b/themes/rbsimple-DE/symbian/images/controller.svg new file mode 100644 index 000000000..345a518f0 --- /dev/null +++ b/themes/rbsimple-DE/symbian/images/controller.svg @@ -0,0 +1,3 @@ + + + diff --git a/themes/rbsimple-DE/symbian/images/logo.svg b/themes/rbsimple-DE/symbian/images/logo.svg new file mode 100644 index 000000000..d05fcab79 --- /dev/null +++ b/themes/rbsimple-DE/symbian/images/logo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/symbian/systeminfo.xml b/themes/rbsimple-DE/symbian/systeminfo.xml new file mode 100644 index 000000000..07d96f17a --- /dev/null +++ b/themes/rbsimple-DE/symbian/systeminfo.xml @@ -0,0 +1,24 @@ + + 7 + + + + The Symbian operating system was the dominant + + + platform for early mobile devices, including + + + smartphones of the era. + + + Due to the popularity of Symbian, there are many + + + games available, primarily developed using + + + Java 2 Platform, Micro Edition (J2ME). + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/symbian/theme.xml b/themes/rbsimple-DE/symbian/theme.xml new file mode 100644 index 000000000..077d05361 --- /dev/null +++ b/themes/rbsimple-DE/symbian/theme.xml @@ -0,0 +1,21 @@ + + 7 + ./../theme.xml + ./colors.xml + ./systeminfo.xml + + + + ./images/controller.svg + + + + + + ./images/logo.svg + + + ./images/consolegame.svg + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/vic20/colors.xml b/themes/rbsimple-DE/vic20/colors.xml new file mode 100644 index 000000000..f189a3d2a --- /dev/null +++ b/themes/rbsimple-DE/vic20/colors.xml @@ -0,0 +1,18 @@ + + 7 + + + + 896841 + + + D3D3C9 + + + FFCD1C + + + DC2770 + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/vic20/images/console.svg b/themes/rbsimple-DE/vic20/images/console.svg new file mode 100644 index 000000000..aef8b914a --- /dev/null +++ b/themes/rbsimple-DE/vic20/images/console.svg @@ -0,0 +1,2999 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/vic20/images/consolegame.svg b/themes/rbsimple-DE/vic20/images/consolegame.svg new file mode 100644 index 000000000..faf7f8863 --- /dev/null +++ b/themes/rbsimple-DE/vic20/images/consolegame.svg @@ -0,0 +1,4067 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/themes/rbsimple-DE/vic20/images/controller.svg b/themes/rbsimple-DE/vic20/images/controller.svg new file mode 100644 index 000000000..4ec397746 --- /dev/null +++ b/themes/rbsimple-DE/vic20/images/controller.svg @@ -0,0 +1,313 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/vic20/images/game.svg b/themes/rbsimple-DE/vic20/images/game.svg new file mode 100644 index 000000000..936a4a77c --- /dev/null +++ b/themes/rbsimple-DE/vic20/images/game.svg @@ -0,0 +1,1195 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/themes/rbsimple-DE/vic20/images/logo.svg b/themes/rbsimple-DE/vic20/images/logo.svg new file mode 100644 index 000000000..f3d23e2c3 --- /dev/null +++ b/themes/rbsimple-DE/vic20/images/logo.svg @@ -0,0 +1,217 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/vic20/systeminfo.xml b/themes/rbsimple-DE/vic20/systeminfo.xml new file mode 100644 index 000000000..02d27aacd --- /dev/null +++ b/themes/rbsimple-DE/vic20/systeminfo.xml @@ -0,0 +1,33 @@ + + 7 + + + + Manufacturer : Commodore Business Machines + + + Year of Release : 1980 + + + OS : Commodore KERNAL / Commodore BASIC 2.0 + + + CPU : MOS Technology 6502 @ 1.108 MHz (PAL version) + + + RAM : 5KB RAM + + + ROM : 20KB + + + GPU : MOS Technology VIC + + + Sound : 3 x Pulse Wave Generators + White Noise + + + Resolution : 176×184 (16 colours) + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/vic20/theme.xml b/themes/rbsimple-DE/vic20/theme.xml new file mode 100644 index 000000000..077d05361 --- /dev/null +++ b/themes/rbsimple-DE/vic20/theme.xml @@ -0,0 +1,21 @@ + + 7 + ./../theme.xml + ./colors.xml + ./systeminfo.xml + + + + ./images/controller.svg + + + + + + ./images/logo.svg + + + ./images/consolegame.svg + + + \ No newline at end of file diff --git a/themes/rbsimple-DE/xbox360/images/controller.svg b/themes/rbsimple-DE/xbox360/images/controller.svg index 345a518f0..54751023a 100644 --- a/themes/rbsimple-DE/xbox360/images/controller.svg +++ b/themes/rbsimple-DE/xbox360/images/controller.svg @@ -1,3 +1,683 @@ - - + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/rbsimple-DE/xbox360/systeminfo.xml b/themes/rbsimple-DE/xbox360/systeminfo.xml index b52e07c6d..1a4abd64e 100644 --- a/themes/rbsimple-DE/xbox360/systeminfo.xml +++ b/themes/rbsimple-DE/xbox360/systeminfo.xml @@ -3,7 +3,31 @@ - Microsoft Xbox 360 + Manufacturer : Microsoft + + + Year of Release : 2005 + + + Units sold : 84 million + + + CPU : 3.2 GHz PowerPC Tri-Core Xenon + + + RAM : 512MB unified GDDR3 @ 700 MHz + 10MB eDRAM cache + + + GPU : 500 MHz ATI/AMD Xenos + + + Resolution : 480i, 480p, 720p, 1080i, 1080p + + + Sound : Stereo LPCM, Dolby Digital 5.1 + + + Media : DVD, Compact Disc \ No newline at end of file