* add svn ignore
[ezgdi.git] / ezgdi / cache.cpp
blob90a9b15c5aa49f4fe30e866222bb4a1469dbd0c5
1 #include "stdafx.h"
3 #include "override.h"
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()
12 if(!m_hdc) {
13 m_hdc = CreateCompatibleDC(NULL);
15 return m_hdc;
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;
26 return m_hbmp;
28 //ƒJƒEƒ“ƒ^’´‰ß
29 //‚½‚¾‚µƒTƒCƒY‚ª‘S‚­“¯‚¶‚È‚ç�Ä�¶�¬‚µ‚È‚¢
30 if (dibSize.cx == width && dibSize.cy == height) {
31 m_counter = 0;
32 *lplpPixels = m_lpPixels;
33 return m_hbmp;
35 } else {
36 if (dibSize.cx > width) {
37 width = dibSize.cx;
39 if (dibSize.cy > height) {
40 height = dibSize.cy;
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);
46 if (!hbmpNew) {
47 return NULL;
50 //ƒ�ƒ‚ƒŠ•s‘«“™‚ÅhbmpNew==NULL‚Ì�ê�‡‚ð‘z’肵�A
51 //�¬Œ÷‚µ‚½‚Æ‚«‚̂݃LƒƒƒbƒVƒ…‚ð�X�V
52 if (m_hbmp) {
53 DeleteBitmap(m_hbmp);
56 m_hbmp = hbmpNew;
57 dibSize.cx = width;
58 dibSize.cy = height;
59 //CreateDIBSection‚Í‘½•ªƒy�[ƒW‹«ŠE‚©ƒZƒOƒ�ƒ“ƒg‹«ŠE
60 m_lpPixels = *lplpPixels;
61 m_counter = 0;
62 return m_hbmp;
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;
70 rgb = RGB2DIB(rgb);
72 //TODO: MMX or SSE‰»
73 __asm {
74 mov edi, dword ptr [lpPixels]
75 mov ecx, dword ptr [dwBmpBytes]
76 mov eax, dword ptr [rgb]
77 cld
78 rep stosd
79 }*/
80 // DWORD* p = (DWORD*)m_lpPixels;
81 // DWORD* const pend = p + dwBmpBytes;
82 // while (p < pend) {
83 // *p++ = rgb;
84 // }
87 //�…•½�ü‚ðˆø‚­
88 //(X1,Y1) (X2,Y1)
89 // +-----------------+ ^
90 // | rgb | | width
91 // +-----------------+ v
92 void CBitmapCache::DrawHorizontalLine(int X1, int Y1, int X2, COLORREF rgb, int width)
94 if (!m_dibSize.cx || !m_dibSize.cy) {
95 return;
98 if (X1 > X2) {
99 const int xx = X1;
100 X1 = X2;
101 X2 = xx;
104 //ƒNƒŠƒbƒsƒ“ƒO
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);
113 rgb = RGB2DIB(rgb);
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) {
125 __asm {
126 mov edi, dword ptr [lpPixels]
127 mov ecx, dword ptr [Xd]
128 mov eax, dword ptr [rgb]
130 rep stosd
134 //–³ˆÓ–¡‚ɃAƒZƒ“ƒuƒŠ‰»
135 #ifdef _M_IX86
136 __asm {
137 mov ebx, dword ptr [Yd]
138 mov edx, dword ptr [lpPixels]
139 mov esi, dword ptr [xSize]
142 mov edi, edx
143 mov ecx, dword ptr [Xd]
144 mov eax, dword ptr [rgb]
145 rep stosd
146 lea edx, dword ptr [edx+esi*4]
147 dec ebx
148 jnz L1
150 #else
151 for (int yy=Y1; yy<Y2; yy++) {
152 for (int xx=X1; xx<X2; xx++) {
153 *( (DWORD*)m_lpPixels + (yy * xSize + xx) ) = rgb;
156 #endif