text.cpp library

Source code of text.cpp library (~/libraries/VGA2/text.cpp)

#include "VGA.h"


void Vga::drawText(char *text, int x, int y, int c, int b, int dir)

{

uint8_t t;

while(t=(uint8_t)*text++){

for(int j=0;j<8;j++)for(int i=0;i<8;i++){

switch(dir){

case -1:

case 0:

if(_vga_font8x8[8*t+j]&(128>>i))drawPixel(x+i,y+j,c);

else if(b!= -256) drawPixel(x+i,y+j,b);

break;

case 1:

if(_vga_font8x8[8*t+j]&(128>>i))drawPixel(x+j,y-i,c);

else if(b!= -256) drawPixel(x+j,y-i,b);

break;

case 2:

if(_vga_font8x8[8*t+j]&(128>>i))drawPixel(x-i,y-j,c);

else if(b!= -256) drawPixel(x-i,y-j,b);

break;

case 3:

if(_vga_font8x8[8*t+j]&(128>>i))drawPixel(x-j,y+i,c);

else if(b!= -256) drawPixel(x-j,y+i,b);

break;

default: break;

}

}

if(dir==0)x+=8;else if(dir==1)y-=8;else if(dir==2)x-=8;else y+=8;

}

}



void Vga::moveCursor(int column, int line)

{

tx=column;if(tx<0)tx=0;if(tx>=tww)tx=tww-1;

ty=line;if(ty<0)ty=0;if(ty>=twh)ty=twh-1;

}


void Vga::setPrintWindow(int left, int top, int width, int height){

if(left<0)left=0;if(left>=tw)left=tw-1;

if(top<0)top=0;if(top>=th)top=th-1;

if(left+width>tw)width=tw-left;

if(top+height>th)height=th-top;

if(width<=0 || height<=0)return;

twx=left;twy=top;tww=width;twh=height;

tx=0;ty=0;

}

void Vga::clearPrintWindow(){

fillRect(twx*8,twy*8,(twx+tww)*8-1,(twy+twh)*8-1,paper);

tx=0;ty=0;

}

void Vga::scrollPrintWindow()

{

if(tww==tw && twh==th){ // fast version where no text window

if(mode == VGA_MONO){

uint16_t *a=pb;

uint16_t *b=a+8*pw;

memmove((uint8_t *)a,(uint8_t *)b,2*pw*(ysize-8));

for(int i=0;i<8;i++)

memset((uint8_t *)(a+pw*(ysize-8+i)),(ink&1)?0:255,2*(pw-2));

}

else if (mode&VGA_COLOUR){

uint8_t *a=cb,*b=cb+8*cw;

memmove(a,b,cw*(ysize-8));

memset(a+cw*(ysize-8),paper,cw*8);

}

}

else scroll(twx*8,twy*8,tww*8,twh*8,0,-8,paper);

tx=0;ty=twh-1;

}


size_t Vga::write(uint8_t c){

if(c==13){tx=0;return(1);}

if(c==10){

tx=0;ty++;

if(ty==twh)scrollPrintWindow();

return 1;

}

if(c==9){write(32);for(int r=1;r<=8;r++)if(tx&7)write(32);else return r;}


if(mode==VGA_MONO){

uint8_t *a=(uint8_t *)pb+(twy+ty)*16*pw+((twx+tx)^1);

for(int j=0;j<8;j++){

*a=_vga_font8x8[8*c+j]^((ink&1)?0:255);

a+=pw*2;

}

}

else if(mode&VGA_COLOUR){

uint8_t *a=(uint8_t *)cb+(twy+ty)*8*cw+(twx+tx)*8;

for(int j=0;j<8;j++){

for(int i=0;i<8;i++){

a[i]=(_vga_font8x8[8*c+j]&(128>>i))?ink:paper;

}

a+=cw;

}

}

tx++;if(tx==tww){

tx=0;ty++;

if(ty==twh)scrollPrintWindow();

}

}


size_t Vga::write(const uint8_t *buffer, size_t size)

{

int rv=0;

for(int i=0;i<size;i++)rv+=write(buffer[i]);

return rv;

}