ReactOS 0.4.16-dev-1012-g3fe4b41
dib.cpp File Reference
#include "precomp.h"
Include dependency graph for dib.cpp:

Go to the source code of this file.

Classes

struct  BITMAPINFOEX
 
struct  BITMAPINFODX
 

Macros

#define WIDTHBYTES(i)   (((i) + 31) / 32 * 4)
 

Functions

float PpcmFromDpi (float dpi)
 
HBITMAP CreateDIBWithProperties (int width, int height)
 
HBITMAP CreateMonoBitmap (int width, int height, BOOL bWhite)
 
HBITMAP CreateColorDIB (int width, int height, COLORREF rgb)
 
HBITMAP CopyMonoImage (HBITMAP hbm, INT cx, INT cy)
 
HBITMAP CachedBufferDIB (HBITMAP hbm, int minimalWidth, int minimalHeight)
 
int GetDIBWidth (HBITMAP hBitmap)
 
int GetDIBHeight (HBITMAP hBitmap)
 
BOOL SaveDIBToFile (HBITMAP hBitmap, LPCWSTR FileName, BOOL fIsMainFile, REFGUID guidFileType)
 
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 DoLoadImageFile (HWND hwnd, LPCWSTR name, BOOL fIsMainFile)
 
HBITMAP Rotate90DegreeBlt (HDC hDC1, INT cx, INT cy, BOOL bRight, BOOL bMono)
 
HBITMAP SkewDIB (HDC hDC1, HBITMAP hbm, INT nDegree, BOOL bVertical, BOOL bMono)
 
HBITMAP getSubImage (HBITMAP hbmWhole, const RECT &rcPartial)
 
void putSubImage (HBITMAP hbmWhole, const RECT &rcPartial, HBITMAP hbmPart)
 
HGLOBAL BitmapToClipboardDIB (HBITMAP hBitmap)
 
HBITMAP BitmapFromClipboardDIB (HGLOBAL hGlobal)
 
HBITMAP BitmapFromHEMF (HENHMETAFILE hEMF)
 
BOOL IsBitmapBlackAndWhite (HBITMAP hbm)
 
HBITMAP ConvertToBlackAndWhite (HBITMAP hbm)
 

Variables

INT g_fileSize = 0
 
float g_xDpi = 96
 
float g_yDpi = 96
 
SYSTEMTIME g_fileTime
 

Macro Definition Documentation

◆ WIDTHBYTES

#define WIDTHBYTES (   i)    (((i) + 31) / 32 * 4)

Definition at line 15 of file dib.cpp.

Function Documentation

◆ BitmapFromClipboardDIB()

HBITMAP BitmapFromClipboardDIB ( HGLOBAL  hGlobal)

Definition at line 511 of file dib.cpp.

512{
513 CWaitCursor waitCursor;
514
515 LPBYTE pb = (LPBYTE)GlobalLock(hGlobal);
516 if (!pb)
517 return NULL;
518
520 pb += pbmi->bmiHeader.biSize;
521
522 INT cColors = 0, cbColors = 0;
523 if (pbmi->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
524 {
526 WORD BitCount = pbmci->bmciHeader.bcBitCount;
527 if (BitCount < 16)
528 {
529 cColors = (1 << BitCount);
530 cbColors = cColors * sizeof(RGBTRIPLE);
531 pb += cbColors;
532 }
533 }
534 else if (pbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER))
535 {
536 WORD BitCount = pbmi->bmiHeader.biBitCount;
537 if (BitCount < 16)
538 {
539 cColors = (1 << BitCount);
540 cbColors = cColors * sizeof(RGBQUAD);
541 pb += cbColors;
542 }
543 }
544
547 if (hBitmap)
548 {
550 }
551 DeleteDC(hDC);
552
553 GlobalUnlock(hGlobal);
554
555 return hBitmap;
556}
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:59
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:88
_In_ HBITMAP _In_ UINT _In_ UINT _Inout_ LPBITMAPINFO pbmi
Definition: ntgdi.h:2780
BITMAPCOREHEADER bmciHeader
Definition: wingdi.h:1453
USHORT biBitCount
Definition: precomp.h:46
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 558 of file dib.cpp.

