//programa: ugraf.c
//descripcion: utilerias graficas para usar
//autor: victor reyes
//fecha: mayo/2002
/*comentarios: este programa no se debe ejecutar, ya que son utilerias
	       y estas no tienen un programa principal (main).
	       para aplicarlas debe crear otro programa en el cual
	       la sentencia include debe ser escrita asi:
		#include "ugraf.c" */

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <graphics.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <dos.h>

#define RAD 3.1415926535/180

struct pto {
 int c;
 int x;
 int y;
};

/* Prototipos de las funciones definidas */

void fondo(int x,int y,int tx,int ty,int ce,int cs,int cf);
void fondox(int x,int y,int fx,int fy,int ce,int ci,int cf);
void inigraf(),fingraf();
void marco(int x,int y,int tx,int ty,int c,int tip);
void letra(int x,int y,char car,int tam,int col);
void db(char car,int d);
void lt(int x,int y,char car,int t,int c);
void greca(int x,int y,int nx,int ny,int t,int c);
void gre(int x,int y,int e);
void l3d(int x,int y,char car,int t,int c,int r,int f);
void poli(int x,int y,int n,int l,int c,int f);
void star(int x,int y,int n,int l,int r,int c,int f);
void borra(int num);
void dibuja();
void boton(int xi,int yi,int tam,char *cad,int tipo,int cod,int fon);
void cont(float fact,float alt,float anch,int xi,int yi);
void colt(int c1,int c2,float anch,float fact,float alt,char *cad,
	  int xi,int yi);
void coparr(int fig[],int fig2[]);
void posarr(int n,int fig2[],int x,int y);
void escarr(int n,int fig2[],float esc);
void fondoy(int xi,int yi,int tx,int ty,int col);

/* Definicion de cada una de las utilerias en cada funcion */

void poli(int x,int y,int n,int l,int c,int f)
{
 double ang;
 int k;
 setcolor(c);
 ang=0;
 moveto(x+cos(ang*RAD)*l,y-sin(ang*RAD)*l);
 for(k=1;k<n;k++)
 {
  ang+=360/n;
  lineto(x+cos(ang*RAD)*l,y-sin(ang*RAD)*l);
 }
 lineto(x+cos(0*RAD)*l,y-sin(0*RAD)*l);
 setfillstyle(1,f);
 floodfill(x,y,c);
}

void star(int x,int y,int n,int l,int r,int c,int f)
{
 float ang;
 int k;
 setcolor(c);
 ang=0;
 moveto(x+cos(ang*RAD)*l,y-sin(ang*RAD)*l);
 for(k=1;k<=n;k++)
 {
  if(ang!=0)
  {
   ang+=180/n;
   lineto(x+cos(ang*RAD)*l,y-sin(ang*RAD)*l);
  }
  ang+=180/n;
  lineto(x+cos(ang*RAD)*r,y-sin(ang*RAD)*r);
 }
 lineto(x+cos(0*RAD)*l,y-sin(0*RAD)*l);
 setfillstyle(1,f);
 floodfill(x,y,c);
}

void letra(int x,int y,char car,int tam,int col)
{
 setcolor(col);
 switch(tolower(car))
 {
  case 'a':
   moveto(x,y);
   lineto(x+tam,y);
   lineto(x+tam,y+tam*2);
   lineto(x+tam-tam/5,y+tam*2);
   lineto(x+tam-tam/5,y+tam*2-tam);
   lineto(x+tam/5,y+tam*2-tam);
   lineto(x+tam/5,y+tam*2);
   lineto(x,y+tam*2);
   lineto(x,y);
   rectangle(x+tam/5,y+tam/5,x+tam-tam/5,y+tam-tam/5);
   moveto(x+tam,y);
   lineto(x+tam+tam/10,y+tam/10);
   lineto(x+tam+tam/10,y+tam*2+tam/10);
   lineto(x+tam+tam/10-tam/5,y+tam*2+tam/10);
   lineto(x+tam-tam/5,y+tam*2);
   moveto(x+tam+tam/10,y+tam*2+tam/10);
   lineto(x+tam,y+tam*2);
   moveto(x+tam/5,y+tam/5);
   lineto(x+tam/5+tam/10,y+tam/5+tam/10);
   lineto(x+tam-tam/5,y+tam/5+tam/10);
   moveto(x+tam/5+tam/10,y+tam/5+tam/10);
   lineto(x+tam/5+tam/10,y+tam-tam/5);
   moveto(x+tam/5,y+tam);
   lineto(x+tam/5+tam/10,y+tam+tam/10);
   lineto(x+tam-tam/5,y+tam+tam/10);
   moveto(x+tam/5+tam/10,y+tam+tam/10);
   lineto(x+tam/5+tam/10,y+tam*2+tam/10);
   lineto(x+tam/10,y+tam*2+tam/10);
   lineto(x,y+tam*2);
   moveto(x+tam/5+tam/10,y+tam*2+tam/10);
   lineto(x+tam/5,y+tam*2);
   setfillstyle(1,col);
   floodfill(x+1,y+1,col);
   setfillstyle(1,7);
   floodfill(x+tam+1,y+tam/10+1,col);
   floodfill(x+tam-1,y+tam*2+1,col);
   floodfill(x+tam/5+1,y+tam/5+2,col);
   floodfill(x+tam/5+2,y+tam/5+1,col);
   floodfill(x+tam/5+1,y+tam+2,col);
   floodfill(x+tam/5+2,y+tam+1,col);
   floodfill(x+2,y+tam*2+1,col);
   break;
 }
}

