2025-08-27 15:09:05 +09:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "MediaAsset.h"
|
2025-08-28 15:13:40 +09:00
|
|
|
#include "Preloader.h"
|
2025-08-27 15:09:05 +09:00
|
|
|
#include <string>
|
2025-08-28 15:13:40 +09:00
|
|
|
#include <sstream>
|
|
|
|
|
#include <iomanip>
|
|
|
|
|
#include <chrono>
|
2025-08-27 15:09:05 +09:00
|
|
|
#include <mutex>
|
2025-08-28 15:13:40 +09:00
|
|
|
#include <random>
|
2025-08-27 15:09:05 +09:00
|
|
|
#include <android/native_window.h>
|
|
|
|
|
#include <android/native_window_jni.h>
|
|
|
|
|
|
|
|
|
|
class Renderer {
|
|
|
|
|
public:
|
2025-08-28 15:13:40 +09:00
|
|
|
enum class AnimationMode {
|
|
|
|
|
PAN = 0,
|
|
|
|
|
ZOOM = 1,
|
|
|
|
|
NONE = 2,
|
|
|
|
|
RANDOM = 3,
|
|
|
|
|
PAN_ONE_WAY = 4,
|
|
|
|
|
PAGE_TURN = 5
|
|
|
|
|
};
|
|
|
|
|
|
2025-08-27 15:09:05 +09:00
|
|
|
Renderer();
|
|
|
|
|
~Renderer();
|
|
|
|
|
|
|
|
|
|
void setNextMedia(int fd);
|
|
|
|
|
void renderFrame(ANativeWindow* window);
|
|
|
|
|
void release();
|
2025-08-28 15:13:40 +09:00
|
|
|
std::string getDebugInfo() const;
|
|
|
|
|
|
|
|
|
|
void setAnimationSpeed(float speed);
|
|
|
|
|
void setAnimationMode(int mode);
|
|
|
|
|
void setFadeDuration(int durationMs);
|
|
|
|
|
void setPageTurnDelay(int delayMs); // <-- 새로운 setter 선언
|
2025-08-27 15:09:05 +09:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::mutex renderMutex_;
|
2025-08-28 15:13:40 +09:00
|
|
|
Preloader preloader_;
|
2025-08-27 15:09:05 +09:00
|
|
|
MediaAsset currentMedia_;
|
|
|
|
|
MediaAsset nextMedia_;
|
|
|
|
|
|
2025-08-28 15:13:40 +09:00
|
|
|
AnimationMode configuredAnimationMode_ = AnimationMode::PAN;
|
|
|
|
|
AnimationMode activeAnimationMode_ = AnimationMode::PAN;
|
|
|
|
|
long long fadeDurationMs_ = 3000;
|
|
|
|
|
long long pageTurnDelayMs_ = 5000; // <-- PAGE_TURN 모드 대기 시간 (기본 5초)
|
|
|
|
|
float animationSpeed_ = 1.0f;
|
|
|
|
|
|
|
|
|
|
// std::chrono::steady_clock::time_point transitionStartTime_; // <-- 삭제
|
|
|
|
|
// bool isTransitioning_ = false; // <-- 삭제
|
|
|
|
|
// float transitionProgress_ = 0.0f; // <-- 삭제
|
|
|
|
|
|
2025-08-27 15:09:05 +09:00
|
|
|
std::chrono::steady_clock::time_point fadeStartTime_;
|
2025-08-28 15:13:40 +09:00
|
|
|
std::chrono::steady_clock::time_point pageTurnStartTime_; // <-- PAGE_TURN 대기 시작 시간 추가
|
2025-08-27 15:09:05 +09:00
|
|
|
bool isFading_ = false;
|
|
|
|
|
|
2025-08-28 15:13:40 +09:00
|
|
|
float currentOffsetX_ = 0.0f;
|
|
|
|
|
float currentOffsetY_ = 0.0f;
|
|
|
|
|
int xDirection_ = 1;
|
|
|
|
|
int yDirection_ = 1;
|
|
|
|
|
|
|
|
|
|
float currentZoom_ = 1.0f;
|
|
|
|
|
int zoomDirection_ = 1;
|
|
|
|
|
|
|
|
|
|
bool animationCycleComplete_ = false;
|
|
|
|
|
|
|
|
|
|
std::mt19937 randomEngine_;
|
|
|
|
|
|
|
|
|
|
void determineActiveAnimationMode();
|
|
|
|
|
void calculateFitScaleAndOffset(const MediaAsset& media, int surfaceWidth, int surfaceHeight,
|
|
|
|
|
float& outScale, float& outOffsetX, float& outOffsetY) const;
|
|
|
|
|
void drawMedia(ANativeWindow_Buffer& buffer, MediaAsset& media, float alpha, float offsetX, float offsetY, float scaleMultiplier);
|
|
|
|
|
void renderVideoFrame(MediaAsset& media, ANativeWindow_Buffer& buffer, float scale, float offsetX, float offsetY, float alpha);
|
2025-08-27 15:09:05 +09:00
|
|
|
void renderImageFrame(const MediaAsset& media, ANativeWindow_Buffer& buffer, float scale, float offsetX, float offsetY, float alpha);
|
|
|
|
|
};
|