5 //CreateDIB‚̌ĂÑ�o‚µ‰ñ�”‚ª‚±‚Ì’l‚ð’´‚¦‚é‚Æ
6 //ƒLƒƒƒbƒVƒ…—pƒrƒbƒgƒ}ƒbƒv‚ð‹�§“I‚É�¶�¬‚µ’¼‚·
7 #define BITMAP_REDUCE_COUNTER 1024
10 HDC
CBitmapCache::CreateDC()
13 m_hdc
= CreateCompatibleDC(NULL
);
18 HBITMAP
CBitmapCache::CreateDIB(int width
, int height
, BYTE
** lplpPixels
)
20 SIZE
& dibSize
= m_dibSize
;
21 width
= (width
+ 3) & ~3;
23 if (dibSize
.cx
>= width
&& dibSize
.cy
>= height
) {
24 if (++m_counter
< BITMAP_REDUCE_COUNTER
) {
25 *lplpPixels
= m_lpPixels
;
29 //‚½‚¾‚µƒTƒCƒY‚ª‘S‚“¯‚¶‚È‚ç�Ä�¶�¬‚µ‚È‚¢
30 if (dibSize
.cx
== width
&& dibSize
.cy
== height
) {
32 *lplpPixels
= m_lpPixels
;
36 if (dibSize
.cx
> width
) {
39 if (dibSize
.cy
> height
) {
44 BITMAPINFOHEADER bmiHeader
= { sizeof(BITMAPINFOHEADER
), width
, -height
, 1, 32, BI_RGB
};
45 HBITMAP hbmpNew
= CreateDIBSection(CreateDC(), (BITMAPINFO
*)&bmiHeader
, DIB_RGB_COLORS
, (LPVOID
*)lplpPixels
, NULL
, 0);
50 //ƒ�ƒ‚ƒŠ•s‘«“™‚ÅhbmpNew==NULL‚Ì�ê�‡‚ð‘z’肵�A
51 //�¬Œ÷‚µ‚½‚Æ‚«‚̂݃LƒƒƒbƒVƒ…‚ð�X�V
59 //CreateDIBSection‚Í‘½•ªƒy�[ƒW‹«ŠE‚©ƒZƒOƒ�ƒ“ƒg‹«ŠE
60 m_lpPixels
= *lplpPixels
;
65 void CBitmapCache::FillSolidRect(COLORREF rgb
, const RECT
* lprc
)
67 DrawHorizontalLine(lprc
->left
, lprc
->top
, lprc
->right
, rgb
, lprc
->bottom
- lprc
->top
);
68 /* LPBYTE lpPixels = m_lpPixels;
69 const DWORD dwBmpBytes = m_dibSize.cx * m_dibSize.cy;
74 mov edi, dword ptr [lpPixels]
75 mov ecx, dword ptr [dwBmpBytes]
76 mov eax, dword ptr [rgb]
80 // DWORD* p = (DWORD*)m_lpPixels;
81 // DWORD* const pend = p + dwBmpBytes;
89 // +-----------------+ ^
91 // +-----------------+ v
92 void CBitmapCache::DrawHorizontalLine(int X1
, int Y1
, int X2
, COLORREF rgb
, int width
)
94 if (!m_dibSize
.cx
|| !m_dibSize
.cy
) {
105 const int xSize
= m_dibSize
.cx
;
106 const int ySize
= m_dibSize
.cy
;
107 X1
= Bound(X1
, 0, xSize
);
108 X2
= Bound(X2
, 0, xSize
);
109 Y1
= Bound(Y1
, 0, ySize
);
110 width
= Max(width
, 1);
111 const int Y2
= Bound(Y1
+ width
, 0, ySize
);
115 DWORD
* lpPixels
= (DWORD
*)m_lpPixels
+ (Y1
* xSize
+ X1
);
116 const int Xd
= X2
- X1
;
117 const int Yd
= Y2
- Y1
;
118 /* for (int yy=Y1; yy<Y2; yy++) {
119 for (int xx=X1; xx<X2; xx++) {
120 _SetPixelV(xx, yy, rgb);
124 for (int yy=Y1; yy<Y2; yy++, lpPixels += xSize) {
126 mov edi, dword ptr [lpPixels]
127 mov ecx, dword ptr [Xd]
128 mov eax, dword ptr [rgb]
134 //–³ˆÓ–¡‚ɃAƒZƒ“ƒuƒŠ‰»
137 mov ebx
, dword ptr
[Yd
]
138 mov edx
, dword ptr
[lpPixels
]
139 mov esi
, dword ptr
[xSize
]
143 mov ecx
, dword ptr
[Xd
]
144 mov eax
, dword ptr
[rgb
]
146 lea edx
, dword ptr
[edx
+esi
*4]
151 for (int yy
=Y1
; yy
<Y2
; yy
++) {
152 for (int xx
=X1
; xx
<X2
; xx
++) {
153 *( (DWORD
*)m_lpPixels
+ (yy
* xSize
+ xx
) ) = rgb
;