Commit 5b589ec3ec22303870595e96af6f506cae7c39cd
0 parents
Initial version
Showing
6 changed files
with
235 additions
and
0 deletions
hanoi/makefile
0 → 100755
1 | +++ a/hanoi/makefile | ||
1 | +TARGET=sun | ||
2 | + | ||
3 | +all: $(TARGET) | ||
4 | + | ||
5 | +%.o:%.c | ||
6 | + gcc -g -I.. -Wall -pedantic `sdl2-config --cflags` -c $< -o $@ | ||
7 | + | ||
8 | +%: %.c ../primlib.o %.c | ||
9 | + gcc -g -I.. -Wall -pedantic `sdl2-config --cflags` ../primlib.o $< -o $@ -lSDL2_gfx `sdl2-config --libs` | ||
10 | + | ||
11 | +../primlib.o: ../primlib.c ../primlib.h | ||
12 | + | ||
13 | +$(TARGET): $(TARGET).c ../primlib.h | ||
14 | + | ||
15 | +clean: | ||
16 | + -rm $(TARGET) | ||
0 | \ No newline at end of file | 17 | \ No newline at end of file |
hanoi/sun.c
0 → 100644
1 | +++ a/hanoi/sun.c | ||
1 | +#include "primlib.h" | ||
2 | +#include <stdlib.h> | ||
3 | +#include <unistd.h> | ||
4 | + | ||
5 | +int main(int argc, char *argv[]) { | ||
6 | + if (gfx_init()) | ||
7 | + exit(3); | ||
8 | + /* clear screen */ | ||
9 | + gfx_filledRect(0, 0, gfx_screenWidth() - 1, gfx_screenHeight() - 1, BLUE); | ||
10 | + gfx_filledCircle(gfx_screenWidth() / 2, gfx_screenHeight() / 4, 100, YELLOW); | ||
11 | + gfx_updateScreen(); | ||
12 | + gfx_getkey(); | ||
13 | + return 0; | ||
14 | +} |
makefile
0 → 100644
1 | +++ a/makefile | ||
1 | +all: testlib | ||
2 | + | ||
3 | +testlib: testlib.o primlib.o | ||
4 | + gcc -g $^ -o $@ -lSDL2_gfx `sdl2-config --libs` | ||
5 | + | ||
6 | +.c.o: | ||
7 | + gcc -g -Wall -pedantic `sdl2-config --cflags` -c $< | ||
8 | + | ||
9 | +primlib.o: primlib.c primlib.h | ||
10 | + | ||
11 | +testlib.o: testlib.c primlib.h | ||
12 | + | ||
13 | +clean: | ||
14 | + -rm primlib.o testlib.o testlib | ||
0 | \ No newline at end of file | 15 | \ No newline at end of file |
primlib.c
0 → 100644
1 | +++ a/primlib.c | ||
1 | +#include <assert.h> | ||
2 | +#include <math.h> | ||
3 | +#include <stdio.h> | ||
4 | +#include <stdlib.h> | ||
5 | +#include <string.h> | ||
6 | +#include <time.h> | ||
7 | + | ||
8 | +#include "primlib.h" | ||
9 | + | ||
10 | +static SDL_Renderer *renderer = NULL; | ||
11 | +static SDL_Window *window = NULL; | ||
12 | + | ||
13 | +// static Uint32 colors[COLOR_MAX] = {0xff000000, | ||
14 | +// 0xff0000ff, 0xff00ff00, 0xffff0000, | ||
15 | +// 0xffffff00, 0xffff00ff, 0xff00ffff, | ||
16 | +// 0xffffffff}; | ||
17 | + | ||
18 | +struct RGB { | ||
19 | + uint8_t r; | ||
20 | + uint8_t g; | ||
21 | + uint8_t b; | ||
22 | +}; | ||
23 | + | ||
24 | +static struct RGB colors[COLOR_MAX] = { | ||
25 | + {0, 0, 0}, {255, 0, 0}, {0, 255, 0}, {0, 0, 255}, | ||
26 | + {0, 255, 255}, {255, 0, 255}, {255, 255, 0}, {255, 255, 255}}; | ||
27 | + | ||
28 | +// Screen dimension constants | ||
29 | +const int SCREEN_WIDTH = 640; | ||
30 | +const int SCREEN_HEIGHT = 480; | ||
31 | + | ||
32 | +void gfx_pixel(int x, int y, enum color c) { | ||
33 | + pixelRGBA(renderer, x, y, colors[c].r, colors[c].g, colors[c].b, 255); | ||
34 | +} | ||
35 | + | ||
36 | +void gfx_line(int x1, int y1, int x2, int y2, enum color c) { | ||
37 | + assert(c < COLOR_MAX); | ||
38 | + lineRGBA(renderer, x1, y1, x2, y2, colors[c].r, colors[c].g, colors[c].b, | ||
39 | + 255); | ||
40 | +} | ||
41 | + | ||
42 | +void gfx_rect(int x1, int y1, int x2, int y2, enum color c) { | ||
43 | + assert(c < COLOR_MAX); | ||
44 | + rectangleRGBA(renderer, x1, y1, x2, y2, colors[c].r, colors[c].g, colors[c].b, | ||
45 | + 255); | ||
46 | +} | ||
47 | + | ||
48 | +void gfx_filledRect(int x1, int y1, int x2, int y2, enum color c) { | ||
49 | + assert(c < COLOR_MAX); | ||
50 | + boxRGBA(renderer, x1, y1, x2, y2, colors[c].r, colors[c].g, colors[c].b, 255); | ||
51 | +} | ||
52 | + | ||
53 | +void gfx_circle(int x, int y, int r, enum color c) { | ||
54 | + assert(c < COLOR_MAX); | ||
55 | + circleRGBA(renderer, x, y, r, colors[c].r, colors[c].g, colors[c].b, 255); | ||
56 | +} | ||
57 | + | ||
58 | +void gfx_filledCircle(int x, int y, int r, enum color c) { | ||
59 | + assert(c < COLOR_MAX); | ||
60 | + filledCircleRGBA(renderer, x, y, r, colors[c].r, colors[c].g, colors[c].b, | ||
61 | + 255); | ||
62 | +} | ||
63 | + | ||
64 | +int gfx_screenWidth() { return SCREEN_WIDTH; } | ||
65 | + | ||
66 | +int gfx_screenHeight() { return SCREEN_HEIGHT; } | ||
67 | + | ||
68 | +void gfx_updateScreen() { | ||
69 | + SDL_RenderPresent(renderer); | ||
70 | + SDL_RenderClear(renderer); | ||
71 | +} | ||
72 | + | ||
73 | +void gfx_textout(int x, int y, const char *s, enum color c) { | ||
74 | + assert(c < COLOR_MAX); | ||
75 | + stringRGBA(renderer, x, y, s, colors[c].r, colors[c].g, colors[c].b, 255); | ||
76 | +} | ||
77 | + | ||
78 | +int gfx_pollkey() { | ||
79 | + SDL_Event event; | ||
80 | + while (SDL_PollEvent(&event)) { | ||
81 | + switch (event.type) { | ||
82 | + case SDL_KEYDOWN: | ||
83 | + return event.key.keysym.sym; | ||
84 | + case SDL_QUIT: | ||
85 | + exit(3); | ||
86 | + } | ||
87 | + } | ||
88 | + return -1; | ||
89 | +} | ||
90 | + | ||
91 | +int gfx_getkey() { | ||
92 | + SDL_Event event; | ||
93 | + while (1) { | ||
94 | + SDL_WaitEvent(&event); | ||
95 | + if (event.type == SDL_KEYDOWN) | ||
96 | + break; | ||
97 | + if (event.type == SDL_QUIT) | ||
98 | + exit(3); | ||
99 | + }; | ||
100 | + return event.key.keysym.sym; | ||
101 | +} | ||
102 | + | ||
103 | +int gfx_isKeyDown(int key) { | ||
104 | + const Uint8 *keytable; | ||
105 | + int numkeys; | ||
106 | + SDL_PumpEvents(); | ||
107 | + keytable = SDL_GetKeyboardState(&numkeys); | ||
108 | + SDL_Scancode code = SDL_GetScancodeFromKey(key); | ||
109 | + assert(code < numkeys); | ||
110 | + return keytable[code]; | ||
111 | +} | ||
112 | + | ||
113 | +static void gfx_close() { | ||
114 | + SDL_DestroyRenderer(renderer); | ||
115 | + SDL_DestroyWindow(window); | ||
116 | + SDL_Quit(); | ||
117 | +} | ||
118 | + | ||
119 | +int gfx_init() { | ||
120 | + | ||
121 | + /* Initialize SDL */ | ||
122 | + if (SDL_Init(SDL_INIT_VIDEO) < 0) { | ||
123 | + fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); | ||
124 | + return 1; | ||
125 | + } | ||
126 | + atexit(gfx_close); | ||
127 | + | ||
128 | + window = SDL_CreateWindow("SDL", SDL_WINDOWPOS_UNDEFINED, | ||
129 | + SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, | ||
130 | + SCREEN_HEIGHT, SDL_WINDOW_SHOWN); | ||
131 | + if (window == NULL) { | ||
132 | + printf("Window could not be created! SDL Error: %s\n", SDL_GetError()); | ||
133 | + exit(3); | ||
134 | + } else { | ||
135 | + // Create renderer for window | ||
136 | + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE); | ||
137 | + if (renderer == NULL) { | ||
138 | + printf("Renderer could not be created! SDL Error: %s\n", SDL_GetError()); | ||
139 | + exit(3); | ||
140 | + } | ||
141 | + } | ||
142 | + | ||
143 | + SDL_Delay(10); | ||
144 | + return 0; | ||
145 | +} |
primlib.h
0 → 100644
1 | +++ a/primlib.h | ||
1 | +#ifndef __PRIMLIB_H__ | ||
2 | +#define __PRIMLIB_H__ | ||
3 | + | ||
4 | +#include <SDL2/SDL.h> | ||
5 | +#include <SDL2/SDL2_gfxPrimitives.h> | ||
6 | +int gfx_init(); | ||
7 | +enum color { BLACK, RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW, WHITE, COLOR_MAX }; | ||
8 | +void gfx_pixel(int x, int y, enum color c); | ||
9 | +void gfx_line(int x1, int y1, int x2, int y2, enum color c); | ||
10 | +void gfx_circle(int x, int y, int r, enum color c); | ||
11 | +void gfx_filledRect(int x1, int y1, int x2, int y2, enum color c); | ||
12 | +void gfx_filledCircle(int x, int y, int r, enum color c); | ||
13 | +void gfx_rect(int x1, int y1, int x2, int y2, enum color c); | ||
14 | +void gfx_textout(int x, int y, const char *s, enum color c); | ||
15 | +int gfx_screenWidth(); | ||
16 | +int gfx_screenHeight(); | ||
17 | +void gfx_updateScreen(); | ||
18 | +int gfx_pollkey(); | ||
19 | +int gfx_getkey(); | ||
20 | +int gfx_isKeyDown(int key); | ||
21 | + | ||
22 | +#endif /* __PRIMLIB_H__ */ |
testlib.c
0 → 100644
1 | +++ a/testlib.c | ||
1 | +#include "primlib.h" | ||
2 | +#include <stdlib.h> | ||
3 | +#include <unistd.h> | ||
4 | + | ||
5 | +int main(int argc, char *argv[]) { | ||
6 | + if (gfx_init()) | ||
7 | + exit(3); | ||
8 | + /* clear screen */ | ||
9 | + for (int i = -99; i < 100; ++i) { | ||
10 | + gfx_filledRect(0, 0, gfx_screenWidth() - 1, gfx_screenHeight() - 1, BLACK); | ||
11 | + gfx_filledCircle(gfx_screenWidth() / 2 + i, gfx_screenHeight() / 2, 100, YELLOW); | ||
12 | + gfx_textout(gfx_screenWidth() / 2 - i, gfx_screenHeight() / 2, "This is a text", RED); | ||
13 | + gfx_updateScreen(); | ||
14 | + SDL_Delay(10); | ||
15 | + } | ||
16 | + gfx_getkey(); | ||
17 | + return 0; | ||
18 | +} |