#include<stdio.h>
#include<stdlib.h>  /* exit() */
#include<stdarg.h>
#include<string.h>
#include<math.h>

#include "fig2pdf.h"

/* An ellipse is a circle, with suitable scaling *
 * a circle can be approximated by four bezier quadrants
 */

void write_ellipse(char *p){
  int i,filled,debug;
  int obj,sub,line_style,thickness,pen_colour,fill_colour,depth;
  int pen_style,fill,dir;
  double ctr_x,ctr_y,rad_x,rad_y,st_x,st_y,end_x,end_y;
  double style,width,angle,t;
  const double magic=0.5522847498; /* This number is arguably wrong */

  char buffer[1000],*f;

  debug=flags&DEBUG_MASK;

  i=sscanf(p,"%d %d %d %d %d %d %d %d %d %lf %d %lf %lf %lf %lf %lf"
	   " %lf %lf %lf %lf",
           &obj,&sub,&line_style,&thickness,&pen_colour,&fill_colour,
           &depth,&pen_style,&fill,&style,&dir,&angle,&ctr_x,&ctr_y,
           &rad_x,&rad_y,&st_x,&st_y,&end_x,&end_y);

  if (i!=20){
    fprintf(stderr,"Error parsing ellipse object\n");
    exit(1);
  }

  if (debug>2) fprintf(stderr,"Ellipse object read\n");

  /* Scale everything */

  ctr_x*=72.0/1200;
  ctr_y=pg[1]-72.0*ctr_y/1200;
  rad_x*=72.0/1200;
  rad_y*=72.0/1200;

  /* The following seems to be mad but true */ 

  if (thickness>1)
    width=(thickness-1)*72.0/80;
  else
    width=thickness*72.0/160;

  style*=72.0/80;

  filled=0;
  if ((fill>=0)&&(fill<=40)) filled=1;
  else if (fill!=-1) fprintf(stderr,"Unsupported fill type ignored\n");

  if ((filled==0)&&(width==0)) return; /* Nothing to do */

  /* Bounding boxes are as follows
   *
   * Parametric form of ellipse rotated by phi is
   * x=a.cos(t)cos(phi) - b.sin(t)sin(phi)
   * y=b.sin(t)cos(phi) + a.cos(t)sin(phi)
   *
   * dx/dt=0 => tan(t)=-b.tan(phi)/a
   * dy/dt=0 => tan(t)=b/(a.tan(phi))
   *
   */

  t=atan(-rad_y*tan(angle)/rad_x);
  bb_fix(ctr_x+rad_x*cos(t)*cos(angle)-rad_y*sin(t)*sin(angle),
	 ctr_y+rad_y*sin(t)*cos(angle)+rad_x*cos(t)*sin(angle),width);
  t+=M_PI;
  bb_fix(ctr_x+rad_x*cos(t)*cos(angle)-rad_y*sin(t)*sin(angle),
	 ctr_y+rad_y*sin(t)*cos(angle)+rad_x*cos(t)*sin(angle),width);
  if (fabs(tan(angle))>1e-9)
    t=atan(rad_y/(tan(angle)*rad_x));
  else
    t=0.5*M_PI;
  bb_fix(ctr_x+rad_x*cos(t)*cos(angle)-rad_y*sin(t)*sin(angle),
	 ctr_y+rad_y*sin(t)*cos(angle)+rad_x*cos(t)*sin(angle),width);
  t+=M_PI;
  bb_fix(ctr_x+rad_x*cos(t)*cos(angle)-rad_y*sin(t)*sin(angle),
	 ctr_y+rad_y*sin(t)*cos(angle)+rad_x*cos(t)*sin(angle),width);


  i=sprintf(buffer,"q\n");

  if ((pen_colour<-1)||(pen_colour>MAX_COL)) pen_colour=-1;

  if (pen_colour==-1)
    i+=sprintf(buffer+i," 0 0 0 RG");
  else if (fig_colours[pen_colour])
    i+=sprintf(buffer+i," %s RG",fig_colours[pen_colour]);
  else
    fprintf(stderr,"Invalid pen colour %d\n",pen_colour);

  f=fill_col(fill_colour,fill);
  if (f) i+=sprintf(buffer+i," %s rg",f);

  i+=sprintf(buffer+i," %.2f w\n",width);

  if (line_style>0) write_dash(line_style,style,buffer,&i);

  i+=sprintf(buffer+i,"1 0 0 1 %.2f %.2f cm\n",ctr_x,ctr_y);

  if (angle!=0.0)
    i+=sprintf(buffer+i,"%f %f %f %f 0 0 cm\n",cos(angle),sin(angle),
	       -sin(angle),cos(angle));

  i+=sprintf(buffer+i,"%.2f 0 m\n",rad_x);
  i+=sprintf(buffer+i,"%.2f %.2f %.2f %.2f %.2f %.2f c\n",
	     rad_x,magic*rad_y,magic*rad_x,rad_y,0.0,rad_y);
  i+=sprintf(buffer+i,"%.2f %.2f %.2f %.2f %.2f %.2f c\n",
	     -magic*rad_x,rad_y,-rad_x,magic*rad_y,-rad_x,0.0);
  i+=sprintf(buffer+i,"%.2f %.2f %.2f %.2f %.2f %.2f c\n",
	     -rad_x,-magic*rad_y,-magic*rad_x,-rad_y,0.0,-rad_y);
  i+=sprintf(buffer+i,"%.2f %.2f %.2f %.2f %.2f %.2f c\n",
	     magic*rad_x,-rad_y,rad_x,-magic*rad_y,rad_x,0.0);

  if (filled)
    if (width==0.0)
      i+=sprintf(buffer+i,"h f");
    else
      i+=sprintf(buffer+i,"b");
  else
    i+=sprintf(buffer+i,"h S");
  
  i+=sprintf(buffer+i," Q\n");
  
  OBJ_PRN("<</Length %d>> stream\n%s\nendstream\nendobj\n\n",i,buffer);

  add_obj(cref,depth);
  
}