void lt(int x,int y,char car,int t,int c)
{
 moveto(x,y);
 setcolor(c);
 switch(tolower(car))
 {
  case 'a':
   db('h',t*5);
   db('v',t*10);
   db('h',-t);
   db('v',-t*5);
   db('h',-t*3);
   db('v',t*5);
   db('h',-t);
   db('v',-t*10);
   db('x',t);
   db('y',t);
   db('h',t*3);
   db('v',t*3);
   db('h',-t*3);
   db('v',-t*3);
   db('d',t/2);
   db('h',t*3-t/2);
   db('x',-(t*3-t/2));
   db('v',t*3-t/2);
   db('y',t+t/2);
   db('d',-t/2);
   db('x',t/2);
   db('y',t/2);
   db('h',t*3-t/2);
   db('x',-(t*3-t/2));
   db('v',t*5);
   db('d',-t/2);
   db('x',t/2);
   db('y',t/2);
   db('h',-t);
   db('d',-t/2);
   db('x',t*5-t);
   db('d',t/2);
   db('h',t);
   db('d',-t/2);
   db('x',t/2);
   db('y',t/2);
   db('v',-t*10);
   db('d',-t/2);
   setfillstyle(1,c);
   floodfill(x+1,y+1,c);
   setfillstyle(1,7);
   floodfill(x+t+1,y+t+2,c);
   floodfill(x+t+2,y+t+1,c);
   floodfill(x+t*5+1,y+2,c);
   floodfill(x+t+1,y+t*5+2,c);
   floodfill(x+t+2,y+t*5+1,c);
   floodfill(x+2,y+t*10+1,c);
   floodfill(x+t*5+1,y+t*10+2,c);
   break;
 }
}

