summaryrefslogtreecommitdiff
path: root/x11/efltk/patches/patch-src_images_Fl__Png.cpp
blob: 7a8a9b571c22c160c2bddafbbff0250431f55b95 (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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
$NetBSD: patch-src_images_Fl__Png.cpp,v 1.1 2011/05/21 08:18:16 obache Exp $

* fixes build with libpng>=1.5.

--- src/images/Fl_Png.cpp.orig	2003-07-13 15:07:26.000000000 +0000
+++ src/images/Fl_Png.cpp
@@ -18,17 +18,17 @@ bool setup_png_transformations(png_struc
 static void my_png_warning(png_structp png_ptr, png_const_charp message)
 {
     const char *name = "PNG: Unknown (WARNING!)";
-    if (png_ptr != NULL && png_ptr->error_ptr != NULL)
-        name = (const char *)png_ptr->error_ptr;
+    if (png_ptr != NULL && png_get_error_ptr(png_ptr) != NULL)
+        name = (const char *)png_get_error_ptr(png_ptr);
     Fl::warning("%s: libpng warning: %s", name, message);
 }
 
 static void my_png_error(png_structp png_ptr, png_const_charp message)
 {
     png_last_error = (volatile char*)"PNG: Unknown (ERROR!)";
-    if (png_ptr != NULL && png_ptr->error_ptr != NULL)
+    if (png_ptr != NULL && png_get_error_ptr(png_ptr) != NULL)
         png_last_error = (volatile char*)message;
-    longjmp(png_ptr->jmpbuf, 0);
+    png_longjmp(png_ptr, 0);
 }
 
 static bool png_is_valid_file(const char *filename)
@@ -56,7 +56,7 @@ static bool png_is_valid_mem(const uint8
 // PNG READ METHODS:
 
 static void read_data_fn(png_structp png_ptr, png_bytep d, png_size_t length) {
-    ((Fl_IO*)png_ptr->io_ptr)->read(d, length);
+    ((Fl_IO*)png_get_io_ptr(png_ptr))->read(d, length);
 }
 
 #define return_error() \
@@ -81,7 +81,7 @@ static bool png_create(Fl_IO &png_io, ui
     if(!end_info_ptr) { return_error(); }
 
     png_bytepp rows = 0;
-    if(setjmp(png_ptr->jmpbuf)) {
+    if(setjmp(png_jmpbuf(png_ptr))) {
         if(rows) free(rows);
         if(png_ptr) png_destroy_read_struct (&png_ptr, &info_ptr, &end_info_ptr);
         fputs((const char *)png_last_error, stderr);
@@ -94,6 +94,8 @@ static bool png_create(Fl_IO &png_io, ui
     int i=0;
     uint32 Rmask=0, Gmask=0, Bmask=0, Amask=0;
     png_color_16 *transv=0;
+    png_colorp png_palette;
+    int png_num_palette;
     Fl_Colormap *palette=0;
 
     png_set_error_fn(png_ptr, (png_voidp)0, my_png_error, my_png_warning);
@@ -108,15 +110,15 @@ static bool png_create(Fl_IO &png_io, ui
         Rmask = 0x000000FF;
         Gmask = 0x0000FF00;
         Bmask = 0x00FF0000;
-        Amask = (info_ptr->channels == 4) ? 0xFF000000 : 0;
+        Amask = (png_get_channels(png_ptr, info_ptr) == 4) ? 0xFF000000 : 0;
 #else
-        int s = (info_ptr->channels == 4) ? 0 : 8;
+        int s = (png_get_channels(png_ptr, info_ptr) == 4) ? 0 : 8;
         Rmask = 0xFF000000 >> s;
         Gmask = 0x00FF0000 >> s;
         Bmask = 0x0000FF00 >> s;
         Amask = 0x000000FF >> s;
 #endif
-        if(info_ptr->channels == 4)
+        if(png_get_channels(png_ptr, info_ptr) == 4)
             fmt.masktype = FL_MASK_ALPHA;
     }
 
@@ -144,13 +146,13 @@ static bool png_create(Fl_IO &png_io, ui
                 palette->colors[i].g = i;
                 palette->colors[i].b = i;
             }
-        } else if(info_ptr->num_palette > 0 )
+        } else if(png_get_PLTE(png_ptr, info_ptr, &png_palette, &png_num_palette) != 0 )
         {
-            palette->ncolors = info_ptr->num_palette;
-            for( i=0; i<info_ptr->num_palette; ++i ) {
-                palette->colors[i].b = info_ptr->palette[i].blue;
-                palette->colors[i].g = info_ptr->palette[i].green;
-                palette->colors[i].r = info_ptr->palette[i].red;
+            palette->ncolors = png_num_palette;
+            for( i=0; i<png_num_palette; ++i ) {
+                palette->colors[i].b = png_palette[i].blue;
+                palette->colors[i].g = png_palette[i].green;
+                palette->colors[i].r = png_palette[i].red;
             }
         }
     }
@@ -178,10 +180,11 @@ bool setup_png_transformations(png_struc
 {
     int bit_depth, interlace_type, compression_type, filter_type;
     int channels;
+    png_uint_32 w, h;
 
     /* Get the image info */
     png_get_IHDR(png_ptr, info_ptr,
-                 (ulong*)&width, (ulong*)&height,
+                 &w, &h,
                  &bit_depth,
                  &col_type,
                  &interlace_type,
@@ -191,10 +194,10 @@ bool setup_png_transformations(png_struc
     /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single
      * byte into separate bytes (useful for paletted and grayscale images).
      */
-    if (info_ptr->bit_depth < 8)
+    if (png_get_bit_depth(png_ptr, info_ptr) < 8)
         png_set_packing(png_ptr);
     /* tell libpng to strip 16 bit/color files down to 8 bits/color */
-    else if (info_ptr->bit_depth == 16)
+    else if (png_get_bit_depth(png_ptr, info_ptr) == 16)
         png_set_strip_16(png_ptr) ;
 
     /* scale greyscale values to the range 0..255 */
@@ -234,7 +237,7 @@ bool setup_png_transformations(png_struc
     /* Update the info the reflect our transformations */
     png_read_update_info(png_ptr, info_ptr);
     png_get_IHDR(png_ptr, info_ptr,
-                 (ulong*)&width, (ulong*)&height,
+                 &w, &h,
                  &bit_depth,
                  &col_type,
                  &interlace_type,
@@ -242,6 +245,8 @@ bool setup_png_transformations(png_struc
                  &filter_type);
     channels = png_get_channels(png_ptr, info_ptr);
     bitspp = bit_depth*channels;
+    width = w;
+    height = h;
 
     if(channels < 1 || channels > 4) {
         return false;
@@ -254,7 +259,7 @@ bool setup_png_transformations(png_struc
 // PNG WRITE METHODS:
 
 static void write_data_fn(png_structp png_ptr, png_bytep d, png_size_t length) {
-    ((Fl_IO*)png_ptr->io_ptr)->write(d, length);
+    ((Fl_IO*)png_get_io_ptr(png_ptr))->write(d, length);
     //png_io.write(d, length);
 }
 
@@ -318,7 +323,7 @@ static bool png_write(Fl_IO &png_io, con
 
     bool allocated = false;
     uint8 *wr_data = (uint8*)data;
-    if(setjmp(png_ptr->jmpbuf)) {
+    if(setjmp(png_jmpbuf(png_ptr))) {
         if(png_ptr) png_destroy_write_struct(&png_ptr, &info_ptr);
         if(allocated && wr_data) free(wr_data);
         return false;
@@ -373,7 +378,6 @@ static bool png_write(Fl_IO &png_io, con
      * PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST
      * currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. REQUIRED
      */
-    info_ptr->channels = wr_fmt->bytespp;
     png_set_IHDR(png_ptr, info_ptr, w, h,
                  (wr_fmt->bitspp==1) == 1 ? 1 : 8 /* per channel */,
 
@@ -385,9 +389,14 @@ static bool png_write(Fl_IO &png_io, con
                  PNG_FILTER_TYPE_BASE
                 );
 
-    info_ptr->sig_bit.red = 8;
-    info_ptr->sig_bit.green = 8;
-    info_ptr->sig_bit.blue = 8;
+    png_color_8 sig_bit;
+    sig_bit.red = 8;
+    sig_bit.green = 8;
+    sig_bit.blue = 8;
+    if(wr_fmt->Amask) {
+        sig_bit.alpha = 8;
+    }
+    png_set_sBIT(png_ptr, info_ptr, &sig_bit);
 #if !WORDS_BIGENDIAN
     if(wr_fmt->bitspp==1) png_set_packswap(png_ptr);
 #endif
@@ -418,10 +427,6 @@ static bool png_write(Fl_IO &png_io, con
         png_set_PLTE(png_ptr, info_ptr, palette, wr_fmt->palette->ncolors);
     }
 
-    if(wr_fmt->Amask) {
-        info_ptr->sig_bit.alpha = 8;
-    }
-
     /* Write the file header information.  REQUIRED */
     png_write_info(png_ptr, info_ptr);