/*
 *  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;
      }
    }
  }
}