void l3d(int x,int y,char car,int t,int c,int r,int f)
{
 int k,i;
 i=7;
 if((car>='a' && car<='z') || car=='¤') i=4;
 for(k=1;k<i;k++)
 {
  moveto(x-k,y-k);
  setcolor(f);
  if(k==(i-1)) setcolor(c);
  switch(car)
  {
   case 'A':
    db('h',t*5);
    db('v',t*10);
    db('h',-t);
    db('v',-t*5);
    db('h',-t*3);
    db('v',t*5);
    db('h',-t);
    db('v',-t*10);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*3);
    db('h',-t*3);
    db('v',-t*3);
    break;
   case 'B':
    db('h',t*4);
    db('d',t);
    db('v',t*3);
    db('c',-t);
    db('d',t);
    db('v',t*3);
    db('c',-t);
    db('h',-t*4);
    db('v',-t*10);
    db('x',t);
    db('y',t);
    db('h',t*2);
    db('d',t);
    db('v',t);
    db('c',-t);
    db('h',-t*2);
    db('v',-t*3);
    db('y',t*5);
    db('h',t*2);
    db('d',t);
    db('v',t);
    db('c',-t);
    db('h',-t*2);
    db('v',-t*3);
    break;
   case 'C':
    db('h',t*5);
    db('v',t);
    db('h',-t*4);
    db('v',t*8);
    db('h',t*4);
    db('v',t);
    db('h',-t*5);
    db('v',-t*10);
    break;
   case 'D':
    db('h',t*4);
    db('d',t);
    db('v',t*8);
    db('c',-t);
    db('h',-t*4);
    db('v',-t*10);
    db('x',t);
    db('y',t);
    db('h',t*2);
    db('d',t);
    db('v',t*6);
    db('c',-t);
    db('h',-t*2);
    db('v',-t*8);
    break;
   case 'E':
    db('h',t*5);
    db('v',t);
    db('h',-t*4);
    db('v',t*3);
    db('h',t*4);
    db('v',t);
    db('h',-t*4);
    db('v',t*4);
    db('h',t*4);
    db('v',t);
    db('h',-t*5);
    db('v',-t*10);
    break;
   case 'F':
    db('h',t*5);
    db('v',t);
    db('h',-t*4);
    db('v',t*3);
    db('h',t*4);
    db('v',t);
    db('h',-t*4);
    db('v',t*5);
    db('h',-t);
    db('v',-t*10);
    break;
   case 'G':
    db('h',t*5);
    db('v',t);
    db('h',-t*4);
    db('v',t*8);
    db('h',t*3);
    db('v',-t*4);
    db('h',-t*2);
    db('v',-t);
    db('h',t*3);
    db('v',t*6);
    db('h',-t*5);
    db('v',-t*10);
    break;
   case 'H':
    db('h',t);
    db('v',t*4);
    db('h',t*3);
    db('v',-t*4);
    db('h',t);
    db('v',t*10);
    db('h',-t);
    db('v',-t*5);
    db('h',-t*3);
    db('v',t*5);
    db('h',-t);
    db('v',-t*10);
    break;
   case 'I':
    db('h',t);
    db('v',t*10);
    db('h',-t);
    db('v',-t*10);
    break;
   case 'J':
    db('x',t*4);
    db('h',t);
    db('v',t*10);
    db('h',-t*5);
    db('v',-t*2);
    db('h',t);
    db('v',t);
    db('h',t*3);
    db('v',-t*9);
    break;
   case 'K':
    db('h',t);
    db('v',t*3);
    db('c',t*3);
    db('h',t);
    db('v',t);
    db('c',-t*4);
    db('d',t*4);
    db('v',t);
    db('h',-t);
    db('d',-t*3);
    db('v',t*3);
    db('h',-t);
    db('v',-t*10);
    break;
   case 'L':
    db('h',t);
    db('v',t*9);
    db('h',t*4);
    db('v',t);
    db('h',-t*5);
    db('v',-t*10);
    break;
   case 'M':
    db('h',t);
    db('d',t);
    db('h',t);
    db('c',t);
    db('h',t);
    db('v',t*10);
    db('h',-t);
    db('v',-t*8);
    db('c',-t);
    db('h',-t);
    db('d',-t);
    db('v',t*8);
    db('h',-t);
    db('v',-t*10);
    break;
   case 'N':
    db('h',t);
    db('d',t*3);
    db('v',-t*3);
    db('h',t);
    db('v',t*10);
    db('h',-t);
    db('v',-t*5);
    db('d',-t*3);
    db('v',t*8);
    db('h',-t);
    db('v',-t*10);
    break;
   case '¥':
    db('h',t*5);
    db('v',t);
    db('h',-t*5);
    db('v',-t);
    db('y',t*2);
    db('h',t);
    db('d',t*3);
    db('v',-t*3);
    db('h',t);
    db('v',t*8);
    db('h',-t);
    db('v',-t*4);
    db('d',-t*3);
    db('v',t*7);
    db('h',-t);
    db('v',-t*8);
    break;
   case 'O':
    db('h',t*5);
    db('v',t*10);
    db('h',-t*5);
    db('v',-t*10);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*8);
    db('h',-t*3);
    db('v',-t*8);
    break;
   case 'P':
    db('h',t*5);
    db('v',t*5);
    db('h',-t*4);
    db('v',t*5);
    db('h',-t);
    db('v',-t*10);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*3);
    db('h',-t*3);
    db('v',-t*3);
    break;
   case 'Q':
    db('h',t*5);
    db('v',t*7);
    db('d',t*2);
    db('c',-t);
    db('d',-t);
    db('v',t);
    db('h',-t*5);
    db('v',-t*10);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*8);
    db('h',-t*3);
    db('v',-t*8);
    break;
   case 'R':
    db('h',t*5);
    db('v',t*5);
    db('h',-t*2);
    db('d',t*2);
    db('v',t*3);
    db('h',-t);
    db('v',-t*2);
    db('d',-t*3);
    db('v',t*5);
    db('h',-t);
    db('v',-t*10);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*3);
    db('h',-t*3);
    db('v',-t*3);
    break;
   case 'S':
    db('h',t*5);
    db('v',t);
    db('h',-t*4);
    db('v',t*3);
    db('h',t*4);
    db('v',t*6);
    db('h',-t*5);
    db('v',-t);
    db('h',t*4);
    db('v',-t*4);
    db('h',-t*4);
    db('v',-t*5);
    break;
   case 'T':
    db('h',t*5);
    db('v',t);
    db('h',-t*2);
    db('v',t*9);
    db('h',-t);
    db('v',-t*9);
    db('h',-t*2);
    db('v',-t);
    break;
   case 'U':
    db('h',t);
    db('v',t*9);
    db('h',t*3);
    db('v',-t*9);
    db('h',t);
    db('v',t*10);
    db('h',-t*5);
    db('v',-t*10);
    break;
   case 'V':
    db('h',t);
    db('v',t*8);
    db('d',t);
    db('h',t);
    db('c',t);
    db('v',-t*8);
    db('h',t);
    db('v',t*9);
    db('c',-t);
    db('h',-t*3);
    db('d',-t);
    db('v',-t*9);
    break;
   case 'W':
    db('h',t);
    db('v',t*7);
    db('d',t);
    db('c',t);
    db('d',t);
    db('c',t);
    db('v',-t*7);
    db('h',t);
    db('v',t*8);
    db('c',-t*2);
    db('d',-t);
    db('c',-t);
    db('d',-t*2);
    db('v',-t*8);
    break;
   case 'X':
    db('h',t);
    db('v',t*2);
    db('d',t);
    db('h',t);
    db('c',t);
    db('v',-t*2);
    db('h',t);
    db('v',t*3);
    db('c',-t*2);
    db('d',t*2);
    db('v',t*3);
    db('h',-t);
    db('v',-t*2);
    db('d',-t);
    db('h',-t);
    db('c',-t);
    db('v',t*2);
    db('h',-t);
    db('v',-t*3);
    db('c',t*2);
    db('d',-t*2);
    db('v',-t*3);
    break;
   case 'Y':
    db('h',t);
    db('v',t*2);
    db('d',t);
    db('h',t);
    db('c',t);
    db('v',-t*2);
    db('h',t);
    db('v',t*3);
    db('c',-t*2);
    db('v',t*5);
    db('h',-t);
    db('v',-t*5);
    db('d',-t*2);
    db('v',-t*3);
    break;
   case 'Z':
    db('h',t*5);
    db('v',t*3);
    db('c',-t*4);
    db('v',t*2);
    db('h',t*4);
    db('v',t);
    db('h',-t*5);
    db('v',-t*4);
    db('c',t*4);
    db('v',-t);
    db('h',-t*4);
    db('v',-t);
    break;
   case '1':
    db('x',t);
    db('h',t);
    db('v',t*9);
    db('h',t);
    db('v',t);
    db('h',-t*3);
    db('v',-t);
    db('h',t);
    db('v',-t*7);
    db('h',-t);
    db('v',-t);
    db('c',t);
    break;
   case '2':
    db('h',t*5);
    db('v',t*5);
    db('c',-t*4);
    db('h',t*4);
    db('v',t);
    db('h',-t*5);
    db('v',-t*2);
    db('c',t*4);
    db('v',-t*3);
    db('h',-t*4);
    db('v',-t);
    break;
   case '3':
    db('h',t*5);
    db('v',t*10);
    db('h',-t*5);
    db('v',-t);
    db('h',t*4);
    db('v',-t*4);
    db('h',-t*3);
    db('v',-t);
    db('h',t*3);
    db('v',-t*3);
    db('h',-t*4);
    db('v',-t);
    break;
   case '4':
    db('h',t);
    db('v',t*4);
    db('h',t*3);
    db('v',-t*4);
    db('h',t);
    db('v',t*10);
    db('h',-t);
    db('v',-t*5);
    db('h',-t*4);
    db('v',-t*5);
    break;
   case '5':
    db('h',t*5);
    db('v',t);
    db('h',-t*4);
    db('v',t*3);
    db('h',t*4);
    db('v',t*6);
    db('h',-t*5);
    db('v',-t);
    db('h',t*4);
    db('v',-t*4);
    db('h',-t*4);
    db('v',-t*5);
    break;
   case '6':
    db('h',t);
    db('v',t*4);
    db('h',t*4);
    db('v',t*6);
    db('h',-t*5);
    db('v',-t*10);
    db('x',t);
    db('y',t*5);
    db('h',t*3);
    db('v',t*4);
    db('h',-t*3);
    db('v',-t*4);
    break;
   case '7':
    db('h',t*5);
    db('v',t*10);
    db('h',-t);
    db('v',-t*9);
    db('h',-t*4);
    db('v',-t);
    break;
   case '8':
    db('h',t*5);
    db('v',t*10);
    db('h',-t*5);
    db('v',-t*10);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*3);
    db('h',-t*3);
    db('v',-t*3);
    db('y',t*4);
    db('h',t*3);
    db('v',t*4);
    db('h',-t*3);
    db('v',-t*4);
    break;
   case '9':
    db('h',t*5);
    db('v',t*10);
    db('h',-t);
    db('v',-t*5);
    db('h',-t*4);
    db('v',-t*5);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*3);
    db('h',-t*3);
    db('v',-t*3);
    break;
   case 'a':
    db('y',t*4);
    db('h',t*5);
    db('v',t*6);
    db('h',-t*5);
    db('v',-t*4);
    db('h',t*4);
    db('v',-t);
    db('h',-t*4);
    db('v',-t);
    db('x',t);
    db('y',t*3);
    db('h',t*3);
    db('v',t*2);
    db('h',-t*3);
    db('v',-t*2);
    break;
   case 'b':
    db('h',t);
    db('v',t*4);
    db('h',t*4);
    db('v',t*6);
    db('h',-t*5);
    db('v',-t*10);
    db('x',t);
    db('y',t*5);
    db('h',t*3);
    db('v',t*4);
    db('h',-t*3);
    db('v',-t*4);
    break;
   case 'c':
    db('y',t*4);
    db('h',t*5);
    db('v',t);
    db('h',-t*4);
    db('v',t*4);
    db('h',t*4);
    db('v',t);
    db('h',-t*5);
    db('v',-t*6);
    break;
   case 'd':
    db('y',t*4);
    db('h',t*4);
    db('v',-t*4);
    db('h',t);
    db('v',t*10);
    db('h',-t*5);
    db('v',-t*6);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*4);
    db('h',-t*3);
    db('v',-t*4);
    break;
   case 'e':
    db('y',t*4);
    db('h',t*5);
    db('v',t*4);
    db('h',-t*4);
    db('v',t);
    db('h',t*4);
    db('v',t);
    db('h',-t*5);
    db('v',-t*6);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*2);
    db('h',-t*3);
    db('v',-t*2);
    break;
   case 'f':
    db('h',t*3);
    db('v',t);
    db('h',-t*2);
    db('v',t*3);
    db('h',t*2);
    db('v',t);
    db('h',-t*2);
    db('v',t*5);
    db('h',-t);
    db('v',-t*10);
    break;
   case 'g':
    db('y',t*4);
    db('h',t*5);
    db('v',t*8);
    db('h',-t*5);
    db('v',-t);
    db('h',t*4);
    db('v',-t);
    db('h',-t*4);
    db('v',-t*6);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*4);
    db('h',-t*3);
    db('v',-t*4);
    break;
   case 'h':
    db('h',t);
    db('v',t*4);
    db('h',t*4);
    db('v',t*6);
    db('h',-t);
    db('v',-t*5);
    db('h',-t*3);
    db('v',t*5);
    db('h',-t);
    db('v',-t*10);
    break;
   case 'i':
    db('y',t*2);
    db('h',t);
    db('v',t);
    db('h',-t);
    db('v',-t);
    db('y',t*2);
    db('h',t);
    db('v',t*6);
    db('h',-t);
    db('v',-t*6);
    break;
   case 'j':
    db('y',t*2);
    db('h',t);
    db('v',t);
    db('h',-t);
    db('v',-t);
    db('y',t*2);
    db('h',t);
    db('v',t*8);
    db('h',-t*3);
    db('v',-t);
    db('h',t*2);
    db('v',-t*7);
    break;
   case 'k':
    db('h',t);
    db('v',t*5);
    db('c',t*2);
    db('h',t);
    db('c',-t*3);
    db('d',t*3);
    db('v',t);
    db('h',-t);
    db('d',-t*2);
    db('v',t*2);
    db('h',-t);
    db('v',-t*10);
    break;
   // la l minuscula es i mayuscula
   case 'm':
    db('y',t*4);
    db('h',t*5);
    db('v',t*6);
    db('h',-t);
    db('v',-t*5);
    db('h',-t);
    db('v',t*5);
    db('h',-t);
    db('v',-t*5);
    db('h',-t);
    db('v',t*5);
    db('h',-t);
    db('v',-t*6);
    break;
   case 'n':
    db('y',t*4);
    db('h',t*5);
    db('v',t*6);
    db('h',-t);
    db('v',-t*5);
    db('h',-t*3);
    db('v',t*5);
    db('h',-t);
    db('v',-t*6);
    break;
   case '¤':
    db('y',t*2);
    db('h',t*5);
    db('v',t);
    db('h',-t*5);
    db('v',-t);
    db('y',t*2);
    db('h',t*5);
    db('v',t*6);
    db('h',-t);
    db('v',-t*5);
    db('h',-t*3);
    db('v',t*5);
    db('h',-t);
    db('v',-t*6);
    break;
   case 'o':
    db('y',t*4);
    db('h',t*5);
    db('v',t*6);
    db('h',-t*5);
    db('v',-t*6);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*4);
    db('h',-t*3);
    db('v',-t*4);
    break;
   case 'p':
    db('y',t*4);
    db('h',t*5);
    db('v',t*6);
    db('h',-t*4);
    db('v',t*2);
    db('h',-t);
    db('v',-t*8);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*4);
    db('h',-t*3);
    db('v',-t*4);
    break;
   case 'q':
    db('y',t*4);
    db('h',t*5);
    db('v',t*8);
    db('h',-t);
    db('v',-t*2);
    db('h',-t*4);
    db('v',-t*6);
    db('x',t);
    db('y',t);
    db('h',t*3);
    db('v',t*4);
    db('h',-t*3);
    db('v',-t*4);
    break;
   case 'r':
    db('y',t*4);
    db('h',t);
    db('v',t*2);
    db('c',t*2);
    db('h',t);
    db('c',-t*3);
    db('v',t*3);
    db('h',-t);
    db('v',-t*6);
    break;
   case 's':
    db('y',t*4);
    db('h',t*5);
    db('v',t);
    db('h',-t*4);
    db('v',t);
    db('h',t*4);
    db('v',t*4);
    db('h',-t*5);
    db('v',-t);
    db('h',t*4);
    db('v',-t*2);
    db('h',-t*4);
    db('v',-t*3);
    break;
   case 't':
    db('x',t);
    db('y',t);
    db('h',t);
    db('v',t*3);
    db('h',t);
    db('v',t);
    db('h',-t);
    db('v',t*5);
    db('h',-t);
    db('v',-t*5);
    db('h',-t);
    db('v',-t);
    db('h',t);
    db('v',-t*3);
    break;
   case 'u':
    db('y',t*4);
    db('h',t);
    db('v',t*5);
    db('h',t*3);
    db('v',-t*5);
    db('h',t);
    db('v',t*6);
    db('h',-t*5);
    db('v',-t*6);
    break;
   case 'v':
    db('y',t*4);
    db('h',t);
    db('v',t*4);
    db('d',t);
    db('h',t);
    db('c',t);
    db('v',-t*4);
    db('h',t);
    db('v',t*4);
    db('c',-t*2);
    db('h',-t);
    db('d',-t*2);
    db('v',-t*4);
    break;
   case 'w':
    db('y',t*4);
    db('h',t);
    db('v',t*3);
    db('d',t);
    db('c',t);
    db('d',t);
    db('c',t);
    db('v',-t*3);
    db('h',t);
    db('v',t*4);
    db('c',-t*2);
    db('d',-t);
    db('c',-t);
    db('d',-t*2);
    db('v',-t*4);
    break;
   case 'x':
    db('y',t*4);
    db('h',t);
    db('v',t);
    db('d',t);
    db('h',t);
    db('c',t);
    db('v',-t);
    db('h',t);
    db('v',t);
    db('c',-t*2);
    db('d',t*2);
    db('v',t);
    db('h',-t);
    db('v',-t);
    db('d',-t);
    db('h',-t);
    db('c',-t);
    db('v',t);
    db('h',-t);
    db('v',-t);
    db('c',t*2);
    db('d',-t*2);
    db('v',-t);
    break;
   case 'y':
    db('y',t*4);
    db('h',t);
    db('v',t*5);
    db('h',t*3);
    db('v',-t*5);
    db('h',t);
    db('v',t*8);
    db('h',-t*5);
    db('v',-t);
    db('h',t*4);
    db('v',-t);
    db('h',-t*4);
    db('v',-t*6);
    break;
   case 'z':
    db('y',t*4);
    db('h',t*5);
    db('v',t);
    db('c',-t*4);
    db('h',t*4);
    db('v',t);
    db('h',-t*5);
    db('v',-t*2);
    db('c',t*3);
    db('h',-t*3);
    db('v',-t);
    break;
  }
 }
 setfillstyle(r,c);
 if(car=='J')
  floodfill(x-(i-1)+1+t*4,y-(i-1)+1,c);
 else
  if(car=='1')
   floodfill(x-(i-1)+1+t,y-(i-1)+1,c);
  else
   if((car>='A' && car<='Z') || (car>='1' && car<='9'))
    floodfill(x-(i-1)+1,y-(i-1)+1,c);
   else
    if((car>='a' && car<='z') || car=='¤')
    {
     floodfill(x-(i-1)+1,y-(i-1)+1+t*4,c);
     if(car=='i' || car=='j' || car=='¤')
      floodfill(x-(i-1)+1,y-(i-1)+1+t*2,c);
    }
    else
    {
     floodfill(x-(i-1)+1,y-(i-1)+1+t*3,c);
     floodfill(x-(i-1)+1,y-(i-1)+1,c);
    }
}

