• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

line rasterizer test


Commit MetaInfo

Revisiond221f08d499ffa014dabf7749b2abb08cf248d06 (tree)
Time2011-02-07 07:39:37
Authorberu <berupon@gmai...>
Commiterberu

Log Message

subpixel horizontal shift

Change Summary

Incremental Difference

--- a/lines.vcproj
+++ b/lines.vcproj
@@ -177,6 +177,10 @@
177177 >
178178 </File>
179179 <File
180+ RelativePath=".\shift.cpp"
181+ >
182+ </File>
183+ <File
180184 RelativePath=".\stdafx.cpp"
181185 >
182186 <FileConfiguration
@@ -219,6 +223,10 @@
219223 >
220224 </File>
221225 <File
226+ RelativePath=".\shift.h"
227+ >
228+ </File>
229+ <File
222230 RelativePath=".\stdafx.h"
223231 >
224232 </File>
--- a/main_plus.h
+++ b/main_plus.h
@@ -8,6 +8,8 @@
88 #include "gl/lineDrawer8_Wu.h"
99 #include "gl/lineDrawer8_Nelson.h"
1010
11+#include "shift.h"
12+
1113 HWND hWnd;
1214 HBITMAP hBMP;
1315 std::vector<uint8_t> bmiBuff(sizeof(BITMAPINFO) + sizeof(RGBQUAD) * 256);
@@ -20,6 +22,8 @@ gl::LineDrawer8_Bresenham<float> lineDrawer_Bresenham;
2022 gl::LineDrawer8_DDA<float> lineDrawer_DDA;
2123 gl::LineDrawer8_Wu<float> lineDrawer_Wu;
2224 gl::LineDrawer8_Nelson<float> lineDrawer_Nelson;
25+float shiftX = 128;
26+float shiftY = 1024;
2327
2428 void renderLines(gl::IBufferLineDrawer<float, uint8_t>& ld, float x)
2529 {
@@ -49,7 +53,7 @@ void renderLines(gl::IBufferLineDrawer<float, uint8_t>& ld, float x)
4953 }
5054 }
5155
52-void render(UINT vk)
56+void render(UINT vk, uint16_t repeatCount)
5357 {
5458 ::SetBkMode(hMemDC, TRANSPARENT);
5559 ::SetTextColor(hMemDC, RGB(255,255,255));
@@ -67,6 +71,38 @@ void render(UINT vk)
6771 break;
6872 case 'N':
6973 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;
70106 }
71107 }
72108
@@ -77,7 +113,13 @@ void OnKeyDown(WPARAM vk, LPARAM lparam)
77113 case 'D':
78114 case 'W':
79115 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);
81123 ::InvalidateRect(hWnd, 0, 0);
82124 ::UpdateWindow(hWnd);
83125 break;
--- /dev/null
+++ b/shift.cpp
@@ -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+
--- /dev/null
+++ b/shift.h
@@ -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+
--- a/stdafx.h
+++ b/stdafx.h
@@ -19,4 +19,6 @@
1919
2020 #include <stdint.h>
2121
22+#include "trace.h"
23+
2224 // TODO: プログラムに必要な追加ヘッダーをここで参照してください。