559{
560 CWaitCursor waitCursor;
561
563 if (!GetEnhMetaFileHeader(hEMF, sizeof(header), &header))
564 return NULL;
565
566 CRect rc = *(LPRECT)&header.rclBounds;
567 INT cx = rc.Width(), cy = rc.Height();
568 HBITMAP hbm = CreateColorDIB(cx, cy, RGB(255, 255, 255));
569 if (!hbm)
570 return NULL;
571
573 HGDIOBJ hbmOld = SelectObject(hDC, hbm);
574 PlayEnhMetaFile(hDC, hEMF, &rc);
575 SelectObject(hDC, hbmOld);
576 DeleteDC(hDC);
577
578 return hbm;
579}
int Width() const noexcept
Definition: atltypes.h:461
int Height() const noexcept
Definition: atltypes.h:318
HBITMAP CreateColorDIB(int width, int height, COLORREF rgb)
Definition: dib.cpp:65
#define RGB(r, g, b)
Definition: precomp.h:71
_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:1546
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 448 of file dib.cpp.

449{
450 CWaitCursor waitCursor;
451
452 BITMAP bm;
453 if (!GetObjectW(hBitmap, sizeof(BITMAP), &bm))
454 return NULL;
455
456 BITMAPINFODX bmi;
457 ZeroMemory(&bmi, sizeof(bmi));
458 bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
459 bmi.bmiHeader.biWidth = bm.bmWidth;
460 bmi.bmiHeader.biHeight = bm.bmHeight;
461 bmi.bmiHeader.biPlanes = 1;
462 bmi.bmiHeader.biBitCount = bm.bmBitsPixel;
464 bmi.bmiHeader.biSizeImage = bm.bmWidthBytes * bm.bmHeight;
465
466 INT cColors;
467 if (bm.bmBitsPixel < 16)
468 cColors = 1 << bm.bmBitsPixel;
469 else
470 cColors = 0;
471
473
474 if (cColors)
475 {
476 HGDIOBJ hbmOld = SelectObject(hDC, hBitmap);
477 cColors = GetDIBColorTable(hDC, 0, cColors, bmi.bmiColors);
478 SelectObject(hDC, hbmOld);
479 }
480
481 DWORD cbColors = cColors * sizeof(RGBQUAD);
482 DWORD dwSize = sizeof(BITMAPINFOHEADER) + cbColors + bmi.bmiHeader.biSizeImage;
484 if (hGlobal)
485 {
486 LPBYTE pb = (LPBYTE)GlobalLock(hGlobal);
487 if (pb)
488 {
489 CopyMemory(pb, &bmi, sizeof(BITMAPINFOHEADER));
490 pb += sizeof(BITMAPINFOHEADER);
491
492 CopyMemory(pb, bmi.bmiColors, cbColors);
493 pb += cbColors;
494
495 GetDIBits(hDC, hBitmap, 0, bm.bmHeight, pb, &bmi, DIB_RGB_COLORS);
496
497 GlobalUnlock(hGlobal);
498 }
499 else
500 {
501 GlobalFree(hGlobal);
502 hGlobal = NULL;
503 }
504 }
505
506 DeleteDC(hDC);
507
508 return hGlobal;
509}
#define BI_RGB
Definition: precomp.h:56
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:47
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:1743
#define CopyMemory
Definition: winbase.h:1741
#define GHND
Definition: winbase.h:323
#define GMEM_SHARE
Definition: winbase.h:331
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
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)

Referenced by CMainWindow::OnCommand().

◆ CachedBufferDIB()

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

Definition at line 115 of file dib.cpp.

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

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

◆ ConvertToBlackAndWhite()

HBITMAP ConvertToBlackAndWhite ( HBITMAP  hbm)

Definition at line 632 of file dib.cpp.

633{
634 CWaitCursor waitCursor;
635
636 BITMAP bm;
637 if (!::GetObjectW(hbm, sizeof(bm), &bm))
638 return NULL;
639
640 BITMAPINFOEX bmi;
641 ZeroMemory(&bmi, sizeof(bmi));
642 bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
643 bmi.bmiHeader.biWidth = bm.bmWidth;
644 bmi.bmiHeader.biHeight = bm.bmHeight;
645 bmi.bmiHeader.biPlanes = 1;
646 bmi.bmiHeader.biBitCount = 1;
647 bmi.bmiColors[1].rgbBlue = 255;
648 bmi.bmiColors[1].rgbGreen = 255;
649 bmi.bmiColors[1].rgbRed = 255;
651 LPVOID pvMonoBits;
652 HBITMAP hMonoBitmap = ::CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &pvMonoBits, NULL, 0);
653 if (!hMonoBitmap)
654 {
656 return NULL;
657 }
658
659 HBITMAP hNewBitmap = CreateDIBWithProperties(bm.bmWidth, bm.bmHeight);
660 if (hNewBitmap)
661 {
662 ::GetDIBits(hdc, hbm, 0, bm.bmHeight, pvMonoBits, &bmi, DIB_RGB_COLORS);
663 ::SetDIBits(hdc, hNewBitmap, 0, bm.bmHeight, pvMonoBits, &bmi, DIB_RGB_COLORS);
664 }
665 ::DeleteObject(hMonoBitmap);
667
668 return hNewBitmap;
669}
HDC hdc
Definition: main.c:9
UCHAR rgbBlue
Definition: bootanim.c:103
UCHAR rgbRed
Definition: bootanim.c:105
UCHAR rgbGreen
Definition: bootanim.c:104

