Esempio n. 1
0
/* 
  HPGL command PS (Plot Size)
*/
int hpgs_reader_do_PS (hpgs_reader *reader)
{
  double x_size=reader->x_size/HP_TO_PT;
  double y_size=reader->y_size/HP_TO_PT;

  if (reader->eoc)
    {
      // Well it seems, that some oldstyle HPGL files use
      // PS w/o arguments in order to enforce a coordinate setup
      // as if a portrait paper size has been selected.
      // (resulting in a prerotation of 90 degrees). 
      x_size = 33600.0;
      y_size = 47520.0;
    }
  else
    {
      if (hpgs_reader_read_double(reader,&x_size)) return -1;

      // set y-size to sqrt(0.5) * x_size in order to prevent
      // the picture from rotation. This is better then setting
      // the y-size to the (fictional) hard-clip limit, because
      // without rotation we definitely can calculate our own plotsize
      // using -i.
      if (reader->eoc)
	y_size = sqrt(0.5) * x_size;
    }

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

  return hpgs_reader_set_plotsize (reader,x_size,y_size);
}
Esempio n. 2
0
/* 
  HPGL command CR (Color Range)
*/
int hpgs_reader_do_CR (hpgs_reader *reader)
{
  reader->min_color.r = 0.0;
  reader->min_color.g = 0.0;
  reader->min_color.b = 0.0;

  reader->max_color.r = 255.0;
  reader->max_color.g = 255.0;
  reader->max_color.b = 255.0;

  if (!reader->eoc)
    {
      if (hpgs_reader_read_double(reader,&reader->min_color.r)) return -1;
      if (reader->eoc) return -1;
      if (hpgs_reader_read_double(reader,&reader->max_color.r)) return -1;
      if (reader->eoc) return -1;
      if (hpgs_reader_read_double(reader,&reader->min_color.g)) return -1;
      if (reader->eoc) return -1;
      if (hpgs_reader_read_double(reader,&reader->max_color.g)) return -1;
      if (reader->eoc) return -1;
      if (hpgs_reader_read_double(reader,&reader->min_color.b)) return -1;
      if (reader->eoc) return -1;
      if (hpgs_reader_read_double(reader,&reader->max_color.b)) return -1;
    }

  return 0;
}
Esempio n. 3
0
/*
  HPGL command LA (Line Attributes)
*/
int hpgs_reader_do_LA(hpgs_reader *reader)
{
  int    kind;
  int    ivalue;
  double rvalue;

  static hpgs_line_cap caps[5] =
    { hpgs_cap_butt,
      hpgs_cap_butt,
      hpgs_cap_square,
      hpgs_cap_round,
      hpgs_cap_round    };

  static hpgs_line_join joins[7] =
    { hpgs_join_miter,
      hpgs_join_miter,
      hpgs_join_miter,
      hpgs_join_miter,
      hpgs_join_round,
      hpgs_join_bevel,
      hpgs_join_miter };

  while (!reader->eoc)
    {
      if (hpgs_reader_read_int(reader,&kind)) return -1;
      if (reader->eoc) return -1;
      
      switch (kind)
	{
	case 3:
	  if (hpgs_reader_read_double(reader,&rvalue)) return -1;
	  if (hpgs_setmiterlimit(reader->device,rvalue)) return -1;
	  break;
	case 1:
	  if (hpgs_reader_read_int(reader,&ivalue)) return -1;
	  if (ivalue >= 0 && ivalue < 5 &&
	      hpgs_setlinecap(reader->device,caps[ivalue])) return -1;
	  break;
	case 2:
	  if (hpgs_reader_read_int(reader,&ivalue)) return -1;
	  if (ivalue >= 0 && ivalue < 7 &&
	      hpgs_setlinejoin(reader->device,joins[ivalue])) return -1;
	  break;
	default:
	  return -1;
	}
    }
  return 0;
}
Esempio n. 4
0
/* 
  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;
}
Esempio n. 5
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);
}
Esempio n. 6
0
/* 
  HPGL command SC (SCale)
*/
int hpgs_reader_do_SC (hpgs_reader *reader)
{
  double xmin,xmax,ymin,ymax,left=50.0,bottom=50.0;
  int type=0;

  if (reader->eoc)
    {
      reader->sc_type = -1;
      hpgs_reader_set_default_transformation(reader);
      return 0;
    }

  if (hpgs_reader_read_double(reader,&xmin)) return -1;
  if (reader->eoc) return -1;
  if (hpgs_reader_read_double(reader,&xmax)) return -1;
  if (reader->eoc) return -1;

  if (xmin == xmax)
    return hpgs_set_error(hpgs_i18n("Empty x range."));

  if (hpgs_reader_read_double(reader,&ymin)) return -1;
  if (reader->eoc) return -1;
  if (hpgs_reader_read_double(reader,&ymax)) return -1;

  if (ymin == ymax)
    return hpgs_set_error(hpgs_i18n("Empty y range."));

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

  if (type == 1 && !reader->eoc)
    {
      if (hpgs_reader_read_double(reader,&left)) return -1;
      if (reader->eoc) return -1;
      if (hpgs_reader_read_double(reader,&bottom)) return -1;
    }

  reader->sc_type = type;
  reader->sc_xmin = xmin;
  reader->sc_xmax = xmax;
  reader->sc_ymin = ymin;
  reader->sc_ymax = ymax;
  reader->sc_bottom = bottom;
  reader->sc_left = left;

  hpgs_reader_set_default_transformation(reader);
  return 0;
}
Esempio n. 7
0
/* 
  HPGL command IR (Input point Relative)
*/
int hpgs_reader_do_IR (hpgs_reader *reader)
{
  // get default input point.
  double p1x=0.0,p1y=0.0,p2x,p2y;

  int angle = reader->y_size >= reader->x_size ? 90 : 0;
  
  angle += reader->rotation;

  switch (angle % 360)
    {
    case 90:
      p1x = reader->x_size;
      p1y = 0.0;
      p2x = 0.0;
      p2y = reader->y_size;
      break;
    case 180:
      break;
      p1x = reader->x_size;
      p1y = reader->y_size;
      p2x = 0.0;
      p2y = 0.0;
      break;
    case 270:
      p1x = 0.0;
      p1y = reader->y_size;
      p2x = reader->x_size;
      p2y = 0.0;
      break;
    default:
      p1x = 0.0;
      p1y = 0.0;
      p2x = reader->x_size;
      p2y = reader->y_size;
    }

  // read input point
  if (!reader->eoc)
    {
      double x,y;

      if (hpgs_reader_read_double(reader,&x)) return -1;
      if (hpgs_reader_read_double(reader,&y)) return -1;

      p1x = reader->x_size * x * 0.01;
      p2x = p1x + reader->delta_P.x;
      p1y = reader->y_size * y * 0.01;
      p2y = p1y + reader->delta_P.y;
    }

  if (!reader->eoc)
    {
      if (hpgs_reader_read_double(reader,&p2x)) return -1;
      if (hpgs_reader_read_double(reader,&p2y)) return -1;

      p2x = reader->x_size * p2x * 0.01;
      p2y = reader->y_size * p2y * 0.01;

      reader->delta_P.x = p2x - p1x;
      reader->delta_P.y = p2y - p1y; 
    }

  reader->P1.x = p1x;
  reader->P1.y = p1y;
  reader->P2.x = p2x;
  reader->P2.y = p2y;
  
#ifdef HPGS_DEBUG_XFORM
  hpgs_log("IR: P1 = %g,%g.\n",reader->P1.x,reader->P1.y);
  hpgs_log("IR: P2 = %g,%g.\n",reader->P2.x,reader->P2.y);
#endif

  hpgs_reader_set_default_transformation(reader);

  return 0;
}
Esempio n. 8
0
/* 
  HPGL command IP (Input Point)
*/
int hpgs_reader_do_IP (hpgs_reader *reader)
{
  // get default input point.
  int angle = reader->y_size >= reader->x_size ? 90 : 0;
  
  angle += reader->rotation;

  switch (angle % 360)
    {
    case 90:
      reader->P1.x = reader->x_size;
      reader->P1.y = 0.0;
      reader->P2.x = 0.0;
      reader->P2.y = reader->y_size;
      break;
    case 180:
      break;
      reader->P1.x = reader->x_size;
      reader->P1.y = reader->y_size;
      reader->P2.x = 0.0;
      reader->P2.y = 0.0;
      break;
    case 270:
      reader->P1.x = 0.0;
      reader->P1.y = reader->y_size;
      reader->P2.x = reader->x_size;
      reader->P2.y = 0.0;
      break;
    default: /* 0 */ 
      reader->P1.x = 0.0;
      reader->P1.y = 0.0;
      reader->P2.x = reader->x_size;
      reader->P2.y = reader->y_size;
    }


  // read input point
  if (!reader->eoc)
    {
      if (hpgs_reader_read_double(reader,
                                  angle%180 ?
                                  &reader->P1.y :
                                  &reader->P1.x  )) return -1;
      if (reader->eoc) return -1;
      if (hpgs_reader_read_double(reader,angle%180 ?
                                  &reader->P2.x :
                                  &reader->P1.y  )) return -1;
    }

  if (!reader->eoc)
    {
      if (hpgs_reader_read_double(reader,
                                  angle%180 ?
                                  &reader->P2.y :
                                  &reader->P2.x  )) return -1;
      if (reader->eoc) return -1;
      if (hpgs_reader_read_double(reader,
                                  angle%180 ?
                                  &reader->P1.x :
                                  &reader->P2.y  )) return -1;
    }

  reader->delta_P.x = reader->P2.x - reader->P1.x; 
  reader->delta_P.y = reader->P2.y - reader->P1.y; 

#ifdef HPGS_DEBUG_XFORM
  hpgs_log("IP: angle = %d.\n",angle);
  hpgs_log("IP: P1 = %g,%g.\n",reader->P1.x,reader->P1.y);
  hpgs_log("IP: P2 = %g,%g.\n",reader->P2.x,reader->P2.y);
#endif

  reader->sc_type = -1;
  hpgs_reader_set_default_transformation(reader);

  return 0;
}
Esempio n. 9
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;
}
Esempio n. 10
0
/* 
  HPGL command PC (Pen Color)
*/
int hpgs_reader_do_PC (hpgs_reader *reader)
{
  int pen=-1;
  double r=-1.0e20,g=-1.0e20,b=-1.0e20;

  if (!reader->eoc && hpgs_reader_read_int(reader,&pen)) return -1;
  if (!reader->eoc && hpgs_reader_read_double(reader,&r)) return -1;
  if (!reader->eoc && hpgs_reader_read_double(reader,&g)) return -1;
  if (!reader->eoc && hpgs_reader_read_double(reader,&b)) return -1;

  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("PC: Illegal pen number %d.\n"),pen);

          return 0;
        }
    }

  if (pen < 0)
    {
      hpgs_reader_set_std_pen_colors(reader,0,reader->npens);
      pen = reader->current_pen;
    }
  else
    {
      if (r==-1.0e20 || g==-1.0e20 || b==-1.0e20)
        {
          hpgs_reader_set_std_pen_colors(reader,pen,1);
        }
      else
        {
          reader->pen_colors[pen].r =
            (r - reader->min_color.r) / (reader->max_color.r - reader->min_color.r);
          if (reader->pen_colors[pen].r < 0.0) reader->pen_colors[pen].r = 0.0;
          if (reader->pen_colors[pen].r > 1.0) reader->pen_colors[pen].r = 1.0;

          reader->pen_colors[pen].g =
            (g - reader->min_color.g) / (reader->max_color.g - reader->min_color.g);
          if (reader->pen_colors[pen].g < 0.0) reader->pen_colors[pen].g = 0.0;
          if (reader->pen_colors[pen].g > 1.0) reader->pen_colors[pen].g = 1.0;

          reader->pen_colors[pen].b =
            (b - reader->min_color.b) / (reader->max_color.b - reader->min_color.b);
          if (reader->pen_colors[pen].b < 0.0) reader->pen_colors[pen].b = 0.0;
          if (reader->pen_colors[pen].b > 1.0) reader->pen_colors[pen].b = 1.0;
        }
    }

  if (pen == reader->current_pen)
    if (hpgs_setrgbcolor(reader->device,
			 &reader->pen_colors[pen]))
      return -1;

  return 0;
}