/elec/propeller-clock

To get this branch, use:
bzr branch http://bzr.ed.am/elec/propeller-clock

« back to all changes in this revision

Viewing changes to src/text_renderer.cc

  • Committer: edam
  • Date: 2012-02-29 21:56:32 UTC
  • Revision ID: edam@waxworlds.org-20120229215632-kypb9491vx7bicef
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
#include "config.h"
25
25
#include "Arduino.h"
26
26
#include <avr/pgmspace.h>
27
 
#include "common.h"
28
 
#include "nvram.h"
 
27
#include "display.h"
29
28
 
30
29
 
31
30
// cached glyph
40
39
// output buffer
41
40
static unsigned char _output_buffer;
42
41
 
43
 
// does buffer need rendering?
44
 
static bool _need_render;
45
 
 
46
42
 
47
43
// cache a glyph
48
44
void cache_glyph( char c )
351
347
}
352
348
 
353
349
 
354
 
void TextRenderer::init()
355
 
{
356
 
        Nvram::load( Nvram::NVRAM_FONT, _font );
357
 
        if( _font < 0 || _font >= 4 ) _font = 0;
358
 
}
359
 
 
360
 
 
361
350
int TextRenderer::get_width( int message_len )
362
351
{
363
352
        return message_len * 8 * TEXT_SCALE;
378
367
                int pos = x / 8;
379
368
                if( pos < message_len )
380
369
                {
381
 
                        // ensure correct glyph is cached and pull out column of data
 
370
                        // ensure correct glyph is cached and pull out colun of data
382
371
                        cache_glyph( message[ pos ] );
383
372
                        glyph_col = _glyph_cache[ x % 8 ];
384
373
                }
386
375
 
387
376
        // draw a column
388
377
        if( y_flip )
389
 
                for( int a = 7; a >= 0; a-- ) {
390
 
                        if( glyph_col & 1 )
391
 
                                _output_buffer |= 1 << ( a + y_shift );
392
 
                        glyph_col >>= 1;
393
 
                }
394
 
        else
395
378
                for( int a = 0; a < 8; a++ ) {
396
379
                        if( glyph_col & 1 )
397
380
                                _output_buffer |= 1 << ( a + y_shift );
398
381
                        glyph_col >>= 1;
399
382
                }
 
383
        else
 
384
                for( int a = 8; a < 0; a++ ) {
 
385
                        if( glyph_col & 1 )
 
386
                                _output_buffer |= 1 << ( a + y_shift );
 
387
                        glyph_col >>= 1;
 
388
                }
400
389
}
401
390
 
402
391
 
403
392
void TextRenderer::reset_buffer()
404
393
{
405
394
        _output_buffer = 0;
406
 
        _need_render = false;
407
 
}
408
 
 
409
 
 
410
 
void TextRenderer::buffer_in_use()
411
 
{
412
 
        _need_render = true;
413
395
}
414
396
 
415
397
 
416
398
void TextRenderer::output_buffer()
417
399
{
418
 
        if( !_need_render ) return;
419
 
 
420
400
        for( int a = 8; a >= 0; a-- ) {
421
 
                led( a, ( _output_buffer & 1 )? true : false );
 
401
                Display::led( a, ( _output_buffer & 1 )? true : false );
422
402
                _output_buffer >>= 1;
423
403
        }
424
404
        _output_buffer = 0;
425
405
}
426
 
 
427
 
 
428
 
int TextRenderer::get_font()
429
 
{
430
 
        return _font;
431
 
}
432
 
 
433
 
 
434
 
void TextRenderer::inc_font()
435
 
{
436
 
        if( ++_font >= 4 )
437
 
                _font = 0;
438
 
        Nvram::save( Nvram::NVRAM_FONT, _font );
439
 
}