Referenced by ImageModel::PushBlackAndWhite().

◆ CopyMonoImage()

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

Definition at line 87 of file dib.cpp.

88{
89 BITMAP bm;
90 if (!::GetObjectW(hbm, sizeof(bm), &bm))
91 return NULL;
92
93 if (cx == 0 || cy == 0)
94 {
95 cx = bm.bmWidth;
96 cy = bm.bmHeight;
97 }
98
99 HBITMAP hbmNew = ::CreateBitmap(cx, cy, 1, 1, NULL);
100 if (!hbmNew)
101 return NULL;
102
105 HGDIOBJ hbm1Old = ::SelectObject(hdc1, hbm);
106 HGDIOBJ hbm2Old = ::SelectObject(hdc2, hbmNew);
107 ::StretchBlt(hdc2, 0, 0, cx, cy, hdc1, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
108 ::SelectObject(hdc1, hbm1Old);
109 ::SelectObject(hdc2, hbm2Old);
112 return hbmNew;
113}
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 65 of file dib.cpp.

66{
68 if (!ret)
69 return NULL;
70
71 if (rgb)
72 {
74 HGDIOBJ hbmOld = SelectObject(hdc, ret);
75 RECT rc;
76 SetRect(&rc, 0, 0, width, height);
77 HBRUSH hbr = CreateSolidBrush(rgb);
78 FillRect(hdc, &rc, hbr);
79 DeleteObject(hbr);
80 SelectObject(hdc, hbmOld);
82 }
83
84 return ret;
85}
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(), ImageModel::Crop(), SelectionModel::GetSelectionContents(), ImageModel::ImageModel(), InitializeImage(), and SkewDIB().

◆ CreateDIBWithProperties()

HBITMAP CreateDIBWithProperties ( int  width,
int  height 
)

Definition at line 32 of file dib.cpp.

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

Referenced by CachedBufferDIB(), ConvertToBlackAndWhite(), CreateColorDIB(), CCanvasWindow::DoDraw(), getSubImage(), and Rotate90DegreeBlt().

◆ CreateMonoBitmap()

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

Definition at line 45 of file dib.cpp.

46{
48 if (hbm == NULL)
49 return NULL;
50
51 if (bWhite)
52 {
54 HGDIOBJ hbmOld = SelectObject(hdc, hbm);
55 RECT rc = { 0, 0, width, height };
56 FillRect(hdc, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH));
57 SelectObject(hdc, hbmOld);
59 }
60
61 return hbm;
62}
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 257 of file dib.cpp.

