mirror of
https://github.com/reactos/reactos.git
synced 2024-11-18 13:01:40 +00:00
525 lines
13 KiB
C
525 lines
13 KiB
C
#include <precomp.h>
|
|
|
|
|
|
BOOL
|
|
DisplayBlackAndWhite(HWND hwnd,
|
|
HDC hdcMem,
|
|
HBITMAP hBitmap)
|
|
{
|
|
BITMAPINFO bi;
|
|
BITMAP bitmap;
|
|
BOOL bRes;
|
|
DWORD Count = 0;
|
|
INT i, j;
|
|
PBYTE pBits;
|
|
RECT rc;
|
|
|
|
GetObject(hBitmap,
|
|
sizeof(BITMAP),
|
|
&bitmap);
|
|
|
|
/* Bitmap header */
|
|
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
|
|
bi.bmiHeader.biWidth = bitmap.bmWidth;
|
|
bi.bmiHeader.biHeight = bitmap.bmHeight;
|
|
bi.bmiHeader.biPlanes = 1;
|
|
bi.bmiHeader.biBitCount = 32;
|
|
bi.bmiHeader.biCompression = BI_RGB;
|
|
bi.bmiHeader.biSizeImage = bitmap.bmWidth * bitmap.bmHeight * 4;
|
|
bi.bmiHeader.biClrUsed = 0;
|
|
bi.bmiHeader.biClrImportant = 0;
|
|
|
|
/* Buffer */
|
|
pBits = (PBYTE)HeapAlloc(ProcessHeap,
|
|
0,
|
|
bitmap.bmWidth * bitmap.bmHeight * 4);
|
|
if (!pBits)
|
|
return FALSE;
|
|
|
|
/* get the bits from the original bitmap */
|
|
bRes = GetDIBits(hdcMem,
|
|
hBitmap,
|
|
0,
|
|
bitmap.bmHeight,
|
|
pBits,
|
|
&bi,
|
|
DIB_RGB_COLORS);
|
|
|
|
for (i = 0; i < bitmap.bmHeight; i++)
|
|
{
|
|
for (j = 0; j < bitmap.bmWidth; j++)
|
|
{
|
|
DWORD Val = 0;
|
|
INT b, g, r;
|
|
|
|
CopyMemory(&Val,
|
|
&pBits[Count],
|
|
4);
|
|
|
|
/* Get pixels in reverse order */
|
|
b = GetRValue(Val);
|
|
g = GetGValue(Val);
|
|
r = GetBValue(Val);
|
|
|
|
/* get the average color value */
|
|
Val = (r + g + b) / 3;
|
|
|
|
/* assign to RGB color */
|
|
Val = RGB(Val, Val, Val);
|
|
CopyMemory(&pBits[Count],
|
|
&Val,
|
|
4);
|
|
|
|
Count+=4;
|
|
}
|
|
}
|
|
|
|
/* Set the new pixel bits */
|
|
SetDIBits(hdcMem,
|
|
hBitmap,
|
|
0,
|
|
bRes,
|
|
pBits,
|
|
&bi,
|
|
DIB_RGB_COLORS);
|
|
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
pBits);
|
|
|
|
GetClientRect(hwnd,
|
|
&rc);
|
|
|
|
InvalidateRect(hwnd,
|
|
&rc,
|
|
FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
DisplayInvertedColors(HWND hwnd,
|
|
HDC hdcMem,
|
|
HBITMAP hBitmap)
|
|
{
|
|
BITMAPINFO bi;
|
|
BITMAP bitmap;
|
|
BOOL bRes;
|
|
DWORD Count = 0;
|
|
INT i, j;
|
|
PBYTE pBits;
|
|
RECT rc;
|
|
|
|
GetObject(hBitmap,
|
|
sizeof(BITMAP),
|
|
&bitmap);
|
|
|
|
/* Bitmap header */
|
|
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
|
|
bi.bmiHeader.biWidth = bitmap.bmWidth;
|
|
bi.bmiHeader.biHeight = bitmap.bmHeight;
|
|
bi.bmiHeader.biPlanes = 1;
|
|
bi.bmiHeader.biBitCount = 32;
|
|
bi.bmiHeader.biCompression = BI_RGB;
|
|
bi.bmiHeader.biSizeImage = bitmap.bmWidth * bitmap.bmHeight * 4;
|
|
bi.bmiHeader.biClrUsed = 0;
|
|
bi.bmiHeader.biClrImportant = 0;
|
|
|
|
/* Buffer */
|
|
pBits = (PBYTE)HeapAlloc(ProcessHeap,
|
|
0,
|
|
bitmap.bmWidth * bitmap.bmHeight * 4);
|
|
if (!pBits)
|
|
return FALSE;
|
|
|
|
/* get the bits from the original bitmap */
|
|
bRes = GetDIBits(hdcMem,
|
|
hBitmap,
|
|
0,
|
|
bitmap.bmHeight,
|
|
pBits,
|
|
&bi,
|
|
DIB_RGB_COLORS);
|
|
|
|
for (i = 0; i < bitmap.bmHeight; i++)
|
|
{
|
|
for (j = 0; j < bitmap.bmWidth; j++)
|
|
{
|
|
DWORD Val = 0;
|
|
INT b, g, r;
|
|
|
|
CopyMemory(&Val,
|
|
&pBits[Count],
|
|
4);
|
|
|
|
b = 255 - GetRValue(Val);
|
|
g = 255 - GetGValue(Val);
|
|
r = 255 - GetBValue(Val);
|
|
|
|
Val = RGB(b, g, r);
|
|
|
|
CopyMemory(&pBits[Count],
|
|
&Val,
|
|
4);
|
|
|
|
Count+=4;
|
|
}
|
|
}
|
|
|
|
/* Set the new pixel bits */
|
|
SetDIBits(hdcMem,
|
|
hBitmap,
|
|
0,
|
|
bRes,
|
|
pBits,
|
|
&bi,
|
|
DIB_RGB_COLORS);
|
|
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
pBits);
|
|
|
|
GetClientRect(hwnd,
|
|
&rc);
|
|
|
|
InvalidateRect(hwnd,
|
|
&rc,
|
|
FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
DisplayBlur(HWND hwnd,
|
|
HDC hdcMem,
|
|
HBITMAP hBitmap)
|
|
{
|
|
BITMAPINFO bi;
|
|
BITMAP bitmap;
|
|
BOOL bRes;
|
|
DWORD Count = 0;
|
|
INT i, j;
|
|
PBYTE pBits, pBitsTemp;
|
|
RECT rc;
|
|
|
|
GetObject(hBitmap,
|
|
sizeof(BITMAP),
|
|
&bitmap);
|
|
|
|
/* Bitmap header */
|
|
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
|
|
bi.bmiHeader.biWidth = bitmap.bmWidth;
|
|
bi.bmiHeader.biHeight = bitmap.bmHeight;
|
|
bi.bmiHeader.biPlanes = 1;
|
|
bi.bmiHeader.biBitCount = 32;
|
|
bi.bmiHeader.biCompression = BI_RGB;
|
|
bi.bmiHeader.biSizeImage = bitmap.bmWidth * bitmap.bmHeight * 4;
|
|
bi.bmiHeader.biClrUsed = 0;
|
|
bi.bmiHeader.biClrImportant = 0;
|
|
|
|
/* Buffer */
|
|
pBits = (PBYTE)HeapAlloc(ProcessHeap,
|
|
0,
|
|
bitmap.bmWidth * bitmap.bmHeight * 4);
|
|
pBitsTemp = (PBYTE)HeapAlloc(ProcessHeap,
|
|
0,
|
|
bitmap.bmWidth * bitmap.bmHeight * 4);
|
|
if (!pBits || !pBitsTemp)
|
|
return FALSE;
|
|
|
|
/* get the bits from the original bitmap */
|
|
bRes = GetDIBits(hdcMem,
|
|
hBitmap,
|
|
0,
|
|
bitmap.bmHeight,
|
|
pBits,
|
|
&bi,
|
|
DIB_RGB_COLORS);
|
|
|
|
for (i = 0; i < bitmap.bmHeight; i++)
|
|
{
|
|
for (j = 0; j < bitmap.bmWidth; j++)
|
|
{
|
|
LONG Val = 0;
|
|
INT b, g, r;
|
|
INT c1, c2, c3, c4, c5;
|
|
|
|
CopyMemory(&Val,
|
|
&pBits[Count],
|
|
4);
|
|
|
|
b = GetRValue(Val);
|
|
g = GetGValue(Val);
|
|
r = GetBValue(Val);
|
|
|
|
c1 = r;
|
|
/* Red */
|
|
if ((Count < ((bitmap.bmHeight - 1) * bitmap.bmWidth * 4lu)) &&
|
|
(Count > (bitmap.bmWidth * 4lu)))
|
|
{
|
|
CopyMemory(&Val, &pBits[Count - (bitmap.bmWidth * 4)], 4);
|
|
c2 = GetBValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count + 4], 4);
|
|
c3 = GetBValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[(Count + (bitmap.bmWidth * 4))], 4);
|
|
c4 = GetBValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count - 4], 4);
|
|
c5 = GetBValue(Val);
|
|
|
|
r = (c1 + c2 + c3 + c4 + c5) / 5;
|
|
}
|
|
|
|
/* Green */
|
|
c1 = g;
|
|
if ((Count < ((bitmap.bmHeight - 1) * bitmap.bmWidth * 4lu)) &&
|
|
(Count > (bitmap.bmWidth * 4lu)))
|
|
{
|
|
CopyMemory(&Val, &pBits[(Count - (bitmap.bmWidth * 4lu))], 4);
|
|
c2 = GetGValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count + 4], 4);
|
|
c3 = GetGValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[(Count + (bitmap.bmWidth * 4lu))], 4);
|
|
c4 = GetGValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count-4], 4);
|
|
c5 = GetGValue(Val);
|
|
|
|
g = (c1 + c2 + c3 + c4 + c5) / 5;
|
|
}
|
|
|
|
/* Blue */
|
|
c1 = b;
|
|
if ((Count < ((bitmap.bmHeight - 1) * bitmap.bmWidth * 4lu)) &&
|
|
(Count > (bitmap.bmWidth * 4lu)))
|
|
{
|
|
CopyMemory(&Val, &pBits[(Count - (bitmap.bmWidth * 4l))], 4);
|
|
c2 = GetRValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count + 4], 4);
|
|
c3 = GetRValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[(Count + (bitmap.bmWidth * 4l))], 4);
|
|
c4 = GetRValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count-4], 4);
|
|
c5 = GetRValue(Val);
|
|
|
|
b = (c1 + c2 + c3 + c4 + c5) / 5;
|
|
}
|
|
|
|
Val = RGB(b, g, r);
|
|
|
|
CopyMemory(&pBitsTemp[Count],
|
|
&Val,
|
|
4);
|
|
|
|
Count+=4;
|
|
}
|
|
}
|
|
|
|
/* Set the new pixel bits */
|
|
SetDIBits(hdcMem,
|
|
hBitmap,
|
|
0,
|
|
bRes,
|
|
pBitsTemp,
|
|
&bi,
|
|
DIB_RGB_COLORS);
|
|
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
pBits);
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
pBitsTemp);
|
|
|
|
GetClientRect(hwnd,
|
|
&rc);
|
|
|
|
InvalidateRect(hwnd,
|
|
&rc,
|
|
FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
DisplaySharpness(HWND hwnd,
|
|
HDC hdcMem,
|
|
HBITMAP hBitmap)
|
|
{
|
|
BITMAPINFO bi;
|
|
BITMAP bitmap;
|
|
BOOL bRes;
|
|
DWORD Count = 0;
|
|
INT i, j;
|
|
PBYTE pBits, pBitsTemp;
|
|
RECT rc;
|
|
|
|
GetObject(hBitmap,
|
|
sizeof(BITMAP),
|
|
&bitmap);
|
|
|
|
/* Bitmap header */
|
|
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
|
|
bi.bmiHeader.biWidth = bitmap.bmWidth;
|
|
bi.bmiHeader.biHeight = bitmap.bmHeight;
|
|
bi.bmiHeader.biPlanes = 1;
|
|
bi.bmiHeader.biBitCount = 32;
|
|
bi.bmiHeader.biCompression = BI_RGB;
|
|
bi.bmiHeader.biSizeImage = bitmap.bmWidth * bitmap.bmHeight * 4;
|
|
bi.bmiHeader.biClrUsed = 0;
|
|
bi.bmiHeader.biClrImportant = 0;
|
|
|
|
/* Buffer */
|
|
pBits = (PBYTE)HeapAlloc(ProcessHeap,
|
|
0,
|
|
bitmap.bmWidth * bitmap.bmHeight * 4);
|
|
pBitsTemp = (PBYTE)HeapAlloc(ProcessHeap,
|
|
0,
|
|
bitmap.bmWidth * bitmap.bmHeight * 4);
|
|
if (!pBits || !pBitsTemp)
|
|
return FALSE;
|
|
|
|
/* get the bits from the original bitmap */
|
|
bRes = GetDIBits(hdcMem,
|
|
hBitmap,
|
|
0,
|
|
bitmap.bmHeight,
|
|
pBits,
|
|
&bi,
|
|
DIB_RGB_COLORS);
|
|
|
|
for (i = 0; i < bitmap.bmHeight; i++)
|
|
{
|
|
for (j = 0; j < bitmap.bmWidth; j++)
|
|
{
|
|
LONG Val = 0;
|
|
INT b, g, r;
|
|
INT c1, c2, c3, c4, c5;
|
|
|
|
CopyMemory(&Val,
|
|
&pBits[Count],
|
|
4);
|
|
|
|
b = GetRValue(Val);
|
|
g = GetGValue(Val);
|
|
r = GetBValue(Val);
|
|
|
|
c1 = r;
|
|
/* Red */
|
|
if ((Count < ((bitmap.bmHeight - 1) * bitmap.bmWidth * 4lu)) &&
|
|
(Count > (bitmap.bmWidth * 4lu)))
|
|
{
|
|
CopyMemory(&Val, &pBits[Count - (bitmap.bmWidth * 4l)], 4);
|
|
c2 = GetBValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count + 4], 4);
|
|
c3 = GetBValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[(Count + (bitmap.bmWidth * 4l))], 4);
|
|
c4 = GetBValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count - 4], 4);
|
|
c5 = GetBValue(Val);
|
|
|
|
r = (c1 * 5) - (c2 + c3 + c4 + c5);
|
|
}
|
|
|
|
/* Green */
|
|
c1 = g;
|
|
if ((Count < ((bitmap.bmHeight - 1)* bitmap.bmWidth * 4lu)) &&
|
|
(Count > (bitmap.bmWidth * 4lu)))
|
|
{
|
|
CopyMemory(&Val, &pBits[(Count - (bitmap.bmWidth * 4l))], 4);
|
|
c2 = GetGValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count + 4], 4);
|
|
c3 = GetGValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[(Count + (bitmap.bmWidth * 4l))], 4);
|
|
c4 = GetGValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count - 4], 4);
|
|
c5 = GetGValue(Val);
|
|
|
|
g = (c1 * 5) - (c2 + c3 + c4 + c5);
|
|
}
|
|
|
|
/* Blue */
|
|
c1 = b;
|
|
if ((Count < ((bitmap.bmHeight - 1) * bitmap.bmWidth * 4lu)) &&
|
|
(Count > (bitmap.bmWidth * 4lu)))
|
|
{
|
|
CopyMemory(&Val, &pBits[(Count - (bitmap.bmWidth * 4l))], 4);
|
|
c2 = GetRValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count + 4], 4);
|
|
c3 = GetRValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[(Count+(bitmap.bmWidth * 4l))], 4);
|
|
c4 = GetRValue(Val);
|
|
|
|
CopyMemory(&Val, &pBits[Count - 4], 4);
|
|
c5 = GetRValue(Val);
|
|
|
|
b = (c1 * 5) - (c2 + c3 + c4 + c5);
|
|
}
|
|
|
|
/* Red */
|
|
if (r > 255) r = 255;
|
|
if (r < 0) r = 0;
|
|
|
|
/* Green */
|
|
if (g > 255) g = 255;
|
|
if (g < 0)g = 0;
|
|
|
|
/* Blue */
|
|
if (b > 255) b = 255;
|
|
if (b < 0) b = 0;
|
|
|
|
Val = RGB(b, g, r);
|
|
|
|
CopyMemory(&pBitsTemp[Count],
|
|
&Val,
|
|
4);
|
|
|
|
Count+=4;
|
|
}
|
|
}
|
|
|
|
/* Set the new pixel bits */
|
|
SetDIBits(hdcMem,
|
|
hBitmap,
|
|
0,
|
|
bRes,
|
|
pBitsTemp,
|
|
&bi,
|
|
DIB_RGB_COLORS);
|
|
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
pBits);
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
pBitsTemp);
|
|
|
|
GetClientRect(hwnd,
|
|
&rc);
|
|
|
|
InvalidateRect(hwnd,
|
|
&rc,
|
|
FALSE);
|
|
|
|
return TRUE;
|
|
}
|