ReactOS 0.4.15-dev-6656-gbbb33a6
dib.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define ROUND(x)   (INT)((x) + 0.5)
 

Functions

BOOL IsBitmapBlackAndWhite (HBITMAP hbm)
 
HBITMAP CreateDIBWithProperties (int width, int height)
 
HBITMAP CreateMonoBitmap (int width, int height, BOOL bWhite)
 
HBITMAP CreateColorDIB (int width, int height, COLORREF rgb)
 
HBITMAP CachedBufferDIB (HBITMAP hbm, int minimalWidth, int minimalHeight)
 
HBITMAP ConvertToBlackAndWhite (HBITMAP hbm)
 
HBITMAP CopyMonoImage (HBITMAP hbm, INT cx=0, INT cy=0)
 
static HBITMAP CopyDIBImage (HBITMAP hbm, INT cx=0, INT cy=0)
 
int GetDIBWidth (HBITMAP hbm)
 
int GetDIBHeight (HBITMAP hbm)
 
BOOL SaveDIBToFile (HBITMAP hBitmap, LPCWSTR FileName, BOOL fIsMainFile, REFGUID guidFileType=GUID_NULL)
 
HBITMAP DoLoadImageFile (HWND hwnd, LPCWSTR name, BOOL fIsMainFile)
 
void SetFileInfo (LPCWSTR name, LPWIN32_FIND_DATAW pFound, BOOL isAFile)
 
HBITMAP InitializeImage (LPCWSTR name, LPWIN32_FIND_DATAW pFound, BOOL isFile)
 
HBITMAP SetBitmapAndInfo (HBITMAP hBitmap, LPCWSTR name, LPWIN32_FIND_DATAW pFound, BOOL isFile)
 
HBITMAP Rotate90DegreeBlt (HDC hDC1, INT cx, INT cy, BOOL bRight, BOOL bMono)
 
HBITMAP SkewDIB (HDC hDC1, HBITMAP hbm, INT nDegree, BOOL bVertical, BOOL bMono=FALSE)
 
float PpcmFromDpi (float dpi)
 
HGLOBAL BitmapToClipboardDIB (HBITMAP hBitmap)
 
HBITMAP BitmapFromClipboardDIB (HGLOBAL hGlobal)
 
HBITMAP BitmapFromHEMF (HENHMETAFILE hEMF)
 

Macro Definition Documentation

◆ ROUND

#define ROUND (   x)    (INT)((x) + 0.5)

Definition at line 42 of file dib.h.

Function Documentation

◆ BitmapFromClipboardDIB()

HBITMAP BitmapFromClipboardDIB ( HGLOBAL  hGlobal)

Definition at line 472 of file dib.cpp.

473{
474 CWaitCursor waitCursor;
475
476 LPBYTE pb = (LPBYTE)GlobalLock(hGlobal);
477 if (!pb)
478 return NULL;
479
481 pb += pbmi->bmiHeader.biSize;
482
483 INT cColors = 0, cbColors = 0;
484 if (pbmi->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
485 {
487 WORD BitCount = pbmci->bmciHeader.bcBitCount;
488 if (BitCount < 16)
489 {
490 cColors = (1 << BitCount);
491 cbColors = cColors * sizeof(RGBTRIPLE);
492 pb += cbColors;
493 }
494 }
495 else if (pbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER))
496 {
497 WORD BitCount = pbmi->bmiHeader.biBitCount;
498 if (BitCount < 16)
499 {
500 cColors = (1 << BitCount);
501 cbColors = cColors * sizeof(RGBQUAD);
502 pb += cbColors;
503 }
504 }
505
508 if (hBitmap)
509 {
511 }
512 DeleteDC(hDC);
513
514 GlobalUnlock(hGlobal);
515
516 return hBitmap;
517}
static HDC hDC
Definition: 3dtext.c:33
#define NULL
Definition: types.h:112
static HBITMAP hBitmap
Definition: timezone.c:26
ULONG RGBQUAD
Definition: precomp.h:50
unsigned short WORD
Definition: ntddk_ex.h:93
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
_Check_return_ long __cdecl labs(_In_ long x)
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:92
_In_ HBITMAP _In_ UINT _In_ UINT _Inout_ LPBITMAPINFO pbmi
Definition: ntgdi.h:2780
BITMAPCOREHEADER bmciHeader
Definition: wingdi.h:1453
USHORT biBitCount
Definition: precomp.h:37
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1476
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
Definition: bitmap.c:245
#define DIB_RGB_COLORS
Definition: wingdi.h:367
struct _BITMAPCOREINFO * LPBITMAPCOREINFO
struct tagRGBTRIPLE RGBTRIPLE
int WINAPI SetDIBits(_In_opt_ HDC, _In_ HBITMAP, _In_ UINT, _In_ UINT, _In_ CONST VOID *, _In_ CONST BITMAPINFO *, _In_ UINT)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
struct tagBITMAPINFO * LPBITMAPINFO
BOOL WINAPI DeleteDC(_In_ HDC)

