summarylogtreecommitdiffstats
path: root/png15.patch
blob: 616c3b2cdf2695e76b39cec3a61215a1d4617ec2 (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
Index: src/engine/video/image.cpp
===================================================================
--- src/engine/video/image.cpp	(revision 2040)
+++ src/engine/video/image.cpp	(working copy)
@@ -684,9 +684,9 @@
 	png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_PACKING | PNG_TRANSFORM_EXPAND, NULL);
 
 	// grab the relevant data...
-	cols = info_ptr->width;
-	rows = info_ptr->height;
-	bpp = info_ptr->channels * 8;
+	cols = png_get_image_width(png_ptr, info_ptr);
+	rows = png_get_image_height(png_ptr, info_ptr);
+	bpp = png_get_channels(png_ptr, info_ptr) * 8;
 
 	// and clean up.
 	png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
Index: src/engine/video/image_base.cpp
===================================================================
--- src/engine/video/image_base.cpp	(revision 2040)
+++ src/engine/video/image_base.cpp	(working copy)
@@ -261,9 +261,9 @@
 	uint8** row_pointers = png_get_rows(png_ptr, info_ptr);
 
 	// copy metadata
-	width = info_ptr->width;
-	height = info_ptr->height;
-	pixels = malloc(info_ptr->width * info_ptr->height * 4);
+	width = png_get_image_width(png_ptr, info_ptr);
+	height = png_get_image_height(png_ptr, info_ptr);
+	pixels = malloc(width * height * 4);
 
 	// check that we were able to allocate enough memory for the PNG
 	if (pixels == NULL) {
@@ -276,18 +276,21 @@
 	// convert the damn thing so that it works in our format
 	// this is mostly just byteswapping and adding extra data - we want everything in four channels
 	// for the moment, anyway
-	uint32 bpp = info_ptr->channels;
+	uint32 bpp = png_get_channels(png_ptr, info_ptr);
 	uint8* img_pixel = NULL;
 	uint8* dst_pixel = NULL;
 
-	if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) {
+	if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_PALETTE) {
 		// colours come from a palette - for this colour type, we have to look up the colour from the palette
+		png_colorp palette;
+		int num_palette;
+		png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette);
 		png_color c;
-		for (uint32 y = 0; y < info_ptr->height; y++) {
-			for (uint32 x = 0; x < info_ptr->width; x++) {
+		for (uint32 y = 0; y < height; y++) {
+			for (uint32 x = 0; x < width; x++) {
 				img_pixel = row_pointers[y] + (x * bpp);
-				dst_pixel = ((uint8*)pixels) + ((y * info_ptr->width) + x) * 4;
-				c = info_ptr->palette[img_pixel[0]];
+				dst_pixel = ((uint8*)pixels) + ((y * width) + x) * 4;
+				c = palette[img_pixel[0]];
 
 				dst_pixel[0] = c.red;
 				dst_pixel[1] = c.green;
@@ -297,10 +300,10 @@
 		}
 	}
 	else if (bpp == 1) {
-		for (uint32 y = 0; y < info_ptr->height; y++) {
-			for (uint32 x = 0; x < info_ptr->width; x++) {
+		for (uint32 y = 0; y < height; y++) {
+			for (uint32 x = 0; x < width; x++) {
 				img_pixel = row_pointers[y] + (x * bpp);
-				dst_pixel = ((uint8*)pixels) + ((y * info_ptr->width) + x) * 4;
+				dst_pixel = ((uint8*)pixels) + ((y * width) + x) * 4;
 				dst_pixel[0] = img_pixel[0];
 				dst_pixel[1] = img_pixel[0];
 				dst_pixel[2] = img_pixel[0];
@@ -309,10 +312,10 @@
 		}
 	}
 	else if (bpp == 3) {
-		for (uint32 y = 0; y < info_ptr->height; y++) {
-			for (uint32 x = 0; x < info_ptr->width; x++) {
+		for (uint32 y = 0; y < height; y++) {
+			for (uint32 x = 0; x < width; x++) {
 				img_pixel = row_pointers[y] + (x * bpp);
-				dst_pixel = ((uint8*)pixels) + ((y * info_ptr->width) + x) * 4;
+				dst_pixel = ((uint8*)pixels) + ((y * width) + x) * 4;
 				dst_pixel[0] = img_pixel[0];
 				dst_pixel[1] = img_pixel[1];
 				dst_pixel[2] = img_pixel[2];
@@ -321,10 +324,10 @@
 		}
 	}
 	else if (bpp == 4) {
-		for (uint32 y = 0; y < info_ptr->height; y++) {
-			for (uint32 x = 0; x < info_ptr->width; x++) {
+		for (uint32 y = 0; y < height; y++) {
+			for (uint32 x = 0; x < width; x++) {
 				img_pixel = row_pointers[y] + (x * bpp);
-				dst_pixel = ((uint8*)pixels) + ((y * info_ptr->width) + x) * 4;
+				dst_pixel = ((uint8*)pixels) + ((y * width) + x) * 4;
 				dst_pixel[0] = img_pixel[0];
 				dst_pixel[1] = img_pixel[1];
 				dst_pixel[2] = img_pixel[2];