diff options
Diffstat (limited to 'examples/pugl_cairo_demo.c')
-rw-r--r-- | examples/pugl_cairo_demo.c | 373 |
1 files changed, 184 insertions, 189 deletions
diff --git a/examples/pugl_cairo_demo.c b/examples/pugl_cairo_demo.c index 48a02db..4da0caf 100644 --- a/examples/pugl_cairo_demo.c +++ b/examples/pugl_cairo_demo.c @@ -28,20 +28,20 @@ #include <string.h> typedef struct { - PuglWorld* world; - PuglTestOptions opts; - unsigned framesDrawn; - int quit; - bool entered; - bool mouseDown; + PuglWorld* world; + PuglTestOptions opts; + unsigned framesDrawn; + int quit; + bool entered; + bool mouseDown; } PuglTestApp; typedef struct { - int x; - int y; - int w; - int h; - const char* label; + int x; + int y; + int w; + int h; + const char* label; } Button; static const Button buttons[] = {{128, 128, 64, 64, "1"}, @@ -53,213 +53,208 @@ static const Button buttons[] = {{128, 128, 64, 64, "1"}, static void roundedBox(cairo_t* cr, double x, double y, double w, double h) { - static const double radius = 10; - static const double degrees = 3.14159265 / 180.0; - - cairo_new_sub_path(cr); - cairo_arc(cr, - x + w - radius, - y + radius, - radius, -90 * degrees, 0 * degrees); - cairo_arc(cr, - x + w - radius, y + h - radius, - radius, 0 * degrees, 90 * degrees); - cairo_arc(cr, - x + radius, y + h - radius, - radius, 90 * degrees, 180 * degrees); - cairo_arc(cr, - x + radius, y + radius, - radius, 180 * degrees, 270 * degrees); - cairo_close_path(cr); + static const double radius = 10; + static const double degrees = 3.14159265 / 180.0; + + cairo_new_sub_path(cr); + cairo_arc(cr, x + w - radius, y + radius, radius, -90 * degrees, 0 * degrees); + + cairo_arc( + cr, x + w - radius, y + h - radius, radius, 0 * degrees, 90 * degrees); + + cairo_arc( + cr, x + radius, y + h - radius, radius, 90 * degrees, 180 * degrees); + + cairo_arc(cr, x + radius, y + radius, radius, 180 * degrees, 270 * degrees); + cairo_close_path(cr); } static void buttonDraw(PuglTestApp* app, cairo_t* cr, const Button* but, const double time) { - cairo_save(cr); - cairo_translate(cr, but->x, but->y); - cairo_rotate(cr, sin(time) * 3.141592); - - // Draw base - if (app->mouseDown) { - cairo_set_source_rgba(cr, 0.4, 0.9, 0.1, 1); - } else { - cairo_set_source_rgba(cr, 0.3, 0.5, 0.1, 1); - } - roundedBox(cr, 0, 0, but->w, but->h); - cairo_fill_preserve(cr); - - // Draw border - cairo_set_source_rgba(cr, 0.4, 0.9, 0.1, 1); - cairo_set_line_width(cr, 4.0); - cairo_stroke(cr); - - // Draw label - cairo_text_extents_t extents; - cairo_set_font_size(cr, 32.0); - cairo_text_extents(cr, but->label, &extents); - cairo_move_to(cr, - (but->w / 2.0) - extents.width / 2, - (but->h / 2.0) + extents.height / 2); - cairo_set_source_rgba(cr, 0, 0, 0, 1); - cairo_show_text(cr, but->label); - - cairo_restore(cr); + cairo_save(cr); + cairo_translate(cr, but->x, but->y); + cairo_rotate(cr, sin(time) * 3.141592); + + // Draw base + if (app->mouseDown) { + cairo_set_source_rgba(cr, 0.4, 0.9, 0.1, 1); + } else { + cairo_set_source_rgba(cr, 0.3, 0.5, 0.1, 1); + } + roundedBox(cr, 0, 0, but->w, but->h); + cairo_fill_preserve(cr); + + // Draw border + cairo_set_source_rgba(cr, 0.4, 0.9, 0.1, 1); + cairo_set_line_width(cr, 4.0); + cairo_stroke(cr); + + // Draw label + cairo_text_extents_t extents; + cairo_set_font_size(cr, 32.0); + cairo_text_extents(cr, but->label, &extents); + cairo_move_to(cr, + (but->w / 2.0) - extents.width / 2, + (but->h / 2.0) + extents.height / 2); + cairo_set_source_rgba(cr, 0, 0, 0, 1); + cairo_show_text(cr, but->label); + + cairo_restore(cr); } static void postButtonRedisplay(PuglView* view) { - const PuglRect frame = puglGetFrame(view); - const double width = frame.width; - const double height = frame.height; - const double scaleX = (width - (512 / width)) / 512.0; - const double scaleY = (height - (512 / height)) / 512.0; - - for (const Button* b = buttons; b->label; ++b) { - const double span = sqrt(b->w * b->w + b->h * b->h); - const PuglRect rect = {(b->x - span) * scaleX, - (b->y - span) * scaleY, - span * 2.0 * scaleX, - span * 2.0 * scaleY}; - - puglPostRedisplayRect(view, rect); - } + const PuglRect frame = puglGetFrame(view); + const double width = frame.width; + const double height = frame.height; + const double scaleX = (width - (512 / width)) / 512.0; + const double scaleY = (height - (512 / height)) / 512.0; + + for (const Button* b = buttons; b->label; ++b) { + const double span = sqrt(b->w * b->w + b->h * b->h); + const PuglRect rect = {(b->x - span) * scaleX, + (b->y - span) * scaleY, + span * 2.0 * scaleX, + span * 2.0 * scaleY}; + + puglPostRedisplayRect(view, rect); + } } static void onDisplay(PuglTestApp* app, PuglView* view, const PuglEventExpose* event) { - cairo_t* cr = (cairo_t*)puglGetContext(view); - - cairo_rectangle(cr, event->x, event->y, event->width, event->height); - cairo_clip_preserve(cr); - - // Draw background - const PuglRect frame = puglGetFrame(view); - const double width = frame.width; - const double height = frame.height; - if (app->entered) { - cairo_set_source_rgb(cr, 0.1, 0.1, 0.1); - } else { - cairo_set_source_rgb(cr, 0, 0, 0); - } - cairo_fill(cr); - - // Scale to view size - const double scaleX = (width - (512 / width)) / 512.0; - const double scaleY = (height - (512 / height)) / 512.0; - cairo_scale(cr, scaleX, scaleY); - - // Draw button - for (const Button* b = buttons; b->label; ++b) { - buttonDraw(app, - cr, - b, - app->opts.continuous ? puglGetTime(app->world) : 0.0); - } - - ++app->framesDrawn; + cairo_t* cr = (cairo_t*)puglGetContext(view); + + cairo_rectangle(cr, event->x, event->y, event->width, event->height); + cairo_clip_preserve(cr); + + // Draw background + const PuglRect frame = puglGetFrame(view); + const double width = frame.width; + const double height = frame.height; + if (app->entered) { + cairo_set_source_rgb(cr, 0.1, 0.1, 0.1); + } else { + cairo_set_source_rgb(cr, 0, 0, 0); + } + cairo_fill(cr); + + // Scale to view size + const double scaleX = (width - (512 / width)) / 512.0; + const double scaleY = (height - (512 / height)) / 512.0; + cairo_scale(cr, scaleX, scaleY); + + // Draw button + for (const Button* b = buttons; b->label; ++b) { + buttonDraw( + app, cr, b, app->opts.continuous ? puglGetTime(app->world) : 0.0); + } + + ++app->framesDrawn; } static void onClose(PuglView* view) { - PuglTestApp* app = (PuglTestApp*)puglGetHandle(view); + PuglTestApp* app = (PuglTestApp*)puglGetHandle(view); - app->quit = 1; + app->quit = 1; } static PuglStatus onEvent(PuglView* view, const PuglEvent* event) { - PuglTestApp* app = (PuglTestApp*)puglGetHandle(view); - - printEvent(event, "Event: ", app->opts.verbose); - - switch (event->type) { - case PUGL_KEY_PRESS: - if (event->key.key == 'q' || event->key.key == PUGL_KEY_ESCAPE) { - app->quit = 1; - } - break; - case PUGL_BUTTON_PRESS: - app->mouseDown = true; - postButtonRedisplay(view); - break; - case PUGL_BUTTON_RELEASE: - app->mouseDown = false; - postButtonRedisplay(view); - break; - case PUGL_POINTER_IN: - app->entered = true; - puglPostRedisplay(view); - break; - case PUGL_POINTER_OUT: - app->entered = false; - puglPostRedisplay(view); - break; - case PUGL_UPDATE: - if (app->opts.continuous) { - puglPostRedisplay(view); - } - break; - case PUGL_EXPOSE: - onDisplay(app, view, &event->expose); - break; - case PUGL_CLOSE: - onClose(view); - break; - default: break; - } - - return PUGL_SUCCESS; + PuglTestApp* app = (PuglTestApp*)puglGetHandle(view); + + printEvent(event, "Event: ", app->opts.verbose); + + switch (event->type) { + case PUGL_KEY_PRESS: + if (event->key.key == 'q' || event->key.key == PUGL_KEY_ESCAPE) { + app->quit = 1; + } + break; + case PUGL_BUTTON_PRESS: + app->mouseDown = true; + postButtonRedisplay(view); + break; + case PUGL_BUTTON_RELEASE: + app->mouseDown = false; + postButtonRedisplay(view); + break; + case PUGL_POINTER_IN: + app->entered = true; + puglPostRedisplay(view); + break; + case PUGL_POINTER_OUT: + app->entered = false; + puglPostRedisplay(view); + break; + case PUGL_UPDATE: + if (app->opts.continuous) { + puglPostRedisplay(view); + } + break; + case PUGL_EXPOSE: + onDisplay(app, view, &event->expose); + break; + case PUGL_CLOSE: + onClose(view); + break; + default: + break; + } + + return PUGL_SUCCESS; } int main(int argc, char** argv) { - PuglTestApp app; - memset(&app, 0, sizeof(app)); - - app.opts = puglParseTestOptions(&argc, &argv); - if (app.opts.help) { - puglPrintTestUsage("pugl_test", ""); - return 1; - } - - app.world = puglNewWorld(PUGL_PROGRAM, 0); - puglSetClassName(app.world, "PuglCairoTest"); - - PuglView* view = puglNewView(app.world); - - puglSetWindowTitle(view, "Pugl Cairo Demo"); - puglSetDefaultSize(view, 512, 512); - puglSetMinSize(view, 256, 256); - puglSetViewHint(view, PUGL_RESIZABLE, app.opts.resizable); - puglSetHandle(view, &app); - puglSetBackend(view, puglCairoBackend()); - puglSetViewHint(view, PUGL_IGNORE_KEY_REPEAT, app.opts.ignoreKeyRepeat); - puglSetEventFunc(view, onEvent); - - PuglStatus st = puglRealize(view); - if (st) { - return logError("Failed to create window (%s)\n", puglStrerror(st)); - } - - puglShow(view); - - PuglFpsPrinter fpsPrinter = { puglGetTime(app.world) }; - const double timeout = app.opts.continuous ? (1 / 60.0) : -1.0; - while (!app.quit) { - puglUpdate(app.world, timeout); - - if (app.opts.continuous) { - puglPrintFps(app.world, &fpsPrinter, &app.framesDrawn); - } - } - - puglFreeView(view); - puglFreeWorld(app.world); - return 0; + PuglTestApp app; + memset(&app, 0, sizeof(app)); + + app.opts = puglParseTestOptions(&argc, &argv); + if (app.opts.help) { + puglPrintTestUsage("pugl_test", ""); + return 1; + } + + app.world = puglNewWorld(PUGL_PROGRAM, 0); + puglSetClassName(app.world, "PuglCairoTest"); + + PuglView* view = puglNewView(app.world); + + puglSetWindowTitle(view, "Pugl Cairo Demo"); + puglSetDefaultSize(view, 512, 512); + puglSetMinSize(view, 256, 256); + puglSetViewHint(view, PUGL_RESIZABLE, app.opts.resizable); + puglSetHandle(view, &app); + puglSetBackend(view, puglCairoBackend()); + puglSetViewHint(view, PUGL_IGNORE_KEY_REPEAT, app.opts.ignoreKeyRepeat); + puglSetEventFunc(view, onEvent); + + PuglStatus st = puglRealize(view); + if (st) { + return logError("Failed to create window (%s)\n", puglStrerror(st)); + } + + puglShow(view); + + PuglFpsPrinter fpsPrinter = {puglGetTime(app.world)}; + const double timeout = app.opts.continuous ? (1 / 60.0) : -1.0; + while (!app.quit) { + puglUpdate(app.world, timeout); + + if (app.opts.continuous) { + puglPrintFps(app.world, &fpsPrinter, &app.framesDrawn); + } + } + + puglFreeView(view); + puglFreeWorld(app.world); + return 0; } |