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