User | Revision | Line number | New contents of line |
Midimetric |
0:601fd83c75e0
|
1
|
#include "doggy.h"
|
Midimetric |
0:601fd83c75e0
|
2
|
|
Midimetric |
0:601fd83c75e0
|
3
|
void DogMLCD::LineH( int x0, int y, int x1, doggy_op raster )
|
Midimetric |
0:601fd83c75e0
|
4
|
{
|
Midimetric |
0:601fd83c75e0
|
5
|
if( y & 0xFFC0 ) return; // line is out of screen
|
Midimetric |
0:601fd83c75e0
|
6
|
BOUND( x0, 0, 127 )
|
Midimetric |
0:601fd83c75e0
|
7
|
BOUND( x1, 0, 127 )
|
Midimetric |
0:601fd83c75e0
|
8
|
ORDER( x0, x1 )
|
Midimetric |
0:601fd83c75e0
|
9
|
|
Midimetric |
0:601fd83c75e0
|
10
|
int n = x1 - x0 + 1;
|
Midimetric |
0:601fd83c75e0
|
11
|
char* p = b_ + (( y & 0x38 ) << 4) + x0;
|
Midimetric |
0:601fd83c75e0
|
12
|
if( raster == poke )
|
Midimetric |
0:601fd83c75e0
|
13
|
{
|
Midimetric |
0:601fd83c75e0
|
14
|
char b = DOGMLCD_on[ y & 7 ];
|
Midimetric |
0:601fd83c75e0
|
15
|
while( n-- )
|
Midimetric |
0:601fd83c75e0
|
16
|
*p++ |= b;
|
Midimetric |
0:601fd83c75e0
|
17
|
}
|
Midimetric |
0:601fd83c75e0
|
18
|
else if( raster == wipe )
|
Midimetric |
0:601fd83c75e0
|
19
|
{
|
Midimetric |
0:601fd83c75e0
|
20
|
char b = DOGMLCD_off[ y & 7 ];
|
Midimetric |
0:601fd83c75e0
|
21
|
while( n-- )
|
Midimetric |
0:601fd83c75e0
|
22
|
*p++ &= b;
|
Midimetric |
0:601fd83c75e0
|
23
|
}
|
Midimetric |
0:601fd83c75e0
|
24
|
else
|
Midimetric |
0:601fd83c75e0
|
25
|
{
|
Midimetric |
0:601fd83c75e0
|
26
|
char b = DOGMLCD_on[ y & 7 ];
|
Midimetric |
0:601fd83c75e0
|
27
|
while( n-- )
|
Midimetric |
0:601fd83c75e0
|
28
|
*p++ ^= b;
|
Midimetric |
0:601fd83c75e0
|
29
|
}
|
Midimetric |
0:601fd83c75e0
|
30
|
}
|
Midimetric |
0:601fd83c75e0
|
31
|
void DogMLCD::LineV( int x, int y0, int y1, doggy_op raster )
|
Midimetric |
0:601fd83c75e0
|
32
|
{
|
Midimetric |
0:601fd83c75e0
|
33
|
if( x & 0xFF80 ) return; // line is out of screen
|
Midimetric |
0:601fd83c75e0
|
34
|
BOUND( y0, 0, 63 )
|
Midimetric |
0:601fd83c75e0
|
35
|
BOUND( y1, 0, 63 )
|
Midimetric |
0:601fd83c75e0
|
36
|
ORDER( y0, y1 )
|
Midimetric |
0:601fd83c75e0
|
37
|
RasterOp op = ((RasterOp[]){ &DogMLCD::Poke, &DogMLCD::Wipe, &DogMLCD::Inv })[raster];
|
Midimetric |
0:601fd83c75e0
|
38
|
for( int y = y0 ; y <= y1 ; y++ )
|
Midimetric |
0:601fd83c75e0
|
39
|
(this->*op)( x, y );
|
Midimetric |
0:601fd83c75e0
|
40
|
}
|
Midimetric |
5:1c78c0b4f513
|
41
|
void DogMLCD::Line( int x0, int y0, int x1, int y1, doggy_op raster )
|
Midimetric |
5:1c78c0b4f513
|
42
|
{
|
Midimetric |
5:1c78c0b4f513
|
43
|
bool steep = abs( y1 - y0 ) > abs( x1 - x0 );
|
Midimetric |
5:1c78c0b4f513
|
44
|
if( steep ) { SWAP( x0, y0 ) SWAP( x1, y1 ) }
|
Midimetric |
5:1c78c0b4f513
|
45
|
if( x0 > x1) { SWAP( x0, x1 ) SWAP( y0, y1 ) }
|
Midimetric |
5:1c78c0b4f513
|
46
|
|
Midimetric |
5:1c78c0b4f513
|
47
|
int dx = x1 - x0;
|
Midimetric |
5:1c78c0b4f513
|
48
|
int dy = abs( y1 - y0 );
|
Midimetric |
5:1c78c0b4f513
|
49
|
int e = dx / 2;
|
Midimetric |
5:1c78c0b4f513
|
50
|
int ystep = y0 < y1 ? 1 : -1;
|
Midimetric |
5:1c78c0b4f513
|
51
|
RasterOp op = ((RasterOp[]){ &DogMLCD::Poke, &DogMLCD::Wipe, &DogMLCD::Inv })[raster];
|
Midimetric |
5:1c78c0b4f513
|
52
|
|
Midimetric |
5:1c78c0b4f513
|
53
|
if( steep ) for( int x = x0, y = y0 ; x <= x1 ; x++ )
|
Midimetric |
5:1c78c0b4f513
|
54
|
{
|
Midimetric |
5:1c78c0b4f513
|
55
|
(this->*op)( y, x );
|
Midimetric |
5:1c78c0b4f513
|
56
|
if( ( e -= dy ) < 0 )
|
Midimetric |
5:1c78c0b4f513
|
57
|
{
|
Midimetric |
5:1c78c0b4f513
|
58
|
y += ystep;
|
Midimetric |
5:1c78c0b4f513
|
59
|
e += dx;
|
Midimetric |
5:1c78c0b4f513
|
60
|
}
|
Midimetric |
5:1c78c0b4f513
|
61
|
}
|
Midimetric |
5:1c78c0b4f513
|
62
|
else for( int x = x0, y = y0 ; x <= x1 ; x++ )
|
Midimetric |
5:1c78c0b4f513
|
63
|
{
|
Midimetric |
5:1c78c0b4f513
|
64
|
(this->*op)( x, y );
|
Midimetric |
5:1c78c0b4f513
|
65
|
if( ( e -= dy ) < 0 )
|
Midimetric |
5:1c78c0b4f513
|
66
|
{
|
Midimetric |
5:1c78c0b4f513
|
67
|
y += ystep;
|
Midimetric |
5:1c78c0b4f513
|
68
|
e += dx;
|
Midimetric |
5:1c78c0b4f513
|
69
|
}
|
Midimetric |
5:1c78c0b4f513
|
70
|
}
|
Midimetric |
5:1c78c0b4f513
|
71
|
}
|
Midimetric |
0:601fd83c75e0
|
72
|
void DogMLCD::Frame( int x0, int y0, int x1, int y1, doggy_op raster )
|
Midimetric |
0:601fd83c75e0
|
73
|
{
|
Midimetric |
0:601fd83c75e0
|
74
|
ORDER( x0, x1 )
|
Midimetric |
0:601fd83c75e0
|
75
|
ORDER( y0, y1 )
|
Midimetric |
0:601fd83c75e0
|
76
|
|
Midimetric |
0:601fd83c75e0
|
77
|
LineH( x0, y0, x1, raster );
|
Midimetric |
0:601fd83c75e0
|
78
|
if( y1 > y0 ) LineH( x0, y1, x1, raster );
|
Midimetric |
0:601fd83c75e0
|
79
|
|
Midimetric |
0:601fd83c75e0
|
80
|
y0++; // don't overlap at angles
|
Midimetric |
0:601fd83c75e0
|
81
|
y1--;
|
Midimetric |
0:601fd83c75e0
|
82
|
if( y1 >= y0 ) // don't overlap if horizontal lines where adjacent
|
Midimetric |
0:601fd83c75e0
|
83
|
{
|
Midimetric |
0:601fd83c75e0
|
84
|
LineV( x0, y0, y1, raster );
|
Midimetric |
0:601fd83c75e0
|
85
|
if( x1 > x0 ) LineV( x1, y0, y1, raster );
|
Midimetric |
0:601fd83c75e0
|
86
|
}
|
Midimetric |
0:601fd83c75e0
|
87
|
}
|
Midimetric |
2:d6e572640dcc
|
88
|
void DogMLCD::Rect( int x0, int y0, int x1, int y1, const unsigned char* p, doggy_op raster )
|
Midimetric |
0:601fd83c75e0
|
89
|
{
|
Midimetric |
0:601fd83c75e0
|
90
|
BOUND( x0, 0, 127 )
|
Midimetric |
0:601fd83c75e0
|
91
|
BOUND( x1, 0, 127 )
|
Midimetric |
0:601fd83c75e0
|
92
|
BOUND( y0, 0, 63 )
|
Midimetric |
0:601fd83c75e0
|
93
|
BOUND( y1, 0, 63 )
|
Midimetric |
0:601fd83c75e0
|
94
|
ORDER( x0, x1 )
|
Midimetric |
0:601fd83c75e0
|
95
|
ORDER( y0, y1 )
|
Midimetric |
2:d6e572640dcc
|
96
|
RasterOp op = ((RasterOp[]){ &DogMLCD::Poke, &DogMLCD::Wipe, &DogMLCD::Inv })[raster];
|
Midimetric |
0:601fd83c75e0
|
97
|
for( int x = x0 ; x <= x1 ; x++ )
|
Midimetric |
0:601fd83c75e0
|
98
|
for( int y = y0 ; y <= y1 ; y++ )
|
Midimetric |
0:601fd83c75e0
|
99
|
if( p[x & 7] & ( 1 << ( y & 7 ) ) )
|
Midimetric |
2:d6e572640dcc
|
100
|
(this->*op)( x, y );
|
Midimetric |
0:601fd83c75e0
|
101
|
} |