Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4680 right-hear 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
}