Referenced by CMainWindow::OnCommand().

◆ BitmapFromHEMF()

HBITMAP BitmapFromHEMF ( HENHMETAFILE  hEMF)

Definition at line 519 of file dib.cpp.

520{
521 CWaitCursor waitCursor;
522
524 if (!GetEnhMetaFileHeader(hEMF, sizeof(header), &header))
525 return NULL;
526
527 CRect rc = *(LPRECT)&header.rclBounds;
528 INT cx = rc.Width(), cy = rc.Height();
529 HBITMAP hbm = CreateColorDIB(cx, cy, RGB(255, 255, 255));
530 if (!hbm)
531 return NULL;
532
534 HGDIOBJ hbmOld = SelectObject(hDC, hbm);
535 PlayEnhMetaFile(hDC, hEMF, &rc);
536 SelectObject(hDC, hbmOld);
537 DeleteDC(hDC);
538
539 return hbm;
540}
int Width() const
Definition: atltypes.h:407
int Height() const
Definition: atltypes.h:318
HBITMAP CreateColorDIB(int width, int height, COLORREF rgb)
Definition: dib.cpp:66
#define RGB(r, g, b)
Definition: precomp.h:62
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
#define LPRECT
Definition: precomp.h:28
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
UINT WINAPI GetEnhMetaFileHeader(_In_ HENHMETAFILE hemf, _In_ UINT nSize, _Out_writes_bytes_opt_(nSize) LPENHMETAHEADER lpEnhMetaHeader)
BOOL WINAPI PlayEnhMetaFile(_In_ HDC, _In_ HENHMETAFILE, _In_ LPCRECT)

Referenced by CMainWindow::OnCommand().

◆ BitmapToClipboardDIB()

HGLOBAL BitmapToClipboardDIB ( HBITMAP  hBitmap)

Definition at line 409 of file dib.cpp.

