aboutsummaryrefslogtreecommitdiff
path: root/engines/wintermute/base/gfx/osystem/base_render_osystem.h
blob: 1e72508cd0b767d3f03d56cd2da90270826f896f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* 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.
 *
 */

/*
 * This file is based on WME Lite.
 * http://dead-code.org/redir.php?target=wmelite
 * Copyright (c) 2011 Jan Nedoma
 */

#ifndef WINTERMUTE_BASE_RENDERER_SDL_H
#define WINTERMUTE_BASE_RENDERER_SDL_H

#include "engines/wintermute/base/gfx/base_renderer.h"
#include "common/rect.h"
#include "graphics/surface.h"
#include "common/list.h"

namespace Wintermute {
class BaseSurfaceOSystem;
class RenderTicket {
	Graphics::Surface *_surface;
public:
	RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRest, bool mirrorX = false, bool mirrorY = false, bool disableAlpha = false);
	RenderTicket() : _isValid(true), _wantsDraw(false), _drawNum(0) {}
	~RenderTicket();
	const Graphics::Surface *getSurface() { return _surface; }
	Common::Rect _srcRect;
	Common::Rect _dstRect;
	uint32 _mirror;
	bool _hasAlpha;

	bool _isValid;
	bool _wantsDraw;
	uint32 _drawNum;
	uint32 _colorMod;

	BaseSurfaceOSystem *_owner;
	bool operator==(RenderTicket &a);
};

class BaseRenderOSystem : public BaseRenderer {
public:
	BaseRenderOSystem(BaseGame *inGame);
	~BaseRenderOSystem();

	Common::String getName() const;

	bool initRenderer(int width, int height, bool windowed);
	bool flip();
	virtual bool indicatorFlip();
	bool fill(byte r, byte g, byte b, Common::Rect *rect = NULL);
	Graphics::PixelFormat getPixelFormat() const;
	void fade(uint16 alpha);
	void fadeToColor(byte r, byte g, byte b, byte a, Common::Rect *rect = NULL);

	bool drawLine(int x1, int y1, int x2, int y2, uint32 color);

	BaseImage *takeScreenshot();

	void setAlphaMod(byte alpha);
	void setColorMod(byte r, byte g, byte b);
	void invalidateTicket(RenderTicket *renderTicket);
	void invalidateTicketsFromSurface(BaseSurfaceOSystem *surf);
	void drawFromTicket(RenderTicket *renderTicket);

	bool setViewport(int left, int top, int right, int bottom);
	bool setViewport(Rect32 *rect) { return BaseRenderer::setViewport(rect); }
	Rect32 getViewPort();
	void modTargetRect(Common::Rect *rect);
	void pointFromScreen(Point32 *point);
	void pointToScreen(Point32 *point);

	void dumpData(const char *filename);

	float getScaleRatioX() const {
		return _ratioX;
	}
	float getScaleRatioY() const {
		return _ratioY;
	}

	void drawSurface(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, bool mirrorX, bool mirrorY, bool disableAlpha = false);
	BaseSurface *createSurface();
private:
	void addDirtyRect(const Common::Rect &rect);
	void drawTickets();
	void drawFromSurface(RenderTicket *ticket, Common::Rect *clipRect);
	void drawFromSurface(const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, Common::Rect *clipRect, uint32 mirror);
	typedef Common::List<RenderTicket *>::iterator RenderQueueIterator;
	Common::Rect *_dirtyRect;
	Common::List<RenderTicket *> _renderQueue;
	bool _needsFlip;
	uint32 _drawNum;
	Common::Rect _renderRect;
	Graphics::Surface *_renderSurface;
	Graphics::Surface *_blankSurface;

	int _borderLeft;
	int _borderTop;
	int _borderRight;
	int _borderBottom;

	static const bool _disableDirtyRects = true;
	float _ratioX;
	float _ratioY;
	uint32 _colorMod;
	uint32 _clearColor;
};

} // end of namespace Wintermute

#endif