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