86 lines
2.2 KiB
C
86 lines
2.2 KiB
C
#include "screen.h"
|
|
#include "types.h"
|
|
|
|
#include <clib/exec_protos.h>
|
|
#include <exec/memory.h>
|
|
|
|
/**
|
|
* Includes double buffer space
|
|
*/
|
|
#define TOTAL_SCREEN_SETUP_SIZE(s) ((s->width / 8) * s->height * s->bitplanes * 2)
|
|
|
|
/**
|
|
* Stores internal allocation details in screenSetup.
|
|
* Sets current
|
|
*/
|
|
void allocateDoubleBufferedScreenMemory(
|
|
struct ScreenDefinition *screenDefinition,
|
|
struct ActiveScreenBufferDetails *activeScreenBufferDetails,
|
|
uint16_t width,
|
|
uint16_t height,
|
|
uint8_t bitplanes
|
|
) {
|
|
unsigned char *memory;
|
|
int buffer, plane;
|
|
|
|
screenDefinition->width = width;
|
|
screenDefinition->height = height;
|
|
screenDefinition->bitplanes = bitplanes;
|
|
|
|
memory = (unsigned char *)AllocMem(
|
|
TOTAL_SCREEN_SETUP_SIZE(screenDefinition),
|
|
MEMF_CLEAR | MEMF_CHIP
|
|
);
|
|
|
|
screenDefinition->memoryStart = memory;
|
|
screenDefinition->byteWidth = width / 8;
|
|
|
|
// memory is not interleaved
|
|
screenDefinition->nextBitplaneAdvance = screenDefinition->byteWidth * height;
|
|
screenDefinition->nextBufferAdvance = screenDefinition->nextBitplaneAdvance * bitplanes;
|
|
|
|
for (buffer = 0; buffer < 2; ++buffer) {
|
|
for (plane = 0; plane < bitplanes; ++plane) {
|
|
screenDefinition->bufferPlanes[buffer][plane] = screenDefinition->memoryStart +
|
|
buffer * screenDefinition->nextBufferAdvance +
|
|
plane * screenDefinition->nextBitplaneAdvance;
|
|
}
|
|
}
|
|
|
|
setActiveScreenBuffer(screenDefinition, activeScreenBufferDetails, 0);
|
|
}
|
|
|
|
void teardownScreen(
|
|
struct ScreenDefinition *screenDefinition
|
|
) {
|
|
FreeMem(
|
|
screenDefinition->memoryStart,
|
|
TOTAL_SCREEN_SETUP_SIZE(screenDefinition)
|
|
);
|
|
}
|
|
|
|
void setActiveScreenBuffer(
|
|
struct ScreenDefinition *screenDefinition,
|
|
struct ActiveScreenBufferDetails *currentScreen,
|
|
short int buffer
|
|
) {
|
|
int plane;
|
|
currentScreen->currentBuffer = buffer;
|
|
|
|
for (plane = 0; plane < screenDefinition->bitplanes; ++plane) {
|
|
currentScreen->planes[plane] = screenDefinition->bufferPlanes[buffer][plane];
|
|
}
|
|
}
|
|
|
|
void swapCurrentScreenBuffer(
|
|
struct ScreenDefinition *screenDefinition,
|
|
struct ActiveScreenBufferDetails *currentScreen
|
|
) {
|
|
setActiveScreenBuffer(
|
|
screenDefinition,
|
|
currentScreen,
|
|
1 - currentScreen->currentBuffer
|
|
);
|
|
}
|
|
|