From 5a05140ac34a6a177b90a22f8601f2adff4831d5 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 18 Nov 2018 21:31:58 -0800 Subject: [PATCH] GLK: Add picture scaling --- engines/glk/picture.cpp | 20 +++++++++++++++----- engines/glk/picture.h | 18 ++++++++++++------ engines/glk/window_graphics.cpp | 2 +- engines/glk/window_text_buffer.cpp | 2 +- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/engines/glk/picture.cpp b/engines/glk/picture.cpp index 8461983c453..89e75fa9411 100644 --- a/engines/glk/picture.cpp +++ b/engines/glk/picture.cpp @@ -126,6 +126,21 @@ Picture *Pictures::load(uint32 id) { return pic; } +Picture *Pictures::scale(Picture *src, size_t sx, size_t sy) { + // Check for the presence of an already scaled version of that size + Picture *dst = retrieve(src->_id, true); + if (dst && dst->w == sx && dst->h == sy) + return dst; + + // Create a new picture of the destination size and rescale the source picture + dst = new Picture(sx, sy, src->format); + dst->_id = src->_id; + dst->_scaled = true; + dst->transBlitFrom(*src, src->getBounds(), dst->getBounds(), (uint)-1); + + storeScaled(dst); +} + /*--------------------------------------------------------------------------*/ void Picture::increment() { @@ -139,11 +154,6 @@ void Picture::decrement() { } } -Picture *Picture::scale(int sx, int sy) { - // TODO: gli_picture_scale - return nullptr; -} - void Picture::drawPicture(int x0, int y0, int dx0, int dy0, int dx1, int dy1) { // TODO: drawPicture } diff --git a/engines/glk/picture.h b/engines/glk/picture.h index ca4f9995c89..c0108dd2a00 100644 --- a/engines/glk/picture.h +++ b/engines/glk/picture.h @@ -40,7 +40,13 @@ public: /** * Constructor */ - Picture() : Graphics::ManagedSurface(), _refCount(0), _id(0), _scaled(0) {} + Picture() : Graphics::ManagedSurface(), _refCount(0), _id(0), _scaled(false) {} + + /** + * Constructor + */ + Picture(int width, int height, const Graphics::PixelFormat &format) : + Graphics::ManagedSurface(width, height, format), _refCount(0), _id(0), _scaled(false) {} /** * Increment reference counter @@ -52,11 +58,6 @@ public: */ void decrement(); - /** - * Rescale the picture to a new picture of a given size - */ - Picture *scale(int sx, int sy); - /** * Draw the picture */ @@ -134,6 +135,11 @@ public: * Load a given picture */ Picture *load(uint32 id); + + /** + * Rescale the passed picture to a new picture of a given size + */ + Picture *scale(Picture *src, size_t sx, size_t sy); }; } // End of namespace Glk diff --git a/engines/glk/window_graphics.cpp b/engines/glk/window_graphics.cpp index 13e66451f74..92224b6a4d1 100644 --- a/engines/glk/window_graphics.cpp +++ b/engines/glk/window_graphics.cpp @@ -186,7 +186,7 @@ void GraphicsWindow::drawPicture(Picture *src, int x0, int y0, int width, int h int w, h; if (width != src->w || height != src->h) { - src = src->scale(width, height); + src = g_vm->_pictures->scale(src, width, height); if (!src) return; } diff --git a/engines/glk/window_text_buffer.cpp b/engines/glk/window_text_buffer.cpp index 6f861fb7b38..4c55066603b 100644 --- a/engines/glk/window_text_buffer.cpp +++ b/engines/glk/window_text_buffer.cpp @@ -286,7 +286,7 @@ glui32 TextBufferWindow::drawPicture(glui32 image, glui32 align, glui32 scaled, if (scaled) { Picture *tmp; - tmp = pic->scale(width, height); + tmp = g_vm->_pictures->scale(pic, width, height); pic = tmp; }