mirror of
				https://github.com/RetroDECK/ES-DE.git
				synced 2025-04-10 19:15:13 +00:00 
			
		
		
		
	Added a new cropSize property to the video element.
This commit is contained in:
		
							parent
							
								
									b9a2a146b7
								
							
						
					
					
						commit
						95ef3b0555
					
				|  | @ -317,6 +317,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>> | |||
|      {"video", | ||||
|       {{"pos", NORMALIZED_PAIR}, | ||||
|        {"size", NORMALIZED_PAIR}, | ||||
|        {"cropSize", NORMALIZED_PAIR}, | ||||
|        {"maxSize", NORMALIZED_PAIR}, | ||||
|        {"origin", NORMALIZED_PAIR}, | ||||
|        {"path", PATH}, | ||||
|  |  | |||
|  | @ -28,6 +28,8 @@ VideoComponent::VideoComponent() | |||
|     , mTargetSize {0.0f, 0.0f} | ||||
|     , mVideoAreaPos {0.0f, 0.0f} | ||||
|     , mVideoAreaSize {0.0f, 0.0f} | ||||
|     , mTopLeftCrop {0.0f, 0.0f} | ||||
|     , mBottomRightCrop {1.0f, 1.0f} | ||||
|     , mPillarboxThreshold {0.85f, 0.90f} | ||||
|     , mStartTime {0} | ||||
|     , mIsPlaying {false} | ||||
|  | @ -36,6 +38,7 @@ VideoComponent::VideoComponent() | |||
|     , mMediaViewerMode {false} | ||||
|     , mScreensaverMode {false} | ||||
|     , mTargetIsMax {false} | ||||
|     , mTargetIsCrop {false} | ||||
|     , mPlayAudio {true} | ||||
|     , mDrawPillarboxes {true} | ||||
|     , mRenderScanlines {false} | ||||
|  | @ -154,6 +157,13 @@ void VideoComponent::applyTheme(const std::shared_ptr<ThemeData>& theme, | |||
|             setMaxSize(videoMaxSize * scale); | ||||
|             mVideoAreaSize = videoMaxSize * scale; | ||||
|         } | ||||
|         else if (elem->has("cropSize")) { | ||||
|             glm::vec2 videoCropSize {elem->get<glm::vec2>("cropSize")}; | ||||
|             videoCropSize.x = glm::clamp(videoCropSize.x, 0.01f, 2.0f); | ||||
|             videoCropSize.y = glm::clamp(videoCropSize.y, 0.01f, 2.0f); | ||||
|             setCroppedSize(videoCropSize * scale); | ||||
|             mVideoAreaSize = videoCropSize * scale; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (properties & ThemeFlags::POSITION) { | ||||
|  | @ -302,8 +312,17 @@ void VideoComponent::applyTheme(const std::shared_ptr<ThemeData>& theme, | |||
|         mPillarboxThreshold.y = glm::clamp(pillarboxThreshold.y, 0.2f, 1.0f); | ||||
|     } | ||||
| 
 | ||||
|     if (elem->has("scanlines")) | ||||
|         mRenderScanlines = elem->get<bool>("scanlines"); | ||||
|     if (elem->has("scanlines")) { | ||||
|         if (elem->has("cropSize") && elem->get<bool>("scanlines")) { | ||||
|             LOG(LogWarning) << "VideoComponent: Invalid theme configuration, property " | ||||
|                                "\"cropSize\" for element \"" | ||||
|                             << element.substr(6) | ||||
|                             << "\" can't be combined with the \"scanlines\" property"; | ||||
|         } | ||||
|         else { | ||||
|             mRenderScanlines = elem->get<bool>("scanlines"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (elem->has("scrollFadeIn") && elem->get<bool>("scrollFadeIn")) | ||||
|         mComponentThemeFlags |= ComponentThemeFlags::SCROLL_FADE_IN; | ||||
|  |  | |||
|  | @ -83,6 +83,8 @@ public: | |||
|     // Never breaks the aspect ratio. setMaxSize() and setResize() are mutually exclusive.
 | ||||
|     virtual void setMaxSize(float width, float height) = 0; | ||||
|     void setMaxSize(const glm::vec2& size) { setMaxSize(size.x, size.y); } | ||||
|     // Resize and crop the video so it fills the entire area.
 | ||||
|     virtual void setCroppedSize(const glm::vec2& size) = 0; | ||||
| 
 | ||||
|     // Basic video controls.
 | ||||
|     void startVideoPlayer(); | ||||
|  | @ -109,6 +111,8 @@ protected: | |||
|     glm::vec2 mTargetSize; | ||||
|     glm::vec2 mVideoAreaPos; | ||||
|     glm::vec2 mVideoAreaSize; | ||||
|     glm::vec2 mTopLeftCrop; | ||||
|     glm::vec2 mBottomRightCrop; | ||||
|     glm::vec2 mPillarboxThreshold; | ||||
|     std::shared_ptr<TextureResource> mTexture; | ||||
|     std::string mStaticImagePath; | ||||
|  | @ -126,6 +130,7 @@ protected: | |||
|     bool mMediaViewerMode; | ||||
|     bool mScreensaverMode; | ||||
|     bool mTargetIsMax; | ||||
|     bool mTargetIsCrop; | ||||
|     bool mPlayAudio; | ||||
|     bool mDrawPillarboxes; | ||||
|     bool mRenderScanlines; | ||||
|  |  | |||
|  | @ -66,6 +66,7 @@ void VideoFFmpegComponent::setResize(const float width, const float height) | |||
|     // This resize function is used when stretching videos to full screen in the video screensaver.
 | ||||
|     mTargetSize = glm::vec2 {width, height}; | ||||
|     mTargetIsMax = false; | ||||
|     mTargetIsCrop = false; | ||||
|     mStaticImage.setResize(mTargetSize); | ||||
|     resize(); | ||||
| } | ||||
|  | @ -76,10 +77,20 @@ void VideoFFmpegComponent::setMaxSize(float width, float height) | |||
|     // and the gamelist videos.
 | ||||
|     mTargetSize = glm::vec2 {width, height}; | ||||
|     mTargetIsMax = true; | ||||
|     mTargetIsCrop = false; | ||||
|     mStaticImage.setMaxSize(width, height); | ||||
|     resize(); | ||||
| } | ||||
| 
 | ||||
| void VideoFFmpegComponent::setCroppedSize(const glm::vec2& size) | ||||
| { | ||||
|     mTargetSize = size; | ||||
|     mTargetIsMax = false; | ||||
|     mTargetIsCrop = true; | ||||
|     mStaticImage.setCroppedSize(size); | ||||
|     resize(); | ||||
| } | ||||
| 
 | ||||
| void VideoFFmpegComponent::resize() | ||||
| { | ||||
|     if (!mTexture) | ||||
|  | @ -106,6 +117,25 @@ void VideoFFmpegComponent::resize() | |||
| 
 | ||||
|         mSize.x = (mSize.y / textureSize.y) * textureSize.x; | ||||
|     } | ||||
|     else if (mTargetIsCrop) { | ||||
|         // Size texture to allow for cropped video to fill the entire area.
 | ||||
|         const float cropFactor { | ||||
|             std::max(mTargetSize.x / textureSize.x, mTargetSize.y / textureSize.y)}; | ||||
|         mSize = textureSize * cropFactor; | ||||
| 
 | ||||
|         if (std::round(mSize.y) > std::round(mTargetSize.y)) { | ||||
|             const float cropSize {1.0f - (mTargetSize.y / mSize.y)}; | ||||
|             mTopLeftCrop.y = cropSize / 2.0f; | ||||
|             mBottomRightCrop.y = 1.0f - (cropSize / 2.0f); | ||||
|             mSize.y = mSize.y - (mSize.y * cropSize); | ||||
|         } | ||||
|         else { | ||||
|             const float cropSize {1.0f - (mTargetSize.x / mSize.x)}; | ||||
|             mTopLeftCrop.x = cropSize / 2.0f; | ||||
|             mBottomRightCrop.x = 1.0f - (cropSize / 2.0f); | ||||
|             mSize.x = mSize.x - (mSize.x * cropSize); | ||||
|         } | ||||
|     } | ||||
|     else { | ||||
|         // If both components are set, we just stretch.
 | ||||
|         // If no components are set, we don't resize at all.
 | ||||
|  | @ -159,10 +189,10 @@ void VideoFFmpegComponent::render(const glm::mat4& parentTrans) | |||
|             return; | ||||
| 
 | ||||
|         // clang-format off
 | ||||
|         vertices[0] = {{0.0f + mRectangleOffset.x,    0.0f + mRectangleOffset.y     }, {0.0f, 0.0f}, 0xFFFFFFFF}; | ||||
|         vertices[1] = {{0.0f + mRectangleOffset.x,    mSize.y + mRectangleOffset.y  }, {0.0f, 1.0f}, 0xFFFFFFFF}; | ||||
|         vertices[2] = {{mSize.x + mRectangleOffset.x, 0.0f + + mRectangleOffset.y   }, {1.0f, 0.0f}, 0xFFFFFFFF}; | ||||
|         vertices[3] = {{mSize.x + mRectangleOffset.x, mSize.y + + mRectangleOffset.y}, {1.0f, 1.0f}, 0xFFFFFFFF}; | ||||
|         vertices[0] = {{0.0f + mRectangleOffset.x,    0.0f + mRectangleOffset.y     }, {mTopLeftCrop.x,            1.0f - mBottomRightCrop.y}, 0xFFFFFFFF}; | ||||
|         vertices[1] = {{0.0f + mRectangleOffset.x,    mSize.y + mRectangleOffset.y  }, {mTopLeftCrop.x,            1.0f - mTopLeftCrop.y    }, 0xFFFFFFFF}; | ||||
|         vertices[2] = {{mSize.x + mRectangleOffset.x, 0.0f + + mRectangleOffset.y   }, {mBottomRightCrop.x * 1.0f, 1.0f - mBottomRightCrop.y}, 0xFFFFFFFF}; | ||||
|         vertices[3] = {{mSize.x + mRectangleOffset.x, mSize.y + + mRectangleOffset.y}, {mBottomRightCrop.x * 1.0f, 1.0f - mTopLeftCrop.y    }, 0xFFFFFFFF}; | ||||
|         // clang-format on
 | ||||
| 
 | ||||
|         vertices[0].color = mColorShift; | ||||
|  |  | |||
|  | @ -46,6 +46,9 @@ public: | |||
|     // This can be set before or after a video is loaded.
 | ||||
|     // Never breaks the aspect ratio. setMaxSize() and setResize() are mutually exclusive.
 | ||||
|     void setMaxSize(float width, float height) override; | ||||
|     // Resize and crop the video so it fills the entire area.
 | ||||
|     void setCroppedSize(const glm::vec2& size) override; | ||||
| 
 | ||||
|     // Basic video controls.
 | ||||
|     void stopVideoPlayer(bool muteAudio = true) override; | ||||
|     void pauseVideoPlayer() override; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Leon Styhre
						Leon Styhre