Committer:
Midimetric
Date:
Sun Feb 06 13:30:28 2011 +0000
Revision:
5:1c78c0b4f513
Parent:
2:d6e572640dcc

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }