mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-26 19:33:31 +00:00
[MSPAINT] Support grayscale palette (#9067)
Preparation for complete monochrome support. JIRA issue: CORE-15990 - Add IDM_COLORSGRAYSCALE and IDM_COLORSMONOCHROME menu items. - Add PAL_GRAYSCALE and PAL_MONOCHROME palette modes. - Add PaletteModel::CreateDitherBrush helper function to create a dithered brush. - Use the dithered brush on PAL_MONOCHROME in drawing the palette window.
This commit is contained in:
@@ -93,6 +93,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Нови палитри", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Стари палитри", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Помощ"
|
||||
BEGIN
|
||||
|
||||
@@ -93,6 +93,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modern palette", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Old palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Nápověda"
|
||||
BEGIN
|
||||
|
||||
@@ -92,6 +92,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Moderne Palette", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Alte Palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Hilfe"
|
||||
BEGIN
|
||||
|
||||
@@ -92,6 +92,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modern palette", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Old palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Help"
|
||||
BEGIN
|
||||
|
||||
@@ -93,6 +93,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modern palette", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Old palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Help"
|
||||
BEGIN
|
||||
|
||||
@@ -95,6 +95,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Paleta moderna", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Paleta antigua", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "Ay&uda"
|
||||
BEGIN
|
||||
|
||||
@@ -92,6 +92,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modernne palett", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Vana palett", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Abi"
|
||||
BEGIN
|
||||
|
||||
@@ -93,6 +93,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Paleta modernua", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Paleta zaharra", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Laguntza"
|
||||
BEGIN
|
||||
|
||||
@@ -93,6 +93,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Palette moderne", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Palette ancienne", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Aide"
|
||||
BEGIN
|
||||
|
||||
@@ -92,6 +92,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modern palette", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Old palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&עזרה"
|
||||
BEGIN
|
||||
|
||||
@@ -92,6 +92,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Moderna paleta", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Stara paleta", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Pomoć"
|
||||
BEGIN
|
||||
|
||||
@@ -93,6 +93,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modern paletta", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Régi paletta", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Súgó"
|
||||
BEGIN
|
||||
|
||||
@@ -92,6 +92,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Warna Modern", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Warna Tua", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Bantuan"
|
||||
BEGIN
|
||||
|
||||
@@ -94,6 +94,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Tavolozza moderna", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Old palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Aiuto"
|
||||
BEGIN
|
||||
|
||||
@@ -94,6 +94,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "モダンなパレット", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "古いパレット", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "ヘルプ(&H)"
|
||||
BEGIN
|
||||
|
||||
@@ -92,6 +92,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modern palette", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Old palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Helpen"
|
||||
BEGIN
|
||||
|
||||
@@ -92,6 +92,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modern palette", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Old palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Hjelp"
|
||||
BEGIN
|
||||
|
||||
@@ -95,6 +95,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Nowoczesna paleta", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Stara paleta", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "Pomo&c"
|
||||
BEGIN
|
||||
|
||||
@@ -93,6 +93,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modern palette", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Old palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Ajuda"
|
||||
BEGIN
|
||||
|
||||
@@ -93,6 +93,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Palete moderna", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Palete antiga", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Ajuda"
|
||||
BEGIN
|
||||
|
||||
@@ -94,6 +94,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Paletă &modernă", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Paletă &veche", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Ajutor"
|
||||
BEGIN
|
||||
|
||||
@@ -96,6 +96,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Современная", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Старая", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Справка"
|
||||
BEGIN
|
||||
|
||||
@@ -92,6 +92,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modern palette", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Old palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Pomocník"
|
||||
BEGIN
|
||||
|
||||
@@ -92,6 +92,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Paleta moderne", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Paleta te vjetra", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Ndihmë"
|
||||
BEGIN
|
||||
|
||||
@@ -93,6 +93,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modern palette", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Old palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Hjälp"
|
||||
BEGIN
|
||||
|
||||
@@ -94,6 +94,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Çağdaş Renk Paleti", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "&Eski Renk Paleti", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Yardım"
|
||||
BEGIN
|
||||
|
||||
@@ -94,6 +94,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Modern palette", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Old palette", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Довідка"
|
||||
BEGIN
|
||||
|
||||
@@ -92,6 +92,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Bảng màu hiện tại", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "Bảng màu cũ", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "&Trợ giúp"
|
||||
BEGIN
|
||||
|
||||
@@ -95,6 +95,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "现代调色板", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "传统调色板", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "帮助(&H)"
|
||||
BEGIN
|
||||
|
||||
@@ -93,6 +93,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "新調色板", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "舊調色板", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "説明(&H)"
|
||||
BEGIN
|
||||
|
||||
@@ -93,6 +93,8 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "新調色板", IDM_COLORSMODERNPALETTE
|
||||
MENUITEM "舊調色板", IDM_COLORSOLDPALETTE
|
||||
MENUITEM "Grayscale palette", IDM_COLORSGRAYSCALE
|
||||
MENUITEM "Monochrome palette", IDM_COLORSMONOCHROME
|
||||
END
|
||||
POPUP "說明(&H)"
|
||||
BEGIN
|
||||
|
||||
@@ -761,6 +761,8 @@ LRESULT CMainWindow::OnInitMenuPopup(UINT nMsg, WPARAM wParam, LPARAM lParam, BO
|
||||
//
|
||||
CheckMenuItem(menu, IDM_COLORSMODERNPALETTE, CHECKED_IF(paletteModel.SelectedPalette() == PAL_MODERN));
|
||||
CheckMenuItem(menu, IDM_COLORSOLDPALETTE, CHECKED_IF(paletteModel.SelectedPalette() == PAL_OLDTYPE));
|
||||
CheckMenuItem(menu, IDM_COLORSGRAYSCALE, CHECKED_IF(paletteModel.SelectedPalette() == PAL_GRAYSCALE));
|
||||
CheckMenuItem(menu, IDM_COLORSMONOCHROME, CHECKED_IF(paletteModel.SelectedPalette() == PAL_MONOCHROME));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1130,6 +1132,12 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
|
||||
case IDM_COLORSOLDPALETTE:
|
||||
paletteModel.SelectPalette(PAL_OLDTYPE);
|
||||
break;
|
||||
case IDM_COLORSGRAYSCALE:
|
||||
paletteModel.SelectPalette(PAL_GRAYSCALE);
|
||||
break;
|
||||
case IDM_COLORSMONOCHROME:
|
||||
paletteModel.SelectPalette(PAL_MONOCHROME);
|
||||
break;
|
||||
case IDM_IMAGEINVERTCOLORS:
|
||||
{
|
||||
if (selectionModel.m_bShow)
|
||||
|
||||
@@ -31,15 +31,12 @@ CPaletteWindow::~CPaletteWindow()
|
||||
::DeleteObject(m_hbmCached);
|
||||
}
|
||||
|
||||
static VOID drawColorBox(HDC hDC, LPCRECT prc, COLORREF rgbColor, UINT nBorder)
|
||||
static VOID drawColorBox(HDC hDC, LPCRECT prc, HBRUSH hbr, UINT nBorder)
|
||||
{
|
||||
RECT rc = *prc;
|
||||
::FillRect(hDC, &rc, (HBRUSH)(COLOR_3DFACE + 1));
|
||||
::DrawEdge(hDC, &rc, nBorder, BF_RECT | BF_ADJUST);
|
||||
|
||||
HBRUSH hbr = ::CreateSolidBrush(rgbColor);
|
||||
::FillRect(hDC, &rc, hbr);
|
||||
::DeleteObject(hbr);
|
||||
}
|
||||
|
||||
static VOID getColorBoxRect(LPRECT prc, const RECT& rcClient, INT iColor)
|
||||
@@ -112,20 +109,26 @@ LRESULT CPaletteWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& b
|
||||
rc.top = Y_MARGIN + (CXY_BIGBOX * 5 / 8) - (CXY_SELECTEDBOX / 2);
|
||||
rc.right = rc.left + CXY_SELECTEDBOX;
|
||||
rc.bottom = rc.top + CXY_SELECTEDBOX;
|
||||
drawColorBox(hMemDC, &rc, paletteModel.GetBgColor(), BDR_RAISEDINNER);
|
||||
HBRUSH hbrBg = paletteModel.CreateBgBrush();
|
||||
drawColorBox(hMemDC, &rc, hbrBg, BDR_RAISEDINNER);
|
||||
DeleteObject(hbrBg);
|
||||
|
||||
/* Draw the black box (overlapping the white box), at 3/8 position */
|
||||
rc.left = X_MARGIN + (CXY_BIGBOX * 3 / 8) - (CXY_SELECTEDBOX / 2);
|
||||
rc.top = Y_MARGIN + (CXY_BIGBOX * 3 / 8) - (CXY_SELECTEDBOX / 2);
|
||||
rc.right = rc.left + CXY_SELECTEDBOX;
|
||||
rc.bottom = rc.top + CXY_SELECTEDBOX;
|
||||
drawColorBox(hMemDC, &rc, paletteModel.GetFgColor(), BDR_RAISEDINNER);
|
||||
HBRUSH hbrFg = paletteModel.CreateFgBrush();
|
||||
drawColorBox(hMemDC, &rc, hbrFg, BDR_RAISEDINNER);
|
||||
DeleteObject(hbrFg);
|
||||
|
||||
/* Draw the normal color boxes */
|
||||
for (INT i = 0; i < COLOR_COUNT; i++)
|
||||
{
|
||||
getColorBoxRect(&rc, rcClient, i);
|
||||
drawColorBox(hMemDC, &rc, paletteModel.GetColor(i), BDR_SUNKENOUTER);
|
||||
HBRUSH hbr = paletteModel.CreateColorBrush(paletteModel.GetColor(i));
|
||||
drawColorBox(hMemDC, &rc, hbr, BDR_SUNKENOUTER);
|
||||
DeleteObject(hbr);
|
||||
}
|
||||
|
||||
/* Transfer bits (hDC <-- hMemDC) */
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
|
||||
* PURPOSE: Keep track of palette data, notify listeners
|
||||
* COPYRIGHT: Copyright 2015 Benedikt Freisen <[email protected]>
|
||||
* Copyright 2021 Katayama Hirofumi MZ <[email protected]>
|
||||
* Copyright 2021-2026 Katayama Hirofumi MZ <[email protected]>
|
||||
*/
|
||||
|
||||
#include "precomp.h"
|
||||
@@ -14,8 +14,8 @@ PaletteModel paletteModel;
|
||||
|
||||
PaletteModel::PaletteModel()
|
||||
{
|
||||
m_fgColor = 0x00000000;
|
||||
m_bgColor = 0x00ffffff;
|
||||
m_fgColor = RGB(0, 0, 0);
|
||||
m_bgColor = RGB(255, 255, 255);
|
||||
SelectPalette(PAL_MODERN);
|
||||
}
|
||||
|
||||
@@ -40,6 +40,13 @@ void PaletteModel::SelectPalette(PAL_TYPE nPalette)
|
||||
0xffffff, 0xc0c0c0, 0x0000ff, 0x00ffff, 0x00ff00, 0xffff00, 0xff0000,
|
||||
0xff00ff, 0x80ffff, 0x80ff00, 0xffff80, 0xff8080, 0x8000ff, 0x4080ff
|
||||
};
|
||||
static const COLORREF grayscale[NUM_COLORS] =
|
||||
{
|
||||
0x000000, 0x090909, 0x121212, 0x1C1C1C, 0x252525, 0x2F2F2F, 0x383838,
|
||||
0x424242, 0x4B4B4B, 0x555555, 0x5E5E5E, 0x676767, 0x717171, 0x7B7B7B,
|
||||
0xFFFFFF, 0xF6F6F6, 0xEDEDED, 0xE3E3E3, 0xD9D9D9, 0xD0D0D0, 0xC7C7C7,
|
||||
0xBDBDBD, 0xB4B4B4, 0xAAAAAA, 0xA1A1A1, 0x979797, 0x8E8E8E, 0x848484
|
||||
};
|
||||
switch (nPalette)
|
||||
{
|
||||
case PAL_MODERN:
|
||||
@@ -48,8 +55,14 @@ void PaletteModel::SelectPalette(PAL_TYPE nPalette)
|
||||
case PAL_OLDTYPE:
|
||||
CopyMemory(m_colors, oldColors, sizeof(m_colors));
|
||||
break;
|
||||
case PAL_GRAYSCALE:
|
||||
case PAL_MONOCHROME:
|
||||
CopyMemory(m_colors, grayscale, sizeof(m_colors));
|
||||
break;
|
||||
}
|
||||
m_nSelectedPalette = nPalette;
|
||||
m_fgColor = RGB(0, 0, 0);
|
||||
m_bgColor = RGB(255, 255, 255);
|
||||
NotifyPaletteChanged();
|
||||
}
|
||||
|
||||
@@ -107,3 +120,78 @@ void PaletteModel::NotifyPaletteChanged()
|
||||
if (paletteWindow.IsWindow())
|
||||
paletteWindow.Invalidate(FALSE);
|
||||
}
|
||||
|
||||
HBRUSH
|
||||
PaletteModel::CreateDitherBrush(COLORREF color, COLORREF monoColor0, COLORREF monoColor1)
|
||||
{
|
||||
// 8x8 Bayer ordered dithering matrix (0 to 63)
|
||||
static const BYTE s_bayerMatrix[8][8] =
|
||||
{
|
||||
{ 0, 32, 8, 40, 2, 34, 10, 42 },
|
||||
{ 48, 16, 56, 24, 50, 18, 58, 26 },
|
||||
{ 12, 44, 4, 36, 14, 46, 6, 38 },
|
||||
{ 60, 28, 52, 20, 62, 30, 54, 22 },
|
||||
{ 3, 35, 11, 43, 1, 33, 9, 41 },
|
||||
{ 51, 19, 59, 27, 49, 17, 57, 25 },
|
||||
{ 15, 47, 7, 39, 13, 45, 5, 37 },
|
||||
{ 63, 31, 55, 23, 61, 29, 53, 21 },
|
||||
};
|
||||
INT sum = GetRValue(color) + GetGValue(color) + GetBValue(color);
|
||||
INT brightness = sum / 3;
|
||||
if (brightness < 0)
|
||||
brightness = 0;
|
||||
if (brightness >= 255)
|
||||
brightness = 256; // White out
|
||||
|
||||
BITMAPINFO bmi = {};
|
||||
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||
bmi.bmiHeader.biWidth = 8;
|
||||
bmi.bmiHeader.biHeight = -8; // Top-down
|
||||
bmi.bmiHeader.biPlanes = 1;
|
||||
bmi.bmiHeader.biBitCount = 24;
|
||||
|
||||
const BYTE b0 = GetBValue(monoColor0), g0 = GetGValue(monoColor0), r0 = GetRValue(monoColor0);
|
||||
const BYTE b1 = GetBValue(monoColor1), g1 = GetGValue(monoColor1), r1 = GetRValue(monoColor1);
|
||||
|
||||
BYTE pixels[8 * 8 * 3];
|
||||
for (INT y = 0; y < 8; ++y)
|
||||
{
|
||||
INT index = y * (3 * CHAR_BIT);
|
||||
for (INT x = 0; x < 8; ++x)
|
||||
{
|
||||
const INT threshold = s_bayerMatrix[y][x] * 255 / 63;
|
||||
if (brightness > threshold)
|
||||
{
|
||||
pixels[index++] = b1; // Blue
|
||||
pixels[index++] = g1; // Green
|
||||
pixels[index++] = r1; // Red
|
||||
}
|
||||
else
|
||||
{
|
||||
pixels[index++] = b0; // Blue
|
||||
pixels[index++] = g0; // Green
|
||||
pixels[index++] = r0; // Red
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HDC hdc = GetDC(NULL);
|
||||
HBITMAP hBitmap = CreateDIBitmap(hdc, &bmi.bmiHeader, CBM_INIT, pixels, &bmi, DIB_RGB_COLORS);
|
||||
ReleaseDC(NULL, hdc);
|
||||
|
||||
if (!hBitmap)
|
||||
return NULL;
|
||||
|
||||
HBRUSH hBrush = CreatePatternBrush(hBitmap);
|
||||
DeleteObject(hBitmap);
|
||||
|
||||
return hBrush;
|
||||
}
|
||||
|
||||
HBRUSH PaletteModel::CreateColorBrush(COLORREF color)
|
||||
{
|
||||
if (m_nSelectedPalette == PAL_MONOCHROME)
|
||||
return CreateDitherBrush(color, RGB(0, 0, 0), RGB(255, 255, 255));
|
||||
else
|
||||
return CreateSolidBrush(color);
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@ enum PAL_TYPE
|
||||
{
|
||||
PAL_MODERN = 1,
|
||||
PAL_OLDTYPE = 2,
|
||||
PAL_GRAYSCALE = 3,
|
||||
PAL_MONOCHROME = 4,
|
||||
};
|
||||
|
||||
/* CLASSES **********************************************************/
|
||||
@@ -27,6 +29,7 @@ private:
|
||||
|
||||
void NotifyColorChanged();
|
||||
void NotifyPaletteChanged();
|
||||
static HBRUSH CreateDitherBrush(COLORREF color, COLORREF monoColor0, COLORREF monoColor1);
|
||||
|
||||
public:
|
||||
PaletteModel();
|
||||
@@ -38,4 +41,7 @@ public:
|
||||
void SetFgColor(COLORREF newColor);
|
||||
COLORREF GetBgColor() const;
|
||||
void SetBgColor(COLORREF newColor);
|
||||
HBRUSH CreateColorBrush(COLORREF color);
|
||||
HBRUSH CreateFgBrush() { return CreateColorBrush(m_fgColor); }
|
||||
HBRUSH CreateBgBrush() { return CreateColorBrush(m_bgColor); }
|
||||
};
|
||||
|
||||
@@ -94,6 +94,8 @@
|
||||
#define IDM_COLORSEDITPALETTE 260
|
||||
#define IDM_COLORSMODERNPALETTE 261
|
||||
#define IDM_COLORSOLDPALETTE 262
|
||||
#define IDM_COLORSGRAYSCALE 263
|
||||
#define IDM_COLORSMONOCHROME 264
|
||||
|
||||
#define IDM_HELPHELPTOPICS 270
|
||||
#define IDM_HELPINFO 271
|
||||
|
||||
Reference in New Issue
Block a user