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