summaryrefslogtreecommitdiff
path: root/package/DirectFB/patches/patch-interfaces_IDirectFBImageProvider_idirectfbimageprovider_png_c
blob: b35c6137ebbbcd7c9a43b59df27fdf225cc5e9f3 (plain)
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;