258{
259 CWaitCursor waitCursor;
260
261 // find the file
263 HANDLE hFind = ::FindFirstFileW(name, &find);
264 if (hFind == INVALID_HANDLE_VALUE) // does not exist
265 {
267 return NULL;
268 }
269 ::FindClose(hFind);
270
271 // is file empty?
272 if (find.nFileSizeLow == 0 && find.nFileSizeHigh == 0)
273 {
274 if (fIsMainFile)
275 return InitializeImage(name, &find, TRUE);
276 }
277
278 // load the image
280 float xDpi = 0, yDpi = 0;
281 HRESULT hr = img.LoadDx(name, &xDpi, &yDpi);
282 if (FAILED(hr) && fIsMainFile)
283 {
285 hr = img.LoadDx(name, &xDpi, &yDpi);
286 }
287 if (FAILED(hr))
288 {
289 ATLTRACE("hr: 0x%08lX\n", hr);
291 return NULL;
292 }
293
294 HBITMAP hBitmap = img.Detach();
295 if (!fIsMainFile)
296 return hBitmap;
297
298 if (xDpi <= 0 || yDpi <= 0)
299 {
300 HDC hDC = ::GetDC(NULL);
304 }
305
306 g_xDpi = xDpi;
307 g_yDpi = yDpi;
308
310 return hBitmap;
311}
#define ATLTRACE(format,...)
Definition: atltrace.h:269
VOID ShowError(DWORD dwLastError)
Definition: progress.c:29
#define IDS_LOADERRORTEXT
Definition: resource.h:220
void ClearHistory(void)
Definition: history.cpp:116
static TAGID TAGID find
Definition: db.cpp:155
HBITMAP InitializeImage(LPCWSTR name, LPWIN32_FIND_DATAW pFound, BOOL isFile)
Definition: dib.cpp:226
float g_xDpi
Definition: dib.cpp:11
float g_yDpi
Definition: dib.cpp:12
HBITMAP SetBitmapAndInfo(HBITMAP hBitmap, LPCWSTR name, LPWIN32_FIND_DATAW pFound, BOOL isFile)
Definition: dib.cpp:245
#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
ImageModel imageModel
Definition: history.cpp:11
#define FAILED(hr)
Definition: intsafe.h:51
static float(__cdecl *square_half_float)(float x
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 CMainWindow::OnCommand(), CMainWindow::OnDropFiles(), and wWinMain().

◆ GetDIBHeight()

int GetDIBHeight ( HBITMAP  hBitmap)

Definition at line 144 of file dib.cpp.

145{
146 BITMAP bm;
147 ::GetObjectW(hBitmap, sizeof(BITMAP), &bm);
148 return bm.bmHeight;
149}

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

◆ GetDIBWidth()

int GetDIBWidth ( HBITMAP  hBitmap)

Definition at line 136 of file dib.cpp.

137{
138 BITMAP bm;
139 ::GetObjectW(hBitmap, sizeof(BITMAP), &bm);
140 return bm.bmWidth;
141}

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

◆ getSubImage()

HBITMAP getSubImage ( HBITMAP  hbmWhole,
const RECT rcPartial 
)

Definition at line 410 of file dib.cpp.

411{
412 CRect rc = rcPartial;
413 HBITMAP hbmPart = CreateDIBWithProperties(rc.Width(), rc.Height());
414 if (!hbmPart)
415 return NULL;
416
419 HGDIOBJ hbm1Old = ::SelectObject(hDC1, hbmWhole);
420 HGDIOBJ hbm2Old = ::SelectObject(hDC2, hbmPart);
421 ::BitBlt(hDC2, 0, 0, rc.Width(), rc.Height(), hDC1, rc.left, rc.top, SRCCOPY);
422 ::SelectObject(hDC1, hbm1Old);
423 ::SelectObject(hDC2, hbm2Old);
424 ::DeleteDC(hDC1);
425 ::DeleteDC(hDC2);
426 return hbmPart;
427}
static VOID 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:57
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306

Referenced by SelectionModel::GetSelectionContents(), ImageModel::PushImageForUndo(), and ImageModel::SwapPart().

◆ InitializeImage()

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

Definition at line 226 of file dib.cpp.

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

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

◆ IsBitmapBlackAndWhite()

BOOL IsBitmapBlackAndWhite ( HBITMAP  hbm)

Definition at line 581 of file dib.cpp.

582{
583 CWaitCursor waitCursor;
584
585 BITMAP bm;
586 if (!::GetObjectW(hbm, sizeof(bm), &bm))
587 return FALSE;
588
589 if (bm.bmBitsPixel == 1)
590 return TRUE;
591
592 BITMAPINFOEX bmi;
593 ZeroMemory(&bmi, sizeof(bmi));
594 bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
595 bmi.bmiHeader.biWidth = bm.bmWidth;
596 bmi.bmiHeader.biHeight = bm.bmHeight;
597 bmi.bmiHeader.biPlanes = 1;
598 bmi.bmiHeader.biBitCount = 24;
599
600 DWORD widthbytes = WIDTHBYTES(24 * bm.bmWidth);
601 DWORD cbBits = widthbytes * bm.bmHeight;
602 LPBYTE pbBits = new BYTE[cbBits];
603
605 ::GetDIBits(hdc, hbm, 0, bm.bmHeight, pbBits, &bmi, DIB_RGB_COLORS);
607
608 BOOL bBlackAndWhite = TRUE;
609 for (LONG y = 0; y < bm.bmHeight; ++y)
610 {
611 LPBYTE pbLine = &pbBits[widthbytes * y];
612 for (LONG x = 0; x < bm.bmWidth; ++x)
613 {
614 BYTE Blue = *pbLine++;
615 BYTE Green = *pbLine++;
616 BYTE Red = *pbLine++;
617 COLORREF rgbColor = RGB(Red, Green, Blue);
618 if (rgbColor != RGB(0, 0, 0) && rgbColor != RGB(255, 255, 255))
619 {
620 bBlackAndWhite = FALSE;
621 goto Finish;
622 }
623 }
624 }
625
626Finish:
627 delete[] pbBits;
628
629 return bBlackAndWhite;
630}
@ Green
Definition: bl.h:199
@ Red
Definition: bl.h:201
@ Blue
Definition: bl.h:198
#define WIDTHBYTES(i)
Definition: dib.cpp:15
#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
unsigned char BYTE
Definition: xxhash.c:193

Referenced by ImageModel::IsBlackAndWhite().

◆ PpcmFromDpi()

float PpcmFromDpi ( float  dpi)

Definition at line 25 of file dib.cpp.

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

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

◆ putSubImage()

void putSubImage ( HBITMAP  hbmWhole,
const RECT rcPartial,
HBITMAP  hbmPart 
)

Definition at line 429 of file dib.cpp.

430{
431 CRect rc = rcPartial;
434 HGDIOBJ hbm1Old = ::SelectObject(hDC1, hbmWhole);
435 HGDIOBJ hbm2Old = ::SelectObject(hDC2, hbmPart);
436 ::BitBlt(hDC1, rc.left, rc.top, rc.Width(), rc.Height(), hDC2, 0, 0, SRCCOPY);
437 ::SelectObject(hDC1, hbm1Old);
438 ::SelectObject(hDC2, hbm2Old);
439 ::DeleteDC(hDC1);
440 ::DeleteDC(hDC2);
441}

Referenced by ImageModel::Crop(), and ImageModel::SwapPart().

◆ Rotate90DegreeBlt()

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

Definition at line 313 of file dib.cpp.

314{
315 HBITMAP hbm2;
316 if (bMono)
317 hbm2 = ::CreateBitmap(cy, cx, 1, 1, NULL);
318 else
320 if (!hbm2)
321 return NULL;
322
324 HGDIOBJ hbm2Old = SelectObject(hDC2, hbm2);
325 if (bRight)
326 {
327 for (INT y = 0; y < cy; ++y)
328 {
329 for (INT x = 0; x < cx; ++x)
330 {
331 COLORREF rgb = GetPixel(hDC1, x, y);
332 SetPixelV(hDC2, cy - (y + 1), x, rgb);
333 }
334 }
335 }
336 else
337 {
338 for (INT y = 0; y < cy; ++y)
339 {
340 for (INT x = 0; x < cx; ++x)
341 {
342 COLORREF rgb = GetPixel(hDC1, x, y);
343 SetPixelV(hDC2, y, cx - (x + 1), rgb);
344 }
345 }
346 }
347 SelectObject(hDC2, hbm2Old);
348 DeleteDC(hDC2);
349 return hbm2;
350}
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 
)

