Example #1
0
static void maybe_init_libpaper(void)
{
  static int libpaper_initted = 0;
  if (!libpaper_initted) {
    paperinit();
    libpaper_initted = 1;
  }
}
Example #2
0
static void
do_init (void)
{
  static int inited = 0;
  int ch, i = 0;
  char *fqpn;
  FILE *fp = NULL;

  if (inited)
    return;

  paperinit ();

  fqpn = kpse_find_file (CONFIG_NAME, kpse_program_text_format, false);
  if (fqpn)
    fp = fopen (fqpn, "r");
  if (!fp)
    die ("can't open config file %s", CONFIG_NAME);

  /* In order to specify PAPER as default papersize the config file must
     contain a line 'p PAPER'.  */
  ch = fgetc (fp);
  /* skip comment lines */
  while (ch > 0 && ch != 'p') {
    while (ch > 0 && ch != '\n' && ch != '\r')
      ch = fgetc (fp);
    while (ch == '\n' || ch == '\r')
      ch = fgetc (fp);
  }
  /* read default papersize */
  if (ch == 'p' && fgetc (fp) == ' ')
    while (i < MAX_PAPER - 1 &&
           (ch = fgetc (fp)) > 0 && ch != ' ' && ch != '\n' && ch != '\r')
      default_paper[i++] = ch;
  default_paper[i] = 0;
  if (i == 0)
    die ("can't read default papersize from file %s", fqpn);

  fclose (fp);
  free (fqpn);
  inited = 1;
}
Example #3
0
/* Actually save the PostScript data to the file stream: */
int do_ps_save(FILE * fi,
		// const char *restrict const fname,
		const char * fname,
		SDL_Surface * surf,
		char * pprsize,
                int is_pipe)
{
  const struct paper * ppr;
  int img_w = surf->w;
  int img_h = surf->h;
  int r_img_w, r_img_h;
  int ppr_w, ppr_h;
  int x, y;
  float tlate_x, tlate_y;
  int cur_line_len;
  int plane;
  Uint8 r, g, b;
  char buf[256];
  Uint32(*getpixel) (SDL_Surface *, int, int) =
    getpixels[surf->format->BytesPerPixel];
  int printed_img_w, printed_img_h;
  time_t t = time(NULL);
  int rotate;
  float scale;


  /* Determine paper size: */

  paperinit(); // FIXME: Should we do this at startup? -bjk 2007.06.25

  if (pprsize == NULL)
  {
    /* User did not request a specific paper size (on command-line or
       in config file), ask the system.  It will return either their
       $PAPER env. var., the value from /etc/papersize, or NULL: */

    pprsize = (char *) systempapername();

    if (pprsize == NULL)
    {
      /* No setting, env. var. or /etc/ file; use the default! */

      pprsize = (char *) defaultpapername();

#ifdef DEBUG
      printf("Using default paper\n");
#endif
    }
#ifdef DEBUG
    else
    {
      printf("Using system paper\n");
    }
#endif
  }
#ifdef DEBUG
  else
  {
    printf("Using user paper\n");
  }
#endif
  
#ifdef DEBUG
  printf("Using paper size: %s\n", pprsize);
#endif


  /* Determine attributes of paper of the size chosen/determined: */

  ppr = paperinfo(pprsize);

  ppr_w = paperpswidth(ppr);
  ppr_h = paperpsheight(ppr);

#ifdef DEBUG
  printf("Paper is %d x %d (%.2f\" x %.2f\")\n", ppr_w, ppr_h,
	 (float) ppr_w / 72.0, (float) ppr_h / 72.0);
#endif

  paperdone(); // FIXME: Should we do this at quit? -bjk 2007.06.25


  /* Determine whether it's best to rotate the image: */

  if ((ppr_w >= ppr_h && img_w >= img_h) ||
      (ppr_w <= ppr_h && img_w <= img_h))
  {
    rotate = 0;
    r_img_w = img_w;
    r_img_h = img_h;
  }
  else
  {
    rotate = 1;
    r_img_w = img_h;
    r_img_h = img_w;
  }

#ifdef DEBUG
  printf("Image is %d x %d\n", img_w, img_h);
  printf("Rotated? %s\n", rotate ? "yes" : "no");
  printf("Will print %d x %d pixels\n", r_img_w, r_img_h);
#endif


  /* Determine scale: */

  scale = my_min(((float) (ppr_w - (MARGIN * 2)) / (float) r_img_w),
         ((float) (ppr_h - (MARGIN * 2)) / (float) r_img_h));

  printed_img_w = r_img_w * scale;
  printed_img_h = r_img_h * scale;

#ifdef DEBUG
  printf("Scaling image by %.2f (to %d x %d)\n", scale,
	 printed_img_w, printed_img_h);
#endif


  // FIXME - doesn't seem to center well -bjk 2007.06.25
  tlate_x = (ppr_w - printed_img_w) / 2;
  tlate_y = (ppr_h - printed_img_h) / 2;


  /* Based off of output from "pnmtops", Tux Paint 0.9.15 thru
     0.9.17 CVS as of June 2007, and Adobe Systems Incorporated's
     'PostScript(r) Language Reference, 3rd Ed.' */

  /* Begin PostScript output with some useful meta info in comments: */

  fprintf(fi, "%%!PS-Adobe-2.0 EPSF-2.0\n"); // we need LanguageLevel2 for color

  fprintf(fi, "%%%%Title: (%s)\n", fname);

  strftime(buf, sizeof buf - 1, "%a %b %e %H:%M:%S %Y", localtime(&t));
  fprintf(fi, "%%%%CreationDate: (%s)\n", buf);

  fprintf(fi, "%%%%Creator: (Tux Paint " VER_VERSION ", " VER_DATE ")\n");

  fprintf(fi, "%%%%Pages: 1\n");

  fprintf(fi, "%%%%BoundingBox: 0 0 %d %d\n", (int) (ppr_w + 0.5), (int)
(ppr_h + 0.5));

  fprintf(fi, "%%%%EndComments\n");


  /* Define a 'readstring' routine and 'picstr' routines for RGB: */

  fprintf(fi, "/readstring {\n");
  fprintf(fi, "  currentfile exch readhexstring pop\n");
  fprintf(fi, "} bind def\n");

  fprintf(fi, "/rpicstr %d string def\n", img_w);
  fprintf(fi, "/gpicstr %d string def\n", img_w);
  fprintf(fi, "/bpicstr %d string def\n", img_w);

  fprintf(fi, "%%%%EndProlog\n");

  fprintf(fi, "%%%%Page: 1 1\n");

  fprintf(fi, "<< /PageSize [ %d %d ] /ImagingBBox null >> setpagedevice\n",
              ppr_w, ppr_h);

  fprintf(fi, "gsave\n");

  /* 'translate' moves the user space origin to a new position with
  respect to the current page, leaving the orientation of the axes and
  the unit lengths unchanged. */
  fprintf(fi, "%d.%02d %d.%02d translate\n",
	  f2int(tlate_x), f2dec(tlate_x),
	  f2int(tlate_y), f2dec(tlate_y));

  /* 'scale' modiļ¬es the unit lengths independently along the current
  x and y axes, leaving the origin location and the orientation of the
  axes unchanged. */
  fprintf(fi, "%d.%02d %d.%02d scale\n",
          f2int(printed_img_w), f2dec(printed_img_w),
          f2int(printed_img_h), f2dec(printed_img_h));

  /* Rotate the image */
  if (rotate)
    fprintf(fi, "0.5 0.5 translate  90 rotate  -0.5 -0.5 translate\n");

  fprintf(fi, "%d %d 8\n", img_w, img_h);
  fprintf(fi, "[ %d 0 0 %d 0 %d ]\n", img_w, -img_h, img_h);

  fprintf(fi, "{ rpicstr readstring }\n");
  fprintf(fi, "{ gpicstr readstring }\n");
  fprintf(fi, "{ bpicstr readstring }\n");

  fprintf(fi, "true 3\n");

  fprintf(fi, "colorimage\n");

  cur_line_len = 0;

  for (y = 0; y < img_h; y++)
  {
    for (plane = 0; plane < 3; plane++)
    {
      for (x = 0; x < img_w; x++)
      {
        SDL_GetRGB(getpixel(surf, x, y), surf->format, &r, &g, &b);
        fprintf(fi, "%02x", (plane == 0 ? r : (plane == 1 ? g : b)));

        cur_line_len++;
        if (cur_line_len >= 30)
        {
          fprintf(fi, "\n");
          cur_line_len = 0;
        }
      }
    }
  }

  fprintf(fi, "\n");
  fprintf(fi, "grestore\n");
  fprintf(fi, "showpage\n");
  fprintf(fi, "%%%%Trailer\n");
  fprintf(fi, "%%%%EOF\n");

  if (!is_pipe)
  {
    fclose(fi);
    return 1;
  }
  else
  {
    pid_t child_pid, w;
    int status;

    child_pid = pclose(fi);

/* debug */
/*
    printf("pclose returned %d\n", child_pid); fflush(stdout);
    printf("errno = %d\n", errno); fflush(stdout);
*/

    if (child_pid < 0 || (errno != 0 && errno != EAGAIN)) { /* FIXME: This right? */
      return 0;
    } else if (child_pid == 0) {
      return 1;
    }

    do
    {
      w = waitpid(child_pid, &status, 0);

/* debug */
/*
            if (w == -1) { perror("waitpid"); exit(EXIT_FAILURE); }
            if (WIFEXITED(status)) {
                printf("exited, status=%d\n", WEXITSTATUS(status));
            } else if (WIFSIGNALED(status)) {
                printf("killed by signal %d\n", WTERMSIG(status));
            } else if (WIFSTOPPED(status)) {
                printf("stopped by signal %d\n", WSTOPSIG(status));
            } else if (WIFCONTINUED(status)) {
                printf("continued\n");
            }
*/
    }
    while (w != -1 && !WIFEXITED(status) && !WIFSIGNALED(status));

    if (WIFEXITED(status) && WEXITSTATUS(status) != 0) /* Not happy exit */
      return 0;

    return 1;
  }
}