Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #include "fitz.h"
  2. #include "mupdf.h"
  3.  
  4. fz_error
  5. pdf_load_xobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict)
  6. {
  7.         fz_error error;
  8.         pdf_xobject *form;
  9.         fz_obj *obj;
  10.  
  11.         if ((*formp = pdf_find_item(xref->store, pdf_drop_xobject, dict)))
  12.         {
  13.                 pdf_keep_xobject(*formp);
  14.                 return fz_okay;
  15.         }
  16.  
  17.         form = fz_malloc(sizeof(pdf_xobject));
  18.         form->refs = 1;
  19.         form->resources = NULL;
  20.         form->contents = NULL;
  21.         form->colorspace = NULL;
  22.  
  23.         /* Store item immediately, to avoid possible recursion if objects refer back to this one */
  24.         pdf_store_item(xref->store, pdf_keep_xobject, pdf_drop_xobject, dict, form);
  25.  
  26.         obj = fz_dict_gets(dict, "BBox");
  27.         form->bbox = pdf_to_rect(obj);
  28.  
  29.         obj = fz_dict_gets(dict, "Matrix");
  30.         if (obj)
  31.                 form->matrix = pdf_to_matrix(obj);
  32.         else
  33.                 form->matrix = fz_identity;
  34.  
  35.         form->isolated = 0;
  36.         form->knockout = 0;
  37.         form->transparency = 0;
  38.  
  39.         obj = fz_dict_gets(dict, "Group");
  40.         if (obj)
  41.         {
  42.                 fz_obj *attrs = obj;
  43.  
  44.                 form->isolated = fz_to_bool(fz_dict_gets(attrs, "I"));
  45.                 form->knockout = fz_to_bool(fz_dict_gets(attrs, "K"));
  46.  
  47.                 obj = fz_dict_gets(attrs, "S");
  48.                 if (fz_is_name(obj) && !strcmp(fz_to_name(obj), "Transparency"))
  49.                         form->transparency = 1;
  50.  
  51.                 obj = fz_dict_gets(attrs, "CS");
  52.                 if (obj)
  53.                 {
  54.                         error = pdf_load_colorspace(&form->colorspace, xref, obj);
  55.                         if (error)
  56.                                 fz_catch(error, "cannot load xobject colorspace");
  57.                 }
  58.         }
  59.  
  60.         form->resources = fz_dict_gets(dict, "Resources");
  61.         if (form->resources)
  62.                 fz_keep_obj(form->resources);
  63.  
  64.         error = pdf_load_stream(&form->contents, xref, fz_to_num(dict), fz_to_gen(dict));
  65.         if (error)
  66.         {
  67.                 pdf_remove_item(xref->store, pdf_drop_xobject, dict);
  68.                 pdf_drop_xobject(form);
  69.                 return fz_rethrow(error, "cannot load xobject content stream (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
  70.         }
  71.  
  72.         *formp = form;
  73.         return fz_okay;
  74. }
  75.  
  76. pdf_xobject *
  77. pdf_keep_xobject(pdf_xobject *xobj)
  78. {
  79.         xobj->refs ++;
  80.         return xobj;
  81. }
  82.  
  83. void
  84. pdf_drop_xobject(pdf_xobject *xobj)
  85. {
  86.         if (xobj && --xobj->refs == 0)
  87.         {
  88.                 if (xobj->colorspace)
  89.                         fz_drop_colorspace(xobj->colorspace);
  90.                 if (xobj->resources)
  91.                         fz_drop_obj(xobj->resources);
  92.                 if (xobj->contents)
  93.                         fz_drop_buffer(xobj->contents);
  94.                 fz_free(xobj);
  95.         }
  96. }
  97.