グラフィックス用のメモリーへの書き込みで描画できるようにします。
そのため SetPixel 関数を以下の関数で置き換えます。
const int g_gwidth = 512; const int g_gheight = 512; int16_t g_gmemory[g_gheight][g_gwidth]; inline COLORREF SetPixel(HDC hdc, int x, int y, COLORREF color) { g_gmemory[y][x] = color; return color; }
実行時には g_gmemory は 0xc00000 に設定します。
実行例(長方形の描画)
前回のコードをコンパイルすると以下のようなアセンブリ言語のコードが得られます。g_gmemory の定義を追加しています。
_Z19DirectDrawRectanglePiiiiim: movem.l #7184,-(%sp) move.l 24(%sp),%d1 move.l 28(%sp),%d2 move.l 36(%sp),%d3 move.l 40(%sp),%a2 move.l %d2,%d0 moveq #9,%d4 lsl.l %d4,%d0 move.l %d0,%a0 add.l %d1,%a0 add.l %a0,%a0 add.l #g_gmemory,%a0 move.l %d3,%d5 moveq #10,%d0 lsl.l %d0,%d5 move.l %a0,%a1 move.l %d1,%d4 move.l %d1,%d0 add.l 32(%sp),%d0 .L144: cmp.l %d0,%d4 jlt .L145 add.l %d2,%d3 neg.l %d1 add.l %d1,%d1 move.l %d0,%a1 add.l %d0,%a1 .L146: cmp.l %d3,%d2 jlt .L147 movem.l (%sp)+,#2104 rts .L145: move.w %a2,(%a1) move.w %a2,(%a1,%d5.l) addq.l #1,%d4 addq.l #2,%a1 jra .L144 .L147: move.w %a2,(%a0) lea (%a0,%d1.l),%a3 move.w %a2,(%a3,%a1.l) addq.l #1,%d2 lea (1024,%a0),%a0 jra .L146 g_gmemory: *const 0xc00000
実行例(塗りつぶした長方形の描画)
前回のコードをコンパイルすると以下のようなアセンブリ言語のコードが得られます。g_gmemory の定義を追加しています。
_Z19DirectFillRectanglePiiiiim: move.l %d3,-(%sp) move.l 12(%sp),%a1 move.l 16(%sp),%d1 move.l %d1,%d2 add.l 24(%sp),%d2 move.l %a1,%a2 add.l 20(%sp),%a2 .L149: cmp.l %d2,%d1 jge .L148 move.l %d1,%d0 moveq #10,%d3 lsl.l %d3,%d0 move.l %d0,%a0 add.l #g_gmemory,%a0 move.l %a1,%d0 jra .L152 .L150: move.l %d0,%d3 add.l %d0,%d3 move.w 30(%sp),(%a0,%d3.l) addq.l #1,%d0 .L152: cmp.l %a2,%d0 jlt .L150 addq.l #1,%d1 jra .L149 .L148: move.l (%sp)+,%d3 rts g_gmemory: *const 0xc00000

