Created
May 5, 2017 21:17
-
-
Save rw-r-r-0644/ace00c78bdff32c6df3e69ea54a9f5dd to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <sys/mman.h> | |
#include <fcntl.h> | |
#include <pthread.h> | |
pthread_t graphics_thread; | |
void graphics_thread() | |
{ | |
screen_init("GBA Screen"); | |
while(1) | |
{ | |
screen_clear(); | |
for (int x = 0; x < 240; x++) | |
for (int y = 0; y < 160; y++) | |
drawpixel(x, y, *(u32*)(0x6000000 + (240 * y) + x), *(u32*)(0x6000000 + (240 * y) + x + 1), *(u32*)(0x6000000 + (240 * y) + x + 2)); | |
screen_flip(); | |
} | |
screen_end(); | |
} | |
int init() | |
{ | |
// map vitual memory for screen mode | |
mmap((void*)0x4000000, 0x2, PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_SHARED | MAP_FIXED, -1, 0); | |
// map virtual memory for screen buffer | |
mmap((void*)0x6000000, 0x9600*3, PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_SHARED | MAP_FIXED, -1, 0); | |
pthread_create(&graphics_thread, NULL, &graphics_thread, NULL); | |
} | |
int deinit() | |
{ | |
// create a screen.ppm file | |
FILE * fp = fopen("screen.ppm", "wb"); | |
int fd = fileno(fp); | |
// header for ppm | |
fprintf(fp, "P6\n%d %d\n255\n", 240, 160); | |
fflush(fp); | |
// write pixel data to disk | |
write(fd, (void *)0x6000000, 0x9600*3); | |
printf("Wrote screenshot to screen.ppm\n"); | |
// exit syscall to stop gracefully | |
exit(0); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "draw.h" | |
#include "SDL.h" | |
uint8_t * screen; | |
SDL_Surface *sdl_screen; | |
void screen_clear() | |
{ | |
SDL_FillRect(sdl_screen, NULL, 0xFFFFFF); | |
} | |
void screen_flip() | |
{ | |
SDL_Flip(sdl_screen); | |
} | |
void screen_init(const char * title) | |
{ | |
SDL_Init(SDL_INIT_VIDEO); | |
sdl_screen = SDL_SetVideoMode(screen_x, screen_y, 24, SDL_HWSURFACE | SDL_FULLSCREEN); | |
SDL_WM_SetCaption(title, 0); | |
screen = (uint8_t *)sdl_screen->pixels; | |
screen_clear(); | |
screen_flip(); | |
} | |
void screen_end() | |
{ | |
SDL_QuitSubSystem(SDL_INIT_VIDEO); | |
SDL_Quit(); | |
} | |
void draw_pixel(int x, int y, char r, char g, char b) | |
{ | |
uint32_t v = (y * screen_x + x) * 3; | |
screen[v] = b; | |
screen[v+1] = g; | |
screen[v+2] = r; | |
} | |
void draw_line(int x0, int y0, int x1, int y1, char r, char g, char b) | |
{ | |
int dx = abs(x1 - x0), sx = (x0 < x1) ? 1 : -1; | |
int dy = abs(y1 - y0), sy = (y0 < y1) ? 1 : -1; | |
int err = ((dx > dy) ? dx : -dy) / 2, e2; | |
for(;;) { | |
draw_pixel(x0, y0, r, g, b); | |
if (x0==x1 && y0==y1) break; | |
e2 = err; | |
if (e2 >-dx) { err -= dy; x0 += sx; } | |
if (e2 < dy) { err += dx; y0 += sy; } | |
} | |
} | |
void draw_rect(int x1, int y1, int x2, int y2, char r, char g, char b) | |
{ | |
draw_line(x1, y1, x2, y1, r, g, b); | |
draw_line(x2, y1, x2, y2, r, g, b); | |
draw_line(x1, y2, x2, y2, r, g, b); | |
draw_line(x1, y1, x1, y2, r, g, b); | |
} | |
void draw_fill_rect(int x1, int y1, int x2, int y2, char r, char g, char b) | |
{ | |
int X1, X2, Y1, Y2, i, j; | |
if (x1 < x2){ | |
X1 = x1; | |
X2 = x2; | |
} | |
else { | |
X1 = x2; | |
X2 = x1; | |
} | |
if (y1 < y2){ | |
Y1 = y1; | |
Y2 = y2; | |
} | |
else { | |
Y1 = y2; | |
Y2 = y1; | |
} | |
for (i = X1; i <= X2; i++){ | |
for (j = Y1; j <= Y2; j++){ | |
draw_pixel(i, j, r, g, b); | |
} | |
} | |
} | |
void draw_circle(int xCen, int yCen, int radius, char r, char g, char b) | |
{ | |
int x = 0; | |
int y = radius; | |
int p = (5 - radius * 4) / 4; | |
draw_circle_circum(xCen, yCen, x, y, r, g, b); | |
while (x < y){ | |
x++; | |
if (p < 0){ | |
p += 2 * x + 1; | |
} | |
else{ | |
y--; | |
p += 2 * (x - y) + 1; | |
} | |
draw_circle_circum(xCen, yCen, x, y, r, g, b); | |
} | |
} | |
void draw_fill_circle(int xCen, int yCen, int radius, char r, char g, char b) | |
{ | |
draw_circle(xCen, yCen, radius, r, g, b); | |
int x, y; | |
for (y = -radius; y <= radius; y++){ | |
for (x = -radius; x <= radius; x++) | |
if (x*x + y*y <= radius*radius + radius * .8f) | |
draw_pixel(xCen + x, yCen + y, r, g, b); | |
} | |
} | |
void draw_circle_circum(int cx, int cy, int x, int y, char r, char g, char b) | |
{ | |
if (x == 0){ | |
draw_pixel(cx, cy + y, r, g, b); | |
draw_pixel(cx, cy - y, r, g, b); | |
draw_pixel(cx + y, cy, r, g, b); | |
draw_pixel(cx - y, cy, r, g, b); | |
} | |
if (x == y){ | |
draw_pixel(cx + x, cy + y, r, g, b); | |
draw_pixel(cx - x, cy + y, r, g, b); | |
draw_pixel(cx + x, cy - y, r, g, b); | |
draw_pixel(cx - x, cy - y, r, g, b); | |
} | |
if (x < y){ | |
draw_pixel(cx + x, cy + y, r, g, b); | |
draw_pixel(cx - x, cy + y, r, g, b); | |
draw_pixel(cx + x, cy - y, r, g, b); | |
draw_pixel(cx - x, cy - y, r, g, b); | |
draw_pixel(cx + y, cy + x, r, g, b); | |
draw_pixel(cx - y, cy + x, r, g, b); | |
draw_pixel(cx + y, cy - x, r, g, b); | |
draw_pixel(cx - y, cy - x, r, g, b); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include <stdint.h> | |
// change these to size of the screen: | |
#define screen_x 300 | |
#define screen_y 200 | |
extern uint8_t * screen; // bgr | |
void screen_init(const char * title); | |
void screen_end(); | |
void screen_clear(); | |
void screen_flip(); | |
void * render_text(char * text, char r, char g, char b); | |
void draw_text(int x, int y, void * render); | |
void draw_pixel(int x, int y, char r, char g, char b); | |
void draw_line(int x0, int y0, int x1, int y1, char r, char g, char b); | |
void draw_rect(int x1, int y1, int x2, int y2, char r, char g, char b); | |
void draw_fill_rect(int x1, int y1, int x2, int y2, char r, char g, char b); | |
void draw_circle(int xCen, int yCen, int radius, char r, char g, char b); | |
void draw_fill_circle(int xCen, int yCen, int radius, char r, char g, char b); | |
void draw_circle_circum(int cx, int cy, int x, int y, char r, char g, char b); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment