Allow negative x and y, no longer draws by block, but by pixel
This commit is contained in:
parent
fbb34c1b5a
commit
2731ddfe14
6
Makefile
6
Makefile
|
@ -63,6 +63,7 @@ AS = arm-none-eabi-gcc -x assembler-with-cpp
|
|||
CP = arm-none-eabi-objcopy
|
||||
AR = arm-none-eabi-ar
|
||||
SZ = arm-none-eabi-size
|
||||
GDB = arm-none-eabi-gdb
|
||||
HEX = $(CP) -O ihex
|
||||
BIN = $(CP) -O binary -S
|
||||
|
||||
|
@ -138,7 +139,10 @@ clean:
|
|||
|
||||
flash: all
|
||||
st-flash write $(BUILD_DIR)/$(TARGET).bin 0x8000000
|
||||
|
||||
|
||||
debug: all
|
||||
$(GDB) --eval-command="tar extended-remote :4242" $(BUILD_DIR)/$(TARGET).elf
|
||||
|
||||
#######################################
|
||||
# dependencies
|
||||
#######################################
|
||||
|
|
|
@ -58,38 +58,34 @@ void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1)
|
|||
}
|
||||
|
||||
static int anim = 1;
|
||||
static int x = 0;
|
||||
static int x = -64;
|
||||
|
||||
void ssd1306_LoadImage(void) {
|
||||
//memcpy(SSD1306_Buffer, image, 1024);
|
||||
fastlz_decompress(image, 1024, SSD1306_Buffer, 1024);
|
||||
}
|
||||
|
||||
void ssd1306_DrawSprite(SpriteDef *sprite, int x, int y, int mode) {
|
||||
void ssd1306_DrawSprite(SpriteDef *sprite, int x, int y) {
|
||||
int spriteAddr = 0;
|
||||
int currX, currY = y;
|
||||
|
||||
for(int bank = y / 8; bank < sprite->height / 8; bank++) {
|
||||
int start = (bank * sprite->width) + (bank * sprite->height) + (x);
|
||||
for(int bank = currY / 8; bank < sprite->height / 8; bank++) {
|
||||
currX = x;
|
||||
int start = (bank * sprite->width) + (bank * sprite->height) + (x);
|
||||
int end = start + sprite->width;
|
||||
|
||||
for(int addr = start; addr < end; addr++) {
|
||||
if (currX >= 0 && currY >= 0 && currX < SSD1306_WIDTH && currY < SSD1306_HEIGHT) {
|
||||
switch(mode) {
|
||||
case 0:
|
||||
SSD1306_Buffer[addr] = sprite->buffer[spriteAddr];
|
||||
break;
|
||||
case 1:
|
||||
SSD1306_Buffer[addr] |= sprite->buffer[spriteAddr];
|
||||
break;
|
||||
case 2:
|
||||
SSD1306_Buffer[addr] &= sprite->buffer[spriteAddr];
|
||||
break;
|
||||
case 3:
|
||||
SSD1306_Buffer[addr] ^= sprite->buffer[spriteAddr];
|
||||
break;
|
||||
if (spriteAddr < (sprite->height * sprite->width / 8) ) {
|
||||
for(int bit = 0; bit < 8; bit++) {
|
||||
if ((sprite->buffer[spriteAddr] >> bit) & 0x01) {
|
||||
int16_t newY = bit + currY;
|
||||
if (currX >= 0 && newY >= 0 && currX < SSD1306_WIDTH && newY < SSD1306_HEIGHT) {
|
||||
ssd1306_DrawPixel(currX, newY, White);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
spriteAddr++;
|
||||
currX++;
|
||||
}
|
||||
|
@ -118,10 +114,12 @@ void ssd1306_Anim(void) {
|
|||
break;
|
||||
}
|
||||
|
||||
ssd1306_DrawSprite(sprite, x, 0, 1);
|
||||
ssd1306_DrawSprite(sprite, x, 0);
|
||||
//ssd1306_DrawSprite(sprite, x, -50, 1);
|
||||
|
||||
anim++;
|
||||
x += 15;
|
||||
//x += 15;
|
||||
x += 1;
|
||||
|
||||
if (anim == 5) {
|
||||
anim = 1;
|
||||
|
|
Loading…
Reference in New Issue