16c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen/* 26c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 36c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * 46c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * Use of this source code is governed by a BSD-style license 56c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * that can be found in the LICENSE file in the root of the source 66c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * tree. An additional intellectual property rights grant can be found 76c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * in the file PATENTS. All contributing project authors may 86c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * be found in the AUTHORS file in the root of the source tree. 96c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen */ 106c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 116c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include <stdlib.h> 126c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 136c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include "vp9/common/vp9_textblit.h" 146c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 156c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatic const int font[] = { 166c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 0x0, 0x5C00, 0x8020, 0xAFABEA, 0xD7EC0, 0x1111111, 0x1855740, 0x18000, 176c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 0x45C0, 0x74400, 0x51140, 0x23880, 0xC4000, 0x21080, 0x80000, 0x111110, 186c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 0xE9D72E, 0x87E40, 0x12AD732, 0xAAD62A, 0x4F94C4, 0x4D6B7, 0x456AA, 196c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 0x3E8423, 0xAAD6AA, 0xAAD6A2, 0x2800, 0x2A00, 0x8A880, 0x52940, 0x22A20, 206c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 0x15422, 0x6AD62E, 0x1E4A53E, 0xAAD6BF, 0x8C62E, 0xE8C63F, 0x118D6BF, 216c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 0x1094BF, 0xCAC62E, 0x1F2109F, 0x118FE31, 0xF8C628, 0x8A89F, 0x108421F, 226c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 0x1F1105F, 0x1F4105F, 0xE8C62E, 0x2294BF, 0x164C62E, 0x12694BF, 0x8AD6A2, 236c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 0x10FC21, 0x1F8421F, 0x744107, 0xF8220F, 0x1151151, 0x117041, 0x119D731, 246c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 0x47E0, 0x1041041, 0xFC400, 0x10440, 0x1084210, 0x820 256c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}; 266c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 276c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatic void plot(int x, int y, unsigned char *image, int pitch) { 286c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen image[x + y * pitch] ^= 255; 296c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 306c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 316c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenvoid vp9_blit_text(const char *msg, unsigned char *address, const int pitch) { 326c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int letter_bitmap; 336c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen unsigned char *output_pos = address; 346c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int colpos = 0; 356c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 366c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen while (msg[colpos] != 0) { 376c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen char letter = msg[colpos]; 386c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int fontcol, fontrow; 396c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 406c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen if (letter <= 'Z' && letter >= ' ') 416c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen letter_bitmap = font[letter - ' ']; 426c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen else if (letter <= 'z' && letter >= 'a') 436c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen letter_bitmap = font[letter - 'a' + 'A' - ' ']; 446c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen else 456c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen letter_bitmap = font[0]; 466c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 476c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen for (fontcol = 6; fontcol >= 0; fontcol--) 486c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen for (fontrow = 0; fontrow < 5; fontrow++) 496c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen output_pos[fontrow * pitch + fontcol] = 506c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen ((letter_bitmap >> (fontcol * 5)) & (1 << fontrow) ? 255 : 0); 516c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 526c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen output_pos += 7; 536c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen colpos++; 546c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 556c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 566c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 576c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 586c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 596c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen/* Bresenham line algorithm */ 606c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenvoid vp9_blit_line(int x0, int x1, int y0, int y1, unsigned char *image, 616c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int pitch) { 626c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int steep = abs(y1 - y0) > abs(x1 - x0); 636c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int deltax, deltay; 646c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int error, ystep, y, x; 656c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 666c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen if (steep) { 676c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int t; 686c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen t = x0; 696c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen x0 = y0; 706c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen y0 = t; 716c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 726c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen t = x1; 736c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen x1 = y1; 746c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen y1 = t; 756c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 766c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 776c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen if (x0 > x1) { 786c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int t; 796c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen t = x0; 806c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen x0 = x1; 816c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen x1 = t; 826c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 836c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen t = y0; 846c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen y0 = y1; 856c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen y1 = t; 866c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 876c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 886c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen deltax = x1 - x0; 896c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen deltay = abs(y1 - y0); 906c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen error = deltax / 2; 916c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 926c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen y = y0; 936c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 946c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen if (y0 < y1) 956c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen ystep = 1; 966c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen else 976c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen ystep = -1; 986c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 996c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen if (steep) { 1006c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen for (x = x0; x <= x1; x++) { 1016c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen plot(y, x, image, pitch); 1026c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1036c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen error = error - deltay; 1046c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen if (error < 0) { 1056c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen y = y + ystep; 1066c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen error = error + deltax; 1076c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1086c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1096c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } else { 1106c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen for (x = x0; x <= x1; x++) { 1116c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen plot(x, y, image, pitch); 1126c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1136c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen error = error - deltay; 1146c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen if (error < 0) { 1156c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen y = y + ystep; 1166c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen error = error + deltax; 1176c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1186c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1196c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1206c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 1216c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen