shithub: libvpx

ref: 3a98508775b1cf3c6b4dea3af45e1f1bf5e31549
dir: /vp9/common/vp9_textblit.c/

View raw version
/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <stdlib.h>

#include "vp9/common/vp9_textblit.h"

static const int font[] = {
  0x0,       0x5C00,    0x8020,    0xAFABEA,  0xD7EC0,   0x1111111, 0x1855740,
  0x18000,   0x45C0,    0x74400,   0x51140,   0x23880,   0xC4000,   0x21080,
  0x80000,   0x111110,  0xE9D72E,  0x87E40,   0x12AD732, 0xAAD62A,  0x4F94C4,
  0x4D6B7,   0x456AA,   0x3E8423,  0xAAD6AA,  0xAAD6A2,  0x2800,    0x2A00,
  0x8A880,   0x52940,   0x22A20,   0x15422,   0x6AD62E,  0x1E4A53E, 0xAAD6BF,
  0x8C62E,   0xE8C63F,  0x118D6BF, 0x1094BF,  0xCAC62E,  0x1F2109F, 0x118FE31,
  0xF8C628,  0x8A89F,   0x108421F, 0x1F1105F, 0x1F4105F, 0xE8C62E,  0x2294BF,
  0x164C62E, 0x12694BF, 0x8AD6A2,  0x10FC21,  0x1F8421F, 0x744107,  0xF8220F,
  0x1151151, 0x117041,  0x119D731, 0x47E0,    0x1041041, 0xFC400,   0x10440,
  0x1084210, 0x820
};

static void plot(int x, int y, unsigned char *image, int pitch) {
  image[x + y * pitch] ^= 255;
}

void vp9_blit_text(const char *msg, unsigned char *address, const int pitch) {
  int letter_bitmap;
  unsigned char *output_pos = address;
  int colpos = 0;

  while (msg[colpos] != 0) {
    char letter = msg[colpos];
    int fontcol, fontrow;

    if (letter <= 'Z' && letter >= ' ')
      letter_bitmap = font[letter - ' '];
    else if (letter <= 'z' && letter >= 'a')
      letter_bitmap = font[letter - 'a' + 'A' - ' '];
    else
      letter_bitmap = font[0];

    for (fontcol = 6; fontcol >= 0; fontcol--)
      for (fontrow = 0; fontrow < 5; fontrow++)
        output_pos[fontrow * pitch + fontcol] =
            ((letter_bitmap >> (fontcol * 5)) & (1 << fontrow) ? 255 : 0);

    output_pos += 7;
    colpos++;
  }
}

/* Bresenham line algorithm */
void vp9_blit_line(int x0, int x1, int y0, int y1, unsigned char *image,
                   int pitch) {
  int steep = abs(y1 - y0) > abs(x1 - x0);
  int deltax, deltay;
  int error, ystep, y, x;

  if (steep) {
    int t;
    t = x0;
    x0 = y0;
    y0 = t;

    t = x1;
    x1 = y1;
    y1 = t;
  }

  if (x0 > x1) {
    int t;
    t = x0;
    x0 = x1;
    x1 = t;

    t = y0;
    y0 = y1;
    y1 = t;
  }

  deltax = x1 - x0;
  deltay = abs(y1 - y0);
  error = deltax / 2;

  y = y0;

  if (y0 < y1)
    ystep = 1;
  else
    ystep = -1;

  if (steep) {
    for (x = x0; x <= x1; x++) {
      plot(y, x, image, pitch);

      error = error - deltay;
      if (error < 0) {
        y = y + ystep;
        error = error + deltax;
      }
    }
  } else {
    for (x = x0; x <= x1; x++) {
      plot(x, y, image, pitch);

      error = error - deltay;
      if (error < 0) {
        y = y + ystep;
        error = error + deltax;
      }
    }
  }
}