From 0f84f4b13a3d354a663125a5cb36b05abd90eee6 Mon Sep 17 00:00:00 2001 From: fanlusky <1730976608@qq.com> Date: Fri, 21 Aug 2026 22:06:48 +0800 Subject: [PATCH] Optimize the tray icon of the language bar and the Japanese icon of the toolbar. --- image/jp-dark.ico | Bin 0 -> 43006 bytes image/jp-light.ico | Bin 0 -> 43006 bytes src/Header/Define.h | 2 + src/Header/resource.h | 2 + src/IME/MetasequoiaIME.rc | 2 + src/LanguageBar/LanguageBar.cpp | 129 ++++---------------------------- 6 files changed, 20 insertions(+), 115 deletions(-) create mode 100644 image/jp-dark.ico create mode 100644 image/jp-light.ico diff --git a/image/jp-dark.ico b/image/jp-dark.ico new file mode 100644 index 0000000000000000000000000000000000000000..c1819eec37aa7001c2e6afbdab25bccc7436ecd1 GIT binary patch literal 43006 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 -#include -#include -#include -#include namespace { @@ -46,108 +41,16 @@ DWORD ResolveThemeIconIndex(DWORD lightIconIndex) { return static_cast(IME_MODE_ON_DARK_ICON_INDEX); } + if (lightIconIndex == static_cast(IME_MODE_ON_JP_ICON_INDEX)) + { + return static_cast(IME_MODE_ON_JP_DARK_ICON_INDEX); + } if (lightIconIndex == static_cast(IME_MODE_OFF_ICON_INDEX)) { return static_cast(IME_MODE_OFF_DARK_ICON_INDEX); } return lightIconIndex; } - -HICON CreateJapaneseModeIcon(int size, bool darkMode) -{ - if (size <= 0) - { - size = 16; - } - - BITMAPINFO info{}; - info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - info.bmiHeader.biWidth = size; - info.bmiHeader.biHeight = -size; - info.bmiHeader.biPlanes = 1; - info.bmiHeader.biBitCount = 32; - info.bmiHeader.biCompression = BI_RGB; - - void *bits = nullptr; - HDC screen = GetDC(nullptr); - HDC dc = CreateCompatibleDC(screen); - HBITMAP color = CreateDIBSection(dc, &info, DIB_RGB_COLORS, &bits, nullptr, 0); - if (!dc || !color || !bits) - { - if (color) - { - DeleteObject(color); - } - if (dc) - { - DeleteDC(dc); - } - if (screen) - { - ReleaseDC(nullptr, screen); - } - return nullptr; - } - - std::memset(bits, 0, static_cast(size) * static_cast(size) * 4); - const std::uint32_t pixel = darkMode ? 0xFFFFFFFFu : 0xFF1A1A1Au; - auto *pixels = static_cast(bits); - const auto map = [size](double value) { - const int mapped = static_cast(std::lround(value * size / 24.0)); - return (std::max)(0, (std::min)(size, mapped)); - }; - const auto fill = [&](double left, double top, double right, double bottom) { - const int x0 = map(left); - const int y0 = map(top); - const int x1 = map(right); - const int y1 = map(bottom); - for (int y = y0; y < y1; ++y) - { - for (int x = x0; x < x1; ++x) - { - pixels[static_cast(y) * static_cast(size) + static_cast(x)] = pixel; - } - } - }; - fill(5.0, 4.4, 19.0, 5.9); - fill(5.0, 18.1, 19.0, 19.6); - fill(5.0, 4.4, 6.5, 19.6); - fill(17.5, 4.4, 19.0, 19.6); - fill(6.5, 11.25, 17.5, 12.75); - - const int maskStride = ((size + 31) / 32) * 4; - std::vector maskBits(static_cast(maskStride) * static_cast(size), 0xFF); - for (int y = 0; y < size; ++y) - { - for (int x = 0; x < size; ++x) - { - if (pixels[static_cast(y) * static_cast(size) + static_cast(x)] == 0) - { - continue; - } - const int bit = 7 - (x % 8); - const int maskY = size - 1 - y; - maskBits[static_cast(maskY) * static_cast(maskStride) + static_cast(x / 8)] &= - static_cast(~(1u << bit)); - } - } - HBITMAP mask = CreateBitmap(size, size, 1, 1, maskBits.data()); - ICONINFO iconInfo{}; - iconInfo.fIcon = TRUE; - iconInfo.hbmMask = mask; - iconInfo.hbmColor = color; - HICON icon = mask ? CreateIconIndirect(&iconInfo) : nullptr; - - if (mask) - { - DeleteObject(mask); - } - SelectObject(dc, GetStockObject(NULL_BRUSH)); - DeleteObject(color); - DeleteDC(dc); - ReleaseDC(nullptr, screen); - return icon; -} } // namespace //+--------------------------------------------------------------------------- @@ -618,23 +521,19 @@ STDAPI CLangBarItemButton::GetIcon(_Out_ HICON *phIcon) desiredSize = 24; } - const DWORD iconIndex = - ResolveThemeIconIndex((isOn && !(status & TF_LBI_STATUS_DISABLED)) ? _onIconIndex : _offIconIndex); + DWORD lightIconIndex = (isOn && !(status & TF_LBI_STATUS_DISABLED)) ? _onIconIndex : _offIconIndex; + if (isOn && !(status & TF_LBI_STATUS_DISABLED) && + _onIconIndex == static_cast(IME_MODE_ON_ICON_INDEX) && + Global::JapaneseInputModeEnabled.load(std::memory_order_relaxed)) + { + lightIconIndex = static_cast(IME_MODE_ON_JP_ICON_INDEX); + } + const DWORD iconIndex = ResolveThemeIconIndex(lightIconIndex); if (Global::dllInstanceHandle) { - const bool japaneseOn = isOn && !(status & TF_LBI_STATUS_DISABLED) && - _onIconIndex == static_cast(IME_MODE_ON_ICON_INDEX) && - Global::JapaneseInputModeEnabled.load(std::memory_order_relaxed); - if (japaneseOn) - { - *phIcon = CreateJapaneseModeIcon(desiredSize, IsSystemDarkMode()); - } - else - { - *phIcon = reinterpret_cast(LoadImage(Global::dllInstanceHandle, MAKEINTRESOURCE(iconIndex), IMAGE_ICON, - desiredSize, desiredSize, 0)); - } + *phIcon = reinterpret_cast(LoadImage(Global::dllInstanceHandle, MAKEINTRESOURCE(iconIndex), IMAGE_ICON, + desiredSize, desiredSize, 0)); } return (*phIcon != NULL) ? S_OK : E_FAIL;