aboutsummaryrefslogtreecommitdiff
path: root/graphics/VectorRendererSpec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/VectorRendererSpec.cpp')
-rw-r--r--graphics/VectorRendererSpec.cpp44
1 files changed, 40 insertions, 4 deletions
diff --git a/graphics/VectorRendererSpec.cpp b/graphics/VectorRendererSpec.cpp
index fc741f6e77..9aed3301fa 100644
--- a/graphics/VectorRendererSpec.cpp
+++ b/graphics/VectorRendererSpec.cpp
@@ -25,6 +25,8 @@
#include "common/frac.h"
#include "graphics/surface.h"
+#include "graphics/transparent_surface.h"
+#include "graphics/nine_patch.h"
#include "graphics/colormasks.h"
#include "gui/ThemeEngine.h"
@@ -848,8 +850,8 @@ blitSubSurfaceClip(const Graphics::Surface *source, const Common::Rect &r, const
}
template<typename PixelType>
-void VectorRendererSpec<PixelType>::
-blitAlphaBitmap(const Graphics::Surface *source, const Common::Rect &r) {
+void VectorRendererSpec<PixelType>::
+blitKeyBitmap(const Graphics::Surface *source, const Common::Rect &r) {
int16 x = r.left;
int16 y = r.top;
@@ -885,9 +887,43 @@ blitAlphaBitmap(const Graphics::Surface *source, const Common::Rect &r) {
template<typename PixelType>
void VectorRendererSpec<PixelType>::
-blitAlphaBitmapClip(const Graphics::Surface *source, const Common::Rect &r, const Common::Rect &clipping) {
+blitAlphaBitmap(Graphics::TransparentSurface *source, const Common::Rect &r, GUI::ThemeEngine::AutoScaleMode autoscale,
+ Graphics::DrawStep::VectorAlignment xAlign, Graphics::DrawStep::VectorAlignment yAlign, int alpha) {
+ if (autoscale == GUI::ThemeEngine::kAutoScaleStretch) {
+ source->blit(*_activeSurface, r.left, r.top, Graphics::FLIP_NONE,
+ nullptr, TS_ARGB(alpha, 255, 255, 255),
+ r.width(), r.height());
+ } else if (autoscale == GUI::ThemeEngine::kAutoScaleFit) {
+ double ratio = (double)r.width() / source->w;
+ double ratio2 = (double)r.height() / source->h;
+
+ if (ratio2 < ratio)
+ ratio = ratio2;
+
+ int offx = 0, offy = 0;
+ if (xAlign == Graphics::DrawStep::kVectorAlignCenter)
+ offx = (r.width() - (int)(source->w * ratio)) >> 1;
+
+ if (yAlign == Graphics::DrawStep::kVectorAlignCenter)
+ offy = (r.height() - (int)(source->h * ratio)) >> 1;
+
+ source->blit(*_activeSurface, r.left + offx, r.top + offy, Graphics::FLIP_NONE,
+ nullptr, TS_ARGB(alpha, 255, 255, 255),
+ (int)(source->w * ratio), (int)(source->h * ratio));
+
+ } else if (autoscale == GUI::ThemeEngine::kAutoScaleNinePatch) {
+ Graphics::NinePatchBitmap nine(source, false);
+ nine.blit(*_activeSurface, r.left, r.top, r.width(), r.height());
+ } else {
+ source->blit(*_activeSurface, r.left, r.top);
+ }
+}
+
+template<typename PixelType>
+void VectorRendererSpec<PixelType>::
+blitKeyBitmapClip(const Graphics::Surface *source, const Common::Rect &r, const Common::Rect &clipping) {
if (clipping.isEmpty() || clipping.contains(r)) {
- blitAlphaBitmap(source, r);
+ blitKeyBitmap(source, r);
return;
}