diff --git a/L07CairoCircle/main.c b/L07CairoCircle/main.c index 40c0461..0517ab4 100644 --- a/L07CairoCircle/main.c +++ b/L07CairoCircle/main.c @@ -16,7 +16,6 @@ void draw(cairo_surface_t *cairosurf) { 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 @@ -24,7 +23,7 @@ int main(int argc, char *argv[]) { window = SDL_CreateWindow( "Draw on surface", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - 550, 400, SDL_WINDOW_OPENGL + 550, 400, SDL_WINDOW_SHOWN ); // but instead of creating a renderer, we can draw directly to the screen diff --git a/L07CairoText/CMakeLists.txt b/L07CairoText/CMakeLists.txt new file mode 100644 index 0000000..5aea9f4 --- /dev/null +++ b/L07CairoText/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/L07CairoText/main.c b/L07CairoText/main.c new file mode 100644 index 0000000..5057de7 --- /dev/null +++ b/L07CairoText/main.c @@ -0,0 +1,55 @@ +#include // include SDL header +#include + + +#define FONT_SIZE 50 + +void draw(cairo_surface_t *cairosurf) { + cairo_t *cr = cairo_create(cairosurf); + + cairo_set_font_size(cr, FONT_SIZE); + cairo_move_to(cr, 0, FONT_SIZE); + cairo_show_text(cr, "Hello Cairo"); + + 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_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_SHOWN + ); + + // 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; +}