mirror of https://github.com/MLXXXp/Arduboy2.git
break out printing into separate class (-2,014 bytes)
- stated savings is for any graphics only programs not using the printing code at all
This commit is contained in:
parent
5042811cec
commit
390e5919dc
|
@ -155,14 +155,16 @@ const byte PROGMEM score [] = {
|
||||||
0x80, 0x81, 0x90,0x45, 0,91, 0,136, 0x80, 0x82, 0x90,0x45, 0x91,0x2D, 7,83, 0x80, 0x81, 0xf0};
|
0x80, 0x81, 0x90,0x45, 0,91, 0,136, 0x80, 0x82, 0x90,0x45, 0x91,0x2D, 7,83, 0x80, 0x81, 0xf0};
|
||||||
|
|
||||||
Arduboy arduboy;
|
Arduboy arduboy;
|
||||||
|
AbPrinter text(arduboy);
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
arduboy.begin();
|
arduboy.begin();
|
||||||
arduboy.setTextSize(4);
|
text.setSize(4);
|
||||||
arduboy.setCursor(0,0);
|
text.setCursor(0,0);
|
||||||
arduboy.print("Music\nDemo");
|
text.print("Music\nDemo");
|
||||||
arduboy.display();
|
arduboy.display();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -191,8 +193,8 @@ void loop ()
|
||||||
}
|
}
|
||||||
|
|
||||||
arduboy.clear();
|
arduboy.clear();
|
||||||
arduboy.setCursor(x,y);
|
text.setCursor(x,y);
|
||||||
arduboy.print("Music\nDemo");
|
text.print("Music\nDemo");
|
||||||
arduboy.display();
|
arduboy.display();
|
||||||
|
|
||||||
// play the tune if we aren't already
|
// play the tune if we aren't already
|
||||||
|
|
|
@ -9,14 +9,10 @@ Arduboy::Arduboy()
|
||||||
frameCount = 0;
|
frameCount = 0;
|
||||||
nextFrameStart = 0;
|
nextFrameStart = 0;
|
||||||
post_render = false;
|
post_render = false;
|
||||||
|
|
||||||
// init not necessary, will be reset after first use
|
// init not necessary, will be reset after first use
|
||||||
// lastFrameStart
|
// lastFrameStart
|
||||||
// lastFrameDurationMs
|
// lastFrameDurationMs
|
||||||
|
|
||||||
// font rendering
|
|
||||||
cursor_x = 0;
|
|
||||||
cursor_y = 0;
|
|
||||||
textsize = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Arduboy::start() // deprecated
|
void Arduboy::start() // deprecated
|
||||||
|
@ -714,47 +710,6 @@ void Arduboy::drawChar
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Arduboy::setCursor(int16_t x, int16_t y)
|
|
||||||
{
|
|
||||||
cursor_x = x;
|
|
||||||
cursor_y = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Arduboy::setTextSize(uint8_t s)
|
|
||||||
{
|
|
||||||
// textsize must always be 1 or higher
|
|
||||||
textsize = max(1,s);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Arduboy::setTextWrap(boolean w)
|
|
||||||
{
|
|
||||||
wrap = w;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Arduboy::write(uint8_t c)
|
|
||||||
{
|
|
||||||
if (c == '\n')
|
|
||||||
{
|
|
||||||
cursor_y += textsize*8;
|
|
||||||
cursor_x = 0;
|
|
||||||
}
|
|
||||||
else if (c == '\r')
|
|
||||||
{
|
|
||||||
// skip em
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
drawChar(cursor_x, cursor_y, c, 1, 0, textsize);
|
|
||||||
cursor_x += textsize*6;
|
|
||||||
if (wrap && (cursor_x > (WIDTH - textsize*6)))
|
|
||||||
{
|
|
||||||
// calling ourselves recursively for 'newline' is
|
|
||||||
// 12 bytes smaller than doing the same math here
|
|
||||||
write('\n');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Arduboy::display()
|
void Arduboy::display()
|
||||||
{
|
{
|
||||||
this->paintScreen(sBuffer);
|
this->paintScreen(sBuffer);
|
||||||
|
@ -765,7 +720,6 @@ unsigned char* Arduboy::getBuffer()
|
||||||
return sBuffer;
|
return sBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
boolean Arduboy::pressed(uint8_t buttons)
|
boolean Arduboy::pressed(uint8_t buttons)
|
||||||
{
|
{
|
||||||
return (buttonsState() & buttons) == buttons;
|
return (buttonsState() & buttons) == buttons;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define Arduboy_h
|
#define Arduboy_h
|
||||||
|
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
|
#include "ab_printer.h"
|
||||||
#include <Print.h>
|
#include <Print.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
|
@ -28,7 +29,8 @@
|
||||||
// compare temperature to 2.5 internal reference and _BV(MUX5)
|
// compare temperature to 2.5 internal reference and _BV(MUX5)
|
||||||
#define ADC_TEMP (_BV(REFS0) | _BV(REFS1) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0))
|
#define ADC_TEMP (_BV(REFS0) | _BV(REFS1) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0))
|
||||||
|
|
||||||
class Arduboy : public Print, public ArduboyCore
|
|
||||||
|
class Arduboy : public ArduboyCore
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Arduboy();
|
Arduboy();
|
||||||
|
@ -156,24 +158,8 @@ public:
|
||||||
/// Draws an ASCII character at a point.
|
/// Draws an ASCII character at a point.
|
||||||
void drawChar(int16_t x, int16_t y, unsigned char c, uint8_t color, uint8_t bg, uint8_t size);
|
void drawChar(int16_t x, int16_t y, unsigned char c, uint8_t color, uint8_t bg, uint8_t size);
|
||||||
|
|
||||||
/// Sets the location of the screen cursor.
|
|
||||||
void setCursor(int16_t x, int16_t y);
|
|
||||||
|
|
||||||
/// Set text size
|
|
||||||
/**
|
|
||||||
* As mentioned in drawChar(), individual ASCII characters are 6x8 pixels
|
|
||||||
* (5x7 with spacing on two edges). The size is a pixel multiplier,
|
|
||||||
* so a size of 2 means each character will be 12x16, etc.
|
|
||||||
*/
|
|
||||||
void setTextSize(uint8_t s);
|
|
||||||
|
|
||||||
/// Sets whether text will wrap at screen edges.
|
|
||||||
void setTextWrap(boolean w);
|
|
||||||
|
|
||||||
unsigned char* getBuffer();
|
unsigned char* getBuffer();
|
||||||
|
|
||||||
/// Writes a single ASCII character to the screen.
|
|
||||||
virtual size_t write(uint8_t);
|
|
||||||
|
|
||||||
/// Seeds the random number generator with entropy from the temperature, voltage reading, and microseconds since boot.
|
/// Seeds the random number generator with entropy from the temperature, voltage reading, and microseconds since boot.
|
||||||
/**
|
/**
|
||||||
|
@ -216,7 +202,6 @@ protected:
|
||||||
unsigned char sBuffer[(HEIGHT*WIDTH)/8];
|
unsigned char sBuffer[(HEIGHT*WIDTH)/8];
|
||||||
|
|
||||||
|
|
||||||
// Adafruit stuff
|
|
||||||
protected:
|
protected:
|
||||||
int16_t cursor_x;
|
int16_t cursor_x;
|
||||||
int16_t cursor_y;
|
int16_t cursor_y;
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
#include "Arduboy.h"
|
||||||
|
#include "ab_printer.h"
|
||||||
|
#include "glcdfont.c"
|
||||||
|
|
||||||
|
AbPrinter::AbPrinter(Arduboy &ab)
|
||||||
|
{
|
||||||
|
arduboy = &ab;
|
||||||
|
|
||||||
|
// font rendering
|
||||||
|
cursor_x = 0;
|
||||||
|
cursor_y = 0;
|
||||||
|
size = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t AbPrinter::write(uint8_t c)
|
||||||
|
{
|
||||||
|
if (c == '\n')
|
||||||
|
{
|
||||||
|
cursor_y += size*8;
|
||||||
|
cursor_x = 0;
|
||||||
|
}
|
||||||
|
else if (c == '\r')
|
||||||
|
{
|
||||||
|
// skip em
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
arduboy->drawChar(cursor_x, cursor_y, c, 1, 0, size);
|
||||||
|
cursor_x += size*6;
|
||||||
|
if (wrap && (cursor_x > (WIDTH - size*6)))
|
||||||
|
{
|
||||||
|
// calling ourselves recursively for 'newline' is
|
||||||
|
// 12 bytes smaller than doing the same math here
|
||||||
|
write('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AbPrinter::setCursor(int16_t x, int8_t y)
|
||||||
|
{
|
||||||
|
cursor_x = x;
|
||||||
|
cursor_y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AbPrinter::setSize(uint8_t s)
|
||||||
|
{
|
||||||
|
// size must always be 1 or higher
|
||||||
|
size = max(1,s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AbPrinter::setWrap(boolean w)
|
||||||
|
{
|
||||||
|
wrap = w;
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
#ifndef AbPrinter_h
|
||||||
|
#define AbPrinter_h
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "Arduboy.h"
|
||||||
|
#include <Print.h>
|
||||||
|
|
||||||
|
class Arduboy;
|
||||||
|
|
||||||
|
/// Separate class to break out Print subclassing
|
||||||
|
/**
|
||||||
|
* This is necessary because C++ keeps a virtual function lookup table around
|
||||||
|
* for the virtual function "write" that the Print subclass requires. That
|
||||||
|
* single reference to the "write" function in the vtable means "write" will
|
||||||
|
* always be compiled and including in the final ouput (even if it's never
|
||||||
|
* actually used in your sketch) - which means it's dependencies are also
|
||||||
|
# included:
|
||||||
|
*
|
||||||
|
* - drawChar
|
||||||
|
* - font (256 bytes!)
|
||||||
|
* - drawRect (for large font 'pixels')
|
||||||
|
* - cursor_x, cursor_y, wrap_mode, etc.
|
||||||
|
*
|
||||||
|
* This quickly adds up to 1 to 2kb of wasted space that many graphics
|
||||||
|
* based games never take advantage of. By breaking printing out into a
|
||||||
|
* separate class we prevent this. If you need it use it, if not then it
|
||||||
|
* will get dropped by the compiler during building.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class AbPrinter : public Print
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AbPrinter(Arduboy &ab);
|
||||||
|
|
||||||
|
/// Writes a single ASCII character to the screen.
|
||||||
|
virtual size_t write(uint8_t);
|
||||||
|
|
||||||
|
/// Sets the location of the screen cursor.
|
||||||
|
void setCursor(int16_t x, int8_t y);
|
||||||
|
|
||||||
|
/// Set text size
|
||||||
|
/**
|
||||||
|
* As mentioned in drawChar(), individual ASCII characters are 6x8 pixels
|
||||||
|
* (5x7 with spacing on two edges). The size is a pixel multiplier,
|
||||||
|
* so a size of 2 means each character will be 12x16, etc.
|
||||||
|
*/
|
||||||
|
void setSize(uint8_t s);
|
||||||
|
|
||||||
|
/// Sets whether text will wrap at screen edges.
|
||||||
|
void setWrap(boolean w);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Arduboy *arduboy;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int16_t cursor_x;
|
||||||
|
int8_t cursor_y;
|
||||||
|
uint8_t size;
|
||||||
|
boolean wrap; // If set, 'wrap' text at right edge of display
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue