void draw_graphics()
{
if (!draw_this_line)
return;
if (ud_border_on)
{
draw_background();
return;
}
int p = _chunkyIndex + x_scroll;
//byte* c = stackalloc byte[4]; // NOTE: stackalloc is not implemented on all .NET Compact Framework CLRs
//fixed (byte* c = new byte[4]) // One workable alternative to stackalloc, but this allocated memory from the heap (causing more fragmentation)
//FourBytes fourBytes;
byte[] colorBuffer = new byte[4];
//byte* c = &fourBytes.first; // Another alternative to stackalloc, which is also allocated on the stack and compatible with .NET Compact Framework
{
byte colorMask;
switch (display_idx)
{
case 0: // Standard text
colorBuffer[0] = b0c_color;
colorBuffer[1] = colors[color_data];
goto draw_std;
case 1: // Multicolor text
if ((color_data & 8) != 0)
{
colorBuffer[0] = b0c_color;
colorBuffer[1] = b1c_color;
colorBuffer[2] = b2c_color;
colorBuffer[3] = colors[color_data & 7];
goto draw_multi;
}
else
{
colorBuffer[0] = b0c_color;
colorBuffer[1] = colors[color_data];
goto draw_std;
}
case 2: // Standard bitmap
colorBuffer[0] = colors[char_data];
colorBuffer[1] = colors[char_data >> 4];
goto draw_std;
case 3: // Multicolor bitmap
colorBuffer[0] = b0c_color;
colorBuffer[1] = colors[char_data >> 4];
colorBuffer[2] = colors[char_data];
colorBuffer[3] = colors[color_data];
goto draw_multi;
case 4: // ECM text
if ((char_data & 0x80) != 0)
if ((char_data & 0x40) != 0)
colorBuffer[0] = b3c_color;
else
colorBuffer[0] = b2c_color;
else
if ((char_data & 0x40) != 0)
colorBuffer[0] = b1c_color;
else
colorBuffer[0] = b0c_color;
colorBuffer[1] = colors[color_data];
goto draw_std;
case 5: // Invalid multicolor text
//p[0] = p[1] = p[2] = p[3] = p[4] = p[5] = p[6] = p[7] = colors[0];
_display.SetPixels(p, 8, colors[0]);
if ((color_data & 8) != 0)
{
// TODO
//fore_mask_ptr[0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
//fore_mask_ptr[1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
fore_mask_buf[fore_mask_index + 0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
fore_mask_buf[fore_mask_index + 1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
}
else
{
// TODO
//fore_mask_ptr[0] |= (byte)(gfx_data >> x_scroll);
//fore_mask_ptr[1] |= (byte)(gfx_data << (7 - x_scroll));
fore_mask_buf[fore_mask_index + 0] |= (byte)(gfx_data >> x_scroll);
fore_mask_buf[fore_mask_index + 1] |= (byte)(gfx_data << (7 - x_scroll));
}
return;
case 6: // Invalid standard bitmap
//p[0] = p[1] = p[2] = p[3] = p[4] = p[5] = p[6] = p[7] = colors[0];
_display.SetPixels(p, 8, colors[0]);
// TODO
//fore_mask_ptr[0] |= (byte)(gfx_data >> x_scroll);
//fore_mask_ptr[1] |= (byte)(gfx_data << (7 - x_scroll));
fore_mask_buf[fore_mask_index + 0] |= (byte)(gfx_data >> x_scroll);
fore_mask_buf[fore_mask_index + 1] |= (byte)(gfx_data << (7 - x_scroll));
return;
case 7: // Invalid multicolor bitmap
//p[0] = p[1] = p[2] = p[3] = p[4] = p[5] = p[6] = p[7] = colors[0];
_display.SetPixels(p, 8, colors[0]);
// TODO
//fore_mask_ptr[0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
//fore_mask_ptr[1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
fore_mask_buf[fore_mask_index + 0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
fore_mask_buf[fore_mask_index + 1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
return;
default: // Can't happen
return;
}
draw_std:
// TODO
//fore_mask_ptr[0] |= (byte)(gfx_data >> x_scroll);
//fore_mask_ptr[1] |= (byte)(gfx_data << (7 - x_scroll));
fore_mask_buf[fore_mask_index + 0] |= (byte)(gfx_data >> x_scroll);
fore_mask_buf[fore_mask_index + 1] |= (byte)(gfx_data << (7 - x_scroll));
colorMask = gfx_data;
/*
_display.SetPixel(p + 7, fourBytes[data & 1]); data >>= 1;
_display.SetPixel(p + 6, fourBytes[data & 1]); data >>= 1;
_display.SetPixel(p + 5, fourBytes[data & 1]); data >>= 1;
_display.SetPixel(p + 4, fourBytes[data & 1]); data >>= 1;
_display.SetPixel(p + 3, fourBytes[data & 1]); data >>= 1;
_display.SetPixel(p + 2, fourBytes[data & 1]); data >>= 1;
_display.SetPixel(p + 1, fourBytes[data & 1]); data >>= 1;
_display.SetPixel(p + 0, fourBytes[data]);
*/
_display.SetPixelsStd(p, colorBuffer, colorMask);
return;
draw_multi:
// TODO
//fore_mask_ptr[0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
//fore_mask_ptr[1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
//fore_mask_buf[fore_mask_buf_index + 0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
//fore_mask_buf[fore_mask_buf_index + 1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
fore_mask_buf[fore_mask_index + 0] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) >> x_scroll);
fore_mask_buf[fore_mask_index + 1] |= (byte)(((gfx_data & 0xaa) | (gfx_data & 0xaa) >> 1) << (8 - x_scroll));
colorMask = gfx_data;
/*
_display.SetPixel(p + 7, fourBytes[data & 3]);
_display.SetPixel(p + 6, fourBytes[data & 3]);
data >>= 2;
_display.SetPixel(p + 5, fourBytes[data & 3]);
_display.SetPixel(p + 4, fourBytes[data & 3]);
data >>= 2;
_display.SetPixel(p + 3, fourBytes[data & 3]);
_display.SetPixel(p + 2, fourBytes[data & 3]);
data >>= 2;
_display.SetPixel(p + 1, fourBytes[data & 3]);
_display.SetPixel(p + 0, fourBytes[data & 3]);
*/
_display.SetPixelsMulti(p, colorBuffer, colorMask);
return;
}
}