scummvm/backends/graphics/gp2xsdl/gp2xsdl-graphics.cpp

184 lines
4.7 KiB
C++
Raw Normal View History

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*
*/
#ifdef GP2X
#include "backends/graphics/gp2xsdl/gp2xsdl-graphics.h"
#include "graphics/scaler/aspect.h"
#include <SDL_gp2x.h>
static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
{"Fullscreen", "1x", GFX_NORMAL},
{0, 0, 0}
};
GP2XSdlGraphicsManager::GP2XSdlGraphicsManager()
:
_adjustZoomOnMouse(false) {
}
const OSystem::GraphicsMode *GP2XSdlGraphicsManager::getSupportedGraphicsModes() const {
return s_supportedGraphicsModes;
}
int GP2XSdlGraphicsManager::getDefaultGraphicsMode() const {
return GFX_NORMAL;
}
bool GP2XSdlGraphicsManager::hasFeature(OSystem::Feature f) {
if (f == OSystem::kFeatureIconifyWindow)
return false;
return SdlGraphicsManager::hasFeature(f);
}
void GP2XSdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) {
if (f != OSystem::kFeatureIconifyWindow)
SdlGraphicsManager::setFeatureState(f, enable);
}
void GP2XSdlGraphicsManager::drawMouse() {
if (!_mouseVisible || !_mouseSurface) {
_mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0;
return;
}
SDL_Rect zoomdst;
SDL_Rect dst;
int scale;
int hotX, hotY;
int tmpScreenWidth, tmpScreenHeight;
// Temp vars to ensure we zoom to the LCD resolution or greater.
tmpScreenWidth = _videoMode.screenWidth;
tmpScreenHeight = _videoMode.screenHeight;
if (_videoMode.screenHeight <= 240) {
tmpScreenHeight = 240;
}
if (_videoMode.screenWidth <= 320) {
tmpScreenWidth = 320;
}
dst.x = _mouseCurState.x;
dst.y = _mouseCurState.y;
if (!_overlayVisible) {
scale = _videoMode.scaleFactor;
dst.w = _mouseCurState.vW;
dst.h = _mouseCurState.vH;
hotX = _mouseCurState.vHotX;
hotY = _mouseCurState.vHotY;
} else {
scale = 1;
dst.w = _mouseCurState.rW;
dst.h = _mouseCurState.rH;
hotX = _mouseCurState.rHotX;
hotY = _mouseCurState.rHotY;
}
// The mouse is undrawn using virtual coordinates, i.e. they may be
// scaled and aspect-ratio corrected.
_mouseBackup.x = dst.x - hotX;
_mouseBackup.y = dst.y - hotY;
_mouseBackup.w = dst.w;
_mouseBackup.h = dst.h;
// We draw the pre-scaled cursor image, so now we need to adjust for
// scaling, shake position and aspect ratio correction manually.
if (!_overlayVisible) {
dst.y += _currentShakePos;
}
if (_videoMode.aspectRatioCorrection && !_overlayVisible)
dst.y = real2Aspect(dst.y);
dst.x = scale * dst.x - _mouseCurState.rHotX;
dst.y = scale * dst.y - _mouseCurState.rHotY;
dst.w = _mouseCurState.rW;
dst.h = _mouseCurState.rH;
// Hacking about with the zoom around mouse pointer stuff.
if (_adjustZoomOnMouse){
zoomdst.w = (tmpScreenWidth / 2);
zoomdst.h = (tmpScreenHeight / 2);
// Create a zoomed rect centered on the mouse pointer.
// Will pan 1/4 of the screen.
if (dst.x > ((tmpScreenWidth / 4) * 3)) {
zoomdst.x = (tmpScreenWidth / 2);
} else {
zoomdst.x = (dst.x - (tmpScreenWidth / 4));
if (zoomdst.x < 0) {
zoomdst.x = 0;
}
}
if (dst.y > ((tmpScreenHeight / 4) * 3)) {
zoomdst.y = (tmpScreenHeight / 2);
} else {
zoomdst.y = (dst.y - (tmpScreenHeight / 4));
if (zoomdst.y < 0) {
zoomdst.y = 0;
}
}
SDL_GP2X_Display(&zoomdst);
} else {
// Make sure we are looking at the whole screen otherwise.
zoomdst.x = 0;
zoomdst.y = 0;
zoomdst.w = (tmpScreenWidth);
zoomdst.h = (tmpScreenHeight);
SDL_GP2X_Display(&zoomdst);
};
// Note that SDL_BlitSurface() and addDirtyRect() will both perform any
// clipping necessary
if (SDL_BlitSurface(_mouseSurface, NULL, _hwscreen, &dst) != 0)
error("SDL_BlitSurface failed: %s", SDL_GetError());
// The screen will be updated using real surface coordinates, i.e.
// they will not be scaled or aspect-ratio corrected.
addDirtyRect(dst.x, dst.y, dst.w, dst.h, true);
}
void GP2XSdlGraphicsManager::toggleZoomOnMouse() {
_adjustZoomOnMouse = !_adjustZoomOnMouse;
}
#endif