-
Notifications
You must be signed in to change notification settings - Fork 0
/
Area.cpp
93 lines (78 loc) · 1.77 KB
/
Area.cpp
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
#include <assert.h>
#include <complex>
#include <algorithm>
#include "Area.h"
Area::Area( const int inLeft, const int inTop, const int inWidth, const int inHeight, const ColourIndex inDefaultColour )
: m_left(inLeft)
, m_top(inTop)
, m_height(inHeight)
, m_width(inWidth)
, m_grid(0)
{
assert( m_width > 0 && m_height > 0 );
if ( m_width > 0 && m_height > 0 )
{
int numberOfCells = m_width * m_height;
m_grid = new ColourIndex[ numberOfCells ];
assert( m_grid );
if ( m_grid )
{
for ( int index = 0; index < numberOfCells; index++ )
{
m_grid[ index ] = inDefaultColour;
}
}
}
}
Area::~Area( void )
{
if ( m_grid )
{
delete [] m_grid;
}
}
ColourIndex Area::GetColour( const int X, const int Y ) const
{
if ( m_grid )
{
if ( X >= m_left && X < (m_left + m_width) &&
Y >= m_top && Y < (m_top + m_height))
{
int gridX = std::abs(m_left - X);
int gridY = std::abs(m_top - Y);
return m_grid[ (m_width * gridY) + gridX ];
}
}
return INVALID_COLOUR;
}
bool Area::SetColour( const ColourIndex inColourIndex, const int X, const int Y )
{
if ( m_grid )
{
if ( X >= m_left && X < (m_left + m_width) &&
Y >= m_top && Y < (m_top + m_height))
{
int gridX = std::abs(m_left - X);
int gridY = std::abs(m_top - Y);
m_grid[ (m_width * gridY) + gridX ] = inColourIndex;
return true;
}
}
return false;
}
void Area::Clone( const Area* inArea, const int inStartX, const int inStartY )
{
if ( inArea && m_grid )
{
for ( int x = 0; x < inArea->m_width; x++ )
{
for ( int y = 0; y < inArea->m_height; y++ )
{
const ColourIndex index = inArea->GetColour( inArea->m_left + x, inArea->m_top + y );
const int newX = inStartX + x;
const int newY = inStartY + y;
SetColour( index, newX, newY );
}
}
}
}