#pragma once #include "AnimationStrategy.h" #include "TransitionStrategy.h" #include "Preloader.h" #include #include #include #include #include #include #include // for std::unique_ptr #include #include class Renderer { public: // 사용자가 설정할 수 있는 애니메이션 모드 종류 enum class AnimationMode { PAN = 0, ZOOM = 1, NONE = 2, RANDOM = 3, PAN_ONE_WAY = 4, PAGE_TURN = 5 }; // 사용자가 설정할 수 있는 전환 효과 종류 enum class TransitionMode { FADE = 0, SLIDE = 1, RANDOM = 2, MOSAIC = 3 }; Renderer(); ~Renderer(); // --- Public API --- void setNextMedia(int fd); void renderFrame(ANativeWindow* window); void release(); std::string getDebugInfo() const; // --- 설정(Settings)을 위한 함수들 --- void setAnimationSpeed(float speed); void setAnimationMode(int mode); void setFadeDuration(int durationMs); void setPageTurnDelay(int delayMs); void setTransitionMode(int mode); // --- 전략(Strategy) 객체들이 호출하는 헬퍼 함수들 --- void drawMedia(ANativeWindow_Buffer& buffer, MediaAsset& media, float alpha, float finalOffsetX, float finalOffsetY, float finalScale); void renderVideoFrame(MediaAsset& media, ANativeWindow_Buffer& buffer, float scale, float offsetX, float offsetY, float alpha); void renderImageFrame(const MediaAsset& media, ANativeWindow_Buffer& buffer, float scale, float offsetX, float offsetY, float alpha); void calculateFitScaleAndOffset(const MediaAsset& media, int surfaceWidth, int surfaceHeight, float& outScale, float& outOffsetX, float& outOffsetY) const; private: // --- 상태 머신(State Machine) --- enum class RenderState { ANIMATING, TRANSITIONING }; RenderState currentState_ = RenderState::ANIMATING; // --- 상태별 처리를 위한 private 핸들러 함수 --- void handleAnimationState(ANativeWindow_Buffer& buffer, int surfaceWidth, int surfaceHeight); void handleTransitionState(ANativeWindow_Buffer& buffer, int surfaceWidth, int surfaceHeight); // --- 멤버 객체들 --- std::mutex renderMutex_; Preloader preloader_; MediaAsset currentMedia_; MediaAsset nextMedia_; std::unique_ptr animationStrategy_; std::unique_ptr transitionStrategy_; // --- 설정값 저장 변수 --- AnimationMode configuredAnimationMode_ = AnimationMode::PAN; TransitionMode configuredTransitionMode_ = TransitionMode::FADE; AnimationMode activeAnimationMode_ = AnimationMode::PAN; long long fadeDurationMs_ = 3000; long long pageTurnDelayMs_ = 5000; float animationSpeed_ = 1.0f; // --- 상태(State) 관리 변수 --- std::chrono::steady_clock::time_point transitionStartTime_; // --- 랜덤 기능 --- std::mt19937 randomEngine_; // --- private 헬퍼 함수 --- void determineActiveAnimationMode(); };