render: add a dgetpixel() function

This commit is contained in:
Lephe 2022-11-16 19:12:27 +01:00
parent 45fa6c87c2
commit 74438f5da5
No known key found for this signature in database
GPG key ID: 1BBA026E13FC0495
8 changed files with 55 additions and 4 deletions

View file

@ -132,6 +132,7 @@ set(SOURCES_FX
# Gray engine # Gray engine
src/gray/engine.c src/gray/engine.c
src/gray/gclear.c src/gray/gclear.c
src/gray/ggetpixel.c
src/gray/gint_gline.c src/gray/gint_gline.c
src/gray/gpixel.c src/gray/gpixel.c
src/gray/grect.c src/gray/grect.c
@ -144,6 +145,7 @@ set(SOURCES_FX
src/render-fx/bopti-asm.s src/render-fx/bopti-asm.s
src/render-fx/bopti.c src/render-fx/bopti.c
src/render-fx/dclear.c src/render-fx/dclear.c
src/render-fx/dgetpixel.c
src/render-fx/dpixel.c src/render-fx/dpixel.c
src/render-fx/drect.c src/render-fx/drect.c
src/render-fx/dsubimage.c src/render-fx/dsubimage.c
@ -193,6 +195,7 @@ set(SOURCES_CG
src/image/image_vflip_alloc.c src/image/image_vflip_alloc.c
# Rendering # Rendering
src/render-cg/dclear.c src/render-cg/dclear.c
src/render-cg/dgetpixel.c
src/render-cg/dpixel.c src/render-cg/dpixel.c
src/render-cg/drect.c src/render-cg/drect.c
src/render-cg/dsubimage.c src/render-cg/dsubimage.c

3
TODO
View file

@ -1,3 +1,6 @@
Bugs to fix:
* render: figure out why fx-CG dclear() now takes 4.1 ms instead of 2.6 ms
Extensions on existing code: Extensions on existing code:
* clock: mono support * clock: mono support
* usb: add PC->calc reading, and interrupt pipes * usb: add PC->calc reading, and interrupt pipes

View file

@ -151,6 +151,11 @@ void drect_border(int x1, int y1, int x2, int y2,
*: When the gray engine is on, see dgray(). */ *: When the gray engine is on, see dgray(). */
void dpixel(int x, int y, int color); void dpixel(int x, int y, int color);
/* dgetpixel(): Get a pixel's color
Returns the current color of any pixel in the VRAM. This function ignores
the rendering window. Returns -1 if (x,y) is out of bounds. */
int dgetpixel(int x, int y);
/* dline(): Render a straight line /* dline(): Render a straight line
This function draws a line using a Bresenham-style algorithm. Please note This function draws a line using a Bresenham-style algorithm. Please note

View file

@ -41,6 +41,7 @@ static struct rendering_mode const gray_mode = {
.dclear = gclear, .dclear = gclear,
.drect = grect, .drect = grect,
.dpixel = gpixel, .dpixel = gpixel,
.dgetpixel = ggetpixel,
.gint_dhline = gint_ghline, .gint_dhline = gint_ghline,
.gint_dvline = gint_gvline, .gint_dvline = gint_gvline,
.dtext_opt = gtext_opt, .dtext_opt = gtext_opt,
@ -51,6 +52,7 @@ static struct rendering_mode const gray_exit_mode = {
.dclear = NULL, .dclear = NULL,
.drect = NULL, .drect = NULL,
.dpixel = NULL, .dpixel = NULL,
.dgetpixel = NULL,
.gint_dhline = NULL, .gint_dhline = NULL,
.gint_dvline = NULL, .gint_dvline = NULL,
.dtext_opt = NULL, .dtext_opt = NULL,

15
src/gray/ggetpixel.c Normal file
View file

@ -0,0 +1,15 @@
#include <gint/gray.h>
#include <gint/defs/types.h>
int ggetpixel(int x, int y)
{
uint32_t *light, *dark;
dgray_getvram(&light, &dark);
int offset = (y << 2) + (x >> 5);
uint32_t mask = 1 << (~x & 31);
bool l = (light[offset] & mask) != 0;
bool d = (dark [offset] & mask) != 0;
return (d << 1) | l;
}

View file

@ -0,0 +1,7 @@
#include <gint/display.h>
int dgetpixel(int x, int y)
{
if((uint)x >= DWIDTH || (uint)y >= DHEIGHT) return -1;
return gint_vram[DWIDTH * y + x];
}

15
src/render-fx/dgetpixel.c Normal file
View file

@ -0,0 +1,15 @@
#include <gint/display.h>
#include <gint/defs/types.h>
#include "render-fx.h"
int dgetpixel(int x, int y)
{
if((uint)x >= DWIDTH || (uint)y >= DHEIGHT) return -1;
DMODE_OVERRIDE(dgetpixel, x, y);
int offset = (y << 2) + (x >> 5);
uint32_t mask = 1 << (~x & 31);
return (gint_vram[offset] & mask) ? C_BLACK : C_WHITE;
}

View file

@ -69,6 +69,7 @@ struct rendering_mode
void (*drect)(int x1, int y1, int x2, int y2, color_t color); void (*drect)(int x1, int y1, int x2, int y2, color_t color);
/* Point rendering */ /* Point rendering */
void (*dpixel)(int x, int y, color_t color); void (*dpixel)(int x, int y, color_t color);
int (*dgetpixel)(int x, int y);
void (*gint_dhline)(int x1, int x2, int y, int color); void (*gint_dhline)(int x1, int x2, int y, int color);
void (*gint_dvline)(int y1, int y2, int x, int color); void (*gint_dvline)(int y1, int y2, int x, int color);
/* Text and image rendering */ /* Text and image rendering */
@ -87,6 +88,7 @@ int gupdate(void);
void gclear(color_t color); void gclear(color_t color);
void grect(int x1, int y1, int x2, int y2, color_t color); void grect(int x1, int y1, int x2, int y2, color_t color);
void gpixel(int x, int y, color_t color); void gpixel(int x, int y, color_t color);
int ggetpixel(int x, int y);
void gint_ghline(int x1, int x2, int y, int color); void gint_ghline(int x1, int x2, int y, int color);
void gint_gvline(int y1, int y2, int x, int color); void gint_gvline(int y1, int y2, int x, int color);
void gtext_opt(int x, int y, int fg, int bg, int halign, int valign, void gtext_opt(int x, int y, int fg, int bg, int halign, int valign,
@ -96,8 +98,7 @@ void gsubimage(bopti_image_t const *image, struct rbox *r, int flags);
/* Short macro to call the alternate rendering function when available */ /* Short macro to call the alternate rendering function when available */
#define DMODE_OVERRIDE(func, ...) \ #define DMODE_OVERRIDE(func, ...) \
if(dmode && dmode->func) { \ if(dmode && dmode->func) { \
dmode->func(__VA_ARGS__); \ return dmode->func(__VA_ARGS__); \
return; \
} }
#endif /* RENDER_FX */ #endif /* RENDER_FX */