use strict; use warnings; use SDL v2.3; use SDL::Video; use SDL::Event; use SDL::Events; use SDL::Surface; use Cairo; my $WIDTH = 400; my $HEIGHT = 300; # relevant part starts: my $screen = SDL::Video::set_video_mode($WIDTH, $HEIGHT, 32, SDL_SWSURFACE); SDL::Video::lock_surface($screen); my $surface = Cairo::ImageSurface->create_for_data ( $screen->get_pixels_ptr, 'argb32', $screen->w, $screen->h, $screen->pitch ); my $cairo = Cairo::Context->create($surface); $cairo->rectangle(0, 0, 100, 100); $cairo->set_source_rgb(255, 0, 0); $cairo->fill; SDL::Video::unlock_surface($screen); SDL::Video::update_rect($screen, 0, 0, $WIDTH, $HEIGHT); # relevant part ends LOOP: while (1) { my $event = SDL::Event->new(); while (SDL::Events::poll_event($event)) { last LOOP if $event->type == SDL_KEYDOWN || $event->type == SDL_QUIT; } SDL::Events::pump_events(); } SDL::quit;