aboutsummaryrefslogtreecommitdiff
path: root/src/strings33.c
blob: 1d2d78b043ceb4faeb0308db6c4862ef99ebf85e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "stdarg.h"
#include "stdio.h"
#include "string.h"

#include "strings33.h"
#include "types33.h"


static Font33 *fonts[2] = {
  &defFont, &bigFont
};


static u32 textColours[9] = {
  BLACK,
  RED,
  GREEN,
  BLUE,
  YELLOW,
  ORANGE,
  MAGENTA,
  CYAN,
  WHITE
};


void strings33_uprintf( Surface33 *surf, Size f, u32 col, Size x, Size y, const char *fmt, ... )
{
  static char tmp[ _STRING_MAX ];

  va_list args;
  va_start(args, fmt);

  vsnprintf(tmp, _STRING_MAX, fmt, args);
  strings33_uprint( surf, f, col, x, y, tmp );

  va_end(args);
}


void strings33_uprint( Surface33 *surf, Size f, u32 col, Size x, Size y, const char *str )
{
  Size i, j, ofs;
  Font33 *font = fonts[f];
  Size sWidth = surf->w;
  Size sHeight = surf->h;
  FontGlyph33 *glyphs = font->glyphs;
  u32 *out;
  uSize stringLen = strlen(str);

  Size strWid = 0;
  for( i = 0; i < stringLen; ++i ) {
    if( str[i] < 0x20 ) continue;
    strWid += glyphs[ str[i] - 0x20 ].w;
  }

  if( (x + strWid) >= sWidth ) {
    x -= (strWid - (sWidth - x));
  }
  if( (y + font->h) >= sHeight ) {
    y -= (font->h- (sHeight - y));
  }

  if(x < 0) { x = 0; }
  if(y < 0) { y = 0; }
  out = surf->data + (x + (y * surf->w));

  for( i = 0, ofs = 0; i < stringLen; ++i )
  {
    if( str[i] < 0x20 )
    {
      col = textColours[str[i]];
      continue;
    }

    FontGlyph33 *glyph = &glyphs[ str[i] - 0x20 ];
    Size numPlots = glyph->plotCount;
    Size gWidth = glyph->w;
    u16 *plots = glyph->plots;

    for( j = 0; j < numPlots; ++j )
    {
      Size plot = plots[j];
      Size offset = (((plot & font->yAnd) * sWidth) + (plot >> font->xShift)) + ofs;

      memcpy( out + offset, &col, sizeof(u32) );
    }

    ofs += gWidth;
  }
}