Committer:
Midimetric
Date:
Wed Dec 29 11:48:54 2010 +0000
Revision:
1:9d081c7fff45
Parent:
0:601fd83c75e0
Child:
5:1c78c0b4f513
Beta 2. Xstring now returns last used y position.

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 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 1:9d081c7fff45 32 int DogMLCD::XString( int x, int y, const char* s, doggy_op raster )
Midimetric 0:601fd83c75e0 33 {
Midimetric 0:601fd83c75e0 34 int oldx = x;
Midimetric 0:601fd83c75e0 35 int trc = 0, brc = 0, inter = XFont[0].hei;
Midimetric 0:601fd83c75e0 36 while( *s )
Midimetric 0:601fd83c75e0 37 {
Midimetric 0:601fd83c75e0 38 if( *s == 13 )
Midimetric 0:601fd83c75e0 39 {
Midimetric 0:601fd83c75e0 40 x = oldx;
Midimetric 0:601fd83c75e0 41 y += inter;
Midimetric 0:601fd83c75e0 42 }
Midimetric 0:601fd83c75e0 43 else if( *s > 31 )
Midimetric 0:601fd83c75e0 44 {
Midimetric 0:601fd83c75e0 45 XGlyph f = GetGlyph( *s );
Midimetric 0:601fd83c75e0 46
Midimetric 0:601fd83c75e0 47 while( ( x > 0 ) && ( trc + f.tlc ) > 0 && ( brc + f.blc ) > 0 )
Midimetric 0:601fd83c75e0 48 {
Midimetric 0:601fd83c75e0 49 x--;
Midimetric 0:601fd83c75e0 50 trc--;
Midimetric 0:601fd83c75e0 51 brc--;
Midimetric 0:601fd83c75e0 52 }
Midimetric 0:601fd83c75e0 53
Midimetric 0:601fd83c75e0 54 if( x + f.wid > 128 ) // simplified form of [ x + f.wid - 1 > 127 ]
Midimetric 0:601fd83c75e0 55 {
Midimetric 0:601fd83c75e0 56 x = oldx;
Midimetric 0:601fd83c75e0 57 y += inter;
Midimetric 0:601fd83c75e0 58 if( *s != 32 ) // don't ouput begining space on new line
Midimetric 0:601fd83c75e0 59 {
Midimetric 0:601fd83c75e0 60 XChar( x, y, f, raster );
Midimetric 0:601fd83c75e0 61 x += f.wid + 1;
Midimetric 0:601fd83c75e0 62 }
Midimetric 0:601fd83c75e0 63 }
Midimetric 0:601fd83c75e0 64 else
Midimetric 0:601fd83c75e0 65 {
Midimetric 0:601fd83c75e0 66 XChar( x, y, f, raster );
Midimetric 0:601fd83c75e0 67 x += f.wid + 1;
Midimetric 0:601fd83c75e0 68 }
Midimetric 0:601fd83c75e0 69 if( *s != 32 ) // for space keep crening of previous char
Midimetric 0:601fd83c75e0 70 {
Midimetric 0:601fd83c75e0 71 trc = f.trc;
Midimetric 0:601fd83c75e0 72 brc = f.brc;
Midimetric 0:601fd83c75e0 73 }
Midimetric 0:601fd83c75e0 74 }
Midimetric 0:601fd83c75e0 75 s++;
Midimetric 0:601fd83c75e0 76 }
Midimetric 1:9d081c7fff45 77 return y;
Midimetric 0:601fd83c75e0 78 }