1/*
2 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <stdlib.h>
12
13
14void vp8_blit_text(const char *msg, unsigned char *address, const int pitch)
15{
16    int letter_bitmap;
17    unsigned char *output_pos = address;
18    int colpos;
19    const int font[] =
20    {
21        0x0, 0x5C00, 0x8020, 0xAFABEA, 0xD7EC0, 0x1111111, 0x1855740, 0x18000,
22        0x45C0, 0x74400, 0x51140, 0x23880, 0xC4000, 0x21080, 0x80000, 0x111110,
23        0xE9D72E, 0x87E40, 0x12AD732, 0xAAD62A, 0x4F94C4, 0x4D6B7, 0x456AA,
24        0x3E8423, 0xAAD6AA, 0xAAD6A2, 0x2800, 0x2A00, 0x8A880, 0x52940, 0x22A20,
25        0x15422, 0x6AD62E, 0x1E4A53E, 0xAAD6BF, 0x8C62E, 0xE8C63F, 0x118D6BF,
26        0x1094BF, 0xCAC62E, 0x1F2109F, 0x118FE31, 0xF8C628, 0x8A89F, 0x108421F,
27        0x1F1105F, 0x1F4105F, 0xE8C62E, 0x2294BF, 0x164C62E, 0x12694BF, 0x8AD6A2,
28        0x10FC21, 0x1F8421F, 0x744107, 0xF8220F, 0x1151151, 0x117041, 0x119D731,
29        0x47E0, 0x1041041, 0xFC400, 0x10440, 0x1084210, 0x820
30    };
31    colpos = 0;
32
33    while (msg[colpos] != 0)
34    {
35        char letter = msg[colpos];
36        int fontcol, fontrow;
37
38        if (letter <= 'Z' && letter >= ' ')
39            letter_bitmap = font[letter-' '];
40        else if (letter <= 'z' && letter >= 'a')
41            letter_bitmap = font[letter-'a'+'A' - ' '];
42        else
43            letter_bitmap = font[0];
44
45        for (fontcol = 6; fontcol >= 0 ; fontcol--)
46            for (fontrow = 0; fontrow < 5; fontrow++)
47                output_pos[fontrow *pitch + fontcol] =
48                    ((letter_bitmap >> (fontcol * 5)) & (1 << fontrow) ? 255 : 0);
49
50        output_pos += 7;
51        colpos++;
52    }
53}
54
55static void plot (const int x, const int y, unsigned char *image, const int pitch)
56{
57    image [x+y*pitch] ^= 255;
58}
59
60/* Bresenham line algorithm */
61void vp8_blit_line(int x0, int x1, int y0, int y1, unsigned char *image, const int pitch)
62{
63    int steep = abs(y1 - y0) > abs(x1 - x0);
64    int deltax, deltay;
65    int error, ystep, y, x;
66
67    if (steep)
68    {
69        int t;
70        t = x0;
71        x0 = y0;
72        y0 = t;
73
74        t = x1;
75        x1 = y1;
76        y1 = t;
77    }
78
79    if (x0 > x1)
80    {
81        int t;
82        t = x0;
83        x0 = x1;
84        x1 = t;
85
86        t = y0;
87        y0 = y1;
88        y1 = t;
89    }
90
91    deltax = x1 - x0;
92    deltay = abs(y1 - y0);
93    error  = deltax / 2;
94
95    y = y0;
96
97    if (y0 < y1)
98        ystep = 1;
99    else
100        ystep = -1;
101
102    if (steep)
103    {
104        for (x = x0; x <= x1; x++)
105        {
106            plot(y,x, image, pitch);
107
108            error = error - deltay;
109            if (error < 0)
110            {
111                y = y + ystep;
112                error = error + deltax;
113            }
114        }
115    }
116    else
117    {
118        for (x = x0; x <= x1; x++)
119        {
120            plot(x,y, image, pitch);
121
122            error = error - deltay;
123            if (error < 0)
124            {
125                y = y + ystep;
126                error = error + deltax;
127            }
128        }
129    }
130}
131