line rasterizer test
Revision | d221f08d499ffa014dabf7749b2abb08cf248d06 (tree) |
---|---|
Time | 2011-02-07 07:39:37 |
Author | beru <berupon@gmai...> |
Commiter | beru |
subpixel horizontal shift
@@ -177,6 +177,10 @@ | ||
177 | 177 | > |
178 | 178 | </File> |
179 | 179 | <File |
180 | + RelativePath=".\shift.cpp" | |
181 | + > | |
182 | + </File> | |
183 | + <File | |
180 | 184 | RelativePath=".\stdafx.cpp" |
181 | 185 | > |
182 | 186 | <FileConfiguration |
@@ -219,6 +223,10 @@ | ||
219 | 223 | > |
220 | 224 | </File> |
221 | 225 | <File |
226 | + RelativePath=".\shift.h" | |
227 | + > | |
228 | + </File> | |
229 | + <File | |
222 | 230 | RelativePath=".\stdafx.h" |
223 | 231 | > |
224 | 232 | </File> |
@@ -8,6 +8,8 @@ | ||
8 | 8 | #include "gl/lineDrawer8_Wu.h" |
9 | 9 | #include "gl/lineDrawer8_Nelson.h" |
10 | 10 | |
11 | +#include "shift.h" | |
12 | + | |
11 | 13 | HWND hWnd; |
12 | 14 | HBITMAP hBMP; |
13 | 15 | std::vector<uint8_t> bmiBuff(sizeof(BITMAPINFO) + sizeof(RGBQUAD) * 256); |
@@ -20,6 +22,8 @@ gl::LineDrawer8_Bresenham<float> lineDrawer_Bresenham; | ||
20 | 22 | gl::LineDrawer8_DDA<float> lineDrawer_DDA; |
21 | 23 | gl::LineDrawer8_Wu<float> lineDrawer_Wu; |
22 | 24 | gl::LineDrawer8_Nelson<float> lineDrawer_Nelson; |
25 | +float shiftX = 128; | |
26 | +float shiftY = 1024; | |
23 | 27 | |
24 | 28 | void renderLines(gl::IBufferLineDrawer<float, uint8_t>& ld, float x) |
25 | 29 | { |
@@ -49,7 +53,7 @@ void renderLines(gl::IBufferLineDrawer<float, uint8_t>& ld, float x) | ||
49 | 53 | } |
50 | 54 | } |
51 | 55 | |
52 | -void render(UINT vk) | |
56 | +void render(UINT vk, uint16_t repeatCount) | |
53 | 57 | { |
54 | 58 | ::SetBkMode(hMemDC, TRANSPARENT); |
55 | 59 | ::SetTextColor(hMemDC, RGB(255,255,255)); |
@@ -67,6 +71,38 @@ void render(UINT vk) | ||
67 | 71 | break; |
68 | 72 | case 'N': |
69 | 73 | renderLines(lineDrawer_Nelson, 10); |
74 | + break; | |
75 | + case '1': | |
76 | + case VK_LEFT: | |
77 | + case VK_RIGHT: | |
78 | + case VK_UP: | |
79 | + case VK_DOWN: | |
80 | + { | |
81 | +// TRACE(_T("%d\n"), repeatCount); | |
82 | + float offset = 0.1 * repeatCount; | |
83 | + if (GetKeyState(VK_SHIFT) < 0) { | |
84 | + offset *= 10; | |
85 | + } | |
86 | + if (GetKeyState(VK_CONTROL) < 0) { | |
87 | + offset *= 100; | |
88 | + } | |
89 | + switch (vk) { | |
90 | + case VK_LEFT: | |
91 | + shiftX -= offset; | |
92 | + break; | |
93 | + case VK_RIGHT: | |
94 | + shiftX += offset; | |
95 | + break; | |
96 | + case VK_UP: | |
97 | + shiftY -= offset; | |
98 | + break; | |
99 | + case VK_DOWN: | |
100 | + shiftY += offset; | |
101 | + break; | |
102 | + } | |
103 | + shiftTest(buff, shiftX, shiftY); | |
104 | + } | |
105 | + break; | |
70 | 106 | } |
71 | 107 | } |
72 | 108 |
@@ -77,7 +113,13 @@ void OnKeyDown(WPARAM vk, LPARAM lparam) | ||
77 | 113 | case 'D': |
78 | 114 | case 'W': |
79 | 115 | case 'N': |
80 | - render(vk); | |
116 | + case '1': | |
117 | + case VK_LEFT: | |
118 | + case VK_RIGHT: | |
119 | + case VK_UP: | |
120 | + case VK_DOWN: | |
121 | + TRACE(_T("%0x\n"), lparam); | |
122 | + render(vk, lparam & 0x7FFF); | |
81 | 123 | ::InvalidateRect(hWnd, 0, 0); |
82 | 124 | ::UpdateWindow(hWnd); |
83 | 125 | break; |
@@ -0,0 +1,46 @@ | ||
1 | +#include "stdafx.h" | |
2 | + | |
3 | +#include "shift.h" | |
4 | + | |
5 | +void shift(const uint8_t* src, uint8_t* dst, size_t len, float offset) | |
6 | +{ | |
7 | + assert(offset >= 0.0f); | |
8 | + float inversed = 1.0f - offset; | |
9 | + uint8_t part; | |
10 | + uint8_t remain = 0; | |
11 | + for (size_t i=0; i<len; ++i) { | |
12 | + part = src[i] * inversed; | |
13 | + dst[i] = part + remain; | |
14 | + remain = src[i] - part; | |
15 | + } | |
16 | + dst[len] = remain; | |
17 | +} | |
18 | + | |
19 | +void shiftTest(gl::Buffer2D<uint8_t>& buff, float shiftX, float shiftY) | |
20 | +{ | |
21 | + uint8_t pat[16]; | |
22 | + for (size_t i=0; i<sizeof(pat); ++i) { | |
23 | + pat[i] = 0xff; | |
24 | + } | |
25 | + uint8_t pat2[17] = {0}; | |
26 | + | |
27 | + const float offset = shiftX / shiftY; | |
28 | + float curOffset = 0; | |
29 | + float ylen = shiftY; | |
30 | + for (size_t y=0; y<ylen; ++y) { | |
31 | + int io = (int) curOffset; | |
32 | + bool isMinus = curOffset < 0.0f; | |
33 | + float fracOffset = curOffset - io; | |
34 | + if (isMinus) { | |
35 | + fracOffset += 1.0f; | |
36 | + --io; | |
37 | + } | |
38 | + shift(pat, pat2, sizeof(pat), fracOffset); | |
39 | + for (size_t x=0; x<sizeof(pat2); ++x) { | |
40 | + buff.SetPixel(600+x+io, 10+y, pat2[x]); | |
41 | + } | |
42 | + curOffset += offset; | |
43 | + } | |
44 | + | |
45 | +} | |
46 | + |
@@ -0,0 +1,6 @@ | ||
1 | +#pragma once | |
2 | + | |
3 | +#include "gl/buffer2d.h" | |
4 | + | |
5 | +void shiftTest(gl::Buffer2D<uint8_t>& buff, float shiftX, float shiftY); | |
6 | + |
@@ -19,4 +19,6 @@ | ||
19 | 19 | |
20 | 20 | #include <stdint.h> |
21 | 21 | |
22 | +#include "trace.h" | |
23 | + | |
22 | 24 | // TODO: プログラムに必要な追加ヘッダーをここで参照してください。 |