void db(char car,int d)
{
 int x,y;
 x=getx();
 y=gety();
 switch(tolower(car))
 {
  case 'v': 	//vertical
   lineto(x,y+d);
   break;
  case 'd':     //diagonal  \
   lineto(x+d,y+d);
   break;
  case 'h':	//horizontal
   lineto(x+d,y);
   break;
  case 'x':	//mover x
   moverel(d,0);
   break;
  case 'y': 	//mover y
   moverel(0,d);
   break;
  case 'c': 	//diagonal /
   lineto(x+d,y-d);
   break;
 }
}

void greca(int x,int y,int nx,int ny,int t,int c)
{
 int k;
 setcolor(c);
 for(k=0;k<nx;k++)
 {
  gre(x+k*t*6,y,t);
  gre(x+k*t*6,y+ny*t*6,t);
 }
 for(k=0;k<ny;k++)
 {
  gre(x,y+k*t*6,t);
  gre(x+(nx-1)*t*6,y+k*t*6,t);
 }
}

void gre(int x,int y,int e)
{
 moveto(x+e*2,y+e*2);
 setlinestyle(0,0,3);
 db('v',e);
 db('h',e*2);
 db('v',-e*3);
 db('h',-e*4);
 db('v',e*5);
 db('h',e*6);
 setlinestyle(0,0,1);
}

