Skip to content

Commit

Permalink
添加与cairo交互的例子
Browse files Browse the repository at this point in the history
  • Loading branch information
plter committed Oct 20, 2020
1 parent 4341c64 commit fbf6c72
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 0 deletions.
20 changes: 20 additions & 0 deletions L06DrawOnSurface/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
42 changes: 42 additions & 0 deletions L06DrawOnSurface/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#include <SDL.h> // 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;
}
22 changes: 22 additions & 0 deletions L07CairoCircle/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
55 changes: 55 additions & 0 deletions L07CairoCircle/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#include <SDL.h> // include SDL header
#include <cairo.h>


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;
}

0 comments on commit fbf6c72

Please sign in to comment.