You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
1.9 KiB
84 lines
1.9 KiB
/* Draws a half-transparent rectangle by blacking out odd pixels on odd lines, |
|
* even pixels on even lines. |
|
* |
|
* TRANS_RECT_X = x offset of upper-left corner |
|
* TRANS_RECT_Y = y offset of upper-left corner |
|
* TRANS_RECT_WIDTH = width of rectangle |
|
* TRANS_RECT_HEIGHT = height of rectangle |
|
*/ |
|
|
|
#if !defined(TRANS_RECT_X) || !defined(TRANS_RECT_Y) || !defined(TRANS_RECT_WIDTH) || !defined(TRANS_RECT_HEIGHT) |
|
#error ASM_TRANS_RECT: Parameter not set |
|
#endif |
|
|
|
#if defined(_MSC_VER) && defined(_M_IX86) |
|
__asm { |
|
mov edi, gpBuffer |
|
; origin is at 64,160 |
|
add edi, (SCREEN_Y + TRANS_RECT_Y + TRANS_RECT_HEIGHT - 1) * BUFFER_WIDTH + 64 + TRANS_RECT_X |
|
xor eax, eax |
|
mov edx, TRANS_RECT_HEIGHT >> 1 |
|
yloop: |
|
mov ecx, TRANS_RECT_WIDTH >> 1 |
|
x0loop: |
|
stosb |
|
inc edi |
|
loop x0loop |
|
#if (TRANS_RECT_WIDTH & 1) |
|
stosb |
|
#endif |
|
sub edi, BUFFER_WIDTH + TRANS_RECT_WIDTH |
|
mov ecx, TRANS_RECT_WIDTH >> 1 |
|
x1loop: |
|
inc edi |
|
stosb |
|
loop x1loop |
|
sub edi, BUFFER_WIDTH + (TRANS_RECT_WIDTH & ~1) |
|
dec edx |
|
jnz yloop |
|
#if (TRANS_RECT_HEIGHT & 1) |
|
mov ecx, TRANS_RECT_WIDTH >> 1 |
|
x2loop: |
|
stosb |
|
inc edi |
|
loop x2loop |
|
#if (TRANS_RECT_WIDTH & 1) |
|
stosb |
|
#endif |
|
#endif |
|
} |
|
#else // _MSC_VER && _M_IX86 |
|
{ |
|
int row, col; |
|
BYTE *pix = &gpBuffer[SCREENXY(TRANS_RECT_X, TRANS_RECT_Y + TRANS_RECT_HEIGHT - 1)]; |
|
for (row = TRANS_RECT_HEIGHT >> 1; row != 0; row--) { |
|
for (col = TRANS_RECT_WIDTH >> 1; col != 0; col--) { |
|
*pix++ = 0; |
|
pix++; |
|
} |
|
#if (TRANS_RECT_WIDTH & 1) |
|
*pix++ = 0; |
|
#endif |
|
pix -= BUFFER_WIDTH + TRANS_RECT_WIDTH; |
|
for (col = TRANS_RECT_WIDTH >> 1; col != 0; col--) { |
|
pix++; |
|
*pix++ = 0; |
|
} |
|
pix -= BUFFER_WIDTH + (TRANS_RECT_WIDTH & ~1); |
|
} |
|
#if (TRANS_RECT_HEIGHT & 1) |
|
for (col = TRANS_RECT_WIDTH >> 1; col != 0; col--) { |
|
*pix++ = 0; |
|
pix++; |
|
} |
|
#if (TRANS_RECT_WIDTH & 1) |
|
*pix++ = 0; |
|
#endif |
|
#endif |
|
} |
|
#endif |
|
|
|
#undef TRANS_RECT_Y |
|
#undef TRANS_RECT_X |
|
#undef TRANS_RECT_WIDTH |
|
#undef TRANS_RECT_HEIGHT
|
|
|