void CLRFCB() // CLRFCB { XFCB(); // XFCB Push(0x002c); Push(0); FILL_2(); // FILL_2 NAM(); // NAM Push(0x000b); Push(Read16(cc_BL)); // BL FILL_2(); // FILL_2 Push(0); XFCB(); // XFCB C_ex__2(); // C!_2 }
static inline void do_fillrect(uint8 *dest, uint32 color, uint32 length) { #define FILL_1(PTR, OFS, VAL) ((uint8 *)(PTR))[OFS] = (VAL) #define FILL_2(PTR, OFS, VAL) ((uint16 *)(PTR))[OFS] = (VAL) #define FILL_4(PTR, OFS, VAL) ((uint32 *)(PTR))[OFS] = (VAL) #define FILL_8(PTR, OFS, VAL) ((uint64 *)(PTR))[OFS] = (VAL) #ifndef UNALIGNED_PROFITABLE // Align on 16-bit boundaries if (bpp < 16 && (((uintptr)dest) & 1)) { FILL_1(dest, 0, color); dest += 1; length -= 1; } // Align on 32-bit boundaries if (bpp < 32 && (((uintptr)dest) & 2)) { FILL_2(dest, 0, color); dest += 2; length -= 2; } #endif // Fill 8-byte words if (length >= 8) { const uint64 c = (((uint64)color) << 32) | color; const int r = (length / 8) % 8; dest += r * 8; int n = ((length / 8) + 7) / 8; switch (r) { case 0: do { dest += 64; FILL_8(dest, -8, c); case 7: FILL_8(dest, -7, c); case 6: FILL_8(dest, -6, c); case 5: FILL_8(dest, -5, c); case 4: FILL_8(dest, -4, c); case 3: FILL_8(dest, -3, c); case 2: FILL_8(dest, -2, c); case 1: FILL_8(dest, -1, c); } while (--n > 0); } } // 32-bit cell to fill? if (length & 4) { FILL_4(dest, 0, color); if (bpp <= 16) dest += 4; } // 16-bit cell to fill? if (bpp <= 16 && (length & 2)) { FILL_2(dest, 0, color); if (bpp <= 8) dest += 2; } // 8-bit cell to fill? if (bpp <= 8 && (length & 1)) FILL_1(dest, 0, color); #undef FILL_1 #undef FILL_2 #undef FILL_4 #undef FILL_8 }