void marco(int x,int y,int tx,int ty,int c,int tip)
{
 float m;
 int d=10;
 setcolor(c);
 setfillstyle(1,c);
 if(tip==0) setlinestyle(0,0,3);
 for(m=0;m<=(tx/d);m++)
 {
  if(tip==0)
  {
   arc(m*d+x,y+d,0,180,d/2);
   arc(m*d+x,y+ty,180,360,d/2);
  }
  else
  {
   circle(m*d+x,y+d,d/2);
   floodfill(m*d+x,y+d,c);
   circle(m*d+x,y+ty,d/2);
   floodfill(m*d+x,y+ty,c);
  }
 }
 for(m=0;m<=(ty/d)-1;m++)
 {
  if(tip==0)
  {
   arc(x,d+y+m*d,90,270,d/2);
   arc(x+tx,d+y+m*d,270,90,d/2);
  }
  else
  {
   circle(x,d+y+m*d,d/2);
   floodfill(x,d+y+m*d,c);
   circle(x+tx,d+y+m*d,d/2);
   floodfill(x+tx,d+y+m*d,c);
  }
 }
 setlinestyle(0,0,1);
}

//x= x inicio, y= y inicio, tx=tama¤o x, ty=tama¤o y
//ce= color externo, cs= color sombra, cf= color fondo
void fondo(int x,int y,int tx,int ty,int ce,int cs,int cf)
{
 setfillstyle(1,ce);
 bar(x,y,x+tx,y+10);
 bar(x,y+ty,x+tx,y+ty+10);
 bar(x,y+11,x+10,y+ty);
 bar(x+tx-10,y+11,x+tx,y+ty);
 setfillstyle(1,cs);
 bar(x+11,y+11,x+tx-11,y+15);
 bar(x+11,y+ty-5,x+tx-11,y+ty);
 bar(x+11,y+11,x+15,y+ty);
 bar(x+tx-15,y+11,x+tx-10,y+ty);
 setfillstyle(1,ce);
 bar(x+15,y+15,x+tx-15,y+25);
 bar(x+15,y+ty-15,x+tx-15,y+ty-5);
 bar(x+15,y+21,x+25,y+ty-10);
 bar(x+tx-25,y+21,x+tx-15,y+ty-10);
 setfillstyle(1,cf);
 bar(x+25,y+25,x+tx-25,y+ty-15);
}

