190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <stdlib.h>
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_blit_text(const char *msg, unsigned char *address, const int pitch)
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int letter_bitmap;
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *output_pos = address;
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int colpos;
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const int font[] =
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        0x0, 0x5C00, 0x8020, 0xAFABEA, 0xD7EC0, 0x1111111, 0x1855740, 0x18000,
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        0x45C0, 0x74400, 0x51140, 0x23880, 0xC4000, 0x21080, 0x80000, 0x111110,
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        0xE9D72E, 0x87E40, 0x12AD732, 0xAAD62A, 0x4F94C4, 0x4D6B7, 0x456AA,
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        0x3E8423, 0xAAD6AA, 0xAAD6A2, 0x2800, 0x2A00, 0x8A880, 0x52940, 0x22A20,
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        0x15422, 0x6AD62E, 0x1E4A53E, 0xAAD6BF, 0x8C62E, 0xE8C63F, 0x118D6BF,
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        0x1094BF, 0xCAC62E, 0x1F2109F, 0x118FE31, 0xF8C628, 0x8A89F, 0x108421F,
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        0x1F1105F, 0x1F4105F, 0xE8C62E, 0x2294BF, 0x164C62E, 0x12694BF, 0x8AD6A2,
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        0x10FC21, 0x1F8421F, 0x744107, 0xF8220F, 0x1151151, 0x117041, 0x119D731,
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        0x47E0, 0x1041041, 0xFC400, 0x10440, 0x1084210, 0x820
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    };
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    colpos = 0;
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    while (msg[colpos] != 0)
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        char letter = msg[colpos];
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int fontcol, fontrow;
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (letter <= 'Z' && letter >= ' ')
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            letter_bitmap = font[letter-' '];
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if (letter <= 'z' && letter >= 'a')
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            letter_bitmap = font[letter-'a'+'A' - ' '];
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            letter_bitmap = font[0];
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (fontcol = 6; fontcol >= 0 ; fontcol--)
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (fontrow = 0; fontrow < 5; fontrow++)
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                output_pos[fontrow *pitch + fontcol] =
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    ((letter_bitmap >> (fontcol * 5)) & (1 << fontrow) ? 255 : 0);
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        output_pos += 7;
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        colpos++;
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
54538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
55538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic void plot (const int x, const int y, unsigned char *image, const int pitch)
56538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
57538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    image [x+y*pitch] ^= 255;
58538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
59538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
60538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Bresenham line algorithm */
61538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid vp8_blit_line(int x0, int x1, int y0, int y1, unsigned char *image, const int pitch)
62538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
63538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int steep = abs(y1 - y0) > abs(x1 - x0);
64538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int deltax, deltay;
65538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int error, ystep, y, x;
66538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
67538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (steep)
68538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
69538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int t;
70538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        t = x0;
71538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        x0 = y0;
72538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y0 = t;
73538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
74538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        t = x1;
75538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        x1 = y1;
76538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y1 = t;
77538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
78538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
79538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (x0 > x1)
80538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
81538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int t;
82538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        t = x0;
83538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        x0 = x1;
84538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        x1 = t;
85538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
86538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        t = y0;
87538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y0 = y1;
88538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        y1 = t;
89538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
90538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
91538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    deltax = x1 - x0;
92538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    deltay = abs(y1 - y0);
93538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    error  = deltax / 2;
94538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
95538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    y = y0;
96538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
97538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (y0 < y1)
98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        ystep = 1;
99538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    else
100538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        ystep = -1;
101538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (steep)
103538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
104538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (x = x0; x <= x1; x++)
105538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        {
106538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            plot(y,x, image, pitch);
107538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
108538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            error = error - deltay;
109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            if (error < 0)
110538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            {
111538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                y = y + ystep;
112538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                error = error + deltax;
113538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            }
114538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
115538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
116538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    else
117538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
118538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (x = x0; x <= x1; x++)
119538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        {
120538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            plot(x,y, image, pitch);
121538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
122538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            error = error - deltay;
123538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            if (error < 0)
124538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            {
125538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                y = y + ystep;
126538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                error = error + deltax;
127538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            }
128538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        }
129538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
130538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
131