aboutsummaryrefslogtreecommitdiff
path: root/cRender.h
blob: 1334cc3fc254d3339588f4bdcd95945fb5a53bff (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#pragma once

#include <stdlib.h>
#include <stdio.h>
#include <string>
//#include <math.h>
//#include <iostream>
#include <termios.h>

#ifdef __linux__
	#include <unistd.h>
	//#include <term.h>
	#include <sys/ioctl.h>

	typedef int WORD;
#elif _WIN32
  #include <Windows.h>
#else
	#error "Platforn not supported"
#endif

//errors
#define _OK_ 0
#define _ERR_ 1
#define _ERR_COORDINATES_INVALID_ 2
#define _ERR_RENDER_BLOCKED_BY_CHILD_ 3
#define _ERR_SCREEN_TOO_SMALL_ 4

#define _COLLISION_ 255

//Colors
#ifdef _WIN32
	#define _COL_BLACK 0x00
	#define _COL_BLUE 0x01
	#define _COL_GREEN 0x02
	#define _COL_YELLOW 0x0E
	#define _COL_RED 0x04
	#define _COL_WHITE 0x0F
	#define _COL_DARK_WHITE 0x07
	#define _COL_INTENSITY 0x08
	#define _COL_DEFAULT 0xFF
#elif __linux__
	#define _COL_BLACK 30
	#define _COL_BLUE 34
	#define _COL_GREEN 32
	#define _COL_YELLOW 33
	#define _COL_RED 31
	#define _COL_WHITE 37
	#define _COL_DEFAULT 0

	//Linux Specific
	#define _COL_BOLD 1
	#define _COL_BOLD_OFF 21
	#define _COL_UNDERLINE 4
	#define _COL_UNDERLINE_OFF 24
	#define _COL_INVERSE 7
	#define _COL_INVERSE_OFF 27
#endif

using namespace std;

struct sPos
{
	int x;
	int y;
};

class cRender
{
public:
	cRender(char _backound, WORD _color, int _sx, int _sy);
	//Constructor
	//sets cBackround[][] to _backround & wColor[][] to _color
	//Resizes console window for Windows
	//Sets Size to Console Window Size for Linux. Writes Error for _sx or _sy smaller than Screen. Get by getLastError()

	virtual ~cRender();
	//frees allocated memory

	int drawPoint(char _c, sPos _pos, bool _overrideCollision, WORD _color);
	//Draws _c @ _pos
	//Returns _COLLOSION_ if _pos is already set to !cBackround && _overrideCollision isnt set

	int drawLine(char _c, sPos _pos1, sPos _pos2, bool _overrideCollision, WORD _color);
	//x Value of pos1 MUSTNT exceed the x value of pos2!

	int drawText(string _s, sPos _pos, WORD _color);
	//Draws Text _s @ _pos
	//First char is @ _pos

	int drawRectangle(char _border, char _fill, sPos _pos1, sPos _pos2, WORD _borderColor, WORD _fillColor);
	//x Value of pos1 MUSTNT exceed the x value of pos2!

	int render(void);
	//Prints cScreen

	int clear();
	int clear(bool _forceReRender);
	//clears cScreen + wColor
	// for _forceReRender == true, the bChanged[][] is set to true to force Re-Render of whole Screen
	// clear(void) calls clear(_forceReRender = false)

	int getLastError();
	//Returns last Error that was not returnable

	sPos getSize();
	//Returns actual Size of screen


protected:
	cRender(); //Empty Constructor for being inheritable

	void setBufferSize(sPos _size);

	bool bBlockRender; //Used by children to block render function

	char **cScreen; //Pixel Map
	WORD **wColor;  //Color Map
	bool **bChanged; //Pixel Change Map

	char cBackound; //Default backround
	WORD wBackColor;
	int sizeX, sizeY;

#ifdef _WIN32
	HANDLE hstdout;
	CONSOLE_SCREEN_BUFFER_INFO csbi;
#endif

	WORD wDefColor; //Default Color

	int iLastError;

private:
#ifdef _WIN32
	int SetConsoleWindowSize(int x, int y);
	//Slightly adapted from: http://www.cplusplus.com/forum/windows/121444/

	void gotoxy( int x, int y );
#endif

	void forceReRender();

	void setConsoleEcho(bool _enable);
#ifdef __linux__
	sPos getConsoleWindowSize();

	void setConsoleCursor(bool _enable);
#endif
};