//x= x inicial, y= y inicial, fx= x final, fy= y final
//ce= color externo, ci= color interno, cf= color fondo
void fondox(int x,int y,int fx,int fy,int ce,int ci,int cf)
{
 float fax,xi1,yi1,xf1,yf1,xi2,yi2,xf2,yf2,xi3,yi3,xf3,yf3;
 fax=(fx-x)*0.015;
 xi1=x+fax*0.7;
 yi1=y+fax*0.7;
 xf1=fx-fax*0.7;
 yf1=fy-fax*0.7;
 xi2=x+fax*1.3;
 yi2=y+fax*1.3;
 xf2=fx-fax*1.3;
 yf2=fy-fax*1.3;
 xi3=x+fax*1.8;
 yi3=y+fax*1.8;
 xf3=fx-fax*1.8;
 yf3=fy-fax*1.8;
 setcolor(ce);
 setfillstyle(1,ce);
 bar(x,y,fx,fy);
 setfillstyle(1,ci);
 bar(xi1,yi1,xf1,yf1);
 setfillstyle(1,ce);
 bar(xi2,yi2,xf2,yf2);
 setfillstyle(1,cf);
 bar(xi3,yi3,xf3,yf3);
}


void borra(int num)
{
 int x,n,k,ya;
 struct pto p[65];
 setfillstyle(0,getbkcolor());
 switch(num)
 {
  case 1:	//borra centro hacia afuera vertical
   for(x=0;x<=320;x+=5)
    bar(319-x,0,319+x,479);
   break;
  case 2:	//borra afuera a centro vertical
   for(x=0;x<=320;x+=5)
   {
    bar(639-x,0,639,479);
    bar(0,0,x,479);
   }
   break;
  case 3:	//borra centro hacia afuera horizontal
   for(x=0;x<=240;x+=5)
    bar(0,239-x,639,239+x);
   break;
  case 4:	//borra afuera a centro horizontal
   for(x=0;x<=240;x+=5)
   {
    bar(0,0,639,x);
    bar(0,479-x,639,479);
   }
   break;
  case 5:	//borra persiana vertical
   for(x=0;x<=80;x+=5)
   {
    bar(0,0,x,479);
    bar(80,0,80+x,479);
    bar(160,0,160+x,479);
    bar(240,0,240+x,479);
    bar(320,0,320+x,479);
    bar(400,0,400+x,479);
    bar(480,0,480+x,479);
    bar(560,0,560+x,479);
    bar(640,0,640+x,479);
    delay(80);
   }
   break;
  case 6:	//borra persiana horizontal
   for(x=0;x<=60;x+=5)
   {
    bar(0,0,639,x);
    bar(0,60,639,60+x);
    bar(0,120,639,120+x);
    bar(0,180,639,180+x);
    bar(0,240,639,240+x);
    bar(0,300,639,300+x);
    bar(0,360,639,360+x);
    bar(0,420,639,420+x);
    bar(0,480,639,480+x);
    delay(80);
   }
   break;
  case 7:	//borra rectangulo centro hacia afuera
   for(x=0;x<=240;x+=5)
   {
    bar(320-4*x/3,240-x,320+4*x/3,240+x);
    delay(25);
   }
   break;
  case 8:	//borra rectangulo afuera al centro
   for(x=0;x<=240;x+=5)
   {
    bar(0,0,639,x);
    bar(0,479-x,639,479);
    bar(0,0,4*x/3,479);
    bar(639-4*x/3,0,639,479);
   }
   break;
  case 9: 	//borra cuadro a cuadro
   for(x=1;x<=64;x++) p[x].c=0;
   for(x=1;x<=64;x++)
   {
    do {
     ya=1;
     n=random(64)+1;
     for(k=1;k<=x;k++)
     {
      if(p[k].c==n) ya=0;
     }
    }while(ya!=1);
    p[x].c=n;
    p[x].x=(n-1) / 8;
    p[x].y=(n-1) % 8;
   }
   for(x=1;x<=64;x++)
   {
    bar( p[x].x*80,p[x].y*60,p[x].x*80+80,p[x].y*60+60);
    delay(25);
   }
   break;
 }
}

