diff --git a/animations/bitmapscroller.c b/animations/bitmapscroller.c index f66f02b..03cf810 100644 --- a/animations/bitmapscroller.c +++ b/animations/bitmapscroller.c @@ -25,17 +25,17 @@ typedef struct bitmap_t unsigned char nXDomain; /**< Last valid x-coordinate for viewport. */ unsigned char nYDomain; /**< Last valid y-coordinate for viewport. */ unsigned char nChunkDomain; /**< Last valid chunk for viewport. */ - unsigned char nChunkCount; /**< Amount of horiz. chunks of the bitmap. */ + unsigned char nChunkCount; /**< Amount of horiz. chunks of the bitmap.*/ } bitmap_t; /** * This function generates an eight-by-one pixel chunk for a given pair of pixel - * coordinates and a borg plane number. The resulting chunk can be copied - * directly to the borg's frame buffer. It makes use of the user provided - * "getChunk" function which in contrast only accepts chunk based coordinates - * (resulting in chunks whose x-coordinates are always a multiple of eight) and + * coordinates and a borg plane index. The resulting chunk can be copied + * directly to the borg's frame buffer. It utilizes the user provided "getChunk" + * function which in contrast only accepts chunk based coordinates (resulting in + * chunks whose pixel based x-coordinates are always a multiple of eight) and * uses bit planes which defer from the plane scheme used by the borg's frame * buffer. * @param pBitmap The bitmap of interest. @@ -55,25 +55,20 @@ static unsigned char bitmap_getAlignedChunk(bitmap_t const *const pBitmap, unsigned char nChunk = 0xFF; unsigned char nMask = 1; unsigned char const nAlignment = x % 8; + unsigned char const x_8 = x / 8; // we have to go through every bit plane - for (unsigned char i = 0; i < pBitmap->nBitPlanes; ++i) + for (unsigned char i = pBitmap->nBitPlanes; i--;) { // generate chunk unsigned char nPlaneChunk; - // if the given x-coordinate is aligned to a chunk coordinate we can - // reuse the result of the "getChunk" function directly. - if (nAlignment == 0) - { - nPlaneChunk = pBitmap->fpGetChunk(i, x/8, y, pBitmap->nFrame); - } + nPlaneChunk = pBitmap->fpGetChunk(i, x_8, y, pBitmap->nFrame) + << nAlignment; // in case of misalignment we combine two chunks with chunk based // coordinates into one chunk which aligns to the given x-coordinate - else + if (nAlignment != 0) { - nPlaneChunk = pBitmap->fpGetChunk(i, x/8, y, pBitmap->nFrame) - << nAlignment; - nPlaneChunk |= pBitmap->fpGetChunk(i, x/8+1, y, pBitmap->nFrame) + nPlaneChunk |= pBitmap->fpGetChunk(i, x_8 + 1, y, pBitmap->nFrame) >> (8 - nAlignment); } @@ -106,6 +101,9 @@ static void bitmap_drawViewport(bitmap_t const *const pBitmap, { for (unsigned char x = 0; x < pBitmap->nViewportWidth; x += 8) { + // determine correct column within frame buffer + unsigned char const nCol = pBitmap->nChunkCount - 1 - (x / 8); + for (unsigned char p = NUMPLANE; p--;) { // retrieve a chunk which can be copied into the frame buffer @@ -128,16 +126,14 @@ static void bitmap_drawViewport(bitmap_t const *const pBitmap, nX, nY + y) >> (8 - NUM_COLS % 8); } #endif - // determine correct column within frame buffer - uint8_t const nCol = pBitmap->nChunkCount - 1 - (x / 8); - // copy chunk into corresponding frame buffer plane - pixmap[p][y][nCol] = nChunk; // if a bit in plane p + 1 is set, the corresponding bit in p // has to be set as well if (p < (NUMPLANE - 1)) { - pixmap[p][y][nCol] |= pixmap[p + 1][y][nCol]; + nChunk |= pixmap[p + 1][y][nCol]; } + // copy chunk into corresponding frame buffer plane + pixmap[p][y][nCol] = nChunk; } } } @@ -215,9 +211,6 @@ void bitmap_scroll(unsigned char const nWidth, signed char dx = 0; signed char dy = 0; - // remove garbage from screen - clear_screen(0); - for (bitmap.nFrame = 0; bitmap.nFrame < nFrameCount; ++bitmap.nFrame) { bitmap_drawViewport(&bitmap, x, y);