Complete Sample: A vsync application using blits, pixmaps and buffers

This is the complete listing for the blit, pixpmap, and buffers sample.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <screen/screen.h>

const int barwidth = 32;

int main(int argc, char **argv)
{
	int i, j, pos = 0;

	screen_context_t screen_ctx;
	screen_create_context(&screen_ctx, SCREEN_APPLICATION_CONTEXT);

	screen_window_t screen_win;
	screen_create_window(&screen_win, screen_ctx);

	int usage = SCREEN_USAGE_NATIVE;
	screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_USAGE, &usage);

	int rect[4] = { 0, 0 };
	screen_create_window_buffers(screen_win, 2);
	screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, rect+2);

	screen_pixmap_t screen_pix;
	screen_create_pixmap(&screen_pix, screen_ctx);

	int format = SCREEN_FORMAT_RGBA8888;
	screen_set_pixmap_property_iv(screen_pix, SCREEN_PROPERTY_FORMAT, &format);

	usage = SCREEN_USAGE_WRITE | SCREEN_USAGE_NATIVE;
	screen_set_pixmap_property_iv(screen_pix, SCREEN_PROPERTY_USAGE, &usage);

	int size[2] = { 100, 100 };
	screen_set_pixmap_property_iv(screen_pix, SCREEN_PROPERTY_BUFFER_SIZE, size);

	screen_buffer_t screen_pbuf;
	screen_create_pixmap_buffer(screen_pix);
	screen_get_pixmap_property_pv(screen_pix, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)&screen_pbuf);

	unsigned char *ptr = NULL;
	screen_get_buffer_property_pv(screen_pbuf, SCREEN_PROPERTY_POINTER, (void **)&ptr);

	int stride = 0;
	screen_get_buffer_property_iv(screen_pbuf, SCREEN_PROPERTY_STRIDE, &stride);

	for (i = 0; i < size[1]; i++, ptr += stride) {
			for (j = 0; j < size[0]; j++) {
				ptr[j*4] = 0xa0;
				ptr[j*4+1] = 0xa0;
				ptr[j*4+2] = 0xa0;
				ptr[j*4+3] = ((j >= i && j <= size[1]-i) || (j <= i && j >= size[1]-i)) ? 0xff : 0;
			}
	}

	while (1) {
		screen_buffer_t screen_buf[2];
		screen_get_window_property_pv(screen_win, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)screen_buf);

		int bg[] = { SCREEN_BLIT_COLOR, 0xffffff00, SCREEN_BLIT_END };
		screen_fill(screen_ctx, screen_buf[0], bg);

		int bar[] = {
			SCREEN_BLIT_COLOR, 0xff0000ff,
			SCREEN_BLIT_DESTINATION_X, pos,
			SCREEN_BLIT_DESTINATION_WIDTH, barwidth,
			SCREEN_BLIT_END };

		screen_fill(screen_ctx, screen_buf[0], bar);

		int hg[] = {
			SCREEN_BLIT_SOURCE_WIDTH, 100,
			SCREEN_BLIT_SOURCE_HEIGHT, 100,
			SCREEN_BLIT_DESTINATION_X, 10,
			SCREEN_BLIT_DESTINATION_Y, 10,
			SCREEN_BLIT_DESTINATION_WIDTH, 100,
			SCREEN_BLIT_DESTINATION_HEIGHT, 100,
			SCREEN_BLIT_TRANSPARENCY, SCREEN_TRANSPARENCY_SOURCE_OVER,
			SCREEN_BLIT_END
		};

		screen_blit(screen_ctx, screen_buf[0], screen_pbuf, hg);
		screen_post_window(screen_win, screen_buf[0], 1, rect, 0);

		if (++pos > rect[2] - barwidth) {
			pos = 0;
		}
	}

	return EXIT_SUCCESS;
}