aboutsummaryrefslogtreecommitdiff
path: root/sanstop.h
blob: 5132662db590a4c3efe3f29c9c4ad25754f64526 (plain) (blame)
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
#pragma once

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <ft2build.h>
#include FT_FREETYPE_H

#define IMAGE_DIM 512
#define IMAGE_PIXELS (IMAGE_DIM * IMAGE_DIM)
#define DDS_HEADER_SIZE 128

typedef struct {
  uint8_t* data;
  int page;
  int x, y; // x = left edge; y = bottom edge
} Buffer;

typedef struct {
  char* fontFileName;
  char* fontPrefix;
  char* targets;
  int size;
} Config;

typedef struct {
  int id;
  int page;
  int left, right, top, bottom;
  // For future reference:
  // B = right - left - 2
  // A and C are unknown
} Glyph;

// Initializes a Buffer struct.
int initializeBuffer(Buffer* b);
// Increments the page counter, clears the data buffer, and resets coordinates.
void flipPage(Buffer* b);
// Returns 1 if there is not enough room in the current row to fit another
// glyph of a given width, and thus the program should advance to the space
// above.
int shouldGoUp(Buffer* b, int width);
// Returns 1 if there is not enough room in the current image to fit another
// glyph of a given height, and thus the program should flip to a new page.
int shouldFlip(Buffer* b, int height);
void goUp(Buffer* b, int height);
void advance(Buffer* b, int width);

// Writes the current page to a file.
int writePage(Buffer* b, Config* c);

// Blits the character stored in face->glyph to the buffer.
// Assumes that there is enough room.
// Does not advance automatically.
// Stores glyph definition in g.
// g->id must be set.
void blit(Buffer* b, FT_Face face, Glyph* gp, int tw, int th, int size);
// Same as blit, but checks if there is enough room and advances
// automatically afterwards.
int blitAndAdvance(Buffer* b, FT_Face face, Glyph* gp, Config* c);

void writeXMLHeader(FILE* f, FT_Face face, Config* c);
void writeXMLPageData(FILE* f, Config* c, Buffer* b);
void writeXMLGlyphData(FILE* f, int glyphCount, Glyph* glyphs);
void writeXMLFooter(FILE* f);

int readConfig(Config* c, int argc, char** argv);
void cleanConfig(Config* c);
void printUsage();
void printHelp();