sub pixel rendering
This commit is contained in:
4
config.h
4
config.h
@@ -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
|
||||
|
||||
58
graphics.c
58
graphics.c
@@ -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", "" );
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
26
physics.c
26
physics.c
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user