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
|
$NetBSD: patch-ab,v 1.6 2011/01/25 18:38:16 drochner Exp $
Fix build with png-1.5. From John Bowler.
--- WebCore/platform/image-decoders/png/PNGImageDecoder.cpp.orig 2010-12-28 12:28:51.000000000 +0000
+++ WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
@@ -60,7 +60,11 @@ const unsigned long cMaxPNGSize = 100000
// Called if the decoding of the image fails.
static void PNGAPI decodingFailed(png_structp png, png_const_charp)
{
+#if (PNG_LIBPNG_VER < 10500)
longjmp(JMPBUF(png), 1);
+#else
+ png_longjmp(png, 1);
+#endif
}
// Callbacks given to the read struct. The first is for warnings (we want to
@@ -216,18 +220,26 @@ void PNGImageDecoder::headerAvailable()
{
png_structp png = m_reader->pngPtr();
png_infop info = m_reader->infoPtr();
- png_uint_32 width = png->width;
- png_uint_32 height = png->height;
+ png_uint_32 width = png_get_image_width(png, info);
+ png_uint_32 height = png_get_image_height(png, info);
// Protect against large images.
- if (png->width > cMaxPNGSize || png->height > cMaxPNGSize) {
+ if (width > cMaxPNGSize || height > cMaxPNGSize) {
+#if (PNG_LIBPNG_VER < 10500)
longjmp(JMPBUF(png), 1);
+#else
+ png_longjmp(png, 1);
+#endif
return;
}
// We can fill in the size now that the header is available.
if (!setSize(width, height)) {
+#if (PNG_LIBPNG_VER < 10500)
longjmp(JMPBUF(png), 1);
+#else
+ png_longjmp(png, 1);
+#endif
return;
}
@@ -277,8 +289,7 @@ void PNGImageDecoder::headerAvailable()
if (m_reader->decodingSizeOnly()) {
// If we only needed the size, halt the reader.
- m_reader->setReadOffset(m_reader->currentBufferSize() - png->buffer_size);
- png->buffer_size = 0;
+ m_reader->setReadOffset(m_reader->currentBufferSize() - png_process_data_pause(png, 0/*do not save the data*/));
}
}
@@ -291,7 +302,11 @@ void PNGImageDecoder::rowAvailable(unsig
RGBA32Buffer& buffer = m_frameBufferCache[0];
if (buffer.status() == RGBA32Buffer::FrameEmpty) {
if (!buffer.setSize(scaledSize().width(), scaledSize().height())) {
+#if (PNG_LIBPNG_VER < 10500)
longjmp(JMPBUF(m_reader->pngPtr()), 1);
+#else
+ png_longjmp(m_reader->pngPtr(), 1);
+#endif
return;
}
buffer.setStatus(RGBA32Buffer::FramePartial);
@@ -300,7 +315,8 @@ void PNGImageDecoder::rowAvailable(unsig
// For PNGs, the frame always fills the entire image.
buffer.setRect(IntRect(IntPoint(), size()));
- if (m_reader->pngPtr()->interlaced)
+ if (png_get_interlace_type(m_reader->pngPtr(), m_reader->infoPtr())
+ != PNG_INTERLACE_NONE)
m_reader->createInterlaceBuffer((m_reader->hasAlpha() ? 4 : 3) * size().width() * size().height());
}
|