void dibuja()
{
 int x,y;
 setbkcolor(DARKGRAY);
 for(x=1;x<400;x+=40)
 {
  setfillstyle(random(10)+1,random(7)+9);
  fillellipse(320,240,x,x);
  delay(5);
 }
}

void fondoy(int xi,int yi,int tx,int ty,int col)
{
 int m;
 m=5;
 setfillstyle(1,0);
 bar(xi,yi,xi+tx,yi+ty);
 setcolor(7);
 rectangle(xi,yi,xi+tx,yi+ty);
 rectangle(xi+m,yi+m,xi+tx-m,yi+ty-m);
 line(xi,yi+ty,xi+m,yi+ty-m);
 line(xi+tx-m,yi+m,xi+tx,yi);
 setfillstyle(1,col);
 floodfill(xi+m+1,yi+m+1,7);
 setfillstyle(1,15);
 floodfill(xi+1,yi+1,7);
}

void boton(int xi, int yi, int tam, char *cad, int tipo,int cod,int fon)
{
 float alt, anch;
 float fact;
 int bk;
 settextstyle(tipo,0,tam);
 alt=textheight("H");
 anch=textwidth(cad);
 fact=0.2;
 setcolor(7);
 cont(fact,alt,anch,xi,yi);
 colt(15,8,anch,fact,alt,cad,xi,yi);
 if(cod != 0) while(getch()!=cod);
 setfillstyle(1,fon);
 bar(xi-anch*.7,yi-alt,xi+anch*1.7,yi+2*anch*fact+alt*2);
 setcolor(7);
 cont(fact,alt,anch,xi,yi);
 colt(8,0,anch,fact,alt,cad,xi,yi);
 delay(700);
 setfillstyle(1,fon);
 bar(xi-anch*.7,yi-alt,xi+anch*1.7,yi+2*anch*fact+alt*2);
 setcolor(7);
 cont(fact,alt,anch,xi,yi);
 colt(15,8,anch,fact,alt,cad,xi,yi);
 delay(700);
}

