source: pwntcha/trunk/src/font.c @ 448

Last change on this file since 448 was 448, checked in by Sam Hocevar, 18 years ago
  • Use font_load_* for all decoders.
  • Property svn:keywords set to Id
File size: 3.7 KB
Line 
1/*
2 * font.c: font handling
3 * $Id: font.c 448 2005-01-10 15:31:33Z sam $
4 *
5 * Copyright: (c) 2005 Sam Hocevar <sam@zoy.org>
6 *   This program is free software; you can redistribute it and/or
7 *   modify it under the terms of the Do What The Fuck You Want To
8 *   Public License as published by Banlu Kemiyatorn. See
9 *   http://sam.zoy.org/projects/COPYING.WTFPL for more details.
10 */
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15
16#include "config.h"
17#include "common.h"
18
19struct font *font_load_fixed(char *file, char *chars)
20{
21    char fontname[BUFSIZ];
22    struct font *font;
23    struct image *img;
24    int i;
25
26    sprintf(fontname, "%s/%s", share, file);
27    img = image_load(fontname);
28    if(!img)
29    {
30        fprintf(stderr, "%s: cannot load font %s\n", argv0, fontname);
31        return NULL;
32    }
33
34    font = malloc(sizeof(struct font));
35    font->img = img;
36    font->size = strlen(chars);
37    font->glyphs = malloc(font->size * sizeof(struct glyph));
38
39    for(i = 0; i < font->size; i++)
40    {
41        font->glyphs[i].xmin = i * font->img->width / font->size;
42        font->glyphs[i].xmax = (i + 1) * font->img->width / font->size;
43        font->glyphs[i].ymin = 0;
44        font->glyphs[i].ymax = font->img->height;
45        font->glyphs[i].count = 0; /* They all have the same width anyway */
46        font->glyphs[i].c = chars[i];
47    }
48
49    return font;
50}
51
52struct font *font_load_variable(char *file, char *chars)
53{
54    char fontname[BUFSIZ];
55    struct font *font;
56    struct image *img;
57    int count = 0, incell = 0, xmin, xmax, ymin, ymax;
58    int x, y, i;
59    int r, g, b;
60
61    sprintf(fontname, "%s/%s", share, file);
62    img = image_load(fontname);
63    if(!img)
64    {
65        fprintf(stderr, "%s: cannot load font %s\n", argv0, fontname);
66        return NULL;
67    }
68
69    font = malloc(sizeof(struct font));
70    font->img = img;
71    font->size = strlen(chars);
72    font->glyphs = malloc(font->size * sizeof(struct glyph));
73
74    for(x = 0, i = 0, xmin = 0; x < font->img->width && i < font->size; x++)
75    {
76        int found = 0;
77        for(y = 0; y < font->img->height; y++)
78        {
79            getpixel(font->img, x, y, &r, &g, &b);
80            if(r < 128)
81            {
82                found = 1;
83                count += (255 - r);
84            }
85        }
86        if(found && !incell)
87        {
88            incell = 1;
89            xmin = x;
90        }
91        else if(!found && incell)
92        {
93            incell = 0;
94            xmax = x;
95#if 0
96            ymin = font->img->height;
97            ymax = 0;
98            for(y = 0; y < font->img->height; y++)
99            {
100                int newx;
101                int gotit = 0;
102                for(newx = xmin; newx < xmax; newx++)
103                {
104                    getpixel(font->img, newx, y, &r, &g, &b);
105                    if(r < 128)
106                    {
107                        gotit = 1;
108                        break;
109                    }
110                }
111                if(gotit)
112                {
113                    if(ymin > y) ymin = y;
114                    if(ymax <= y) ymax = y + 1;
115                }
116            }
117#else
118            ymin = 0;
119            ymax = font->img->height;
120#endif
121            font->glyphs[i].xmin = xmin;
122            font->glyphs[i].xmax = xmax;
123            font->glyphs[i].ymin = ymin;
124            font->glyphs[i].ymax = ymax;
125            font->glyphs[i].count = count;
126            font->glyphs[i].c = chars[i];
127            count = 0;
128            i++;
129        }
130    }
131
132    if(i != font->size)
133    {
134        printf("%s: could not find %i glyphs in font\n", argv0, font->size);
135        image_free(font->img);
136        free(font->glyphs);
137        free(font);
138        return NULL;
139    }
140
141    return font;
142}
143
144void font_free(struct font *font)
145{
146    image_free(font->img);
147    free(font->glyphs);
148    free(font);
149}
150
Note: See TracBrowser for help on using the repository browser.