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_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
}