#pragma once #include "core/jail/jdraw8.hpp" namespace scenes { // Wrapper RAII damunt de `JD8_Surface`. Allibera automàticament amb // `JD8_FreeSurface` al destructor. Move-only per evitar dobles alliberaments. // Converteix implícitament a `JD8_Surface` per a poder passar-lo // directament a `JD8_Blit*` sense haver de cridar `.get()`. class SurfaceHandle { public: SurfaceHandle() = default; explicit SurfaceHandle(const char* file); ~SurfaceHandle(); SurfaceHandle(const SurfaceHandle&) = delete; SurfaceHandle& operator=(const SurfaceHandle&) = delete; SurfaceHandle(SurfaceHandle&& other) noexcept; SurfaceHandle& operator=(SurfaceHandle&& other) noexcept; // Allibera la surface actual (si n'hi ha) i carrega una nova. // Usat per escenes que recarreguen assets a mitja cinemàtica // (p.ex. doSecreta que passa de tomba1 a tomba2). void reset(const char* file); // Adopta una surface ja creada (p.ex. amb JD8_NewSurface). Pren ownership // — la surface adoptada s'allibera al destructor o al següent reset/adopt. void adopt(JD8_Surface raw); // Allibera ownership sense destruir la surface. Retorna el pointer cru; // el caller passa a ser responsable d'alliberar-lo (o de passar-lo a un // altre propietari). Usat quan una escena delega a codi legacy que // també allibera la mateixa surface — cal "soltar" el ownership per // evitar double free. [[nodiscard]] JD8_Surface release(); // Conversió implícita per al confort d'ús: JD8_Blit(handle) // en lloc de JD8_Blit(handle.get()). operator JD8_Surface() const { return surface_; } JD8_Surface get() const { return surface_; } bool valid() const { return surface_ != nullptr; } private: JD8_Surface surface_{nullptr}; }; } // namespace scenes