Definition at line 151 of file dib.cpp.

152{
153 CWaitCursor waitCursor;
154
156 img.Attach(hBitmap);
157 HRESULT hr = img.SaveDx(FileName, guidFileType, g_xDpi, g_yDpi);
158 img.Detach();
159
160 if (FAILED(hr))
161 {
163 return FALSE;
164 }
165
166 if (!fIsMainFile)
167 return TRUE;
168
171 if (hFind == INVALID_HANDLE_VALUE)
172 {
174 return FALSE;
175 }
176 ::FindClose(hFind);
177
180 return TRUE;
181}
BOOL g_imageSaved
Definition: main.cpp:21
#define IDS_SAVEERROR
Definition: resource.h:229
void SetFileInfo(LPCWSTR name, LPWIN32_FIND_DATAW pFound, BOOL isAFile)
Definition: dib.cpp:183

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

◆ SetBitmapAndInfo()

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

Definition at line 245 of file dib.cpp.

246{
247 // update image
251
252 SetFileInfo(name, pFound, isFile);
254 return hBitmap;
255}
CCanvasWindow canvasWindow
Definition: canvas.cpp:10
VOID updateScrollPos(INT x=0, INT y=0)
Definition: canvas.cpp:251
void PushImageForUndo()
Definition: history.cpp:127

Referenced by DoLoadImageFile(), and InitializeImage().

◆ SetFileInfo()

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

Definition at line 183 of file dib.cpp.

