/* * 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('/Users/john/work/cell-image/png') var time = use('time') // Create window var win = video.window({ title: "Lenna - WASD to move", width: 640, height: 480 }) // Create renderer var renderer = 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 = 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() var ev = null var key_name = null var pressed = null var frame = function() { if (!running) { log.console("Exiting...") $stop() return } // Calculate delta time var now = time.number() var dt = now - last_time last_time = now // Process events ev = events.poll() while (ev != null) { if (ev.type == "quit" || ev.type == "window_close_requested") { running = false return } if (ev.type == "key_down" || ev.type == "key_up") { key_name = lower(keyboard.get_key_name(ev.key)) 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 } ev = events.poll() } // Update position based on keys if (keys.w) img_y = img_y - speed * dt if (keys.s) img_y = img_y + speed * dt if (keys.a) img_x = img_x - speed * dt if (keys.d) img_x = 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()