410{
411 CWaitCursor waitCursor;
412
413 BITMAP bm;
414 if (!GetObject(hBitmap, sizeof(BITMAP), &bm))
415 return NULL;
416
417 BITMAPINFODX bmi;
418 ZeroMemory(&bmi, sizeof(bmi));
419 bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
420 bmi.bmiHeader.biWidth = bm.bmWidth;
421 bmi.bmiHeader.biHeight = bm.bmHeight;
422 bmi.bmiHeader.biPlanes = 1;
423 bmi.bmiHeader.biBitCount = bm.bmBitsPixel;
425 bmi.bmiHeader.biSizeImage = bm.bmWidthBytes * bm.bmHeight;
426
427 INT cColors;
428 if (bm.bmBitsPixel < 16)
429 cColors = 1 << bm.bmBitsPixel;
430 else
431 cColors = 0;
432
434
435 if (cColors)
436 {
437 HGDIOBJ hbmOld = SelectObject(hDC, hBitmap);
438 cColors = GetDIBColorTable(hDC, 0, cColors, bmi.bmiColors);
439 SelectObject(hDC, hbmOld);
440 }
441
442 DWORD cbColors = cColors * sizeof(RGBQUAD);
443 DWORD dwSize = sizeof(BITMAPINFOHEADER) + cbColors + bmi.bmiHeader.biSizeImage;
445 if (hGlobal)
446 {
447 LPBYTE pb = (LPBYTE)GlobalLock(hGlobal);
448 if (pb)
449 {
450 CopyMemory(pb, &bmi, sizeof(BITMAPINFOHEADER));
451 pb += sizeof(BITMAPINFOHEADER);
452
453 CopyMemory(pb, bmi.bmiColors, cbColors);
454 pb += cbColors;
455
456 GetDIBits(hDC, hBitmap, 0, bm.bmHeight, pb, &bmi, DIB_RGB_COLORS);
457
458 GlobalUnlock(hGlobal);
459 }
460 else
461 {
462 GlobalFree(hGlobal);
463 hGlobal = NULL;
464 }
465 }
466
467 DeleteDC(hDC);
468
469 return hGlobal;
470}
#define BI_RGB
Definition: precomp.h:47
unsigned long DWORD
Definition: ntddk_ex.h:95
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
Definition: bl.h:1331
ULONG biCompression
Definition: precomp.h:38
RGBQUAD bmiColors[1]
Definition: wingdi.h:1477
UINT WINAPI GetDIBColorTable(HDC hDC, UINT iStartIndex, UINT cEntries, RGBQUAD *pColors)
Definition: palette.c:123
#define ZeroMemory
Definition: winbase.h:1700
#define CopyMemory
Definition: winbase.h:1698
#define GHND
Definition: winbase.h:297
#define GMEM_SHARE
Definition: winbase.h:305
int WINAPI GetDIBits(_In_ HDC hdc, _In_ HBITMAP hbm, _In_ UINT start, _In_ UINT cLines, _Out_opt_ LPVOID lpvBits, _At_((LPBITMAPINFOHEADER) lpbmi, _Inout_) LPBITMAPINFO lpbmi, _In_ UINT usage)
#define GetObject
Definition: wingdi.h:4468

Referenced by CMainWindow::OnCommand().

◆ CachedBufferDIB()

HBITMAP CachedBufferDIB ( HBITMAP  hbm,
int  minimalWidth,
int  minimalHeight 
)

Definition at line 116 of file dib.cpp.

117{
118 if (minimalWidth <= 0)
119 minimalWidth = 1;
120 if (minimalHeight <= 0)
121 minimalHeight = 1;
122
123 BITMAP bm;
124 if (!GetObject(hbm, sizeof(bm), &bm))
125 hbm = NULL;
126
127 if (hbm && minimalWidth <= bm.bmWidth && minimalHeight <= bm.bmHeight)
128 return hbm;
129
130 if (hbm)
132
133 return CreateDIBWithProperties((minimalWidth * 3) / 2, (minimalHeight * 3) / 2);
134}
HBITMAP CreateDIBWithProperties(int width, int height)
Definition: dib.cpp:33
pKey DeleteObject()

Referenced by CCanvasWindow::DoDraw(), CMiniatureWindow::OnPaint(), and CPaletteWindow::OnPaint().

◆ ConvertToBlackAndWhite()

HBITMAP ConvertToBlackAndWhite ( HBITMAP  hbm)

Definition at line 593 of file dib.cpp.

594{
595 CWaitCursor waitCursor;
596
597 BITMAP bm;
598 if (!::GetObject(hbm, sizeof(bm), &bm))
599 return NULL;
600
601 BITMAPINFOEX bmi;
602 ZeroMemory(&bmi, sizeof(bmi));
603 bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
604 bmi.bmiHeader.biWidth = bm.bmWidth;
605 bmi.bmiHeader.biHeight = bm.bmHeight;
606 bmi.bmiHeader.biPlanes = 1;
607 bmi.bmiHeader.biBitCount = 1;
608 bmi.bmiColors[1].rgbBlue = 255;
609 bmi.bmiColors[1].rgbGreen = 255;
610 bmi.bmiColors[1].rgbRed = 255;
612 LPVOID pvMonoBits;
613 HBITMAP hMonoBitmap = ::CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &pvMonoBits, NULL, 0);
614 if (!hMonoBitmap)
615 {
617 return NULL;
618 }
619
620 HBITMAP hNewBitmap = CreateDIBWithProperties(bm.bmWidth, bm.bmHeight);
621 if (hNewBitmap)
622 {
623 ::GetDIBits(hdc, hbm, 0, bm.bmHeight, pvMonoBits, &bmi, DIB_RGB_COLORS);
624 ::SetDIBits(hdc, hNewBitmap, 0, bm.bmHeight, pvMonoBits, &bmi, DIB_RGB_COLORS);
625 }
626 ::DeleteObject(hMonoBitmap);
628
629 return hNewBitmap;
630}
HDC hdc
Definition: main.c:9
UCHAR rgbBlue
Definition: bootanim.c:97
UCHAR rgbRed
Definition: bootanim.c:99
UCHAR rgbGreen
Definition: bootanim.c:98

