convert colour to a 2 bit format

This commit is contained in:
2025-01-24 16:29:22 +01:00
parent c80cf60d52
commit 23a27e3e10
5 changed files with 43 additions and 35 deletions

22
src/window/colour.h Normal file
View File

@@ -0,0 +1,22 @@
#pragma once
// fits colours with each channel having a width of 2 bits
#include <stdint.h>
typedef union {
uint8_t packed;
struct {
uint8_t a : 2;
uint8_t b : 2;
uint8_t g : 2;
uint8_t r : 2;
};
} Colour;
#define COLOUR_RED ((Colour){0b11000011})
#define COLOUR_YELLOW ((Colour){0b11110011})
#define COLOUR_ORANGE ((Colour){0b11100011})
#define COLOUR_GREEN ((Colour){0b00110011})
#define COLOUR_CYAN ((Colour){0b00111111})
#define COLOUR_BLUE ((Colour){0b00001111})
#define COLOUR_MAGENTA ((Colour){0b11001111})

View File

@@ -5,6 +5,7 @@
#include <stdio.h>
#include "../errors.h"
#include "colour.h"
#include "renderer.h"
@@ -40,12 +41,12 @@ void renderer_update(const RenderData* render_data) {
Row row = data->row[y];
for (uint8_t x = 0; x < COLUMNS; x++) {
if (row.columns[x].block != 0) {
if (row.columns[x].packed != 0) {
success |= SDL_SetRenderDrawColor(renderer,
0xFF * !!(row.columns[x].block & RED),
0xFF * !!(row.columns[x].block & GREEN),
0xFF * !!(row.columns[x].block & BLUE),
0xFF);
0x55 * row.columns[x].r, // repeat the 2 bits by multiplying by 0x55
0x55 * row.columns[x].g,
0x55 * row.columns[x].b,
0x55 * row.columns[x].a);
success |= SDL_RenderFillRect(renderer, &(SDL_Rect){x * BLOCK_WIDTH + 1, y * BLOCK_HEIGHT + 1, BLOCK_WIDTH - 1, BLOCK_HEIGHT - 1});
}
}

View File

@@ -1,5 +1,6 @@
#pragma once
#include <SDL2/SDL.h>
#include <stdint.h>
#include "../game/game.h"
@@ -8,19 +9,6 @@
#define BLOCK_WIDTH (SCREEN_WIDTH / COLUMNS)
#define BLOCK_HEIGHT (SCREEN_HEIGHT / ROWS)
// fits colours in a 3 bit length
// 4th bit is unused
typedef enum {
BLACK = 0,
RED = 1,
GREEN = 2,
BLUE = 4,
YELLOW = RED | GREEN,
CYAN = GREEN | BLUE,
MAGENTA = BLUE | RED,
WHITE = RED | GREEN | BLUE,
} Colour;
typedef struct {
SDL_Window* window;
SDL_Renderer* renderer;