Skip to content

Commit

Permalink
Merge pull request #409 from WildernessLabs/feature-8x16_font
Browse files Browse the repository at this point in the history
Add 8x16 font
  • Loading branch information
jorgedevs authored Aug 24, 2022
2 parents f311b6f + bd6e532 commit a87873b
Showing 1 changed file with 143 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
namespace Meadow.Foundation.Graphics
{
/// <summary>
/// Represents a 8x16 bitmap font
/// </summary>
public class Font8x16 : IFont
{
/// <summary>
/// Width of a character in the font.
/// </summary>
public int Width => 8;

/// <summary>
/// Height of a character in the font.
/// </summary>
public int Height => 16;

/// <summary>
/// Font table containing the binary representation of ASCII characters.
/// </summary>
private static readonly byte[][] _fontTable =
{
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //0020( )
new byte[] {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00}, //0021(!)
new byte[] {0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //0022(")
new byte[] {0x00, 0x14, 0x14, 0x14, 0x7F, 0x14, 0x14, 0x7F, 0x14, 0x14, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00}, //0023(#)
new byte[] {0x08, 0x3E, 0x49, 0x09, 0x09, 0x09, 0x3E, 0x48, 0x48, 0x48, 0x49, 0x3E, 0x08, 0x00, 0x00, 0x00}, //0024($)
new byte[] {0x00, 0x02, 0x05, 0x45, 0x22, 0x10, 0x08, 0x04, 0x22, 0x51, 0x50, 0x20, 0x00, 0x00, 0x00, 0x00}, //0025(%)
new byte[] {0x00, 0x0C, 0x12, 0x12, 0x12, 0x0C, 0x52, 0x21, 0x41, 0x41, 0x21, 0x5E, 0x00, 0x00, 0x00, 0x00}, //0026(&)
new byte[] {0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //0027(')
new byte[] {0x08, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00}, //0028(()
new byte[] {0x08, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00, 0x00, 0x00}, //0029())
new byte[] {0x00, 0x00, 0x00, 0x08, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //002A(*)
new byte[] {0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x7F, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //002B(+)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00}, //002C(,)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //002D(-)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, //002E(.)
new byte[] {0x00, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //002F(/)
new byte[] {0x3E, 0x41, 0x61, 0x51, 0x51, 0x49, 0x49, 0x45, 0x45, 0x43, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0030(0)
new byte[] {0x08, 0x0C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00}, //0031(1)
new byte[] {0x3E, 0x41, 0x40, 0x40, 0x40, 0x3E, 0x01, 0x01, 0x01, 0x01, 0x01, 0x7F, 0x00, 0x00, 0x00, 0x00}, //0032(2)
new byte[] {0x3E, 0x41, 0x40, 0x40, 0x40, 0x3C, 0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0033(3)
new byte[] {0x20, 0x30, 0x28, 0x24, 0x22, 0x21, 0x7F, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00}, //0034(4)
new byte[] {0x7F, 0x01, 0x01, 0x01, 0x01, 0x3F, 0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0035(5)
new byte[] {0x3E, 0x41, 0x01, 0x01, 0x01, 0x3F, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0036(6)
new byte[] {0x7F, 0x40, 0x40, 0x20, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00}, //0037(7)
new byte[] {0x3E, 0x41, 0x41, 0x41, 0x41, 0x3E, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0038(8)
new byte[] {0x3E, 0x41, 0x41, 0x41, 0x41, 0x7E, 0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0039(9)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, //003A(:)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00}, //003B(;)
new byte[] {0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00}, //003C(<)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //003D(=)
new byte[] {0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00}, //003E(>)
new byte[] {0x3E, 0x41, 0x41, 0x40, 0x40, 0x30, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}, //003F(?)
new byte[] {0x3E, 0x41, 0x59, 0x55, 0x55, 0x55, 0x45, 0x45, 0x3D, 0x01, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0040(@)
new byte[] {0x3E, 0x41, 0x41, 0x41, 0x41, 0x41, 0x7F, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00}, //0041(A)
new byte[] {0x3F, 0x41, 0x41, 0x41, 0x41, 0x3F, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3F, 0x00, 0x00, 0x00, 0x00}, //0042(B)
new byte[] {0x3C, 0x42, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00}, //0043(C)
new byte[] {0x3F, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3F, 0x00, 0x00, 0x00, 0x00}, //0044(D)
new byte[] {0x7F, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x7F, 0x00, 0x00, 0x00, 0x00}, //0045(E)
new byte[] {0x7F, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00}, //0046(F)
new byte[] {0x3E, 0x41, 0x01, 0x01, 0x01, 0x01, 0x71, 0x41, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0047(G)
new byte[] {0x41, 0x41, 0x41, 0x41, 0x41, 0x7F, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00}, //0048(H)
new byte[] {0x1C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00}, //0049(I)
new byte[] {0x1C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00}, //004A(J)
new byte[] {0x41, 0x21, 0x11, 0x09, 0x05, 0x03, 0x05, 0x09, 0x11, 0x21, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00}, //004B(K)
new byte[] {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x7F, 0x00, 0x00, 0x00, 0x00}, //004C(L)
new byte[] {0x63, 0x55, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00}, //004D(M)
new byte[] {0x43, 0x45, 0x49, 0x51, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00}, //004E(N)
new byte[] {0x3E, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //004F(O)
new byte[] {0x3F, 0x41, 0x41, 0x41, 0x41, 0x3F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00}, //0050(P)
new byte[] {0x3E, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x21, 0x5E, 0x00, 0x00, 0x00, 0x00}, //0051(Q)
new byte[] {0x3F, 0x41, 0x41, 0x41, 0x41, 0x3F, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00}, //0052(R)
new byte[] {0x3E, 0x41, 0x01, 0x01, 0x01, 0x3E, 0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0053(S)
new byte[] {0x7F, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00}, //0054(T)
new byte[] {0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0055(U)
new byte[] {0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x22, 0x14, 0x08, 0x00, 0x00, 0x00, 0x00}, //0056(V)
new byte[] {0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x49, 0x55, 0x63, 0x00, 0x00, 0x00, 0x00}, //0057(W)
new byte[] {0x41, 0x41, 0x41, 0x22, 0x14, 0x08, 0x14, 0x22, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00}, //0058(X)
new byte[] {0x41, 0x41, 0x22, 0x14, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00}, //0059(Y)
new byte[] {0x7F, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x01, 0x7F, 0x00, 0x00, 0x00, 0x00}, //005A(Z)
new byte[] {0x3C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x3C, 0x00, 0x00, 0x00, 0x00}, //005B([)
new byte[] {0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //005C(\)
new byte[] {0x1E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1E, 0x00, 0x00, 0x00, 0x00}, //005D(])
new byte[] {0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //005E(^)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00}, //005F(_)
new byte[] {0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //0060(`)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x41, 0x61, 0x5E, 0x00, 0x00, 0x00, 0x00}, //0061(a)
new byte[] {0x01, 0x01, 0x01, 0x01, 0x01, 0x3D, 0x43, 0x41, 0x41, 0x41, 0x43, 0x3D, 0x00, 0x00, 0x00, 0x00}, //0062(b)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x41, 0x01, 0x01, 0x01, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0063(c)
new byte[] {0x40, 0x40, 0x40, 0x40, 0x40, 0x5E, 0x61, 0x41, 0x41, 0x41, 0x61, 0x5E, 0x00, 0x00, 0x00, 0x00}, //0064(d)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x41, 0x41, 0x7F, 0x01, 0x01, 0x7E, 0x00, 0x00, 0x00, 0x00}, //0065(e)
new byte[] {0x78, 0x04, 0x04, 0x04, 0x04, 0x7F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00}, //0066(f)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x61, 0x41, 0x41, 0x41, 0x41, 0x7E, 0x40, 0x41, 0x3E, 0x00}, //0067(g)
new byte[] {0x01, 0x01, 0x01, 0x01, 0x01, 0x3F, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00}, //0068(h)
new byte[] {0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00}, //0069(i)
new byte[] {0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x06, 0x00}, //006A(j)
new byte[] {0x01, 0x01, 0x01, 0x01, 0x11, 0x09, 0x05, 0x03, 0x05, 0x09, 0x11, 0x21, 0x00, 0x00, 0x00, 0x00}, //006B(k)
new byte[] {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00}, //006C(l)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00}, //006D(m)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x43, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00}, //006E(n)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //006F(o)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x43, 0x41, 0x41, 0x41, 0x43, 0x3D, 0x01, 0x01, 0x01, 0x00}, //0070(p)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x61, 0x41, 0x41, 0x41, 0x61, 0x5E, 0x40, 0x40, 0x40, 0x00}, //0071(q)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x43, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00}, //0072(r)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x41, 0x01, 0x3E, 0x40, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0073(s)
new byte[] {0x00, 0x00, 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00}, //0074(t)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00, 0x00}, //0075(u)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x41, 0x41, 0x41, 0x22, 0x14, 0x08, 0x00, 0x00, 0x00, 0x00}, //0076(v)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x41, 0x41, 0x41, 0x49, 0x49, 0x36, 0x00, 0x00, 0x00, 0x00}, //0077(w)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00}, //0078(x)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x7E, 0x40, 0x41, 0x3E, 0x00}, //0079(y)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x20, 0x10, 0x08, 0x04, 0x02, 0x7F, 0x00, 0x00, 0x00, 0x00}, //007A(z)
new byte[] {0x18, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x18, 0x00, 0x00, 0x00}, //007B({)
new byte[] {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00}, //007C(|)
new byte[] {0x0C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x00, 0x00, 0x00}, //007D(})
new byte[] {0x26, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //007E(~)
new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //00A0( )
};

/// <summary>
/// Get the binary representation of an ASCII character from the
/// font table.
/// </summary>
/// <param name="character">Character to look up.</param>
/// <returns>
/// Byte array containing the rows of pixels in the character. Unknown byte codes will result in a space being
/// returned.
/// </returns>
public byte[] this[char character]
{
get
{
var index = (byte)character;
if ((index < 32) || (index > 127))
{
return _fontTable[0x20];
}
return _fontTable[(byte)character - 0x20];
}
}
}
}

0 comments on commit a87873b

Please sign in to comment.