Referenced by ImageModel::PushBlackAndWhite().

◆ CopyDIBImage()

static HBITMAP CopyDIBImage ( HBITMAP  hbm,
INT  cx = 0,
INT  cy = 0 
)
inlinestatic

Definition at line 19 of file dib.h.

20{
22}
#define IMAGE_BITMAP
Definition: winuser.h:211
#define LR_CREATEDIBSECTION
Definition: winuser.h:1092
#define LR_COPYRETURNORG
Definition: winuser.h:1084
HANDLE WINAPI CopyImage(_In_ HANDLE, _In_ UINT, _In_ int, _In_ int, _In_ UINT)
Definition: cursoricon.c:1956

Referenced by ImageModel::CopyBitmap(), SelectionModel::CopyBitmap(), ImageModel::PushImageForUndo(), ImageModel::ResetToPrevious(), SkewDIB(), SelectionModel::StretchSkew(), and ImageModel::StretchSkew().

◆ CopyMonoImage()

HBITMAP CopyMonoImage ( HBITMAP  hbm,
INT  cx = 0,
INT  cy = 0 
)

Definition at line 88 of file dib.cpp.

89{
90 BITMAP bm;
91 if (!GetObject(hbm, sizeof(bm), &bm))
92 return NULL;
93
94 if (cx == 0 || cy == 0)
95 {
96 cx = bm.bmWidth;
97 cy = bm.bmHeight;
98 }
99
100 HBITMAP hbmNew = CreateBitmap(cx, cy, 1, 1, NULL);
101 if (!hbmNew)
102 return NULL;
103
106 HGDIOBJ hbm1Old = SelectObject(hdc1, hbm);
107 HGDIOBJ hbm2Old = SelectObject(hdc2, hbmNew);
108 StretchBlt(hdc2, 0, 0, cx, cy, hdc1, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
109 SelectObject(hdc1, hbm1Old);
110 SelectObject(hdc2, hbm2Old);
111 DeleteDC(hdc1);
112 DeleteDC(hdc2);
113 return hbmNew;
114}
HDC hdc1
Definition: SelectObject.c:10
HDC hdc2
Definition: SelectObject.c:10
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)
BOOL WINAPI StretchBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD)
#define SRCCOPY
Definition: wingdi.h:333

Referenced by SelectionModel::StretchSkew().

◆ CreateColorDIB()

HBITMAP CreateColorDIB ( int  width,
int  height,
COLORREF  rgb 
)

Definition at line 66 of file dib.cpp.

67{
69 if (!ret)
70 return NULL;
71
72 if (rgb)
73 {
75 HGDIOBJ hbmOld = SelectObject(hdc, ret);
76 RECT rc;
77 SetRect(&rc, 0, 0, width, height);
78 HBRUSH hbr = CreateSolidBrush(rgb);
79 FillRect(hdc, &rc, hbr);
80 DeleteObject(hbr);
81 SelectObject(hdc, hbmOld);
83 }
84
85 return ret;
86}
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
int ret
_In_ ULONG _In_ ULONG rgb
Definition: winddi.h:3521
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)

Referenced by BitmapFromHEMF(), ColorKeyedMaskBlt(), SelectionModel::GetSelectionContents(), ImageModel::ImageModel(), InitializeImage(), and SkewDIB().

◆ CreateDIBWithProperties()

HBITMAP CreateDIBWithProperties ( int  width,
int  height 
)

Definition at line 33 of file dib.cpp.

34{
35 BITMAPINFO bmi;
36 ZeroMemory(&bmi, sizeof(BITMAPINFO));
37 bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
40 bmi.bmiHeader.biPlanes = 1;
41 bmi.bmiHeader.biBitCount = 24;
42 return CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, NULL, NULL, 0);
43}

