[Scummvm-git-logs] scummvm master -> 364f36365aece1bf4a1346028c12cc3711bc498a
whiterandrek
whiterandrek at gmail.com
Sun May 24 19:02:51 UTC 2020
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
b0809250ec PETKA: reimplemented video system
364f36365a PETKA: reimplemented cursor drawing
Commit: b0809250ecf884543df10b89e1c1cd94f3936c04
https://github.com/scummvm/scummvm/commit/b0809250ecf884543df10b89e1c1cd94f3936c04
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2020-05-24T22:01:19+03:00
Commit Message:
PETKA: reimplemented video system
Changed paths:
engines/petka/objects/heroes.cpp
engines/petka/objects/object.cpp
engines/petka/objects/object_bg.cpp
engines/petka/objects/object_case.cpp
engines/petka/objects/object_cursor.cpp
engines/petka/objects/text.cpp
engines/petka/video.cpp
engines/petka/video.h
diff --git a/engines/petka/objects/heroes.cpp b/engines/petka/objects/heroes.cpp
index c74d875318..40dc2bab8f 100644
--- a/engines/petka/objects/heroes.cpp
+++ b/engines/petka/objects/heroes.cpp
@@ -142,7 +142,7 @@ void QObjectPetka::draw() {
Common::Rect dstRect(srcRect);
dstRect.translate(_x, _y);
- g_vm->videoSystem()->screen().transBlitFrom(*surf, srcRect, dstRect, flc->getTransColor(surf->format));
+ g_vm->videoSystem()->transBlitFrom(*surf, srcRect, dstRect, flc->getTransColor(surf->format));
conv->free();
delete conv;
}
diff --git a/engines/petka/objects/object.cpp b/engines/petka/objects/object.cpp
index 8ec792bb72..29b04d6d8c 100644
--- a/engines/petka/objects/object.cpp
+++ b/engines/petka/objects/object.cpp
@@ -457,7 +457,7 @@ void QObject::draw() {
continue;
Common::Rect srcRect(destRect);
srcRect.translate(-_x, -_y);
- g_vm->videoSystem()->screen().transBlitFrom(*s, srcRect, destRect, flc->getTransColor(s->format));
+ g_vm->videoSystem()->transBlitFrom(*s, srcRect, destRect, flc->getTransColor(s->format));
}
s->free();
delete s;
@@ -518,8 +518,8 @@ void QObject::update(int time) {
void QObject::setPos(int x, int y) {
FlicDecoder *flc = g_vm->resMgr()->loadFlic(_resourceId);
if (flc) {
- g_vm->videoSystem()->addDirtyRectFromMsk(Common::Point(_x, _y), *flc);
- g_vm->videoSystem()->addDirtyRectFromMsk(Common::Point(x, y), *flc);
+ g_vm->videoSystem()->addDirtyMskRects(Common::Point(_x, _y), *flc);
+ g_vm->videoSystem()->addDirtyMskRects(Common::Point(x, y), *flc);
_x = x;
_y = y;
}
diff --git a/engines/petka/objects/object_bg.cpp b/engines/petka/objects/object_bg.cpp
index 39c89271f7..296aba5eda 100644
--- a/engines/petka/objects/object_bg.cpp
+++ b/engines/petka/objects/object_bg.cpp
@@ -89,7 +89,7 @@ void QObjectBG::draw() {
if (s) {
const Common::List<Common::Rect> &dirty = g_vm->videoSystem()->rects();
for (Common::List<Common::Rect>::const_iterator it = dirty.begin(); it != dirty.end(); ++it) {
- g_vm->videoSystem()->screen().blitFrom(*s, *it, Common::Point(it->left, it->top));
+ g_vm->videoSystem()->blitFrom(*s, *it, Common::Point(it->left, it->top));
}
}
}
diff --git a/engines/petka/objects/object_case.cpp b/engines/petka/objects/object_case.cpp
index f496b9ea8e..b4cf6f9521 100644
--- a/engines/petka/objects/object_case.cpp
+++ b/engines/petka/objects/object_case.cpp
@@ -88,7 +88,7 @@ void QObjectCase::update(int time) {
while (_time >= flc->getDelay()) {
flc->setFrame(-1);
_time -= flc->getDelay();
- g_vm->videoSystem()->addDirtyRectFromMsk(Common::Point(0, 0), *flc);
+ g_vm->videoSystem()->addDirtyMskRects(*flc);
}
}
}
@@ -108,7 +108,7 @@ void QObjectCase::draw() {
for (uint i = 0; i < mskRects.size(); ++i) {
Common::Rect rect = mskRects[i].findIntersectingRect(*it);
debug("%d %d", rect.width(), rect.height());
- g_vm->videoSystem()->screen().transBlitFrom(*s, rect, rect, flc->getTransColor(s->format));
+ g_vm->videoSystem()->transBlitFrom(*s, rect, rect, flc->getTransColor(s->format));
}
}
@@ -144,7 +144,7 @@ void QObjectCase::onMouseMove(int x, int y) {
if (_clickedObjIndex != kCloseButton && _clickedObjIndex != kInvalidButton) {
flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + _clickedObjIndex);
flc->setFrame(1);
- g_vm->videoSystem()->addDirtyRectFromMsk(Common::Point(0, 0), *flc);
+ g_vm->videoSystem()->addDirtyMskRects(*flc);
}
_clickedObjIndex = kCloseButton;
} else {
@@ -159,7 +159,7 @@ void QObjectCase::onMouseMove(int x, int y) {
if (_clickedObjIndex != i && _clickedObjIndex != kInvalidButton) {
flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + _clickedObjIndex);
flc->setFrame(1);
- g_vm->videoSystem()->addDirtyRectFromMsk(Common::Point(0, 0), *flc);
+ g_vm->videoSystem()->addDirtyMskRects(*flc);
}
if (i == kButtonsCount && _clickedObjIndex != kInvalidButton) {
@@ -167,7 +167,7 @@ void QObjectCase::onMouseMove(int x, int y) {
} else if (i != _clickedObjIndex) {
if ((i != kChapayevButton || g_vm->getQSystem()->_chapayev->_isShown) && (i != kMapButton || g_vm->getQSystem()->_room->_showMap)) {
flc = g_vm->resMgr()->loadFlic(kFirstButtonResourceId + i);
- g_vm->videoSystem()->addDirtyRectFromMsk(Common::Point(0, 0), *flc);
+ g_vm->videoSystem()->addDirtyMskRects(*flc);
_clickedObjIndex = i;
} else {
_clickedObjIndex = kInvalidButton;
diff --git a/engines/petka/objects/object_cursor.cpp b/engines/petka/objects/object_cursor.cpp
index 739cca9fc0..51adc7e304 100644
--- a/engines/petka/objects/object_cursor.cpp
+++ b/engines/petka/objects/object_cursor.cpp
@@ -63,7 +63,7 @@ void QObjectCursor::draw() {
srcRect.clip(640, 480);
Common::Rect destRect(srcRect);
srcRect.translate(-_x, -_y);
- g_vm->videoSystem()->screen().transBlitFrom(*s, srcRect, destRect, flc->getTransColor(s->format));
+ g_vm->videoSystem()->transBlitFrom(*s, srcRect, destRect, flc->getTransColor(s->format));
s->free();
delete s;
}
diff --git a/engines/petka/objects/text.cpp b/engines/petka/objects/text.cpp
index 35b2548445..4a34970190 100644
--- a/engines/petka/objects/text.cpp
+++ b/engines/petka/objects/text.cpp
@@ -53,7 +53,7 @@ QText::QText(const Common::U32String &text, uint16 textColor, uint16 outlineColo
void QText::draw() {
const Graphics::Surface *s = g_vm->resMgr()->loadBitmap(-2);
- g_vm->videoSystem()->screen().transBlitFrom(*s, Common::Point((640 - s->w) / 2, 479 - s->h));
+ g_vm->videoSystem()->transBlitFrom(*s, Common::Point((640 - s->w) / 2, 479 - s->h));
}
const Common::Rect &QText::getRect() {
@@ -154,7 +154,7 @@ void QTextDescription::onClick(int x, int y) {
void QTextDescription::draw() {
Graphics::Surface *s = g_vm->resMgr()->loadBitmap(-2);
FlicDecoder *flc = g_vm->resMgr()->loadFlic(6008);
- g_vm->videoSystem()->screen().transBlitFrom(*s, flc->getTransColor(s->format));
+ g_vm->videoSystem()->transBlitFrom(*s, flc->getTransColor(s->format));
// todo dirty rects
}
diff --git a/engines/petka/video.cpp b/engines/petka/video.cpp
index 9d55054e3d..5242af131f 100644
--- a/engines/petka/video.cpp
+++ b/engines/petka/video.cpp
@@ -40,6 +40,7 @@ VideoSystem::VideoSystem() :
_shake(false), _shift(false), _shakeTime(0), _time(0) {
makeAllDirty();
_time = g_system->getMillis();
+ _allowAddingRects = true;
}
void VideoSystem::update() {
@@ -56,54 +57,65 @@ void VideoSystem::update() {
sort();
+ mergeDirtyRects();
+
+ _allowAddingRects = false;
for (uint i = 0; i < interface->_objs.size(); ++i) {
interface->_objs[i]->draw();
}
+ _allowAddingRects = true;
+
+ for (Common::List<Common::Rect>::iterator i = _dirtyRects.begin(); i != _dirtyRects.end(); ++i) {
+ const Common::Rect &r = *i;
+ const byte *srcP = (const byte *)getBasePtr(r.left, r.top);
+ g_system->copyRectToScreen(srcP, pitch, r.left, r.top,
+ r.width(), r.height());
+ }
+
+ _dirtyRects.clear();
}
_time = time;
- _rects.clear();
if (_shake) {
g_system->setShakePos(_shift ? kShakeOffset : 0, 0);
- time = g_system->getMillis();
if (time - _shakeTime > kShakeTime) {
_shift = !_shift;
_shakeTime = time;
}
}
- _screen.update();
-}
-void VideoSystem::addDirtyRect(const Common::Rect &rect) {
- _rects.push_back(rect);
+ g_system->updateScreen();
}
-const Common::List<Common::Rect> VideoSystem::rects() const {
- return _rects;
+void VideoSystem::addDirtyRect(const Common::Rect &rect) {
+ if (_allowAddingRects) {
+ Graphics::Screen::addDirtyRect(rect);
+ }
}
-Graphics::Screen &VideoSystem::screen() {
- return _screen;
+void VideoSystem::addDirtyRect(Common::Point pos, Common::Rect rect) {
+ rect.translate(pos.x, pos.y);
+ addDirtyRect(rect);
}
void VideoSystem::addDirtyRect(Common::Point pos, FlicDecoder &flc) {
- Common::Rect rect = flc.getBounds();
- rect.translate(pos.x, pos.y);
- addDirtyRect(rect);
+ addDirtyRect(pos, flc.getBounds());
}
-void VideoSystem::addDirtyRectFromMsk(Common::Point pos, FlicDecoder &flc) {
+void VideoSystem::addDirtyMskRects(Common::Point pos, FlicDecoder &flc) {
const Common::Array<Common::Rect> &rects = flc.getMskRects();
for (uint i = 0; i < rects.size(); ++i) {
- Common::Rect r = rects[i];
- r.translate(pos.x, pos.y);
- _rects.push_back(r);
+ addDirtyRect(pos, rects[i]);
}
}
-void VideoSystem::makeAllDirty() {
- addDirtyRect(Common::Rect(640, 480));
+void VideoSystem::addDirtyMskRects(FlicDecoder &flc) {
+ addDirtyMskRects(Common::Point(0, 0), flc);
+}
+
+const Common::List<Common::Rect> VideoSystem::rects() const {
+ return _dirtyRects;
}
void VideoSystem::updateTime() {
diff --git a/engines/petka/video.h b/engines/petka/video.h
index 385c7410a8..f6370d1089 100644
--- a/engines/petka/video.h
+++ b/engines/petka/video.h
@@ -29,30 +29,33 @@ namespace Petka {
class FlicDecoder;
-class VideoSystem {
+class VideoSystem : public Graphics::Screen {
public:
VideoSystem();
void updateTime();
- void update();
- void makeAllDirty();
- void addDirtyRect(const Common::Rect &rect);
+ void update() override;
+
+ void addDirtyRect(const Common::Rect &rect) override;
+ void addDirtyRect(Common::Point pos, Common::Rect rect);
void addDirtyRect(Common::Point pos, FlicDecoder &flc);
- void addDirtyRectFromMsk(Common::Point pos, FlicDecoder &flc);
+
+ void addDirtyMskRects(Common::Point pos, FlicDecoder &flc);
+ void addDirtyMskRects(FlicDecoder &flc);
+
void setShake(bool shake);
+
const Common::List<Common::Rect> rects() const;
- Graphics::Screen &screen();
private:
void sort();
private:
- Graphics::Screen _screen;
- Common::List<Common::Rect> _rects;
uint32 _shakeTime;
uint32 _time;
bool _shake;
bool _shift;
+ bool _allowAddingRects;
};
}
Commit: 364f36365aece1bf4a1346028c12cc3711bc498a
https://github.com/scummvm/scummvm/commit/364f36365aece1bf4a1346028c12cc3711bc498a
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2020-05-24T22:01:19+03:00
Commit Message:
PETKA: reimplemented cursor drawing
Changed paths:
engines/petka/objects/object_cursor.cpp
diff --git a/engines/petka/objects/object_cursor.cpp b/engines/petka/objects/object_cursor.cpp
index 51adc7e304..8736cd3e48 100644
--- a/engines/petka/objects/object_cursor.cpp
+++ b/engines/petka/objects/object_cursor.cpp
@@ -58,12 +58,7 @@ void QObjectCursor::draw() {
const Graphics::Surface *frame = flc->getCurrentFrame();
if (frame) {
Graphics::Surface *s = frame->convertTo(g_system->getScreenFormat(), flc->getPalette());
- Common::Rect srcRect(flc->getBounds());
- srcRect.translate(_x, _y);
- srcRect.clip(640, 480);
- Common::Rect destRect(srcRect);
- srcRect.translate(-_x, -_y);
- g_vm->videoSystem()->transBlitFrom(*s, srcRect, destRect, flc->getTransColor(s->format));
+ g_vm->videoSystem()->transBlitFrom(*s, flc->getBounds(), Common::Point(_x, _y), flc->getTransColor(s->format));
s->free();
delete s;
}
More information about the Scummvm-git-logs
mailing list