Back to index

texmacs  1.0.7.15
Classes | Defines | Typedefs | Functions
pdfximage.h File Reference
#include "pdfdev.h"
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  ximage_info
struct  xform_info

Defines

#define PDF_XOBJECT_TYPE_FORM   0
#define PDF_XOBJECT_TYPE_IMAGE   1

Typedefs

typedef struct pdf_ximage_

Functions

void pdf_ximage_set_verbose (void)
void pdf_init_images (void)
void pdf_close_images (void)
char * pdf_ximage_get_resname (int xobj_id)
pdf_objpdf_ximage_get_reference (int xobj_id)
int pdf_ximage_findresource (const char *ident, long page_no, pdf_obj *dict)
int pdf_ximage_defineresource (const char *ident, int subtype, void *cdata, pdf_obj *resource)
void pdf_ximage_init_image_info (ximage_info *info)
void pdf_ximage_init_form_info (xform_info *info)
void pdf_ximage_set_image (pdf_ximage *ximage, void *info, pdf_obj *resource)
void pdf_ximage_set_form (pdf_ximage *ximage, void *info, pdf_obj *resource)
long pdf_ximage_get_page (pdf_ximage *I)
void set_distiller_template (char *s)
int pdf_ximage_scale_image (int id, pdf_tmatrix *M, pdf_rect *r, transform_info *p)
void pdf_ximage_disable_ebb (void)
int pdf_ximage_get_subtype (int xobj_id)
void pdf_ximage_set_attr (int xobj_id, long width, long height, double xdensity, double ydensity, double llx, double lly, double urx, double ury)

Class Documentation

struct ximage_info

Definition at line 33 of file pdfximage.h.

Class Members
int bits_per_component
int flags
long height
long min_dpi
int num_components
long width
double xdensity
double ydensity
struct xform_info

Definition at line 47 of file pdfximage.h.

Collaboration diagram for xform_info:
Class Members
pdf_rect bbox
int flags
pdf_tmatrix matrix

Define Documentation

#define PDF_XOBJECT_TYPE_FORM   0

Definition at line 30 of file pdfximage.h.

#define PDF_XOBJECT_TYPE_IMAGE   1

Definition at line 31 of file pdfximage.h.


Typedef Documentation

typedef struct pdf_ximage_

Definition at line 54 of file pdfximage.h.


Function Documentation

void pdf_close_images ( void  )

Definition at line 181 of file pdfximage.c.

