forked from Lephenixnoir/gint
65 lines
1.1 KiB
C
65 lines
1.1 KiB
C
#include <internals/tales.h>
|
|
#include <display.h>
|
|
#include <gray.h>
|
|
|
|
void operate_gray(OPERATE_ARGS)
|
|
{
|
|
size_t vram_offset = (x >> 5) + (y << 2);
|
|
uint32_t *light = gray_lightVRAM() + vram_offset;
|
|
uint32_t *dark = gray_darkVRAM() + vram_offset;
|
|
uint32_t op, old_light;
|
|
|
|
for(int i = 0; i < height; i++)
|
|
{
|
|
op = operators[i];
|
|
|
|
switch(operator)
|
|
{
|
|
case color_white:
|
|
*light &= ~op;
|
|
*dark &= ~op;
|
|
break;
|
|
case color_light:
|
|
*light |= op;
|
|
*dark &= ~op;
|
|
break;
|
|
case color_dark:
|
|
*light &= ~op;
|
|
*dark |= op;
|
|
break;
|
|
case color_black:
|
|
*light |= op;
|
|
*dark |= op;
|
|
break;
|
|
case color_none:
|
|
return;
|
|
|
|
case color_invert:
|
|
*light ^= op;
|
|
*dark ^= op;
|
|
break;
|
|
case color_lighten:
|
|
old_light = *light;
|
|
*light &= *dark | ~op;
|
|
*dark = (old_light | ~op) & (op ^ *dark);
|
|
break;
|
|
case color_lighten2:
|
|
*dark &= *light | ~op;
|
|
*light &= ~op;
|
|
break;
|
|
case color_darken:
|
|
old_light = *light;
|
|
*light |= *dark & op;
|
|
*dark = (old_light & op) | (op ^ *dark);
|
|
break;
|
|
case color_darken2:
|
|
*dark |= *light | op;
|
|
*light |= op;
|
|
break;
|
|
}
|
|
|
|
light += 4;
|
|
dark += 4;
|
|
}
|
|
}
|