Referenced by CachedBufferDIB(), ConvertToBlackAndWhite(), CreateColorDIB(), ImageModel::Crop(), and Rotate90DegreeBlt().

◆ CreateMonoBitmap()

HBITMAP CreateMonoBitmap ( int  width,
int  height,
BOOL  bWhite 
)

Definition at line 46 of file dib.cpp.

47{
49 if (hbm == NULL)
50 return NULL;
51
52 if (bWhite)
53 {
55 HGDIOBJ hbmOld = SelectObject(hdc, hbm);
56 RECT rc = { 0, 0, width, height };
57 FillRect(hdc, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH));
58 SelectObject(hdc, hbmOld);
60 }
61
62 return hbm;
63}
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define WHITE_BRUSH
Definition: wingdi.h:902

Referenced by SkewDIB(), and SelectionModel::StretchSkew().

◆ DoLoadImageFile()

HBITMAP DoLoadImageFile ( HWND  hwnd,
LPCWSTR  name,
BOOL  fIsMainFile 
)

Definition at line 253 of file dib.cpp.

254{
255 CWaitCursor waitCursor;
256
257 // find the file
259 HANDLE hFind = ::FindFirstFileW(name, &find);
260 if (hFind == INVALID_HANDLE_VALUE) // does not exist
261 {
263 return NULL;
264 }
265 ::FindClose(hFind);
266
267 // is file empty?
268 if (find.nFileSizeLow == 0 && find.nFileSizeHigh == 0)
269 {
270 if (fIsMainFile)
271 return InitializeImage(name, &find, TRUE);
272 }
273
274 // load the image
276 float xDpi = 0, yDpi = 0;
277 HRESULT hr = img.LoadDx(name, &xDpi, &yDpi);
278 if (FAILED(hr))
279 {
281 return NULL;
282 }
283
284 HBITMAP hBitmap = img.Detach();
285 if (!fIsMainFile)
286 return hBitmap;
287
288 if (xDpi <= 0 || yDpi <= 0)
289 {
290 HDC hDC = ::GetDC(NULL);
294 }
295
296 g_xDpi = xDpi;
297 g_yDpi = yDpi;
298
300 return hBitmap;
301}
VOID ShowError(DWORD dwLastError)
Definition: progress.c:29
#define IDS_LOADERRORTEXT
Definition: resource.h:214
static TAGID TAGID find
Definition: db.cpp:155
HBITMAP InitializeImage(LPCWSTR name, LPWIN32_FIND_DATAW pFound, BOOL isFile)
Definition: dib.cpp:227
float g_xDpi
Definition: dib.cpp:12
float g_yDpi
Definition: dib.cpp:13
HBITMAP SetBitmapAndInfo(HBITMAP hBitmap, LPCWSTR name, LPWIN32_FIND_DATAW pFound, BOOL isFile)
Definition: dib.cpp:242
#define TRUE
Definition: types.h:120
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
GLint GLvoid * img
Definition: gl.h:1956
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT hr
Definition: shlfolder.c:183
Definition: name.c:39
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
#define LOGPIXELSY
Definition: wingdi.h:719
#define LOGPIXELSX
Definition: wingdi.h:718
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
HDC WINAPI GetDC(_In_opt_ HWND)

Referenced by _tWinMain(), CMainWindow::OnCommand(), and CMainWindow::OnDropFiles().

◆ GetDIBHeight()

int GetDIBHeight ( HBITMAP  hbm)

Definition at line 145 of file dib.cpp.

146{
147 BITMAP bm;
148 GetObject(hBitmap, sizeof(BITMAP), &bm);
149 return bm.bmHeight;
150}

Referenced by ImageModel::GetHeight(), SelectionModel::InsertFromHBITMAP(), and CMainWindow::InsertSelectionFromHBITMAP().

◆ GetDIBWidth()

int GetDIBWidth ( HBITMAP  hbm)

Definition at line 137 of file dib.cpp.

138{
139 BITMAP bm;
140 GetObject(hBitmap, sizeof(BITMAP), &bm);
141 return bm.bmWidth;
142}

Referenced by ImageModel::GetWidth(), SelectionModel::InsertFromHBITMAP(), and CMainWindow::InsertSelectionFromHBITMAP().

◆ InitializeImage()

