/* 
  HPGL command IW (Input Window)
*/
int hpgs_reader_do_IW (hpgs_reader *reader)
{
  // get default input point.
  hpgs_point ll;
  hpgs_point ur;
  hpgs_point p;

  if (hpgs_reader_checkpath(reader)) return -1;

  while (reader->clipsave_depth > 0)
    {
      hpgs_cliprestore(reader->device);
      --reader->clipsave_depth;
    }

  if (reader->eoc) return 0;

  // read input point
  if (hpgs_reader_read_point(reader,&ll,0)) return -1;
  if (hpgs_reader_read_point(reader,&ur,0)) return -1;

  if (hpgs_clipsave(reader->device)) return -1;
  ++reader->clipsave_depth;

  if (hpgs_newpath(reader->device)) return -1;

  hpgs_matrix_xform (&p,&reader->total_matrix,&ll);
  if (hpgs_moveto(reader->device,&p)) return -1;
  p.x = ll.x;
  p.y = ur.y;
  hpgs_matrix_xform (&p,&reader->total_matrix,&p);
  if (hpgs_lineto(reader->device,&p)) return -1;
  hpgs_matrix_xform (&p,&reader->total_matrix,&ur);
  if (hpgs_lineto(reader->device,&p)) return -1;
  p.x = ur.x;
  p.y = ll.y;
  hpgs_matrix_xform (&p,&reader->total_matrix,&p);
  if (hpgs_lineto(reader->device,&p)) return -1;
  if (hpgs_closepath(reader->device)) return -1;
  if (hpgs_clip(reader->device,HPGS_TRUE)) return -1; 

  reader->have_current_point = 0;

  return hpgs_newpath(reader->device);
}
/* 
  HPGL command FR (advance FRame)
*/
int hpgs_reader_do_FR (hpgs_reader *reader)
{
  double advance = reader->x_size;

  if (!reader->eoc)
    {
      if (hpgs_reader_read_double(reader,&advance)) return -1;
    }

  if (hpgs_reader_checkpath(reader)) return -1;

  while (reader->clipsave_depth > 0)
    {
      hpgs_cliprestore(reader->device);
      --reader->clipsave_depth;
    }

  if (reader->frame_asset_func)
    {
      hpgs_bbox frame_bbox;
      
      frame_bbox.llx = reader->frame_x == 0.0 ? reader->content_bbox.llx : reader->frame_x;
      frame_bbox.lly = reader->content_bbox.lly;
      frame_bbox.urx = reader->frame_x + advance * HP_TO_PT;
      frame_bbox.ury = reader->content_bbox.ury;

      if (frame_bbox.urx > frame_bbox.llx)
        {
          int ipage = reader->current_page;
          
          if (reader->frame_asset_func(reader->frame_asset_ctxt,
                                       reader->device,
                                       &reader->page_matrix,
                                       &reader->total_matrix,
                                       &frame_bbox,ipage <= 1 ? 0 : ipage-1) )
            return -1;
        }
    }

  reader->frame_x += advance * HP_TO_PT;
  reader->P1.x -= advance;
  reader->P2.x -= advance;

  return 0;
}
Beispiel #3
0
/*
  HPGL command LT (Line Type)
*/
int hpgs_reader_do_LT(hpgs_reader *reader)
{
  float dashes[20];
  int i,ndash;
  int linetype=0;
  double patlen = 4.0;
  int    mode = 0;

  if (hpgs_reader_checkpath(reader)) return -1;

  if (!reader->eoc &&
      hpgs_reader_read_int(reader,&linetype)) return -1;

  if (!reader->eoc &&
      hpgs_reader_read_double(reader,&patlen)) return -1;

  if (!reader->eoc &&
      hpgs_reader_read_int(reader,&mode)) return -1;

  if (linetype < -8 || linetype > 8)
    {
      if (reader->verbosity)
	hpgs_log(hpgs_i18n("LT: Illegal linetype %d.\n"),linetype);
      return 0;
    }

  // line type are store as percentages.
  patlen *= 0.01;

  if (mode)
    patlen *= MM_TO_PT;
  else
    patlen *= hypot(reader->P2.x-reader->P1.x,
		    reader->P2.y-reader->P1.y ) * 0.01 * HP_TO_PT;

  ndash = reader->linetype_nsegs[linetype+8];
  if (ndash > 20) ndash = 20;

  for (i=0;i<ndash;++i)
    dashes[i] = reader->linetype_segs[linetype+8][i] * patlen;
  
  return hpgs_setdash(reader->device,
		      dashes,ndash,0.0);
}
Beispiel #4
0
/*
  Do the pen select.
*/
int hpgs_reader_do_setpen(hpgs_reader *reader, int pen)
{
  double width;

  if (hpgs_reader_checkpath(reader)) return -1;

  if (pen < 0)
    return hpgs_set_error(hpgs_i18n("Illegal pen numer %d."),pen);

  if (pen >= reader->npens)
    {
      if (pen < 256)
        {
          if (hpgs_reader_set_number_of_pens(reader,pen+1))
            return -1;
        }
      else
        {
          if (reader->verbosity)
            hpgs_log(hpgs_i18n("Illegal pen number %d replaced by %d.\n"),
                     pen, pen % reader->npens);
          pen = pen %  reader->npens;
        }
    }

  reader->current_pen = pen;

  width = reader->pen_widths[pen];

  if (reader->pen_width_relative)
    width *= hypot(reader->P2.x-reader->P1.x,
		   reader->P2.y-reader->P1.y ) * 0.001 * HP_TO_PT;
  else
    width *= HP_TO_PT / reader->world_scale;

  width *= reader->page_scale;

  if (hpgs_setlinewidth(reader->device,width*reader->lw_factor))
    return -1;

  return hpgs_setrgbcolor(reader->device,
			  &reader->pen_colors[pen]);
}
Beispiel #5
0
/* 
  HPGL command PW (Pen Width)
*/
int hpgs_reader_do_PW (hpgs_reader *reader)
{
  int pen=-1;
  double width=1.0;

  if (!reader->eoc)
    if (hpgs_reader_read_double(reader,&width)) return -1;
  if (!reader->eoc)
    {
      if (hpgs_reader_read_int(reader,&pen)) return -1;

      if (pen < 0 || pen >= reader->npens)
        {
          if (pen >= reader->npens && pen < 256)
            {
              if (hpgs_reader_set_number_of_pens(reader,pen+1))
                return -1;
            }
          else
            {
              if (reader->verbosity)
                hpgs_log(hpgs_i18n("PW: Illegal pen number %d.\n"),pen);
              
              return 0;
            }
        }
    }

  if (reader->verbosity >= 2)
    hpgs_log("PW: pen,width,rel = %d,%g,%d.\n",pen,width,reader->pen_width_relative);

  if (reader->pen_width_relative)
    width *= 10.0;
  else
    width *= MM_TO_PT;

  if (pen < 0)
    {
      int i;
      for (i=0;i<reader->npens;++i)
	reader->pen_widths[i] = width;
    }
  else
    reader->pen_widths[pen] = width;

  if (pen < 0 || pen == reader->current_pen)
    {
      if (hpgs_reader_checkpath(reader)) return -1;

      if (reader->pen_width_relative)
        width *= hypot(reader->P2.x-reader->P1.x,
                       reader->P2.y-reader->P1.y ) * 0.001 * HP_TO_PT;
      else
        width *= HP_TO_PT / reader->world_scale;

      width *= reader->page_scale;

      if (hpgs_setlinewidth(reader->device,width*reader->lw_factor))
	return -1;
    }

  return 0;
}