diff --git a/L06DrawOnSurface/CMakeLists.txt b/L06DrawOnSurface/CMakeLists.txt new file mode 100644 index 0000000..08b56c4 --- /dev/null +++ b/L06DrawOnSurface/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.17) +project(L06DrawOnSurface) + +set(CMAKE_CXX_STANDARD 14) + +add_compile_definitions(THREAD_SAFE) + +include_directories( + /usr/local/include/SDL2 +) + +link_directories( + /usr/local/lib +) + +link_libraries( + SDL2 +) + +add_executable(L06DrawOnSurface main.c) \ No newline at end of file diff --git a/L06DrawOnSurface/main.c b/L06DrawOnSurface/main.c new file mode 100644 index 0000000..459bed5 --- /dev/null +++ b/L06DrawOnSurface/main.c @@ -0,0 +1,42 @@ +#include // include SDL header + +void draw(struct SDL_Surface *surface) { + SDL_Rect rect = {0, 0, 100, 100}; + SDL_FillRect(surface, &rect, 0xffff0000); +} + +int main(int argc, char *argv[]) { + SDL_Surface *screen; // even with SDL2, we can still bring ancient code back + SDL_Window *window; + SDL_Surface *image; + + SDL_Init(SDL_INIT_VIDEO); // init video + + // create the window like normal + window = SDL_CreateWindow( + "Draw on surface", + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + 550, 400, 0 + ); + + // but instead of creating a renderer, we can draw directly to the screen + screen = SDL_GetWindowSurface(window); + + while (1) { + // fill background + SDL_FillRect(screen, NULL, 0xffffffff); + draw(screen); + SDL_UpdateWindowSurface(window); + + SDL_Event event; + if (SDL_PollEvent(&event)) { + if (event.type == SDL_QUIT) { + break; + } + } + } + + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; +} diff --git a/L07CairoCircle/CMakeLists.txt b/L07CairoCircle/CMakeLists.txt new file mode 100644 index 0000000..5aea9f4 --- /dev/null +++ b/L07CairoCircle/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.17) +project(L07CairoCircle) + +set(CMAKE_CXX_STANDARD 14) + +add_compile_definitions(THREAD_SAFE) + +include_directories( + /usr/local/include/SDL2 + /usr/local/include/cairo +) + +link_directories( + /usr/local/lib +) + +link_libraries( + SDL2 + cairo +) + +add_executable(L07CairoCircle main.c) \ No newline at end of file diff --git a/L07CairoCircle/main.c b/L07CairoCircle/main.c new file mode 100644 index 0000000..40c0461 --- /dev/null +++ b/L07CairoCircle/main.c @@ -0,0 +1,55 @@ +#include // include SDL header +#include + + +void draw(cairo_surface_t *cairosurf) { + cairo_t *cr = cairo_create(cairosurf); + + cairo_set_source_rgb(cr, 1, 0, 0); + cairo_arc(cr, 100, 100, 50, 0, M_PI * 2); + cairo_fill(cr); + cairo_surface_flush(cairosurf); + + cairo_destroy(cr); +} + +int main(int argc, char *argv[]) { + SDL_Surface *screen; // even with SDL2, we can still bring ancient code back + SDL_Window *window; + SDL_Surface *image; + + SDL_Init(SDL_INIT_VIDEO); // init video + + // create the window like normal + window = SDL_CreateWindow( + "Draw on surface", + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + 550, 400, SDL_WINDOW_OPENGL + ); + + // but instead of creating a renderer, we can draw directly to the screen + screen = SDL_GetWindowSurface(window); + cairo_surface_t *cairosurf = cairo_image_surface_create_for_data( + screen->pixels, CAIRO_FORMAT_RGB24, + screen->w, screen->h, screen->pitch + ); + + while (1) { + // fill background + SDL_FillRect(screen, NULL, 0xffffffff); + draw(cairosurf); + SDL_UpdateWindowSurface(window); + + SDL_Event event; + if (SDL_PollEvent(&event)) { + if (event.type == SDL_QUIT) { + break; + } + } + } + + cairo_surface_destroy(cairosurf); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; +}