HBITMAP InitializeImage ( LPCWSTR  name,
LPWIN32_FIND_DATAW  pFound,
BOOL  isFile 
)

Definition at line 227 of file dib.cpp.

228{
229 COLORREF white = RGB(255, 255, 255);
231 if (hBitmap == NULL)
232 return NULL;
233
234 HDC hScreenDC = ::GetDC(NULL);
235 g_xDpi = ::GetDeviceCaps(hScreenDC, LOGPIXELSX);
236 g_yDpi = ::GetDeviceCaps(hScreenDC, LOGPIXELSY);
237 ::ReleaseDC(NULL, hScreenDC);
238
239 return SetBitmapAndInfo(hBitmap, name, pFound, isFile);
240}
DWORD BMPWidth
Definition: registry.h:19
DWORD BMPHeight
Definition: registry.h:18
RegistrySettings registrySettings
Definition: registry.cpp:14
DWORD COLORREF
Definition: windef.h:300

Referenced by _tWinMain(), DoLoadImageFile(), and CMainWindow::OnCommand().

◆ IsBitmapBlackAndWhite()

BOOL IsBitmapBlackAndWhite ( HBITMAP  hbm)

Definition at line 542 of file dib.cpp.

543{
544 CWaitCursor waitCursor;
545
546 BITMAP bm;
547 if (!::GetObjectW(hbm, sizeof(bm), &bm))
548 return FALSE;
549
550 if (bm.bmBitsPixel == 1)
551 return TRUE;
552
553 BITMAPINFOEX bmi;
554 ZeroMemory(&bmi, sizeof(bmi));
555 bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
556 bmi.bmiHeader.biWidth = bm.bmWidth;
557 bmi.bmiHeader.biHeight = bm.bmHeight;
558 bmi.bmiHeader.biPlanes = 1;
559 bmi.bmiHeader.biBitCount = 24;
560
561 DWORD widthbytes = WIDTHBYTES(24 * bm.bmWidth);
562 DWORD cbBits = widthbytes * bm.bmHeight;
563 LPBYTE pbBits = new BYTE[cbBits];
564
566 ::GetDIBits(hdc, hbm, 0, bm.bmHeight, pbBits, &bmi, DIB_RGB_COLORS);
568
569 BOOL bBlackAndWhite = TRUE;
570 for (LONG y = 0; y < bm.bmHeight; ++y)
571 {
572 LPBYTE pbLine = &pbBits[widthbytes * y];
573 for (LONG x = 0; x < bm.bmWidth; ++x)
574 {
575 BYTE Blue = *pbLine++;
576 BYTE Green = *pbLine++;
577 BYTE Red = *pbLine++;
578 COLORREF rgbColor = RGB(Red, Green, Blue);
579 if (rgbColor != RGB(0, 0, 0) && rgbColor != RGB(255, 255, 255))
580 {
581 bBlackAndWhite = FALSE;
582 goto Finish;
583 }
584 }
585 }
586
587Finish:
588 delete[] pbBits;
589
590 return bBlackAndWhite;
591}
@ Green
Definition: bl.h:199
@ Red
Definition: bl.h:201
@ Blue
Definition: bl.h:198
#define WIDTHBYTES(i)
Definition: dib.cpp:16
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
long LONG
Definition: pedump.c:60
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
unsigned char BYTE
Definition: xxhash.c:193

Referenced by ImageModel::IsBlackAndWhite().

◆ PpcmFromDpi()

float PpcmFromDpi ( float  dpi)

Definition at line 26 of file dib.cpp.

27{
28 // 1 DPI is 0.0254 meter. 1 centimeter is 1/100 meter.
29 return dpi / (0.0254f * 100.0f);
30}
#define dpi
Definition: sysparams.c:23

Referenced by CAttributesDialog::OnEdit1(), CAttributesDialog::OnEdit2(), CAttributesDialog::OnInitDialog(), and CAttributesDialog::OnRadioButton2().

◆ Rotate90DegreeBlt()

HBITMAP Rotate90DegreeBlt ( HDC  hDC1,
INT  cx,
INT  cy,
BOOL  bRight,
BOOL  bMono 
)

Definition at line 303 of file dib.cpp.

