Synchronet now requires the libarchive development package (e.g. libarchive-dev on Debian-based Linux distros, libarchive.org for more info) to build successfully.

Commit 75bd66f1 authored by Deucе's avatar Deucе 👌🏾

Optimize color_value() and fix RIP reset

color_value() is in the hot drawing path, so should be as fast
as possible... remove all the bit shifting and have the palette
just be colour values.

For RIP, the reset wasn't resetting the global coordinates, so a
scaled image would cause everything to be scaled down later.
parent 1075cd28
Pipeline #2098 passed with stage
in 8 minutes and 28 seconds
......@@ -23,13 +23,7 @@
#include "vidmodes.h"
#include "bitmap_con.h"
struct palette_entry {
uint8_t red;
uint8_t green;
uint8_t blue;
};
static struct palette_entry palette[65536];
static uint32_t palette[65536];
#if 0
......@@ -441,8 +435,9 @@ static uint32_t color_value(uint32_t col)
if (col & 0x80000000)
return col;
if (col < sizeof(palette) / sizeof(palette[0]))
return (0xff << 24) | (palette[col].red << 16) | (palette[col].green << 8) | palette[col].blue;
return palette[col];
fprintf(stderr, "Invalid colour value: %08x\n", col);
return 0xff000000;
}
static struct rectlist *get_full_rectangle_locked(struct bitmap_screen *screen)
......@@ -1545,9 +1540,7 @@ int bitmap_setpalette(uint32_t index, uint16_t r, uint16_t g, uint16_t b)
pthread_mutex_lock(&blinker_lock);
pthread_mutex_lock(&screena.screenlock);
pthread_mutex_lock(&screenb.screenlock);
palette[index].red = r>>8;
palette[index].green = g>>8;
palette[index].blue = b>>8;
palette[index] = (0xff << 24) | ((r>>8) << 16) | ((g>>8) << 8) | (b>>8);
screena.update_pixels = 1;
screenb.update_pixels = 1;
pthread_mutex_unlock(&screenb.screenlock);
......@@ -1676,9 +1669,7 @@ int bitmap_drv_init(void (*drawrect_cb) (struct rectlist *data)
pthread_mutex_lock(&screena.screenlock);
pthread_mutex_lock(&screenb.screenlock);
for (i = 0; i < sizeof(dac_default)/sizeof(struct dac_colors); i++) {
palette[i].red = dac_default[i].red;
palette[i].green = dac_default[i].green;
palette[i].blue = dac_default[i].blue;
palette[i] = (0xff << 24) | (dac_default[i].red << 16) | (dac_default[i].green << 8) | dac_default[i].blue;
}
pthread_mutex_unlock(&screenb.screenlock);
pthread_mutex_unlock(&screena.screenlock);
......
......@@ -598,7 +598,7 @@ static void ciolib_window(struct cterminal *cterm,int sx, int sy, int ex, int ey
GOTOXY(1,1);
}
static int ciolib_cputs(struct cterminal *cterm, char *str)
static int ciolib_cputs(struct cterminal *cterm, const char *str)
{
int pos;
int ret=0;
......
......@@ -238,7 +238,7 @@ struct cterminal {
int (*ciolib_putch) (struct cterminal *,int);
int (*ciolib_puttext) (struct cterminal *,int,int,int,int,void *);
void (*ciolib_window) (struct cterminal *,int,int,int,int);
int (*ciolib_cputs) (struct cterminal *,char *);
int (*ciolib_cputs) (struct cterminal *,const char *);
int (*ciolib_setfont) (struct cterminal *,int font, int force, int font_num);
#else
void (*ciolib_gotoxy) (int,int);
......@@ -260,7 +260,7 @@ struct cterminal {
int (*ciolib_puttext) (int,int,int,int,void *);
int (*ciolib_vmem_puttext) (int,int,int,int,struct vmem_cell *);
void (*ciolib_window) (int,int,int,int);
int (*ciolib_cputs) (char *);
int (*ciolib_cputs) (const char *);
int (*ciolib_setfont) (int font, int force, int font_num);
#endif
int *_wscroll;
......
......@@ -7614,6 +7614,21 @@ rv_reset(const char * const var, const void * const data)
}
// TODO: Figure out what all gets reset here...
rip.color = 0;
pthread_mutex_lock(&vstatlock);
rip.x_max = vstat.scrnwidth;
rip.y_max = vstat.scrnheight;
pthread_mutex_unlock(&vstatlock);
rip.x_dim = 640;
rip.y_dim = 350;
if (rip.x_max > rip.x_dim)
rip.x_max = rip.x_dim;
if (rip.y_max > rip.y_dim)
rip.y_max = rip.y_dim;
// TODO: Hack... we should likely scale both directions...
FREE_AND_NULL(rip.xmap);
FREE_AND_NULL(rip.ymap);
FREE_AND_NULL(rip.xunmap);
FREE_AND_NULL(rip.yunmap);
rip.viewport.sx = 0;
rip.viewport.sy = 0;
rip.viewport.ex = rip.x_dim - 1;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment