aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/samsungtv/graphics.cpp
diff options
context:
space:
mode:
authorPaweł Kołodziejski2009-11-10 11:20:35 +0000
committerPaweł Kołodziejski2009-11-10 11:20:35 +0000
commit02165cff5a901e4508b4b10da23258c0d802bad7 (patch)
tree441f8d2a6ff14e8b2dee30e916395d17e7173d85 /backends/platform/samsungtv/graphics.cpp
parent9ea10940943dbc4d74552475361d12adc49bc724 (diff)
downloadscummvm-rg350-02165cff5a901e4508b4b10da23258c0d802bad7.tar.gz
scummvm-rg350-02165cff5a901e4508b4b10da23258c0d802bad7.tar.bz2
scummvm-rg350-02165cff5a901e4508b4b10da23258c0d802bad7.zip
make samsungtv backend subclass of sdl class
svn-id: r45805
Diffstat (limited to 'backends/platform/samsungtv/graphics.cpp')
-rw-r--r--backends/platform/samsungtv/graphics.cpp991
1 files changed, 2 insertions, 989 deletions
diff --git a/backends/platform/samsungtv/graphics.cpp b/backends/platform/samsungtv/graphics.cpp
index b7e02d9f1c..88f4674c54 100644
--- a/backends/platform/samsungtv/graphics.cpp
+++ b/backends/platform/samsungtv/graphics.cpp
@@ -34,20 +34,6 @@
#if defined(SAMSUNGTV)
-static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
- {"1x", "Normal (no scaling)", GFX_NORMAL},
- {"2x", "2x", GFX_DOUBLESIZE},
- {"3x", "3x", GFX_TRIPLESIZE},
- {"2xsai", "2xSAI", GFX_2XSAI},
- {"super2xsai", "Super2xSAI", GFX_SUPER2XSAI},
- {"supereagle", "SuperEagle", GFX_SUPEREAGLE},
- {"advmame2x", "AdvMAME2x", GFX_ADVMAME2X},
- {"advmame3x", "AdvMAME3x", GFX_ADVMAME3X},
- {"tv2x", "TV2x", GFX_TV2X},
- {"dotmatrix", "DotMatrix", GFX_DOTMATRIX},
- {0, 0, 0}
-};
-
// Table of relative scalers magnitudes
// [definedScale - 1][scaleFactor - 1]
static ScalerProc *scalersMagn[3][3] = {
@@ -62,141 +48,14 @@ static ScalerProc *scalersMagn[3][3] = {
#endif
};
-static const int s_gfxModeSwitchTable[][4] = {
- { GFX_NORMAL, GFX_DOUBLESIZE, GFX_TRIPLESIZE, -1 },
- { GFX_NORMAL, GFX_ADVMAME2X, GFX_ADVMAME3X, -1 },
- { GFX_NORMAL, GFX_HQ2X, GFX_HQ3X, -1 },
- { GFX_NORMAL, GFX_2XSAI, -1, -1 },
- { GFX_NORMAL, GFX_SUPER2XSAI, -1, -1 },
- { GFX_NORMAL, GFX_SUPEREAGLE, -1, -1 },
- { GFX_NORMAL, GFX_TV2X, -1, -1 },
- { GFX_NORMAL, GFX_DOTMATRIX, -1, -1 }
- };
-
#ifndef DISABLE_SCALERS
static int cursorStretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY);
#endif
-const OSystem::GraphicsMode *OSystem_SDL_SamsungTV::getSupportedGraphicsModes() const {
- return s_supportedGraphicsModes;
-}
-
int OSystem_SDL_SamsungTV::getDefaultGraphicsMode() const {
return GFX_2XSAI;
}
-void OSystem_SDL_SamsungTV::beginGFXTransaction(void) {
- assert(_transactionMode == kTransactionNone);
-
- _transactionMode = kTransactionActive;
-
- _transactionDetails.sizeChanged = false;
-
- _transactionDetails.needHotswap = false;
- _transactionDetails.needUpdatescreen = false;
-
- _transactionDetails.normal1xScaler = false;
- _transactionDetails.formatChanged = false;
-
- _oldVideoMode = _videoMode;
-}
-
-OSystem::TransactionError OSystem_SDL_SamsungTV::endGFXTransaction(void) {
- int errors = kTransactionSuccess;
-
- assert(_transactionMode != kTransactionNone);
-
- if (_transactionMode == kTransactionRollback) {
- if (_videoMode.fullscreen != _oldVideoMode.fullscreen) {
- errors |= kTransactionFullscreenFailed;
-
- _videoMode.fullscreen = _oldVideoMode.fullscreen;
- } else if (_videoMode.aspectRatioCorrection != _oldVideoMode.aspectRatioCorrection) {
- errors |= kTransactionAspectRatioFailed;
-
- _videoMode.aspectRatioCorrection = _oldVideoMode.aspectRatioCorrection;
- } else if (_videoMode.mode != _oldVideoMode.mode) {
- errors |= kTransactionModeSwitchFailed;
-
- _videoMode.mode = _oldVideoMode.mode;
- _videoMode.scaleFactor = _oldVideoMode.scaleFactor;
- } else if (_videoMode.format != _oldVideoMode.format) {
- errors |= kTransactionFormatNotSupported;
-
- _videoMode.format = _oldVideoMode.format;
- _screenFormat = _videoMode.format;
- } else if (_videoMode.screenWidth != _oldVideoMode.screenWidth || _videoMode.screenHeight != _oldVideoMode.screenHeight) {
- errors |= kTransactionSizeChangeFailed;
-
- _videoMode.screenWidth = _oldVideoMode.screenWidth;
- _videoMode.screenHeight = _oldVideoMode.screenHeight;
- _videoMode.overlayWidth = _oldVideoMode.overlayWidth;
- _videoMode.overlayHeight = _oldVideoMode.overlayHeight;
- }
-
- if (_videoMode.fullscreen == _oldVideoMode.fullscreen &&
- _videoMode.aspectRatioCorrection == _oldVideoMode.aspectRatioCorrection &&
- _videoMode.mode == _oldVideoMode.mode &&
- _videoMode.screenWidth == _oldVideoMode.screenWidth &&
- _videoMode.screenHeight == _oldVideoMode.screenHeight) {
-
- // Our new video mode would now be exactly the same as the
- // old one. Since we still can not assume SDL_SetVideoMode
- // to be working fine, we need to invalidate the old video
- // mode, so loadGFXMode would error out properly.
- _oldVideoMode.setup = false;
- }
- }
-
- if (_transactionDetails.sizeChanged || _transactionDetails.formatChanged) {
- unloadGFXMode();
- if (!loadGFXMode()) {
- if (_oldVideoMode.setup) {
- _transactionMode = kTransactionRollback;
- errors |= endGFXTransaction();
- }
- } else {
- setGraphicsModeIntern();
- clearOverlay();
-
- _videoMode.setup = true;
- _modeChanged = true;
- // OSystem_SDL::pollEvent used to update the screen change count,
- // but actually it gives problems when a video mode was changed
- // but OSystem_SDL::pollEvent was not called. This for example
- // caused a crash under certain circumstances when doing an RTL.
- // To fix this issue we update the screen change count right here.
- _screenChangeCount++;
- }
- } else if (_transactionDetails.needHotswap) {
- setGraphicsModeIntern();
- if (!hotswapGFXMode()) {
- if (_oldVideoMode.setup) {
- _transactionMode = kTransactionRollback;
- errors |= endGFXTransaction();
- }
- } else {
- _videoMode.setup = true;
- _modeChanged = true;
- // OSystem_SDL::pollEvent used to update the screen change count,
- // but actually it gives problems when a video mode was changed
- // but OSystem_SDL::pollEvent was not called. This for example
- // caused a crash under certain circumstances when doing an RTL.
- // To fix this issue we update the screen change count right here.
- _screenChangeCount++;
-
- if (_transactionDetails.needUpdatescreen)
- internUpdateScreen();
- }
- } else if (_transactionDetails.needUpdatescreen) {
- setGraphicsModeIntern();
- internUpdateScreen();
- }
-
- _transactionMode = kTransactionNone;
- return (TransactionError)errors;
-}
-
Common::List<Graphics::PixelFormat> OSystem_SDL_SamsungTV::getSupportedFormats() {
static Common::List<Graphics::PixelFormat>list;
list.push_back(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0));
@@ -204,136 +63,6 @@ Common::List<Graphics::PixelFormat> OSystem_SDL_SamsungTV::getSupportedFormats()
return list;
}
-bool OSystem_SDL_SamsungTV::setGraphicsMode(int mode) {
- Common::StackLock lock(_graphicsMutex);
-
- assert(_transactionMode == kTransactionActive);
-
- if (_oldVideoMode.setup && _oldVideoMode.mode == mode)
- return true;
-
- int newScaleFactor = 1;
-
- switch (mode) {
- case GFX_NORMAL:
- newScaleFactor = 1;
- break;
-#ifndef DISABLE_SCALERS
- case GFX_DOUBLESIZE:
- newScaleFactor = 2;
- break;
- case GFX_TRIPLESIZE:
- newScaleFactor = 3;
- break;
- case GFX_2XSAI:
- newScaleFactor = 2;
- break;
- case GFX_SUPER2XSAI:
- newScaleFactor = 2;
- break;
- case GFX_SUPEREAGLE:
- newScaleFactor = 2;
- break;
- case GFX_ADVMAME2X:
- newScaleFactor = 2;
- break;
- case GFX_ADVMAME3X:
- newScaleFactor = 3;
- break;
- case GFX_TV2X:
- newScaleFactor = 2;
- break;
- case GFX_DOTMATRIX:
- newScaleFactor = 2;
- break;
-#endif // DISABLE_SCALERS
-
- default:
- warning("unknown gfx mode %d", mode);
- return false;
- }
-
- _transactionDetails.normal1xScaler = (mode == GFX_NORMAL);
- if (_oldVideoMode.setup && _oldVideoMode.scaleFactor != newScaleFactor)
- _transactionDetails.needHotswap = true;
-
- _transactionDetails.needUpdatescreen = true;
-
- _videoMode.mode = mode;
- _videoMode.scaleFactor = newScaleFactor;
-
- return true;
-}
-
-void OSystem_SDL_SamsungTV::setGraphicsModeIntern() {
- Common::StackLock lock(_graphicsMutex);
- ScalerProc *newScalerProc = 0;
-
- switch (_videoMode.mode) {
- case GFX_NORMAL:
- newScalerProc = Normal1x;
- break;
-#ifndef DISABLE_SCALERS
- case GFX_DOUBLESIZE:
- newScalerProc = Normal2x;
- break;
- case GFX_TRIPLESIZE:
- newScalerProc = Normal3x;
- break;
- case GFX_2XSAI:
- newScalerProc = _2xSaI;
- break;
- case GFX_SUPER2XSAI:
- newScalerProc = Super2xSaI;
- break;
- case GFX_SUPEREAGLE:
- newScalerProc = SuperEagle;
- break;
- case GFX_ADVMAME2X:
- newScalerProc = AdvMame2x;
- break;
- case GFX_ADVMAME3X:
- newScalerProc = AdvMame3x;
- break;
- case GFX_TV2X:
- newScalerProc = TV2x;
- break;
- case GFX_DOTMATRIX:
- newScalerProc = DotMatrix;
- break;
-#endif // DISABLE_SCALERS
-
- default:
- error("Unknown gfx mode %d", _videoMode.mode);
- }
-
- _scalerProc = newScalerProc;
-
- if (_videoMode.mode != GFX_NORMAL) {
- for (int i = 0; i < ARRAYSIZE(s_gfxModeSwitchTable); i++) {
- if (s_gfxModeSwitchTable[i][1] == _videoMode.mode || s_gfxModeSwitchTable[i][2] == _videoMode.mode) {
- _scalerType = i;
- break;
- }
- }
- }
-
- if (!_screen || !_hwscreen || !_prehwscreen)
- return;
-
- // Blit everything to the screen
- _forceFull = true;
-
- // Even if the old and new scale factors are the same, we may have a
- // different scaler for the cursor now.
- blitCursor();
-}
-
-int OSystem_SDL_SamsungTV::getGraphicsMode() const {
- assert (_transactionMode == kTransactionNone);
- return _videoMode.mode;
-}
-
void OSystem_SDL_SamsungTV::initSize(uint w, uint h, const Graphics::PixelFormat *format) {
assert(_transactionMode == kTransactionActive);
@@ -634,14 +363,6 @@ bool OSystem_SDL_SamsungTV::hotswapGFXMode() {
return true;
}
-void OSystem_SDL_SamsungTV::updateScreen() {
- assert (_transactionMode == kTransactionNone);
-
- Common::StackLock lock(_graphicsMutex); // Lock the mutex until this function ends
-
- internUpdateScreen();
-}
-
void OSystem_SDL_SamsungTV::internUpdateScreen() {
SDL_Surface *srcSurf, *origSurf;
int height, width;
@@ -808,13 +529,6 @@ void OSystem_SDL_SamsungTV::internUpdateScreen() {
_mouseNeedsRedraw = false;
}
-bool OSystem_SDL_SamsungTV::saveScreenshot(const char *filename) {
- assert(_hwscreen != NULL);
-
- Common::StackLock lock(_graphicsMutex); // Lock the mutex until this function ends
- return SDL_SaveBMP(_hwscreen, filename) == 0;
-}
-
void OSystem_SDL_SamsungTV::setFullscreenMode(bool enable) {
Common::StackLock lock(_graphicsMutex);
@@ -827,517 +541,6 @@ void OSystem_SDL_SamsungTV::setFullscreenMode(bool enable) {
}
}
-void OSystem_SDL_SamsungTV::setAspectRatioCorrection(bool enable) {
- Common::StackLock lock(_graphicsMutex);
-
- if (_oldVideoMode.setup && _oldVideoMode.aspectRatioCorrection == enable)
- return;
-
- if (_transactionMode == kTransactionActive) {
- _videoMode.aspectRatioCorrection = enable;
- _transactionDetails.needHotswap = true;
- }
-}
-
-void OSystem_SDL_SamsungTV::copyRectToScreen(const byte *src, int pitch, int x, int y, int w, int h) {
- assert (_transactionMode == kTransactionNone);
- assert(src);
-
- if (_screen == NULL) {
- warning("OSystem_SDL::copyRectToScreen: _screen == NULL");
- return;
- }
-
- Common::StackLock lock(_graphicsMutex); // Lock the mutex until this function ends
-
- assert(x >= 0 && x < _videoMode.screenWidth);
- assert(y >= 0 && y < _videoMode.screenHeight);
- assert(h > 0 && y + h <= _videoMode.screenHeight);
- assert(w > 0 && x + w <= _videoMode.screenWidth);
-
- if (IS_ALIGNED(src, 4) && pitch == _videoMode.screenWidth && x == 0 && y == 0 &&
- w == _videoMode.screenWidth && h == _videoMode.screenHeight && _modeFlags & DF_WANT_RECT_OPTIM) {
- /* Special, optimized case for full screen updates.
- * It tries to determine what areas were actually changed,
- * and just updates those, on the actual display. */
- addDirtyRgnAuto(src);
- } else {
- _cksumValid = false;
- addDirtyRect(x, y, w, h);
- }
-
- // Try to lock the screen surface
- if (SDL_LockSurface(_screen) == -1)
- error("SDL_LockSurface failed: %s", SDL_GetError());
-
- byte *dst = (byte *)_screen->pixels + y * _videoMode.screenWidth * _screenFormat.bytesPerPixel + x * _screenFormat.bytesPerPixel;
- if (_videoMode.screenWidth == w && pitch == w * _screenFormat.bytesPerPixel) {
- memcpy(dst, src, h*w*_screenFormat.bytesPerPixel);
- } else {
- do {
- memcpy(dst, src, w * _screenFormat.bytesPerPixel);
- src += pitch;
- dst += _videoMode.screenWidth * _screenFormat.bytesPerPixel;
- } while (--h);
- }
-
- // Unlock the screen surface
- SDL_UnlockSurface(_screen);
-}
-
-Graphics::Surface *OSystem_SDL_SamsungTV::lockScreen() {
- assert (_transactionMode == kTransactionNone);
-
- // Lock the graphics mutex
- lockMutex(_graphicsMutex);
-
- // paranoia check
- assert(!_screenIsLocked);
- _screenIsLocked = true;
-
- // Try to lock the screen surface
- if (SDL_LockSurface(_screen) == -1)
- error("SDL_LockSurface failed: %s", SDL_GetError());
-
- _framebuffer.pixels = _screen->pixels;
- _framebuffer.w = _screen->w;
- _framebuffer.h = _screen->h;
- _framebuffer.pitch = _screen->pitch;
- _framebuffer.bytesPerPixel = _screenFormat.bytesPerPixel;
-
- return &_framebuffer;
-}
-
-void OSystem_SDL_SamsungTV::unlockScreen() {
- assert (_transactionMode == kTransactionNone);
-
- // paranoia check
- assert(_screenIsLocked);
- _screenIsLocked = false;
-
- // Unlock the screen surface
- SDL_UnlockSurface(_screen);
-
- // Trigger a full screen update
- _forceFull = true;
-
- // Finally unlock the graphics mutex
- unlockMutex(_graphicsMutex);
-}
-
-void OSystem_SDL_SamsungTV::addDirtyRect(int x, int y, int w, int h, bool realCoordinates) {
- if (_forceFull)
- return;
-
- if (_numDirtyRects == NUM_DIRTY_RECT) {
- _forceFull = true;
- return;
- }
-
- int height, width;
-
- if (!_overlayVisible && !realCoordinates) {
- width = _videoMode.screenWidth;
- height = _videoMode.screenHeight;
- } else {
- width = _videoMode.overlayWidth;
- height = _videoMode.overlayHeight;
- }
-
- // Extend the dirty region by 1 pixel for scalers
- // that "smear" the screen, e.g. 2xSAI
- if (!realCoordinates) {
- x--;
- y--;
- w+=2;
- h+=2;
- }
-
- // clip
- if (x < 0) {
- w += x;
- x = 0;
- }
-
- if (y < 0) {
- h += y;
- y=0;
- }
-
- if (w > width - x) {
- w = width - x;
- }
-
- if (h > height - y) {
- h = height - y;
- }
-
-#ifndef DISABLE_SCALERS
- if (_videoMode.aspectRatioCorrection && !_overlayVisible && !realCoordinates) {
- makeRectStretchable(x, y, w, h);
- }
-#endif
-
- if (w == width && h == height) {
- _forceFull = true;
- return;
- }
-
- if (w > 0 && h > 0) {
- SDL_Rect *r = &_dirtyRectList[_numDirtyRects++];
-
- r->x = x;
- r->y = y;
- r->w = w;
- r->h = h;
- }
-}
-
-
-void OSystem_SDL_SamsungTV::makeChecksums(const byte *buf) {
- assert(buf);
- uint32 *sums = _dirtyChecksums;
- uint x,y;
- const uint last_x = (uint)_videoMode.screenWidth / 8;
- const uint last_y = (uint)_videoMode.screenHeight / 8;
-
- const uint BASE = 65521; /* largest prime smaller than 65536 */
-
- /* the 8x8 blocks in buf are enumerated starting in the top left corner and
- * reading each line at a time from left to right */
- for (y = 0; y != last_y; y++, buf += _videoMode.screenWidth * (8 - 1))
- for (x = 0; x != last_x; x++, buf += 8) {
- // Adler32 checksum algorithm (from RFC1950, used by gzip and zlib).
- // This computes the Adler32 checksum of a 8x8 pixel block. Note
- // that we can do the modulo operation (which is the slowest part)
- // of the algorithm) at the end, instead of doing each iteration,
- // since we only have 64 iterations in total - and thus s1 and
- // s2 can't overflow anyway.
- uint32 s1 = 1;
- uint32 s2 = 0;
- const byte *ptr = buf;
- for (int subY = 0; subY < 8; subY++) {
- for (int subX = 0; subX < 8; subX++) {
- s1 += ptr[subX];
- s2 += s1;
- }
- ptr += _videoMode.screenWidth;
- }
-
- s1 %= BASE;
- s2 %= BASE;
-
- /* output the checksum for this block */
- *sums++ = (s2 << 16) + s1;
- }
-}
-
-void OSystem_SDL_SamsungTV::addDirtyRgnAuto(const byte *buf) {
- assert(buf);
- assert(IS_ALIGNED(buf, 4));
-
- /* generate a table of the checksums */
- makeChecksums(buf);
-
- if (!_cksumValid) {
- _forceFull = true;
- _cksumValid = true;
- }
-
- /* go through the checksum list, compare it with the previous checksums,
- and add all dirty rectangles to a list. try to combine small rectangles
- into bigger ones in a simple way */
- if (!_forceFull) {
- int x, y, w;
- uint32 *ck = _dirtyChecksums;
-
- for (y = 0; y != _videoMode.screenHeight / 8; y++) {
- for (x = 0; x != _videoMode.screenWidth / 8; x++, ck++) {
- if (ck[0] != ck[_cksumNum]) {
- /* found a dirty 8x8 block, now go as far to the right as possible,
- and at the same time, unmark the dirty status by setting old to new. */
- w=0;
- do {
- ck[w + _cksumNum] = ck[w];
- w++;
- } while (x + w != _videoMode.screenWidth / 8 && ck[w] != ck[w + _cksumNum]);
-
- addDirtyRect(x * 8, y * 8, w * 8, 8);
-
- if (_forceFull)
- goto get_out;
- }
- }
- }
- } else {
- get_out:;
- /* Copy old checksums to new */
- memcpy(_dirtyChecksums + _cksumNum, _dirtyChecksums, _cksumNum * sizeof(uint32));
- }
-}
-
-int16 OSystem_SDL_SamsungTV::getHeight() {
- return _videoMode.screenHeight;
-}
-
-int16 OSystem_SDL_SamsungTV::getWidth() {
- return _videoMode.screenWidth;
-}
-
-void OSystem_SDL_SamsungTV::setPalette(const byte *colors, uint start, uint num) {
- assert(colors);
-
- if (_screenFormat.bytesPerPixel > 1)
- return; //not using a paletted pixel format
-
- // Setting the palette before _screen is created is allowed - for now -
- // since we don't actually set the palette until the screen is updated.
- // But it could indicate a programming error, so let's warn about it.
-
- if (!_screen)
- warning("OSystem_SDL::setPalette: _screen == NULL");
-
- const byte *b = colors;
- uint i;
- SDL_Color *base = _currentPalette + start;
- for (i = 0; i < num; i++) {
- base[i].r = b[0];
- base[i].g = b[1];
- base[i].b = b[2];
- b += 4;
- }
-
- if (start < _paletteDirtyStart)
- _paletteDirtyStart = start;
-
- if (start + num > _paletteDirtyEnd)
- _paletteDirtyEnd = start + num;
-
- // Some games blink cursors with palette
- if (_cursorPaletteDisabled)
- blitCursor();
-}
-
-void OSystem_SDL_SamsungTV::grabPalette(byte *colors, uint start, uint num) {
- assert(colors);
- const SDL_Color *base = _currentPalette + start;
-
- for (uint i = 0; i < num; ++i) {
- colors[i * 4] = base[i].r;
- colors[i * 4 + 1] = base[i].g;
- colors[i * 4 + 2] = base[i].b;
- colors[i * 4 + 3] = 0xFF;
- }
-}
-
-void OSystem_SDL_SamsungTV::setCursorPalette(const byte *colors, uint start, uint num) {
- assert(colors);
- const byte *b = colors;
- uint i;
- SDL_Color *base = _cursorPalette + start;
- for (i = 0; i < num; i++) {
- base[i].r = b[0];
- base[i].g = b[1];
- base[i].b = b[2];
- b += 4;
- }
-
- _cursorPaletteDisabled = false;
- blitCursor();
-}
-
-
-void OSystem_SDL_SamsungTV::setShakePos(int shake_pos) {
- assert (_transactionMode == kTransactionNone);
-
- _newShakePos = shake_pos;
-}
-
-
-#pragma mark -
-#pragma mark --- Overlays ---
-#pragma mark -
-
-void OSystem_SDL_SamsungTV::showOverlay() {
- assert (_transactionMode == kTransactionNone);
-
- int x, y;
-
- if (_overlayVisible)
- return;
-
- _overlayVisible = true;
-
- // Since resolution could change, put mouse to adjusted position
- // Fixes bug #1349059
- x = _mouseCurState.x * _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- y = real2Aspect(_mouseCurState.y) * _videoMode.scaleFactor;
- else
- y = _mouseCurState.y * _videoMode.scaleFactor;
-
- warpMouse(x, y);
-
- clearOverlay();
-}
-
-void OSystem_SDL_SamsungTV::hideOverlay() {
- assert (_transactionMode == kTransactionNone);
-
- if (!_overlayVisible)
- return;
-
- int x, y;
-
- _overlayVisible = false;
-
- // Since resolution could change, put mouse to adjusted position
- // Fixes bug #1349059
- x = _mouseCurState.x / _videoMode.scaleFactor;
- y = _mouseCurState.y / _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- y = aspect2Real(y);
-
- warpMouse(x, y);
-
- clearOverlay();
-
- _forceFull = true;
-}
-
-void OSystem_SDL_SamsungTV::clearOverlay() {
- //assert (_transactionMode == kTransactionNone);
- Common::StackLock lock(_graphicsMutex); // Lock the mutex until this function ends
-
- if (!_overlayVisible)
- return;
-
- // Clear the overlay by making the game screen "look through" everywhere.
- SDL_Rect src, dst;
- src.x = src.y = 0;
- dst.x = dst.y = 1;
- src.w = dst.w = _videoMode.screenWidth;
- src.h = dst.h = _videoMode.screenHeight;
- if (SDL_BlitSurface(_screen, &src, _tmpscreen, &dst) != 0)
- error("SDL_BlitSurface failed: %s", SDL_GetError());
-
- SDL_LockSurface(_tmpscreen);
- SDL_LockSurface(_overlayscreen);
-
- _scalerProc((byte *)(_tmpscreen->pixels) + _tmpscreen->pitch + 2, _tmpscreen->pitch,
- (byte *)_overlayscreen->pixels, _overlayscreen->pitch, _videoMode.screenWidth, _videoMode.screenHeight);
-
-#ifndef DISABLE_SCALERS
- if (_videoMode.aspectRatioCorrection)
- stretch200To240((uint8 *)_overlayscreen->pixels, _overlayscreen->pitch,
- _videoMode.overlayWidth, _videoMode.screenHeight * _videoMode.scaleFactor, 0, 0, 0);
-#endif
- SDL_UnlockSurface(_tmpscreen);
- SDL_UnlockSurface(_overlayscreen);
-
- _forceFull = true;
-}
-
-void OSystem_SDL_SamsungTV::grabOverlay(OverlayColor *buf, int pitch) {
- assert (_transactionMode == kTransactionNone);
-
- if (_overlayscreen == NULL)
- return;
-
- if (SDL_LockSurface(_overlayscreen) == -1)
- error("SDL_LockSurface failed: %s", SDL_GetError());
-
- byte *src = (byte *)_overlayscreen->pixels;
- int h = _videoMode.overlayHeight;
- do {
- memcpy(buf, src, _videoMode.overlayWidth * 2);
- src += _overlayscreen->pitch;
- buf += pitch;
- } while (--h);
-
- SDL_UnlockSurface(_overlayscreen);
-}
-
-void OSystem_SDL_SamsungTV::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) {
- assert (_transactionMode == kTransactionNone);
-
- if (_overlayscreen == NULL)
- return;
-
- // Clip the coordinates
- if (x < 0) {
- w += x;
- buf -= x;
- x = 0;
- }
-
- if (y < 0) {
- h += y; buf -= y * pitch;
- y = 0;
- }
-
- if (w > _videoMode.overlayWidth - x) {
- w = _videoMode.overlayWidth - x;
- }
-
- if (h > _videoMode.overlayHeight - y) {
- h = _videoMode.overlayHeight - y;
- }
-
- if (w <= 0 || h <= 0)
- return;
-
- // Mark the modified region as dirty
- _cksumValid = false;
- addDirtyRect(x, y, w, h);
-
- if (SDL_LockSurface(_overlayscreen) == -1)
- error("SDL_LockSurface failed: %s", SDL_GetError());
-
- byte *dst = (byte *)_overlayscreen->pixels + y * _overlayscreen->pitch + x * 2;
- do {
- memcpy(dst, buf, w * 2);
- dst += _overlayscreen->pitch;
- buf += pitch;
- } while (--h);
-
- SDL_UnlockSurface(_overlayscreen);
-}
-
-
-#pragma mark -
-#pragma mark --- Mouse ---
-#pragma mark -
-
-bool OSystem_SDL_SamsungTV::showMouse(bool visible) {
- if (_mouseVisible == visible)
- return visible;
-
- bool last = _mouseVisible;
- _mouseVisible = visible;
- _mouseNeedsRedraw = true;
-
- return last;
-}
-
-void OSystem_SDL_SamsungTV::setMousePos(int x, int y) {
- if (x != _mouseCurState.x || y != _mouseCurState.y) {
- _mouseNeedsRedraw = true;
- _mouseCurState.x = x;
- _mouseCurState.y = y;
- }
-}
-
-void OSystem_SDL_SamsungTV::warpMouse(int x, int y) {
- int y1 = y;
-
- if (_videoMode.aspectRatioCorrection && !_overlayVisible)
- y1 = real2Aspect(y);
-
- if (_mouseCurState.x != x || _mouseCurState.y != y)
- setMousePos(x, y);
-}
-
void OSystem_SDL_SamsungTV::setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format) {
if (!format)
_cursorFormat = Graphics::PixelFormat::createFormatCLUT8();
@@ -1567,26 +770,6 @@ static int cursorStretch200To240(uint8 *buf, uint32 pitch, int width, int height
}
#endif
-void OSystem_SDL_SamsungTV::toggleMouseGrab() {
- if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF)
- SDL_WM_GrabInput(SDL_GRAB_ON);
- else
- SDL_WM_GrabInput(SDL_GRAB_OFF);
-}
-
-void OSystem_SDL_SamsungTV::undrawMouse() {
- const int x = _mouseBackup.x;
- const int y = _mouseBackup.y;
-
- // When we switch bigger overlay off mouse jumps. Argh!
- // This is intended to prevent undrawing offscreen mouse
- if (!_overlayVisible && (x >= _videoMode.screenWidth || y >= _videoMode.screenHeight))
- return;
-
- if (_mouseBackup.w != 0 && _mouseBackup.h != 0)
- addDirtyRect(x, y, _mouseBackup.w, _mouseBackup.h);
-}
-
void OSystem_SDL_SamsungTV::drawMouse() {
if (!_mouseVisible || !_mouseSurface) {
_mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0;
@@ -1654,178 +837,8 @@ void OSystem_SDL_SamsungTV::drawMouse() {
addDirtyRect(dst.x, dst.y, dst.w, dst.h, true);
}
-#pragma mark -
-#pragma mark --- On Screen Display ---
-#pragma mark -
-
-#ifdef USE_OSD
-void OSystem_SDL_SamsungTV::displayMessageOnOSD(const char *msg) {
- assert (_transactionMode == kTransactionNone);
- assert(msg);
-
- Common::StackLock lock(_graphicsMutex); // Lock the mutex until this function ends
-
- uint i;
-
- // Lock the OSD surface for drawing
- if (SDL_LockSurface(_osdSurface))
- error("displayMessageOnOSD: SDL_LockSurface failed: %s", SDL_GetError());
-
- Graphics::Surface dst;
- dst.pixels = _osdSurface->pixels;
- dst.w = _osdSurface->w;
- dst.h = _osdSurface->h;
- dst.pitch = _osdSurface->pitch;
- dst.bytesPerPixel = _osdSurface->format->BytesPerPixel;
-
- // The font we are going to use:
- const Graphics::Font *font = FontMan.getFontByUsage(Graphics::FontManager::kOSDFont);
-
- // Clear everything with the "transparent" color, i.e. the colorkey
- SDL_FillRect(_osdSurface, 0, kOSDColorKey);
-
- // Split the message into separate lines.
- Common::StringList lines;
- const char *ptr;
- for (ptr = msg; *ptr; ++ptr) {
- if (*ptr == '\n') {
- lines.push_back(Common::String(msg, ptr - msg));
- msg = ptr + 1;
- }
- }
- lines.push_back(Common::String(msg, ptr - msg));
-
- // Determine a rect which would contain the message string (clipped to the
- // screen dimensions).
- const int vOffset = 6;
- const int lineSpacing = 1;
- const int lineHeight = font->getFontHeight() + 2 * lineSpacing;
- int width = 0;
- int height = lineHeight * lines.size() + 2 * vOffset;
- for (i = 0; i < lines.size(); i++) {
- width = MAX(width, font->getStringWidth(lines[i]) + 14);
- }
-
- // Clip the rect
- if (width > dst.w)
- width = dst.w;
- if (height > dst.h)
- height = dst.h;
-
- // Draw a dark gray rect
- // TODO: Rounded corners ? Border?
- SDL_Rect osdRect;
- osdRect.x = (dst.w - width) / 2;
- osdRect.y = (dst.h - height) / 2;
- osdRect.w = width;
- osdRect.h = height;
- SDL_FillRect(_osdSurface, &osdRect, SDL_MapRGB(_osdSurface->format, 64, 64, 64));
-
- // Render the message, centered, and in white
- for (i = 0; i < lines.size(); i++) {
- font->drawString(&dst, lines[i],
- osdRect.x, osdRect.y + i * lineHeight + vOffset + lineSpacing, osdRect.w,
- SDL_MapRGB(_osdSurface->format, 255, 255, 255),
- Graphics::kTextAlignCenter);
- }
-
- // Finished drawing, so unlock the OSD surface again
- SDL_UnlockSurface(_osdSurface);
-
- // Init the OSD display parameters, and the fade out
- _osdAlpha = SDL_ALPHA_TRANSPARENT + kOSDInitialAlpha * (SDL_ALPHA_OPAQUE - SDL_ALPHA_TRANSPARENT) / 100;
- _osdFadeStartTime = SDL_GetTicks() + kOSDFadeOutDelay;
- SDL_SetAlpha(_osdSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, _osdAlpha);
-
- // Ensure a full redraw takes place next time the screen is updated
- _forceFull = true;
-}
-#endif
-
-
-#pragma mark -
-#pragma mark --- Misc ---
-#pragma mark -
-
-void OSystem_SDL_SamsungTV::handleScalerHotkeys(const SDL_KeyboardEvent &key) {
- // Ctrl-Alt-a toggles aspect ratio correction
- if (key.keysym.sym == 'a') {
- beginGFXTransaction();
- setFeatureState(kFeatureAspectRatioCorrection, !_videoMode.aspectRatioCorrection);
- endGFXTransaction();
-#ifdef USE_OSD
- char buffer[128];
- if (_videoMode.aspectRatioCorrection)
- sprintf(buffer, "Enabled aspect ratio correction\n%d x %d -> %d x %d",
- _videoMode.screenWidth, _videoMode.screenHeight,
- _hwscreen->w, _hwscreen->h
- );
- else
- sprintf(buffer, "Disabled aspect ratio correction\n%d x %d -> %d x %d",
- _videoMode.screenWidth, _videoMode.screenHeight,
- _hwscreen->w, _hwscreen->h
- );
- displayMessageOnOSD(buffer);
-#endif
- internUpdateScreen();
- return;
- }
-
- int newMode = -1;
- int factor = _videoMode.scaleFactor - 1;
-
- // Increase/decrease the scale factor
- if (key.keysym.sym == SDLK_EQUALS || key.keysym.sym == SDLK_PLUS || key.keysym.sym == SDLK_MINUS ||
- key.keysym.sym == SDLK_KP_PLUS || key.keysym.sym == SDLK_KP_MINUS) {
- factor += (key.keysym.sym == SDLK_MINUS || key.keysym.sym == SDLK_KP_MINUS) ? -1 : +1;
- if (0 <= factor && factor <= 3) {
- newMode = s_gfxModeSwitchTable[_scalerType][factor];
- }
- }
-
- const bool isNormalNumber = (SDLK_1 <= key.keysym.sym && key.keysym.sym <= SDLK_9);
- const bool isKeypadNumber = (SDLK_KP1 <= key.keysym.sym && key.keysym.sym <= SDLK_KP9);
- if (isNormalNumber || isKeypadNumber) {
- _scalerType = key.keysym.sym - (isNormalNumber ? SDLK_1 : SDLK_KP1);
- if (_scalerType >= ARRAYSIZE(s_gfxModeSwitchTable))
- return;
-
- while (s_gfxModeSwitchTable[_scalerType][factor] < 0) {
- assert(factor > 0);
- factor--;
- }
- newMode = s_gfxModeSwitchTable[_scalerType][factor];
- }
-
- if (newMode >= 0) {
- beginGFXTransaction();
- setGraphicsMode(newMode);
- endGFXTransaction();
-#ifdef USE_OSD
- if (_osdSurface) {
- const char *newScalerName = 0;
- const GraphicsMode *g = getSupportedGraphicsModes();
- while (g->name) {
- if (g->id == _videoMode.mode) {
- newScalerName = g->description;
- break;
- }
- g++;
- }
- if (newScalerName) {
- char buffer[128];
- sprintf(buffer, "Active graphics filter: %s\n%d x %d -> %d x %d",
- newScalerName,
- _videoMode.screenWidth, _videoMode.screenHeight,
- _hwscreen->w, _hwscreen->h
- );
- displayMessageOnOSD(buffer);
- }
- }
-#endif
- internUpdateScreen();
- }
-
+void OSystem_SDL_SamsungTV::warpMouse(int x, int y) {
+ setMousePos(x, y);
}
#endif