void ClipSpriteX8_ORnew(short x, short y, short h, unsigned char *sprite, short bytewidth, unsigned char *dest) { unsigned short bit_r, bit_l, spr_jump; unsigned short i, j; short skip_row, x_row, first_byte; unsigned char clipped; // No bytewidth may exceed 30 //if (bytewidth > 30) // return; // Return if will never see if (x <= -(bytewidth << 3) || y <= -h || x > 239 || y > 127) return; // Clip Y axis if (y < 0) { h += y; // Change h to new height sprite -= (bytewidth * y); // Walk sprite pointer down to clip y = 0; // Set to 0 } if (y > (128 - h)) h -= (y - 120); // Change H // Clip X Axis Bytes spr_jump = 0; while (x < -7) { x += 8; sprite++; spr_jump++; bytewidth--; } while ((x + (bytewidth << 3)) > 247) { spr_jump++; bytewidth--; } // Calculate first_byte = (y * 30) + (x >> 3); bit_r = x & 7; bit_l = 8 - bit_r; dest += first_byte; skip_row = 30 - bytewidth; FontSetSys(F_4x6); printf("x: %d, y: %d, bit_r: %d, bit_l: %d, first_byte: %d, spr_jump: %d\n", x,y, bit_r, bit_l, first_byte, spr_jump); for(i=0; i<(unsigned short)h; i++) { x_row = x; for(j=0; j<(unsigned short)bytewidth; j++) { // Clip X if (x_row < 0) { clipped = *sprite << -x_row; clipped >>= -x_row; } else if (x_row > 232) { clipped = *sprite >> (x_row - 232); clipped <<= (x_row - 232); } else clipped = *sprite; // OR Sprite Now *dest |= clipped >> bit_r; if (bit_r) *(dest + 1) |= clipped << bit_l; // Walk Pointers sprite++; // Walk Sprite Pointer dest++; // Dest Walk Pointer x_row += 8; // Onto next byte } dest += skip_row; // Walk Dest Pointer to next row sprite += spr_jump; // Walk Sprite Pointer to new row } }