304{
305 HBITMAP hbm2;
306 if (bMono)
307 hbm2 = ::CreateBitmap(cy, cx, 1, 1, NULL);
308 else
310 if (!hbm2)
311 return NULL;
312
314 HGDIOBJ hbm2Old = SelectObject(hDC2, hbm2);
315 if (bRight)
316 {
317 for (INT y = 0; y < cy; ++y)
318 {
319 for (INT x = 0; x < cx; ++x)
320 {
321 COLORREF rgb = GetPixel(hDC1, x, y);
322 SetPixelV(hDC2, cy - (y + 1), x, rgb);
323 }
324 }
325 }
326 else
327 {
328 for (INT y = 0; y < cy; ++y)
329 {
330 for (INT x = 0; x < cx; ++x)
331 {
332 COLORREF rgb = GetPixel(hDC1, x, y);
333 SetPixelV(hDC2, y, cx - (x + 1), rgb);
334 }
335 }
336 }
337 SelectObject(hDC2, hbm2Old);
338 DeleteDC(hDC2);
339 return hbm2;
340}
DWORD GetPixel(LPDIRECTDRAWSURFACE7 Surface, UINT x, UINT y)
Definition: blt.cpp:2
BOOL WINAPI SetPixelV(_In_ HDC, _In_ int, _In_ int, _In_ COLORREF)

Referenced by ImageModel::RotateNTimes90Degrees(), and SelectionModel::RotateNTimes90Degrees().

◆ SaveDIBToFile()

BOOL SaveDIBToFile ( HBITMAP  hBitmap,
LPCWSTR  FileName,
BOOL  fIsMainFile,
REFGUID  guidFileType = GUID_NULL 
)

Definition at line 152 of file dib.cpp.

153{
154 CWaitCursor waitCursor;
155
157 img.Attach(hBitmap);
158 HRESULT hr = img.SaveDx(FileName, guidFileType, g_xDpi, g_yDpi);
159 img.Detach();
160
161 if (FAILED(hr))
162 {
164 return FALSE;
165 }
166
167 if (!fIsMainFile)
168 return TRUE;
169
172 if (hFind == INVALID_HANDLE_VALUE)
173 {
175 return FALSE;
176 }
177 ::FindClose(hFind);
178
181 return TRUE;
182}
#define IDS_SAVEERROR
Definition: resource.h:223
void SetFileInfo(LPCWSTR name, LPWIN32_FIND_DATAW pFound, BOOL isAFile)
Definition: dib.cpp:184
BOOL g_imageSaved
Definition: main.cpp:19

Referenced by CMainWindow::OnCommand(), OpenMailer(), and ImageModel::SaveImage().

◆ SetBitmapAndInfo()

HBITMAP SetBitmapAndInfo ( HBITMAP  hBitmap,
LPCWSTR  name,
LPWIN32_FIND_DATAW  pFound,
BOOL  isFile 
)

Definition at line 242 of file dib.cpp.

243{
244 // update image
247
248 SetFileInfo(name, pFound, isFile);
250 return hBitmap;
251}
void PushImageForUndo(HBITMAP hbm=NULL)
Definition: history.cpp:106
void ClearHistory(void)
Definition: history.cpp:100
ImageModel imageModel
Definition: history.cpp:11

Referenced by DoLoadImageFile(), and InitializeImage().

◆ SetFileInfo()

void SetFileInfo ( LPCWSTR  name,
LPWIN32_FIND_DATAW  pFound,
BOOL  isAFile 
)

Definition at line 184 of file dib.cpp.

