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