{
  struct ic_ *ic = &_ic;
  if (ic->ximages) {
    int  i;
    for (i = 0; i < ic->count; i++) {
      pdf_ximage *I = ic->ximages+i;
      if (I->tempfile) {
       /*
        * It is important to remove temporary files at the end because
        * we cache file names. Since we use mkstemp to create them, we
        * might get the same file name again if delete the first file.
        * (This happens on NetBSD, reported by Jukka Salmi.)
        * We also use this to convert a PS file only once if multiple
        * pages are imported from that file.
        */
       if (_opts.verbose > 1)
         MESG("pdf_image>> deleting temporary file \"%s\"\n", I->filename);
       dpx_delete_temp_file(I->filename); /* temporary filename freed here */
       I->filename = NULL;
      }
      pdf_clean_ximage_struct(I);
    }
    RELEASE(ic->ximages);
    ic->ximages = NULL;
    ic->count = ic->capacity = 0;
  }

  if (_opts.cmdtmpl)
    RELEASE(_opts.cmdtmpl);
  _opts.cmdtmpl = NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void pdf_init_images ( void  )

Definition at line 172 of file pdfximage.c.

{
  struct ic_ *ic = &_ic;
  ic->count    = 0;
  ic->capacity = 0;
  ic->ximages  = NULL;
}

Here is the caller graph for this function:

int pdf_ximage_defineresource ( const char *  ident,
int  subtype,
void *  cdata,
pdf_obj resource 
)

Definition at line 580 of file pdfximage.c.

{
  struct ic_ *ic = &_ic;
  int         id;
  pdf_ximage *I;

  id = ic->count;
  if (ic->count >= ic->capacity) {
    ic->capacity += 16;
    ic->ximages   = RENEW(ic->ximages, ic->capacity, pdf_ximage);
  }

  I = &ic->ximages[id];

  pdf_init_ximage_struct(I, ident, NULL, 0, NULL);

  switch (subtype) {
  case PDF_XOBJECT_TYPE_IMAGE:
    pdf_ximage_set_image(I, info, resource);
    sprintf(I->res_name, "Im%d", id);
    break;
  case PDF_XOBJECT_TYPE_FORM:
    pdf_ximage_set_form (I, info, resource);
    sprintf(I->res_name, "Fm%d", id);
    break;
  default:
    ERROR("Unknown XObject subtype: %d", subtype);
  }
  ic->count++;

  return  id;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void pdf_ximage_disable_ebb ( void  )
int pdf_ximage_findresource ( const char *  ident,
long  page_no,
pdf_obj dict 
)

Definition at line 348 of file pdfximage.c.

{
  struct ic_ *ic = &_ic;
  int         id = -1;
  pdf_ximage *I;
  char       *fullname, *f = NULL;
  int         format;
  FILE       *fp;

  for (id = 0; id < ic->count; id++) {
    I = &ic->ximages[id];
    if (I->ident && !strcmp(ident, I->ident)) {
      f = I->filename;
      if (I->page_no == page_no && I->attr_dict == dict) {
       return  id;
      }
    }
  }

  if (f) {
    /* we already have converted this file; f is the temporary file name */
    fullname = NEW(strlen(f)+1, char);
    strcpy(fullname, f);
  } else {
#ifdef NOKPSE
    /* try loading image */
    fullname = dpx_find_file(ident, "_pic_", "");
#else
    fullname = NEW(strlen(ident)+1, char);
    strcpy(fullname, ident);
#endif
    if (!fullname) {
      WARN("Error locating image file \"%s\"", ident);
      return  -1;
    }
  }

  fp = dpx_fopen(fullname, FOPEN_RBIN_MODE);
  if (!fp) {
    WARN("Error opening image file \"%s\"", fullname);
    RELEASE(fullname);
    return  -1;
  }
  if (_opts.verbose) {
    MESG("(Image:%s", ident);
    if (_opts.verbose > 1)
      MESG("[%s]", fullname);
  }

  format = source_image_type(fp);
  switch (format) {
#if 0
  case IMAGE_TYPE_MPS:
    if (_opts.verbose)
      MESG("[MPS]");
    id = mps_include_page(ident, fp);
    if (id < 0) {
      WARN("Try again with the distiller.");
      format = IMAGE_TYPE_EPS;
      rewind(fp);
    } else
      break;
#endif
  default:
    id = load_image(ident, fullname, format, fp, page_no, dict);
    break;
  }
  dpx_fclose(fp);

  RELEASE(fullname);

  if (_opts.verbose)
    MESG(")");

  if (id < 0)
    WARN("pdf: image inclusion failed for \"%s\".", ident);

  return  id;
}

Here is the call graph for this function:

Here is the caller graph for this function:

long pdf_ximage_get_page ( pdf_ximage *  I)

Definition at line 551 of file pdfximage.c.

{
  return I->page_no;
}

Here is the caller graph for this function:

pdf_obj* pdf_ximage_get_reference ( int  xobj_id)

Definition at line 564 of file pdfximage.c.

{
  struct ic_ *ic = &_ic;
  pdf_ximage *I;

  CHECK_ID(ic, id);

  I = GET_IMAGE(ic, id);
  if (!I->reference)
    I->reference = pdf_ref_obj(I->resource);

  return pdf_link_obj(I->reference);
}

Here is the call graph for this function:

Here is the caller graph for this function:

char* pdf_ximage_get_resname ( int  xobj_id)

Definition at line 616 of file pdfximage.c.

{
  struct ic_ *ic = &_ic;
  pdf_ximage *I;

  CHECK_ID(ic, id);

  I = GET_IMAGE(ic, id);

  return I->res_name;
}

Here is the caller graph for this function:

int pdf_ximage_get_subtype ( int  xobj_id)

Definition at line 629 of file pdfximage.c.

{
  struct ic_ *ic = &_ic;
  pdf_ximage *I;

  CHECK_ID(ic, id);

  I = GET_IMAGE(ic, id);

  return I->subtype;
}

Definition at line 443 of file pdfximage.c.

{
  info->flags    = 0;
  info->bbox.llx = 0;
  info->bbox.lly = 0;
  info->bbox.urx = 0;
  info->bbox.ury = 0;
  info->matrix.a = 1.0;
  info->matrix.b = 0.0;
  info->matrix.c = 0.0;
  info->matrix.d = 1.0;
  info->matrix.e = 0.0;
  info->matrix.f = 0.0;
}

Here is the caller graph for this function:

Definition at line 489 of file pdfximage.c.

{
  info->flags  = 0;
  info->width  = 0;
  info->height = 0;
  info->bits_per_component = 0;
  info->num_components = 0;
  info->min_dpi = 0;
  info->xdensity = info->ydensity = 1.0;
}

Here is the caller graph for this function:

int pdf_ximage_scale_image ( int  id,
pdf_tmatrix M,
pdf_rect r,
transform_info p 
)

Definition at line 782 of file pdfximage.c.

{
  struct ic_ *ic = &_ic;
  pdf_ximage *I;

  CHECK_ID(ic, id);

  I = GET_IMAGE(ic, id);

  pdf_setmatrix(M, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0);

  switch (I->subtype) {
  /* Reference: PDF Reference 1.5 v6, p.302
   *
   * An image can be placed on the output page in any desired position,
   * orientation, and size by using the cm operator to modify the current
   * transformation matrix (CTM) so as to map the unit square of user space
   * to the rectangle or parallelogram in which the image is to be painted.
   *
   * There is neither BBox nor Matrix key in the image XObject.
   * Everything must be controlled by the cm operator.
   *
   * The argument [p] contains the user-defined bounding box, the scailing
   * factor of which is bp as EPS and PDF. On the other hand, I->attr
   * contains the (sampling) width and the (sampling) height of the image.
   *
   * There is no problem if a bitmap image has density information.
   * Otherwise, DVIPDFM's ebb generates bounding box as 100px = 72bp = 1in.
   * In this case, screen captured images look bad. Moreover, DVIPDFM's ebb
   * ignores all density information and use just 100px = 72bp = 1in.
   *
   * On the other hand, pdfTeX uses 100px = 100bp to get a better quality
   * for screen captured images.
   *
   * DVIPDFMx's xbb generates bounding box as 100px = 100bp in the same
   * way as pdfTeX. Furthermore, it takes care of density information too.
   */
  case PDF_XOBJECT_TYPE_IMAGE:
    scale_to_fit_I(M, p, I);
    if (p->flags & INFO_HAS_USER_BBOX) {
      r->llx = p->bbox.llx / (I->attr.width * I->attr.xdensity);
      r->lly = p->bbox.lly / (I->attr.height * I->attr.ydensity);
      r->urx = p->bbox.urx / (I->attr.width * I->attr.xdensity);
      r->ury = p->bbox.ury / (I->attr.height * I->attr.ydensity);
    } else {
      r->llx = 0.0;
      r->lly = 0.0;
      r->urx = 1.0;
      r->ury = 1.0;
    }
    break;
  /* User-defined transformation and clipping are controlled by
   * the cm operator and W operator, explicitly */
  case PDF_XOBJECT_TYPE_FORM:
    scale_to_fit_F(M, p, I);
    if (p->flags & INFO_HAS_USER_BBOX) {
      r->llx = p->bbox.llx;
      r->lly = p->bbox.lly;
      r->urx = p->bbox.urx;
      r->ury = p->bbox.ury;
    } else { /* I->attr.bbox from the image bounding box */
      r->llx = I->attr.bbox.llx;
      r->lly = I->attr.bbox.lly;
      r->urx = I->attr.bbox.urx;
      r->ury = I->attr.bbox.ury;
    }
    break;
  }

  return  0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void pdf_ximage_set_attr ( int  xobj_id,
long  width,
long  height,
double  xdensity,
double  ydensity,
double  llx,
double  lly,
double  urx,
double  ury 
)

Definition at line 642 of file pdfximage.c.

{
  struct ic_ *ic = &_ic;
  pdf_ximage *I;

  CHECK_ID(ic, id);

  I = GET_IMAGE(ic, id);
  I->attr.width = width;
  I->attr.height = height;
  I->attr.xdensity = xdensity;
  I->attr.ydensity = ydensity;
  I->attr.bbox.llx = llx;
  I->attr.bbox.lly = lly;
  I->attr.bbox.urx = urx;
  I->attr.bbox.ury = ury;
}
void pdf_ximage_set_form ( pdf_ximage *  ximage,
void *  info,
pdf_obj resource 
)

Definition at line 533 of file pdfximage.c.

{
  xform_info *info = form_info;

  I->subtype   = PDF_XOBJECT_TYPE_FORM;

  I->attr.bbox.llx = info->bbox.llx;
  I->attr.bbox.lly = info->bbox.lly;
  I->attr.bbox.urx = info->bbox.urx;
  I->attr.bbox.ury = info->bbox.ury;

  I->reference = pdf_ref_obj(resource);

  pdf_release_obj(resource); /* Caller don't know we are using reference. */
  I->resource  = NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void pdf_ximage_set_image ( pdf_ximage *  ximage,
void *  info,
pdf_obj resource 
)

Definition at line 501 of file pdfximage.c.

{
  pdf_obj     *dict;
  ximage_info *info = image_info;

  if (!PDF_OBJ_STREAMTYPE(resource))
    ERROR("Image XObject must be of stream type.");

  I->subtype = PDF_XOBJECT_TYPE_IMAGE;

  I->attr.width  = info->width;  /* The width of the image, in samples */
  I->attr.height = info->height; /* The height of the image, in samples */
  I->attr.xdensity = info->xdensity;
  I->attr.ydensity = info->ydensity;

  I->reference = pdf_ref_obj(resource);

  dict = pdf_stream_dict(resource);
  pdf_add_dict(dict, pdf_new_name("Type"),    pdf_new_name("XObject"));
  pdf_add_dict(dict, pdf_new_name("Subtype"), pdf_new_name("Image"));
  pdf_add_dict(dict, pdf_new_name("Width"),   pdf_new_number(info->width));
  pdf_add_dict(dict, pdf_new_name("Height"),  pdf_new_number(info->height));
  pdf_add_dict(dict, pdf_new_name("BitsPerComponent"),
               pdf_new_number(info->bits_per_component));
  if (I->attr_dict)
    pdf_merge_dict(dict, I->attr_dict);

  pdf_release_obj(resource); /* Caller don't know we are using reference. */
  I->resource  = NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void pdf_ximage_set_verbose ( void  )

Definition at line 101 of file pdfximage.c.

{ _opts.verbose++; }

Here is the caller graph for this function:

void set_distiller_template ( char *  s)

Definition at line 861 of file pdfximage.c.

{
  if (_opts.cmdtmpl)
    RELEASE(_opts.cmdtmpl);
  if (!s || *s == '\0')
    _opts.cmdtmpl = NULL;
  else {
    _opts.cmdtmpl = NEW(strlen(s) + 1, char);
    strcpy(_opts.cmdtmpl, s);
  }
  return;
}