/* * 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()