[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