// [RH] Set an area to a specified color void DCanvas::Clear (int left, int top, int right, int bottom, int color) const { int x, y; if (is8bit()) { byte *dest; dest = buffer + top * pitch + left; x = right - left; for (y = top; y < bottom; y++) { memset (dest, color, x); dest += pitch; } } else { unsigned int *dest; dest = (unsigned int *)(buffer + top * pitch + (left << 2)); right -= left; for (y = top; y < bottom; y++) { for (x = 0; x < right; x++) { dest[x] = color; } dest += pitch >> 2; } } }
static void fxputc(FILE *f, int ch) { /* drop any sign */ ch = ch&0xff; /* on 7-bit terminals, strip high bit */ if (!is8bit()) ch &= 0x7f; /* * Assume anything that isn't a control character is printable. * We can't count on locale stuff to tell us what's printable * because we might be looking at someone who uses different * locale settings or is on the other side of the planet. So, * strip 0-31, 127, 128-159, and 255. Note that not stripping * 128-159 is asking for trouble, as 155 (M-esc) is interpreted * as esc-[ by most terminals. Hopefully this won't break anyone's * charset. * * It would be nice if we could set the terminal to display in the * right charset, but we have no way to know what it is. feh. */ if (((ch&0x7f) >= 32 && (ch&0x7f) != 0x7f) || ch=='\t') { putc(ch, f); return; } if (ch=='\n') { if (send_crs) putc('\r', f); putc('\n', f); return; } if (ch&0x80) { putc('M', f); putc('-', f); ch &= 0x7f; } putc('^', f); if (ch==0x7f) putc('?', f); else putc(ch+'@', f); }
// [RH] Fill an area with a 64x64 flat texture // right and bottom are one pixel *past* the boundaries they describe. void DCanvas::FlatFill (int left, int top, int right, int bottom, const byte *src) const { int x, y; int advance; int width; width = right - left; right = width >> 6; if (is8bit()) { byte *dest; advance = pitch - width; dest = buffer + top * pitch + left; for (y = top; y < bottom; y++) { for (x = 0; x < right; x++) { memcpy (dest, src + ((y&63)<<6), 64); dest += 64; } if (width & 63) { memcpy (dest, src + ((y&63)<<6), width & 63); dest += width & 63; } dest += advance; } } else { unsigned int *dest; int z; const byte *l; advance = (pitch - (width << 2)) >> 2; dest = (unsigned int *)(buffer + top * pitch + (left << 2)); for (y = top; y < bottom; y++) { l = src + ((y&63)<<6); for (x = 0; x < right; x++) { for (z = 0; z < 64; z += 4, dest += 4) { // Try and let the optimizer pair this on a Pentium // (even though VC++ doesn't anyway) dest[0] = V_Palette[l[z]]; dest[1] = V_Palette[l[z+1]]; dest[2] = V_Palette[l[z+2]]; dest[3] = V_Palette[l[z+3]]; } } if (width & 63) { // Do any odd pixel left over if (width & 1) *dest++ = V_Palette[l[0]]; // Do the rest of the pixels for (z = 1; z < (width & 63); z += 2, dest += 2) { dest[0] = V_Palette[l[z]]; dest[1] = V_Palette[l[z+1]]; } } dest += advance; } } }