xchar.cpp@5:1c78c0b4f513, 2011-02-06 (annotated)
- Committer:
- Midimetric
- Date:
- Sun Feb 06 13:30:28 2011 +0000
- Revision:
- 5:1c78c0b4f513
- Parent:
- 1:9d081c7fff45
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Midimetric | 0:601fd83c75e0 | 1 | #include "doggy.h" |
Midimetric | 0:601fd83c75e0 | 2 | |
Midimetric | 0:601fd83c75e0 | 3 | XGlyph DogMLCD::GetGlyph( int code ) |
Midimetric | 0:601fd83c75e0 | 4 | { |
Midimetric | 0:601fd83c75e0 | 5 | if( code > 31 && code < 256 ) |
Midimetric | 0:601fd83c75e0 | 6 | return XFont[code - 31]; |
Midimetric | 0:601fd83c75e0 | 7 | return XFont[0]; |
Midimetric | 0:601fd83c75e0 | 8 | } |
Midimetric | 0:601fd83c75e0 | 9 | |
Midimetric | 0:601fd83c75e0 | 10 | void DogMLCD::XChar( int x, int y, int code, doggy_op raster ) |
Midimetric | 0:601fd83c75e0 | 11 | { |
Midimetric | 0:601fd83c75e0 | 12 | XChar( x, y, GetGlyph( code ) ); |
Midimetric | 0:601fd83c75e0 | 13 | } |
Midimetric | 0:601fd83c75e0 | 14 | void DogMLCD::XChar( int x, int y, XGlyph f, doggy_op raster ) |
Midimetric | 0:601fd83c75e0 | 15 | { |
Midimetric | 0:601fd83c75e0 | 16 | const char* p = f.bmp; |
Midimetric | 0:601fd83c75e0 | 17 | RasterOp op = ((RasterOp[]){ &DogMLCD::Poke, &DogMLCD::Wipe, &DogMLCD::Inv })[raster]; |
Midimetric | 0:601fd83c75e0 | 18 | int y1 = y + f.hei; |
Midimetric | 0:601fd83c75e0 | 19 | for( int w = 0 ; w < f.wid ; w++ ) |
Midimetric | 0:601fd83c75e0 | 20 | { |
Midimetric | 0:601fd83c75e0 | 21 | for( int z = y, m = 1 ; z < y1 ; z++ ) |
Midimetric | 0:601fd83c75e0 | 22 | { |
Midimetric | 0:601fd83c75e0 | 23 | if( m == 256 ) { m = 1; p++; } |
Midimetric | 0:601fd83c75e0 | 24 | if( *p & m ) |
Midimetric | 0:601fd83c75e0 | 25 | (this->*op)( x, z ); |
Midimetric | 0:601fd83c75e0 | 26 | m <<= 1; |
Midimetric | 0:601fd83c75e0 | 27 | } |
Midimetric | 0:601fd83c75e0 | 28 | p++; |
Midimetric | 0:601fd83c75e0 | 29 | x++; |
Midimetric | 0:601fd83c75e0 | 30 | } |
Midimetric | 0:601fd83c75e0 | 31 | } |
Midimetric | 5:1c78c0b4f513 | 32 | int DogMLCD::XString( int x, int y, int i, doggy_op raster ) |
Midimetric | 5:1c78c0b4f513 | 33 | { |
Midimetric | 5:1c78c0b4f513 | 34 | char buf[32]; |
Midimetric | 5:1c78c0b4f513 | 35 | sprintf( buf, "%d", i ); |
Midimetric | 5:1c78c0b4f513 | 36 | return XString( x, y, buf, raster ); |
Midimetric | 5:1c78c0b4f513 | 37 | } |
Midimetric | 5:1c78c0b4f513 | 38 | int DogMLCD::XString( int x, int y, float f, doggy_op raster ) |
Midimetric | 5:1c78c0b4f513 | 39 | { |
Midimetric | 5:1c78c0b4f513 | 40 | char buf[32]; |
Midimetric | 5:1c78c0b4f513 | 41 | sprintf( buf, "%f", f ); |
Midimetric | 5:1c78c0b4f513 | 42 | return XString( x, y, buf, raster ); |
Midimetric | 5:1c78c0b4f513 | 43 | } |
Midimetric | 1:9d081c7fff45 | 44 | int DogMLCD::XString( int x, int y, const char* s, doggy_op raster ) |
Midimetric | 0:601fd83c75e0 | 45 | { |
Midimetric | 0:601fd83c75e0 | 46 | int oldx = x; |
Midimetric | 0:601fd83c75e0 | 47 | int trc = 0, brc = 0, inter = XFont[0].hei; |
Midimetric | 0:601fd83c75e0 | 48 | while( *s ) |
Midimetric | 0:601fd83c75e0 | 49 | { |
Midimetric | 0:601fd83c75e0 | 50 | if( *s == 13 ) |
Midimetric | 0:601fd83c75e0 | 51 | { |
Midimetric | 0:601fd83c75e0 | 52 | x = oldx; |
Midimetric | 0:601fd83c75e0 | 53 | y += inter; |
Midimetric | 0:601fd83c75e0 | 54 | } |
Midimetric | 0:601fd83c75e0 | 55 | else if( *s > 31 ) |
Midimetric | 0:601fd83c75e0 | 56 | { |
Midimetric | 0:601fd83c75e0 | 57 | XGlyph f = GetGlyph( *s ); |
Midimetric | 0:601fd83c75e0 | 58 | |
Midimetric | 0:601fd83c75e0 | 59 | while( ( x > 0 ) && ( trc + f.tlc ) > 0 && ( brc + f.blc ) > 0 ) |
Midimetric | 0:601fd83c75e0 | 60 | { |
Midimetric | 0:601fd83c75e0 | 61 | x--; |
Midimetric | 0:601fd83c75e0 | 62 | trc--; |
Midimetric | 0:601fd83c75e0 | 63 | brc--; |
Midimetric | 0:601fd83c75e0 | 64 | } |
Midimetric | 0:601fd83c75e0 | 65 | |
Midimetric | 0:601fd83c75e0 | 66 | if( x + f.wid > 128 ) // simplified form of [ x + f.wid - 1 > 127 ] |
Midimetric | 0:601fd83c75e0 | 67 | { |
Midimetric | 0:601fd83c75e0 | 68 | x = oldx; |
Midimetric | 0:601fd83c75e0 | 69 | y += inter; |
Midimetric | 0:601fd83c75e0 | 70 | if( *s != 32 ) // don't ouput begining space on new line |
Midimetric | 0:601fd83c75e0 | 71 | { |
Midimetric | 0:601fd83c75e0 | 72 | XChar( x, y, f, raster ); |
Midimetric | 0:601fd83c75e0 | 73 | x += f.wid + 1; |
Midimetric | 0:601fd83c75e0 | 74 | } |
Midimetric | 0:601fd83c75e0 | 75 | } |
Midimetric | 0:601fd83c75e0 | 76 | else |
Midimetric | 0:601fd83c75e0 | 77 | { |
Midimetric | 0:601fd83c75e0 | 78 | XChar( x, y, f, raster ); |
Midimetric | 0:601fd83c75e0 | 79 | x += f.wid + 1; |
Midimetric | 0:601fd83c75e0 | 80 | } |
Midimetric | 0:601fd83c75e0 | 81 | if( *s != 32 ) // for space keep crening of previous char |
Midimetric | 0:601fd83c75e0 | 82 | { |
Midimetric | 0:601fd83c75e0 | 83 | trc = f.trc; |
Midimetric | 0:601fd83c75e0 | 84 | brc = f.brc; |
Midimetric | 0:601fd83c75e0 | 85 | } |
Midimetric | 0:601fd83c75e0 | 86 | } |
Midimetric | 0:601fd83c75e0 | 87 | s++; |
Midimetric | 0:601fd83c75e0 | 88 | } |
Midimetric | 1:9d081c7fff45 | 89 | return y; |
Midimetric | 0:601fd83c75e0 | 90 | } |