185{
186 // update file time and size
187 if (pFound)
188 {
189 FILETIME ft;
192
193 g_fileSize = pFound->nFileSizeLow;
194 }
195 else
196 {
198 g_fileSize = 0;
199 }
200
201 // update g_szFileName
202 if (name && name[0])
203 {
204 CStringW strName = name;
206 // The following code won't work correctly when (name == g_szFileName):
207 // ::GetFullPathNameW(name, _countof(g_szFileName), g_szFileName, NULL);
208 }
209 else
210 {
212 }
213
214 // set title
215 CString strTitle;
217 mainWindow.SetWindowText(strTitle);
218
219 // update file info and recent
220 g_isAFile = isAFile;
221 if (g_isAFile)
223
225}
#define IDS_DEFAULTFILENAME
Definition: resource.h:186
#define IDS_WINDOWTITLE
Definition: resource.h:181
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
BOOL SetWindowText(LPCTSTR lpszString)
Definition: atlwin.h:1300
void SetMostRecentFile(LPCTSTR szPathName)
Definition: registry.cpp:254
SYSTEMTIME g_fileTime
Definition: dib.cpp:14
INT g_fileSize
Definition: dib.cpp:11
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:188
BOOL WINAPI FileTimeToLocalFileTime(IN CONST FILETIME *lpFileTime, OUT LPFILETIME lpLocalFileTime)
Definition: time.c:221
TCHAR g_szFileName[MAX_LONG_PATH]
Definition: main.cpp:16
CMainWindow mainWindow
Definition: main.cpp:22
BOOL g_isAFile
Definition: main.cpp:18
HINSTANCE g_hinstExe
Definition: main.cpp:15
#define PathFindFileName
Definition: shlwapi.h:911
#define _countof(array)
Definition: sndvol32.h:68
FILETIME ftLastWriteTime
Definition: winbase.h:942
DWORD nFileSizeLow
Definition: winbase.h:944
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)

Referenced by SaveDIBToFile(), and SetBitmapAndInfo().

◆ SkewDIB()

HBITMAP SkewDIB ( HDC  hDC1,
HBITMAP  hbm,
INT  nDegree,
BOOL  bVertical,
BOOL  bMono = FALSE 
)

Definition at line 346 of file dib.cpp.

347{
348 CWaitCursor waitCursor;
349
350 if (nDegree == 0)
351 return CopyDIBImage(hbm);
352
353 const double eTan = tan(abs(nDegree) * M_PI / 180);
354
355 BITMAP bm;
356 GetObjectW(hbm, sizeof(bm), &bm);
357 INT cx = bm.bmWidth, cy = bm.bmHeight, dx = 0, dy = 0;
358 if (bVertical)
359 dy = INT(cx * eTan);
360 else
361 dx = INT(cy * eTan);
362
363 if (dx == 0 && dy == 0)
364 return CopyDIBImage(hbm);
365
366 HBITMAP hbmNew;
367 if (bMono)
368 hbmNew = CreateMonoBitmap(cx + dx, cy + dy, FALSE);
369 else
370 hbmNew = CreateColorDIB(cx + dx, cy + dy, RGB(255, 255, 255));
371 if (!hbmNew)
372 return NULL;
373
375 HGDIOBJ hbm2Old = SelectObject(hDC2, hbmNew);
376 if (bVertical)
377 {
378 for (INT x = 0; x < cx; ++x)
379 {
380 INT delta = INT(x * eTan);
381 if (nDegree > 0)
382 BitBlt(hDC2, x, (dy - delta), 1, cy, hDC1, x, 0, SRCCOPY);
383 else
384 BitBlt(hDC2, x, delta, 1, cy, hDC1, x, 0, SRCCOPY);
385 }
386 }
387 else
388 {
389 for (INT y = 0; y < cy; ++y)
390 {
391 INT delta = INT(y * eTan);
392 if (nDegree > 0)
393 BitBlt(hDC2, (dx - delta), y, cx, 1, hDC1, 0, y, SRCCOPY);
394 else
395 BitBlt(hDC2, delta, y, cx, 1, hDC1, 0, y, SRCCOPY);
396 }
397 }
398
399 SelectObject(hDC2, hbm2Old);
400 DeleteDC(hDC2);
401 return hbmNew;
402}
_STLP_DECLSPEC complex< float > _STLP_CALL tan(const complex< float > &)
static HBITMAP CopyDIBImage(HBITMAP hbm, INT cx=0, INT cy=0)
Definition: dib.h:19
HBITMAP CreateMonoBitmap(int width, int height, BOOL bWhite)
Definition: dib.cpp:46
#define M_PI
Definition: dib.cpp:343
static VOID NTAPI BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
Definition: common.c:49
#define abs(i)
Definition: fconv.c:206
GLint dy
Definition: linetemp.h:97
GLint dx
Definition: linetemp.h:97
#define INT
Definition: polytest.cpp:20

Referenced by SelectionModel::StretchSkew(), and ImageModel::StretchSkew().