mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-18 07:39:08 +00:00
MORTEVIELLE: Added an optimised drawBox routine
This commit is contained in:
parent
c33f25cffb
commit
33f70da53c
@ -25,41 +25,17 @@
|
||||
* Copyright (c) 1988-1989 Lankhor
|
||||
*/
|
||||
|
||||
#include "common/textconsole.h"
|
||||
#include "mortevielle/boite.h"
|
||||
#include "mortevielle/mouse.h"
|
||||
#include "mortevielle/var_mor.h"
|
||||
#include "mortevielle/mortevielle.h"
|
||||
|
||||
namespace Mortevielle {
|
||||
|
||||
//Translation: box()
|
||||
void boite(int x, int y, int dx, int dy, int coul) {
|
||||
int i;
|
||||
int xi, yi, xo, yo;
|
||||
warning("TODO: boite is deprecated in favour of ScreenSurface::drawBox");
|
||||
|
||||
/* debug('boite'); */
|
||||
hide_mouse();
|
||||
if (res == 1) {
|
||||
x = (uint)x >> 1;
|
||||
dx = (uint)dx >> 1;
|
||||
}
|
||||
xi = x;
|
||||
yi = y;
|
||||
xo = x;
|
||||
yo = y;
|
||||
for (i = 0; i <= dx + dy; i ++) {
|
||||
putpix(gd, xi, yi, coul);
|
||||
if (xi == x + dx) {
|
||||
if (gd != cga) putpix(gd, pred(int, xi), yi, coul);
|
||||
yi = succ(int, yi);
|
||||
} else xi = succ(int, xi);
|
||||
putpix(gd, xo, yo, coul);
|
||||
if (yo == y + dy) xo = succ(int, xo);
|
||||
else {
|
||||
if (gd != cga) putpix(gd, succ(int, xo), yo, coul);
|
||||
yo = succ(int, yo);
|
||||
}
|
||||
}
|
||||
show_mouse();
|
||||
g_vm->_screenSurface.drawBox(x, y, dx, dy, coul);
|
||||
}
|
||||
|
||||
} // End of namespace Mortevielle
|
||||
|
@ -24,6 +24,8 @@
|
||||
#include "common/system.h"
|
||||
#include "mortevielle/graphics.h"
|
||||
#include "mortevielle/mortevielle.h"
|
||||
#include "mortevielle/mouse.h"
|
||||
#include "mortevielle/var_mor.h"
|
||||
|
||||
namespace Mortevielle {
|
||||
|
||||
@ -819,6 +821,7 @@ Graphics::Surface ScreenSurface::lockArea(const Common::Rect &bounds) {
|
||||
_dirtyRects.push_back(bounds);
|
||||
|
||||
Graphics::Surface s;
|
||||
s.format = format;
|
||||
s.pixels = getBasePtr(bounds.left, bounds.top);
|
||||
s.pitch = pitch;
|
||||
s.w = bounds.width();
|
||||
@ -845,8 +848,8 @@ void ScreenSurface::updateScreen() {
|
||||
|
||||
/**
|
||||
* Draws a decoded picture on the screen
|
||||
* @remarks Because the ScummVM surface is using a double height 640x200 surface to
|
||||
* simulate the original 640x200 surface, all Y values have to be doubled.
|
||||
* @remarks Because the ScummVM surface is using a double height 640x400 surface to
|
||||
* simulate the original 640x400 surface, all Y values have to be doubled.
|
||||
* Also, image resources are stored at 320x200, so when drawn onto the screen every
|
||||
* other column is interpolated.
|
||||
*/
|
||||
@ -888,8 +891,8 @@ void ScreenSurface::drawPicture(GfxSurface &surface, int x, int y) {
|
||||
|
||||
/**
|
||||
* Draws a character at the specified co-ordinates
|
||||
* @remarks Because the ScummVM surface is using a double height 640x200 surface to
|
||||
* simulate the original 640x200 surface, all Y values have to be doubled
|
||||
* @remarks Because the ScummVM surface is using a double height 640x400 surface to
|
||||
* simulate the original 640x400 surface, all Y values have to be doubled
|
||||
*/
|
||||
void ScreenSurface::writeCharacter(const Common::Point &pt, unsigned char ch, int palIndex) {
|
||||
Graphics::Surface destSurface = lockArea(Common::Rect(pt.x, pt.y * 2,
|
||||
@ -913,10 +916,34 @@ void ScreenSurface::writeCharacter(const Common::Point &pt, unsigned char ch, in
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a box at the specified position and size
|
||||
* @remarks Because the ScummVM surface is using a double height 640x400 surface to
|
||||
* simulate the original 640x400 surface, all Y values have to be doubled
|
||||
*/
|
||||
void ScreenSurface::drawBox(int x, int y, int dx, int dy, int col) {
|
||||
if (res == 1) {
|
||||
x = (uint)x >> 1;
|
||||
dx = (uint)dx >> 1;
|
||||
}
|
||||
|
||||
Graphics::Surface destSurface = lockArea(Common::Rect(x, y * 2, x + dx, (y + dy) * 2));
|
||||
|
||||
destSurface.hLine(0, 0, dx, col);
|
||||
destSurface.hLine(0, 1, dx, col);
|
||||
destSurface.hLine(0, destSurface.h - 1, dx, col);
|
||||
destSurface.hLine(0, destSurface.h - 2, dx, col);
|
||||
destSurface.vLine(0, 2, destSurface.h - 3, col);
|
||||
destSurface.vLine(1, 2, destSurface.h - 3, col);
|
||||
destSurface.vLine(dx - 1, 2, destSurface.h - 3, col);
|
||||
destSurface.vLine(dx - 2, 2, destSurface.h - 3, col);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets a single pixel at the specified co-ordinates
|
||||
* @remarks Because the ScummVM surface is using a double height 640x200 surface to
|
||||
* simulate the original 640x200 surface, all Y values have to be doubled
|
||||
* @remarks Because the ScummVM surface is using a double height 640x400 surface to
|
||||
* simulate the original 640x400 surface, all Y values have to be doubled
|
||||
*/
|
||||
void ScreenSurface::setPixel(const Common::Point &pt, int palIndex) {
|
||||
Graphics::Surface destSurface = lockArea(Common::Rect(pt.x, pt.y * 2, pt.x + 1, (pt.y + 1) * 2));
|
||||
|
@ -76,7 +76,7 @@ public:
|
||||
void updateScreen();
|
||||
void drawPicture(GfxSurface &surface, int x, int y);
|
||||
void writeCharacter(const Common::Point &pt, unsigned char ch, int palIndex);
|
||||
|
||||
void drawBox(int x, int y, int dx, int dy, int col);
|
||||
// TODO: Refactor code to remove this method, for increased performance
|
||||
void setPixel(const Common::Point &pt, int palIndex);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user