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_pattern(pdf_pattern **patp, pdf_xref *xref, fz_obj *dict)
  6. {
  7.         fz_error error;
  8.         pdf_pattern *pat;
  9.         fz_obj *obj;
  10.  
  11.         if ((*patp = pdf_find_item(xref->store, pdf_drop_pattern, dict)))
  12.         {
  13.                 pdf_keep_pattern(*patp);
  14.                 return fz_okay;
  15.         }
  16.  
  17.         pat = fz_malloc(sizeof(pdf_pattern));
  18.         pat->refs = 1;
  19.         pat->resources = NULL;
  20.         pat->contents = NULL;
  21.  
  22.         /* Store pattern now, to avoid possible recursion if objects refer back to this one */
  23.         pdf_store_item(xref->store, pdf_keep_pattern, pdf_drop_pattern, dict, pat);
  24.  
  25.         pat->ismask = fz_to_int(fz_dict_gets(dict, "PaintType")) == 2;
  26.         pat->xstep = fz_to_real(fz_dict_gets(dict, "XStep"));
  27.         pat->ystep = fz_to_real(fz_dict_gets(dict, "YStep"));
  28.  
  29.         obj = fz_dict_gets(dict, "BBox");
  30.         pat->bbox = pdf_to_rect(obj);
  31.  
  32.         obj = fz_dict_gets(dict, "Matrix");
  33.         if (obj)
  34.                 pat->matrix = pdf_to_matrix(obj);
  35.         else
  36.                 pat->matrix = fz_identity;
  37.  
  38.         pat->resources = fz_dict_gets(dict, "Resources");
  39.         if (pat->resources)
  40.                 fz_keep_obj(pat->resources);
  41.  
  42.         error = pdf_load_stream(&pat->contents, xref, fz_to_num(dict), fz_to_gen(dict));
  43.         if (error)
  44.         {
  45.                 pdf_remove_item(xref->store, pdf_drop_pattern, dict);
  46.                 pdf_drop_pattern(pat);
  47.                 return fz_rethrow(error, "cannot load pattern stream (%d %d R)", fz_to_num(dict), fz_to_gen(dict));
  48.         }
  49.  
  50.         *patp = pat;
  51.         return fz_okay;
  52. }
  53.  
  54. pdf_pattern *
  55. pdf_keep_pattern(pdf_pattern *pat)
  56. {
  57.         pat->refs ++;
  58.         return pat;
  59. }
  60.  
  61. void
  62. pdf_drop_pattern(pdf_pattern *pat)
  63. {
  64.         if (pat && --pat->refs == 0)
  65.         {
  66.                 if (pat->resources)
  67.                         fz_drop_obj(pat->resources);
  68.                 if (pat->contents)
  69.                         fz_drop_buffer(pat->contents);
  70.                 fz_free(pat);
  71.         }
  72. }
  73.