void colt(int c1,int c2,float anch,float fact,float alt,char *cad,
	  int xi,int yi)
{
 setfillstyle(1,7);
 floodfill(xi+2,yi+2,7);
 setfillstyle(1,c1);
 floodfill(xi-2,yi-2,7);
 setfillstyle(1,c2);
 floodfill(xi,yi+2*anch*fact+alt+2,7);
 setfillstyle(1,c1);
 floodfill(xi-2,yi+2*anch*fact+alt,7);
 setfillstyle(1,c1);
 floodfill(xi+anch+2,yi,7);
 setcolor(0);
 outtextxy(xi,yi+anch*0.15,cad);
}

void cont(float fact,float alt,float anch,int xi,int yi)
{
  int fig[18],fig2[18];
  fig[0]=xi; fig[1]=yi;
  fig[2]=(xi+anch); fig[3]=yi;
  fig[4]=(xi+anch*(1+fact)); fig[5]=(yi+anch*fact);
  fig[6]=(xi+anch*(1+fact)); fig[7]=(yi+anch*fact+alt);
  fig[8]=(xi+anch); fig[9]=(yi+2*anch*fact+alt);
  fig[10]=xi; fig[11]=(yi+2*anch*fact+alt);
  fig[12]=(xi-anch*fact); fig[13]=(yi+anch*fact+alt);
  fig[14]=(xi-anch*fact); fig[15]=(yi+anch*fact);
  fig[16]=fig[0]; fig[17]=fig[1];
  drawpoly(9,fig);
  coparr(fig,fig2);
  posarr(18,fig2,-fig2[0]+anch*fact,-fig2[1]);
  escarr(18,fig2,1.5);
  posarr(18,fig2,fig[0]-anch*.55,fig[1]-anch*fact);
  drawpoly(9,fig2);
  line(fig[12],fig[13],fig2[12],fig2[13]);
  line(fig[4],fig[5],fig2[4],fig2[5]);
  line(fig[2],fig[3],fig2[2],fig2[3]);
  line(fig[10],fig[11],fig2[10],fig2[11]);
}

void coparr(int fig[],int fig2[])
{
 int i;
 for(i=0;i<18;i++) fig2[i]=fig[i];
}

void posarr(int n,int fig2[],int x,int y)
{
 int i;
 for(i=0;i<n;i+=2)
 {
   fig2[i]=fig2[i]+x;
   fig2[i+1]=fig2[i+1]+y;
 }
}

void escarr(int n,int fig2[],float esc)
{
 int i;
 for(i=0;i<n;i+=2)
 {
   fig2[i]=fig2[i]*esc;
   fig2[i+1]=fig2[i+1]*esc;
 }
}

void inigraf()
{
 int ag,mg;
 ag=VGA;
 mg=VGAHI;
 initgraph(&ag,&mg,"c:\\borlandc\\bgi");
}

void fingraf()
{
 closegraph();
}