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 "muxps.h"
3
 
4
static int
5
xps_decode_image(fz_pixmap **imagep, byte *buf, int len)
6
{
7
	int error;
8
 
9
	if (len < 8)
10
		return fz_throw("unknown image file format");
11
 
12
	if (buf[0] == 0xff && buf[1] == 0xd8)
13
	{
14
		error = xps_decode_jpeg(imagep, buf, len);
15
		if (error)
16
			return fz_rethrow(error, "cannot decode jpeg image");
17
	}
18
	else if (memcmp(buf, "\211PNG\r\n\032\n", 8) == 0)
19
	{
20
		error = xps_decode_png(imagep, buf, len);
21
		if (error)
22
			return fz_rethrow(error, "cannot decode png image");
23
	}
24
	else if (memcmp(buf, "II", 2) == 0 && buf[2] == 0xBC)
25
	{
26
		return fz_throw("JPEG-XR codec is not available");
27
	}
28
	else if (memcmp(buf, "MM", 2) == 0 || memcmp(buf, "II", 2) == 0)
29
	{
30
		error = xps_decode_tiff(imagep, buf, len);
31
		if (error)
32
			return fz_rethrow(error, "cannot decode TIFF image");
33
	}
34
	else
35
		return fz_throw("unknown image file format");
36
 
37
	return fz_okay;
38
}
39
 
40
static void
41
xps_paint_image_brush(xps_context *ctx, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict,
42
	xml_element *root, void *vimage)
43
{
44
	fz_pixmap *pixmap = vimage;
45
	float xs = pixmap->w * 96 / pixmap->xres;
46
	float ys = pixmap->h * 96 / pixmap->yres;
47
	fz_matrix im = fz_scale(xs, -ys);
48
	im.f = ys;
49
	ctm = fz_concat(im, ctm);
50
	fz_fill_image(ctx->dev, pixmap, ctm, ctx->opacity[ctx->opacity_top]);
51
}
52
 
53
static xps_part *
54
xps_find_image_brush_source_part(xps_context *ctx, char *base_uri, xml_element *root)
55
{
56
	char *image_source_att;
57
	char buf[1024];
58
	char partname[1024];
59
	char *image_name;
60
	char *profile_name;
61
	char *p;
62
 
63
	image_source_att = xml_att(root, "ImageSource");
64
	if (!image_source_att)
65
		return NULL;
66
 
67
	/* "{ColorConvertedBitmap /Resources/Image.tiff /Resources/Profile.icc}" */
68
	if (strstr(image_source_att, "{ColorConvertedBitmap") == image_source_att)
69
	{
70
		image_name = NULL;
71
		profile_name = NULL;
72
 
73
		fz_strlcpy(buf, image_source_att, sizeof buf);
74
		p = strchr(buf, ' ');
75
		if (p)
76
		{
77
			image_name = p + 1;
78
			p = strchr(p + 1, ' ');
79
			if (p)
80
			{
81
				*p = 0;
82
				profile_name = p + 1;
83
				p = strchr(p + 1, '}');
84
				if (p)
85
					*p = 0;
86
			}
87
		}
88
	}
89
	else
90
	{
91
		image_name = image_source_att;
92
		profile_name = NULL;
93
	}
94
 
95
	if (!image_name)
96
		return NULL;
97
 
98
	xps_absolute_path(partname, base_uri, image_name, sizeof partname);
99
 
100
	return xps_read_part(ctx, partname);
101
}
102
 
103
void
104
xps_parse_image_brush(xps_context *ctx, fz_matrix ctm, fz_rect area,
105
	char *base_uri, xps_resource *dict, xml_element *root)
106
{
107
	xps_part *part;
108
	fz_pixmap *image;
109
	int code;
110
 
111
	part = xps_find_image_brush_source_part(ctx, base_uri, root);
112
	if (!part) {
113
		fz_warn("cannot find image source");
114
		return;
115
	}
116
 
117
	code = xps_decode_image(&image, part->data, part->size);
118
	if (code < 0) {
119
		xps_free_part(ctx, part);
120
		fz_catch(-1, "cannot decode image resource");
121
		return;
122
	}
123
 
124
	xps_parse_tiling_brush(ctx, ctm, area, base_uri, dict, root, xps_paint_image_brush, image);
125
 
126
	fz_drop_pixmap(image);
127
	xps_free_part(ctx, part);
128
}