Files
cell-sdl3/examples/lenna.ce
2025-12-11 10:39:24 -06:00

128 lines
2.9 KiB
Plaintext

/*
* Lenna Image Viewer - SDL3 Example
*
* Demonstrates loading an image from cell-image and rendering it with SDL3.
* Use WASD to move the image around the window.
*
* Usage: cell run examples/lenna.ce
*/
var io = use('fd')
var video = use('video')
var render = use('render')
var surface = use('surface')
var events = use('events')
var keyboard = use('keyboard')
var png = use('gitea.pockle.world/john/cell-image/png')
var time = use('time')
// Create window
var win = new video.window({
title: "Lenna - WASD to move",
width: 640,
height: 480
})
// Create renderer
var renderer = new render(win)
renderer.win = win
// Load lenna.png using cell-image
log.console("Loading lenna.png...")
var img_blob = io.slurp("lenna.png")
if (!img_blob) {
log.console("Error: Could not load lenna.png")
$_.stop()
}
var img = png.decode(img_blob)
if (!img) {
log.console("Error: Could not decode lenna.png")
$_.stop()
}
log.console("Image loaded: " + text(img.width) + "x" + text(img.height))
// Create SDL surface from image data
var surf = new surface({
width: img.width,
height: img.height,
format: "rgba32",
pixels: img.pixels,
pitch: img.pitch
})
// Create texture from surface
var tex = renderer.load_texture(surf)
log.console("Texture created: " + text(tex.width) + "x" + text(tex.height))
// Image position (centered initially)
var img_x = (640 - img.width) / 2
var img_y = (480 - img.height) / 2
var speed = 200 // pixels per second
// Track key states
var keys = {
w: false,
a: false,
s: false,
d: false
}
var running = true
var last_time = time.number()
function frame() {
if (!running) {
log.console("Exiting...")
$_.stop()
return
}
// Calculate delta time
var now = time.number()
var dt = now - last_time
last_time = now
// Process events
var ev
while ((ev = events.poll()) != null) {
if (ev.type == "quit" || ev.type == "window_close_requested") {
running = false
return
}
if (ev.type == "key_down" || ev.type == "key_up") {
var key_name = keyboard.get_key_name(ev.key).toLowerCase()
var pressed = ev.type == "key_down"
if (key_name == "w") keys.w = pressed
if (key_name == "a") keys.a = pressed
if (key_name == "s") keys.s = pressed
if (key_name == "d") keys.d = pressed
if (key_name == "escape" && pressed) running = false
}
}
// Update position based on keys
if (keys.w) img_y -= speed * dt
if (keys.s) img_y += speed * dt
if (keys.a) img_x -= speed * dt
if (keys.d) img_x += speed * dt
// Clear screen (dark gray)
renderer.draw_color([0.2, 0.2, 0.2, 1])
renderer.clear()
// Draw texture at current position
renderer.texture(tex, { x: img_x, y: img_y, width: tex.width, height: tex.height }, null, null)
// Present
renderer.present()
// Schedule next frame
$_.delay(frame, 1/60)
}
log.console("Starting render loop... Press ESC to exit, WASD to move")
frame()