diff options
author | lukaslw | 2014-04-29 16:57:14 +0200 |
---|---|---|
committer | lukaslw | 2014-06-22 20:07:51 +0200 |
commit | 991ca05fd4e48706523f22435a18b5f70e08277f (patch) | |
tree | 91f9dc0d67be201be75b8d2e0d1ad2897c829197 | |
parent | eb9a0009bb1b4699ce60be7b3638c3a63ee0dfda (diff) | |
download | scummvm-rg350-991ca05fd4e48706523f22435a18b5f70e08277f.tar.gz scummvm-rg350-991ca05fd4e48706523f22435a18b5f70e08277f.tar.bz2 scummvm-rg350-991ca05fd4e48706523f22435a18b5f70e08277f.zip |
PRINCE: Hero zooming progress
-rw-r--r-- | engines/prince/hero.cpp | 156 | ||||
-rw-r--r-- | engines/prince/hero.h | 2 |
2 files changed, 92 insertions, 66 deletions
diff --git a/engines/prince/hero.cpp b/engines/prince/hero.cpp index deccb7d24d..f4a1c9ece1 100644 --- a/engines/prince/hero.cpp +++ b/engines/prince/hero.cpp @@ -83,8 +83,8 @@ const Graphics::Surface * Hero::getSurface() { int16 phaseFrameIndex = _moveSet[_moveSetType]->getPhaseFrameIndex(_phase); Graphics::Surface *heroFrame = _moveSet[_moveSetType]->getFrame(phaseFrameIndex); //return _moveSet[_moveSetType]->getFrame(phaseFrameIndex); - - return heroFrame; + //return heroFrame; + return zoomSprite(heroFrame); } return NULL; } @@ -128,7 +128,7 @@ void Hero::getState() { int Hero::getScaledValue(int size) { int newSize = 0; int16 initScaleValue = _scaleValue; - if(_scaleValue != 10000) { + if (_scaleValue != 10000) { for(int i = 0; i < size; i++) { initScaleValue -= 100; if(initScaleValue >= 0) { @@ -147,38 +147,13 @@ void Hero::checkNak() { } -void Hero::zoomSprite(int16 tempMiddleY) { - if(_zoomFactor == 0) { - //notfullSize - int sprWidth = _moveSet[_moveSetType]->getFrameWidth(_phase); - int temp = sprWidth / 2; - int sprFullHeight = _moveSet[_moveSetType]->getFrameHeight(_phase); // edx - int sprModulo = tempMiddleY; // ebp ??? - int sprSkipX = 0; - int sprSkipY = 0; - - } else { - //fullSize - - } -} - -//TODO -/* -void Hero::countDrawPosition() { - int16 frameXSize = _moveSet[_moveSetType]->getFrameWidth(_phase); - int16 frameYSize = _moveSet[_moveSetType]->getFrameHeight(_phase); - _drawX = _middleX - frameXSize/2; - _drawY = _middleY - frameYSize; -} -*/ -void Hero::countDrawPosition() { +Graphics::Surface *Hero::zoomSprite(Graphics::Surface *heroFrame) { int16 tempMiddleX; int16 tempMiddleY; int16 baseX = _moveSet[_moveSetType]->getBaseX(); int16 baseY = _moveSet[_moveSetType]->getBaseY(); // any chance? - if(baseX == 320) { + if (baseX == 320) { tempMiddleY = _middleY - (baseY - 240); } else { tempMiddleY = _middleY; @@ -187,38 +162,46 @@ void Hero::countDrawPosition() { int16 frameYSize = _moveSet[_moveSetType]->getFrameHeight(_phase); int scaledX = getScaledValue(frameXSize); // ebx int scaledY = getScaledValue(frameYSize); // edx - int tempHeroHeight = scaledY; // not used? global? - - int width = scaledX / 2; - tempMiddleX = _middleX - width; //eax - int z = _middleY; //ebp - int y = _middleY - scaledY; //ecx - //TODO - checkNak(); - - //zoomSprite(tempMiddleY); - // zoomSprite: int sprModulo; - if(_zoomFactor != 0) { + + Graphics::Surface *surf = new Graphics::Surface(); + surf->create(scaledX, scaledY, Graphics::PixelFormat::createFormatCLUT8()); + + if (_zoomFactor != 0) { //notfullSize - int sprFullHeight = frameXSize; - sprModulo = tempMiddleY; // ebp ??? + //int sprFullHeight = frameXSize; + sprModulo = frameXSize; //int sprSkipX = 0; //int sprSkipY = 0; int sprWidth = scaledX; int sprHeight = scaledY; // after resize - int allocMemSize = sprWidth*sprHeight; - sprFullHeight--; - int imulEDX = sprFullHeight*sprModulo; // edx + //int allocMemSize = sprWidth*sprHeight; + //sprFullHeight--; + //int imulEDX = sprFullHeight*sprModulo; // hop do ostatniej linii int sprZoomX; int sprZoomY = _scaleValue; int loop_lin; + /* + for (uint y = 0; y < heroFrame->h; ++y) { + for (uint x = 0; x < heroFrame->w; ++x) { + byte pixel = *((byte*)heroFrame->getBasePtr(x, y)); + *((byte*)surf->getBasePtr(x, y)) = pixel; + } + } + */ + + uint x1 = 0; + uint y1 = 0; + + uint x2 = 0; + uint y2 = 0; + for(int i = 0; i < sprHeight; i++) { // linear_loop: while(1) { sprZoomY -= 100; - if(sprZoomY >= 0 || _scaleValue == 10000) { + if (sprZoomY >= 0 || _scaleValue == 10000) { // all_r_y // push esi loop_lin = sprWidth; @@ -228,10 +211,15 @@ void Hero::countDrawPosition() { } else { sprZoomY += _scaleValue; // add esi, sprModulo /? + //heroFrame += sprModulo; + x1 = 0; + y1++; } } // end of linear_loop // loop_lin: + debug("loop_lin: %d", loop_lin); + for(int i = 0; i < loop_lin; i++) { // mov al, b[esi] // inc esi @@ -240,39 +228,77 @@ void Hero::countDrawPosition() { //its_all_r // without ZOOMFIX //mov [edi], al + //memcpy(surf->getBasePtr(0, i), frameData + 4 + width * i, width); + memcpy(surf->getBasePtr(x2, y2), heroFrame->getBasePtr(x1, y1), 1); // inc edi + //surf++; + x2++; + if(x2 > scaledX) { + x2 = 0; + y2++; + } + } else { sprZoomX += _scaleValue; } + //heroFrame++; + x1++; + if(x1 > frameXSize) { + x1 = 0; + y1++; + } + } //pop esi //add esi, sprModulo - debug("loop_lin: %d", loop_lin); + //heroFrame += (sprModulo - loop_lin); + x2 = 0; + y2++; + x1 = 0; + y1++; } + return surf; + } + return heroFrame; +} + +void Hero::countDrawPosition() { + //int16 tempMiddleX; + int16 tempMiddleY; + int16 baseX = _moveSet[_moveSetType]->getBaseX(); + int16 baseY = _moveSet[_moveSetType]->getBaseY(); + // any chance? + if (baseX == 320) { + tempMiddleY = _middleY - (baseY - 240); + } else { + tempMiddleY = _middleY; + } + int16 frameXSize = _moveSet[_moveSetType]->getFrameWidth(_phase); + int16 frameYSize = _moveSet[_moveSetType]->getFrameHeight(_phase); + int scaledX = getScaledValue(frameXSize); + int scaledY = getScaledValue(frameYSize); + + //TODO + //int tempHeroHeight = scaledY; // not used? global? + //int width = scaledX / 2; + //tempMiddleX = _middleX - width; //eax + //int z = _middleY; //ebp + //int y = _middleY - scaledY; //ecx + //checkNak(); + + if (_zoomFactor != 0) { + //notfullSize debug("scaledX: %d", scaledX); debug("scaledY: %d", scaledY); - _drawX = _middleX - frameXSize/2; - _drawY = _middleY - frameYSize; + _drawX = _middleX - scaledX/2; + _drawY = tempMiddleY + 1 - scaledY; } else { //fullSize - sprModulo = 0; //? _drawX = _middleX - frameXSize / 2; _drawY = tempMiddleY + 1 - frameYSize; } - - // ShowSprite } -/* -AnimHeader struc ;struktura naglowka pliku z animacja -AH_ID dw 0 ;ID = "AN" -AH_Loop dw 0 ;numer fazy do petli -AH_Fazy dw 0 ;ilosc faz animacji -AH_Ramki dw 0 ;ilosc ramek grafiki -AH_X dw 0 ;poczatkowa wsp¢lrzedna X -AH_Y dw 0 ;poczatkowa wsp¢lrzedna Y -AH_Tablica dd 0 ;offset tablicy faz -AH_RamkiAddr dd 0 ;poczatek tablicy z offsetami ramek -*/ + void Hero::showHeroAnimFrame() { if (_phase < _moveSet[_moveSetType]->getFrameCount() - 1) { _phase++; diff --git a/engines/prince/hero.h b/engines/prince/hero.h index 2914b1f01a..6f6c614315 100644 --- a/engines/prince/hero.h +++ b/engines/prince/hero.h @@ -106,7 +106,7 @@ public: void selectZoom(); void countDrawPosition(); void checkNak(); - void zoomSprite(int16 tempMiddleY); + Graphics::Surface *zoomSprite(Graphics::Surface *heroFrame); void showHeroAnimFrame(); void specialAnim(); void getState(); |