sub pixel rendering

This commit is contained in:
Ole Morud
2022-06-09 19:10:47 +02:00
parent 30fc9e1861
commit 1f19d9127a
4 changed files with 68 additions and 21 deletions

View File

@@ -3,12 +3,12 @@
#define CONFIG_H_
#define ON 'x'
#define ON '#'
#define OFF ' '
#define HEIGHT 100
#define WIDTH 100
#define FRAMERATE 60
#define GRAVITY 15.0f
#define LINENUMBERS 1
#define LINENUMBERS 0
#endif

View File

@@ -3,6 +3,7 @@
#include <string.h>
#include <stdio.h>
#include "config.h"
#include <locale.h>
#define uint unsigned int
@@ -19,6 +20,7 @@ void clear();
void render(Canvas* c);
void line(Canvas* c, uint start_x, uint start_y, uint end_x, uint end_y);
void dot(Canvas* c, const uint x, const uint y);
void subpixel(int m1, int m2, int n1, int n2);
/*
@@ -49,6 +51,34 @@ void render(Canvas* c){
}
/*
* Renders canvas with subpixel rendering
* */
void subpixel_render(Canvas* c){
setlocale(LC_ALL, "C.UTF-8");
clear();
putchar('\n');
for(int i=0; i < c->y; i+=2){
#if LINENUMBERS
printf("%2i ", i*2); // horizontal line numbers
#endif
for(int j=0; j < c->x; j+=2){
subpixel( c->data[i*(c->x) + j] == ON, c->data[i*(c->x) + j+1] == ON,
c->data[(i+1)*(c->x) + j] == ON, c->data[(i+1)*(c->x) + j+1] == ON);
}
putchar('\n');
}
#if 0
// vertical line numbers
for(int i=0; i<(c->x) / 2; i+=2){
printf(" %2i", i*2);
}
#endif
}
/*
* Sets pixel at x,y to ON
*/
@@ -100,9 +130,33 @@ void line(Canvas* c, uint start_x, uint start_y, uint end_x, uint end_y){
}
//TODO: find escape sequence for clearing screen
/*
* Clears terminal (for ANSI like terminal emulation)
*/
void clear(){
printf("\033[2;2H");
//printf("function clear() not implemented yet");
}
/*
* Print 4 pixels as unicode character
* pixel arrangement is like this:
* m1,m2 1 0
* n1,n2, example: 0 1 = '▚'
*/
void subpixel(int m1, int m2, int n1, int n2){
const wchar_t *quads[] =
{
/* 00, 01, 10, 11*/
/*00*/ L" ", L"", L"", L"",
/*01*/ L"", L"", L"", L"",
/*10*/ L"", L"", L"", L"",
/*11*/ L"", L"", L"", L"",
};
int x = !!m2 + (!!m1<<1);
int y = !!n2 + (!!n1<<1);
printf("%ls", quads[y*4 + x]);
printf("%s", "" );
}

View File

@@ -10,6 +10,7 @@ typedef struct Canvas {
void clear();
void render(Canvas*);
void subpixel_render(Canvas*);
void line(Canvas*, unsigned int, unsigned int, unsigned int, unsigned int);
void dot(Canvas*, const unsigned int, const unsigned int);

View File

@@ -43,31 +43,24 @@ void update_link(Link* l);
* Main
*/
int main(){
#if 0
Point a = {0, 0};
Point b = {10, 10};
unit_vec(&a, &b);
#endif
#if 1
char *data = malloc(WIDTH*HEIGHT);
Canvas cnv = {WIDTH, HEIGHT, data};
// Add 4 points, link them, and add points and links to respective arrays
Point a = { 10.0, 10.0,
11.0, 10.0,
Point a = { 20.0, 10.0,
21.0, 10.0,
0.0, GRAVITY/(FRAMERATE*FRAMERATE)};
Point b = { 20.0, 10.0,
20.0, 10.0,
Point b = { 40.0, 10.0,
40.0, 10.0,
0.0, GRAVITY/(FRAMERATE*FRAMERATE)};
Point c = { 20.0, 20.0,
19.0, 20.0,
Point c = { 40.0, 30.0,
39.0, 30.0,
0.0, GRAVITY/(FRAMERATE*FRAMERATE)};
Point d = { 10.0, 20.0,
10.0, 20.0,
Point d = { 20.0, 30.0,
20.0, 30.0,
0.0, GRAVITY/(FRAMERATE*FRAMERATE)};
Link *l_ab = link_points(&a, &b);
@@ -98,10 +91,9 @@ int main(){
}
// then render and wait
render(&cnv);
subpixel_render(&cnv);
usleep(1000000/FRAMERATE);
}
#endif
return 0;
}