1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
--- DirectFB-1.4.11.orig/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c 2010-10-31 09:49:49.000000000 +0100
+++ DirectFB-1.4.11/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c 2011-03-29 10:57:18.433069010 +0200
@@ -207,7 +207,7 @@ Construct( IDirectFBImageProvider *thiz,
if (!data->png_ptr)
goto error;
- if (setjmp( data->png_ptr->jmpbuf )) {
+ if (png_jmpbuf( data->png_ptr )) {
D_ERROR( "ImageProvider/PNG: Error reading header!\n" );
goto error;
}
@@ -292,7 +292,7 @@ IDirectFBImageProvider_PNG_RenderTo( IDi
rect = dst_data->area.wanted;
}
- if (setjmp( data->png_ptr->jmpbuf )) {
+ if (png_jmpbuf( data->png_ptr )) {
D_ERROR( "ImageProvider/PNG: Error during decoding!\n" );
if (data->stage < STAGE_IMAGE)
@@ -327,6 +327,7 @@ IDirectFBImageProvider_PNG_RenderTo( IDi
}
else {
CoreSurfaceBufferLock lock;
+ png_byte bit_depth = png_get_bit_depth( data->png_ptr, data->info_ptr );
ret = dfb_surface_lock_buffer( dst_surface, CSBR_BACK, CSAID_CPU, CSAF_WRITE, &lock );
if (ret)
@@ -334,7 +335,7 @@ IDirectFBImageProvider_PNG_RenderTo( IDi
switch (data->color_type) {
case PNG_COLOR_TYPE_PALETTE:
- if (dst_surface->config.format == DSPF_LUT8 && data->info_ptr->bit_depth == 8) {
+ if (dst_surface->config.format == DSPF_LUT8 && bit_depth == 8) {
/*
* Special indexed PNG to LUT8 loading.
*/
@@ -377,7 +378,7 @@ IDirectFBImageProvider_PNG_RenderTo( IDi
}
else {
if (data->color_type == PNG_COLOR_TYPE_GRAY) {
- int num = 1 << data->info_ptr->bit_depth;
+ int num = 1 << bit_depth;
for (x=0; x<num; x++) {
int value = x * 255 / (num - 1);
@@ -386,7 +387,7 @@ IDirectFBImageProvider_PNG_RenderTo( IDi
}
}
- switch (data->info_ptr->bit_depth) {
+ switch (bit_depth) {
case 8:
for (y=0; y<data->height; y++) {
u8 *S = data->image + data->pitch * y;
@@ -441,7 +442,7 @@ IDirectFBImageProvider_PNG_RenderTo( IDi
default:
D_ERROR( "ImageProvider/PNG: Unsupported indexed bit depth %d!\n",
- data->info_ptr->bit_depth );
+ bit_depth );
}
dfb_scale_linear_32( image_argb, data->width, data->height,
@@ -594,16 +595,26 @@ png_info_callback( png_structp png_read_
NULL, NULL, NULL );
if (png_get_valid( data->png_ptr, data->info_ptr, PNG_INFO_tRNS )) {
+ png_bytep trans;
+ png_color_16p trans_color;
+ int num_trans;
+
+ png_get_tRNS( data->png_ptr, data->info_ptr, &trans, &num_trans, &trans_color );
+
data->color_keyed = true;
/* generate color key based on palette... */
if (data->color_type == PNG_COLOR_TYPE_PALETTE) {
u32 key;
- png_colorp palette = data->info_ptr->palette;
- png_bytep trans = data->info_ptr->trans_alpha;
- int num_colors = MIN( MAXCOLORMAPSIZE,
- data->info_ptr->num_palette );
- u8 cmap[3][num_colors];
+ png_colorp palette;
+ int num_colors;
+ u8 *cmap[3];
+
+ png_get_PLTE( data->png_ptr, data->info_ptr, &palette, &num_colors );
+ num_colors = MIN( MAXCOLORMAPSIZE, num_colors );
+ cmap[0] = alloca (num_colors);
+ cmap[1] = alloca (num_colors);
+ cmap[2] = alloca (num_colors);
for (i=0; i<num_colors; i++) {
cmap[0][i] = palette[i].red;
@@ -613,7 +624,7 @@ png_info_callback( png_structp png_read_
key = FindColorKey( num_colors, &cmap[0][0] );
- for (i=0; i<data->info_ptr->num_trans; i++) {
+ for (i=0; i<num_trans; i++) {
if (!trans[i]) {
palette[i].red = (key & 0xff0000) >> 16;
palette[i].green = (key & 0x00ff00) >> 8;
@@ -625,20 +636,23 @@ png_info_callback( png_structp png_read_
}
else {
/* ...or based on trans rgb value */
- png_color_16p trans = &data->info_ptr->trans_color;
-
- data->color_key = (((trans->red & 0xff00) << 8) |
- ((trans->green & 0xff00)) |
- ((trans->blue & 0xff00) >> 8));
+ data->color_key = (((trans_color->red & 0xff00) << 8) |
+ ((trans_color->green & 0xff00)) |
+ ((trans_color->blue & 0xff00) >> 8));
}
}
switch (data->color_type) {
case PNG_COLOR_TYPE_PALETTE: {
- png_colorp palette = data->info_ptr->palette;
- png_bytep trans = data->info_ptr->trans_alpha;
- int num_trans = data->info_ptr->num_trans;
- int num_colors = MIN( MAXCOLORMAPSIZE, data->info_ptr->num_palette );
+ png_colorp palette;
+ png_bytep trans;
+ png_color_16p trans_color;
+ int num_trans;
+ int num_colors;
+
+ png_get_PLTE( data->png_ptr, data->info_ptr, &palette, &num_colors );
+ num_colors = MIN( MAXCOLORMAPSIZE, num_colors );
+ png_get_tRNS( data->png_ptr, data->info_ptr, &trans, &num_trans, &trans_color );
for (i=0; i<num_colors; i++) {
data->colors[i].a = (i < num_trans) ? trans[i] : 0xff;
|