diff options
| author | Berke Güzel <wenekar1@gmail.com> | 2026-10-14 13:13:52 +0300 |
|---|---|---|
| committer | Berke Güzel <wenekar1@gmail.com> | 2026-10-14 13:13:52 +0300 |
| commit | 1ab3e5a123109704789c2768e11a4f9af515821d (patch) | |
| tree | 31ee03e58093a58100c6eb58681d5d29648a5ddd /examples/hello.c | |
| parent | d86fa6215d40caa7852dbbd6a8cf4aa8e89dd879 (diff) | |
Redefine public and rendering APIs with explicit contracts
Diffstat (limited to 'examples/hello.c')
| -rw-r--r-- | examples/hello.c | 56 |
1 files changed, 40 insertions, 16 deletions
diff --git a/examples/hello.c b/examples/hello.c index 9e324a6..054051d 100644 --- a/examples/hello.c +++ b/examples/hello.c @@ -1,26 +1,50 @@ -/* A CPU-rendered window. Build instructions: docs/getting-started.md. */ +/* A CPU-rendered window. */ #include <yasl/yasl.h> #include <yasl/cpu.h> int main(void) { - yasl_surface *surface = yasl_surface_create("Hello YASL", 640, 480, YASL_SURFACE_CPU); - yasl_event event; - while (surface && yasl_wait_event(&event, -1) >= 0 && - event.type != YASL_EVENT_CLOSE && event.type != YASL_EVENT_QUIT) { - if (event.type != YASL_EVENT_REFRESH) continue; - int w, h; - uint32_t *pixels = yasl_cpu_pixels(surface, &w, &h); - for (int y = 0; pixels && y < h; y++) { - for (int x = 0; x < w; x++) { - /* Red grows rightward, green downward, blue fades; opaque premultiplied ARGB. */ - uint32_t r = (uint32_t)(x * 255 / (w > 1 ? w - 1 : 1)); - uint32_t g = (uint32_t)(y * 255 / (h > 1 ? h - 1 : 1)); - pixels[(size_t)y * w + x] = 0xff000000 | r << 16 | g << 8 | (255 - r); + struct yasl_surface_options options = { + .title = "Hello YASL", + .width = 640, + .height = 480, + .type = YASL_SURFACE_CPU, + }; + yasl_surface *surface = yasl_surface_create(&options); + if (!surface) + return 1; + + int result = 0; + for (;;) { + yasl_event event; + if (yasl_wait_event(&event, -1) < 0) { + result = 1; + break; + } + if (event.type == YASL_EVENT_CLOSE || event.type == YASL_EVENT_QUIT) + break; + if (event.type != YASL_EVENT_REFRESH) + continue; + + struct yasl_cpu_buffer buffer; + if (yasl_cpu_acquire(surface, &buffer) < 0) { + result = 1; + break; + } + for (int y = 0; y < buffer.height; y++) { + uint32_t *row = (uint32_t *)((unsigned char *)buffer.pixels + y * buffer.stride_bytes); + for (int x = 0; x < buffer.width; x++) { + /* Opaque premultiplied ARGB: red grows rightward, green downward. */ + uint32_t r = (uint32_t)(x * 255 / (buffer.width > 1 ? buffer.width - 1 : 1)); + uint32_t g = (uint32_t)(y * 255 / (buffer.height > 1 ? buffer.height - 1 : 1)); + row[x] = 0xff000000 | r << 16 | g << 8 | (255 - r); } } - yasl_cpu_present(surface); + if (yasl_cpu_present(surface, &buffer) < 0) { + result = 1; + break; + } } yasl_shutdown(); - return surface ? 0 : 1; + return result; } |
