Ejemplo n.º 1
0
uint32_t lcd_drawchar(uint32_t x, uint32_t y, char c, uint32_t size, uint32_t fgcolor, uint32_t bgcolor, uint32_t clear_bg)
{
  uint32_t ret, i, x0, y0, x1, y1, h, data, mask;
  uint8_t *ptr;

  //size = (size==0)?1:size;

  x1 = x+(FONT_WIDTH*size);
  y1 = y+(FONT_HEIGHT*size);

  if((x1-1) >= width)
  {
    return width+1;
  }
  else if((y1-1) >= height)
  {
    return width+1;
  }
  else if(c < FONT_START)
  {
    return x;
  }
  size--;
  ret = x1;

  lcd_enable();

  ptr = (uint8_t*)&fontdata[(c-FONT_START)*(8*FONT_HEIGHT/8)];
  if(size == 0)
  {
    y0 = y;
    for(h=FONT_HEIGHT; h!=0; h--)
    {
      data = *ptr++;
      x0 = x;
      for(mask=(1<<(FONT_WIDTH-1)); mask!=0; mask>>=1)
      {
        if(data & mask)
        {
          lcd_setarea(x0, y0, x0, y0);
          lcd_drawstart();
          lcd_draw(fgcolor);
          lcd_drawstop();
        }
        else if(clear_bg)
        {
          lcd_setarea(x0, y0, x0, y0);
          lcd_drawstart();
          lcd_draw(bgcolor);
          lcd_drawstop();
        }
        x0++;
      }
      y0++;
    }
  }
Ejemplo n.º 2
0
Archivo: lcd.c Proyecto: horazont/hint
inline void lcd_setpixel(const uint16_t x0, const uint16_t y0,
                         const colour_t colour)
{
    lcd_setarea(x0, y0, x0, y0);
    lcd_drawstart();
    lcd_draw(colour);
    lcd_drawstop();
}
Ejemplo n.º 3
0
uint32_t lcd_setbias(uint32_t o)
{
  uint32_t param, w, h;

  #define MEM_Y   (7) //MY row address order
  #define MEM_X   (6) //MX column address order 
  #define MEM_V   (5) //MV row / column exchange 
  #define MEM_L   (4) //ML vertical refresh order
  #define MEM_H   (2) //MH horizontal refresh order
  #define MEM_BGR (3) //RGB-BGR Order 

  switch(o)
  {
    default:
    case 0:
    //case 36:
    //case 360:
      w     = LCD_WIDTH;
      h     = LCD_HEIGHT;
      param = (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y);
      break;
    case 9:
    case 90:
      w     = LCD_HEIGHT;
      h     = LCD_WIDTH;
      param = (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_V);
      break;
    case 18:
    case 180:
      w     = LCD_WIDTH;
      h     = LCD_HEIGHT;
      param = (1<<MEM_BGR) | (1<<MEM_L);
      break;
    case 27:
    case 270:
    case 14: //270&0xFF
      w     = LCD_HEIGHT;
      h     = LCD_WIDTH;
      param = (1<<MEM_BGR) | (1<<MEM_Y) | (1<<MEM_V);
      break;
  }

  lcd_enable();

  lcd_wrcmd8(LCD_CMD_MEMACCESS_CTRL);
  lcd_wrdata8(param);

  lcd_setarea(0, 0, w-1, h-1);

  lcd_disable();

  return (w<<16) | (h<<0);
}
Ejemplo n.º 4
0
void cmd_lcd_drawimage(uint_least16_t fgcolor, uint_least16_t bgcolor)
{
  uint_least8_t b, c, e, n;
  uint_least16_t a, x0, y0, x1, y1, w, h;
  uint_least32_t i, ms;

  x0 = if_read(); //x0
  y0 = if_read(); //y0
  w  = if_read(); //w
  h  = if_read(); //h
  x1 = x0+w-1;
  y1 = y0+h-1;
  c  = if_read8(); //color mode + encoding
  e  = c & COLOR_RLE;
  c  = c & ~COLOR_RLE;

  lcd_enable();
  lcd_setarea(x0, y0, x1, y1);
  lcd_drawstart();

  switch(c)
  {
    case COLOR_BW: //black/white
      fgcolor = RGB(0,0,0);
      bgcolor = RGB(255,255,255);
      break;
    case COLOR_WB: //white/black
      fgcolor = RGB(255,255,255);
      bgcolor = RGB(0,0,0);
      break;
    case COLOR_FG: //fg/bg
      fgcolor = fgcolor;
      bgcolor = bgcolor;
      break;
    case COLOR_BG: //bg/fg
      fgcolor ^= bgcolor;
      bgcolor ^= fgcolor;
      fgcolor ^= bgcolor;
      break;
  }

  ms = get_ms();
  if(e == 0) //no encoding
  {
    switch(c)
    {
      case COLOR_BW: //black/white
      case COLOR_WB: //white/black
      case COLOR_FG: //fg/bg
      case COLOR_BG: //bg/fg
        for(i=w*h; i!=0;)
        {
          if(if_available())
          {
            a = if_read8();
            for(b=0x80; (b!=0) && (i!=0); b>>=1)
            {
              if(a & b) { lcd_draw(fgcolor); }
              else      { lcd_draw(bgcolor); }
              i--;
            }
          }
          else if((get_ms()-ms) > 2000) //2s
          {
            break;
          }
        }
        break;
      case COLOR_RGB323:
      case COLOR_RGB332:
      case COLOR_RGB233:
      case COLOR_GRAY:
        for(i=w*h; i!=0;)
        {
          if(if_available())
          {
            a = if_read8();
                 if(c == COLOR_RGB323){ a = RGB323toRGB565(a); }
            else if(c == COLOR_RGB332){ a = RGB332toRGB565(a); }
            else if(c == COLOR_RGB233){ a = RGB233toRGB565(a); }
            else                      { a = GRAYtoRGB565(a);   }
            lcd_draw(a);
            i--;
          }
          else if((get_ms()-ms) > 2000) //2s
          {
            break;
          }
        }
        break;
      default:
      case COLOR_RGB565:
        for(i=w*h; i!=0;)
        {
          if(if_available())
          {
            a = if_read16();
            lcd_draw(a);
            i--;
          }
          else if((get_ms()-ms) > 2000) //2s
          {
            break;
          }
        }
        break;
      case COLOR_RGB888:
        for(i=w*h; i!=0;)
        {
          if(if_available())
          {
            a  = (if_read8()&0xF8)<<8; //R (5 bits)
            a |= (if_read8()&0xFC)<<3; //G (6 bits)
            a |= (if_read8()&0xF8)>>3; //B (5 bits)
            lcd_draw(a);
            i--;
          }
          else if((get_ms()-ms) > 2000) //2s
          {
            break;
          }
        }
        break;
    }