184{
185 // update file time and size
186 if (pFound)
187 {
188 FILETIME ft;
191
192 g_fileSize = pFound->nFileSizeLow;
193 }
194 else
195 {
197 g_fileSize = 0;
198 }
199
200 // update g_szFileName
201 if (name && name[0])
202 {
203 CStringW strName = name;
205 // The following code won't work correctly when (name == g_szFileName):
206 // ::GetFullPathNameW(name, _countof(g_szFileName), g_szFileName, NULL);
207 }
208 else
209 {
211 }
212
213 // set title
214 CStringW strTitle;
216 mainWindow.SetWindowText(strTitle);
217
218 // update file info and recent
219 g_isAFile = isAFile;
220 if (g_isAFile)
222
224}
WCHAR g_szFileName[MAX_LONG_PATH]
Definition: main.cpp:18
CMainWindow mainWindow
Definition: main.cpp:25
BOOL g_isAFile
Definition: main.cpp:20
HINSTANCE g_hinstExe
Definition: main.cpp:17
#define IDS_DEFAULTFILENAME
Definition: resource.h:192
#define IDS_WINDOWTITLE
Definition: resource.h:187
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
BOOL SetWindowText(LPCTSTR lpszString)
Definition: atlwin.h:1300
void SetMostRecentFile(LPCWSTR szPathName)
Definition: registry.cpp:277
SYSTEMTIME g_fileTime
Definition: dib.cpp:13
INT g_fileSize
Definition: dib.cpp:10
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
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
#define _countof(array)
Definition: sndvol32.h:70
FILETIME ftLastWriteTime
Definition: winbase.h:973
DWORD nFileSizeLow
Definition: winbase.h:975
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 
)

Definition at line 352 of file dib.cpp.

353{
354 CWaitCursor waitCursor;
355
356 if (nDegree == 0)
357 return CopyDIBImage(hbm);
358
359 const double eTan = tan(abs(nDegree) * M_PI / 180);
360
361 BITMAP bm;
362 ::GetObjectW(hbm, sizeof(bm), &bm);
363 INT cx = bm.bmWidth, cy = bm.bmHeight, dx = 0, dy = 0;
364 if (bVertical)
365 dy = INT(cx * eTan);
366 else
367 dx = INT(cy * eTan);
368
369 if (dx == 0 && dy == 0)
370 return CopyDIBImage(hbm);
371
372 HBITMAP hbmNew;
373 if (bMono)
374 hbmNew = CreateMonoBitmap(cx + dx, cy + dy, FALSE);
375 else
376 hbmNew = CreateColorDIB(cx + dx, cy + dy, RGB(255, 255, 255));
377 if (!hbmNew)
378 return NULL;
379
381 HGDIOBJ hbm2Old = SelectObject(hDC2, hbmNew);
382 if (bVertical)
383 {
384 for (INT x = 0; x < cx; ++x)
385 {
386 INT delta = INT(x * eTan);
387 if (nDegree > 0)
388 ::BitBlt(hDC2, x, (dy - delta), 1, cy, hDC1, x, 0, SRCCOPY);
389 else
390 ::BitBlt(hDC2, x, delta, 1, cy, hDC1, x, 0, SRCCOPY);
391 }
392 }
393 else
394 {
395 for (INT y = 0; y < cy; ++y)
396 {
397 INT delta = INT(y * eTan);
398 if (nDegree > 0)
399 ::BitBlt(hDC2, (dx - delta), y, cx, 1, hDC1, 0, y, SRCCOPY);
400 else
401 ::BitBlt(hDC2, delta, y, cx, 1, hDC1, 0, y, SRCCOPY);
402 }
403 }
404
405 SelectObject(hDC2, hbm2Old);
406 DeleteDC(hDC2);
407 return hbmNew;
408}
_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:45
#define abs(i)
Definition: fconv.c:206
GLint dy
Definition: linetemp.h:97
GLint dx
Definition: linetemp.h:97
#define M_PI
Definition: macros.h:263
#define INT
Definition: polytest.cpp:20

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

Variable Documentation

◆ g_fileSize

INT g_fileSize = 0

Definition at line 10 of file dib.cpp.

Referenced by CAttributesDialog::OnInitDialog(), and SetFileInfo().

◆ g_fileTime

SYSTEMTIME g_fileTime

Definition at line 13 of file dib.cpp.

Referenced by CAttributesDialog::OnInitDialog(), and SetFileInfo().

◆ g_xDpi

◆ g_yDpi