Land complete PNG support for Win32 (yay).
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Feb 2006 10:50:52 +0000 (10:50 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Feb 2006 10:50:52 +0000 (10:50 +0000)
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@12656 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/image-decoders/ImageDecoder.h
WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp
WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
WebCore/platform/image-decoders/png/PNGImageDecoder.h
WebCore/platform/image-decoders/png/mozpngconf.h

index 81b761e5335c5196652dbea0f23d36761a79b7f6..d527033f4c471dab77c66d02e1bcc838a534f8e8 100644 (file)
@@ -1,3 +1,51 @@
+2006-02-08  Dave Hyatt <hyatt@apple.com>
+
+        Implement support for PNGs on Win32.  Includes support for
+        interlacing and transparency.
+
+        Also optimized the GIF loop that sets the RGBA values to
+        increment the pointer through the loop instead of doing multiplies
+        and adds from the base every time.
+
+        Reviewed by mjs
+
+        * platform/image-decoders/ImageDecoder.h:
+        (WebCore::RGBA32Buffer::setRGBA):
+        * platform/image-decoders/gif/GIFImageDecoder.cpp:
+        (WebCore::GIFImageDecoder::haveDecodedRow):
+        * platform/image-decoders/png/PNGImageDecoder.cpp:
+        (WebCore::PNGImageReader::PNGImageReader):
+        (WebCore::PNGImageReader::~PNGImageReader):
+        (WebCore::PNGImageReader::close):
+        (WebCore::PNGImageReader::decode):
+        (WebCore::PNGImageReader::decodingSizeOnly):
+        (WebCore::PNGImageReader::pngPtr):
+        (WebCore::PNGImageReader::infoPtr):
+        (WebCore::PNGImageReader::interlaceBuffer):
+        (WebCore::PNGImageReader::hasAlpha):
+        (WebCore::PNGImageReader::setReadOffset):
+        (WebCore::PNGImageReader::setHasAlpha):
+        (WebCore::PNGImageReader::createInterlaceBuffer):
+        (WebCore::PNGImageDecoder::PNGImageDecoder):
+        (WebCore::PNGImageDecoder::~PNGImageDecoder):
+        (WebCore::PNGImageDecoder::setData):
+        (WebCore::PNGImageDecoder::isSizeAvailable):
+        (WebCore::PNGImageDecoder::frameBufferAtIndex):
+        (WebCore::PNGImageDecoder::decode):
+        (WebCore::decodingFailed):
+        (WebCore::decodingWarning):
+        (WebCore::headerAvailable):
+        (WebCore::PNGImageDecoder::headerAvailable):
+        (WebCore::rowAvailable):
+        (WebCore::PNGImageDecoder::rowAvailable):
+        (WebCore::pngComplete):
+        (WebCore::PNGImageDecoder::pngComplete):
+        * platform/image-decoders/png/PNGImageDecoder.h:
+        (WebCore::PNGImageDecoder::setFailed):
+        (WebCore::PNGImageDecoder::reader):
+        (WebCore::PNGImageDecoder::decodingFailed):
+        * platform/image-decoders/png/mozpngconf.h:
+
 2006-02-07  Maciej Stachowiak  <mjs@apple.com>
 
         Rubber stamped by Hyatt.
index 895bb1966dd754574916d8b9d2c2adda6fb361cd..b570bc4660156c2f930f4812fdad706e8635ccd3 100755 (executable)
@@ -56,10 +56,20 @@ public:
     unsigned duration() const { return m_duration; }
     bool includeInNextFrame() const { return m_includeInNextFrame; }
 
-    void setRGBA(unsigned pos, unsigned r, unsigned b, unsigned g, unsigned a)
+    static void setRGBA(unsigned& pos, unsigned r, unsigned b, unsigned g, unsigned a)
     {
-        unsigned rgba = (a << 24 | r << 16 | g << 8 | b);
-        m_bytes[pos] = rgba;
+        // We store this data pre-multiplied.
+        if (a == 0)
+            pos = 0;
+        else {
+            if (a < 255) {
+                float alphaPercent = a / 255.0f;
+                r *= alphaPercent;
+                g *= alphaPercent;
+                b *= alphaPercent;
+            }
+            pos = (a << 24 | r << 16 | g << 8 | b);
+        }
     }
 
 private:
index 026badce52bfec468507cd0a91336bb050e451e7..279973c826cc862b0da5b9200b6bb9e58588c907 100755 (executable)
@@ -198,10 +198,10 @@ void GIFImageDecoder::decodingHalted(unsigned bytesLeft)
 }
 
 void GIFImageDecoder::haveDecodedRow(unsigned frameIndex,
-                                      unsigned char* rowBuffer,   // Pointer to single scanline temporary buffer
-                                      unsigned char* rowEnd,
-                                      unsigned rowNumber,  // The row index
-                                      unsigned repeatCount) // How many times to repeat the row
+                                     unsigned char* rowBuffer,   // Pointer to single scanline temporary buffer
+                                     unsigned char* rowEnd,
+                                     unsigned rowNumber,  // The row index
+                                     unsigned repeatCount) // How many times to repeat the row
 {
     // Resize to the width and height of the image.
     RGBA32Buffer& buffer = m_frameBufferCache[frameIndex];
@@ -239,7 +239,8 @@ void GIFImageDecoder::haveDecodedRow(unsigned frameIndex,
     // sub-rectangle.  This means that if the GIF frame's sub-rectangle is (x,y,w,h) then row 0 is really row
     // y, and each row goes from x to x+w.
     unsigned dstPos = (m_impl->frameYOffset() + rowNumber) * m_size.width() + m_impl->frameXOffset();
-    unsigned currDstPos = dstPos;
+    unsigned* dst = buffer.bytes().data() + dstPos;
+    unsigned* currDst = dst;
     unsigned char* currentRowByte = rowBuffer;
     
     bool hasAlpha = m_impl->isTransparent(); 
@@ -249,12 +250,25 @@ void GIFImageDecoder::haveDecodedRow(unsigned frameIndex,
             unsigned red = colorMap[colorIndex];
             unsigned green = colorMap[colorIndex + 1];
             unsigned blue = colorMap[colorIndex + 2];
-            for (unsigned i = 0; i < repeatCount; i++)
-                buffer.setRGBA(currDstPos + m_size.width() * i, red, blue, green, 255);
+            RGBA32Buffer::setRGBA(*currDst, red, blue, green, 255);
         }
-        currDstPos++;
+        currDst++;
         currentRowByte++;
     }
+
+    if (repeatCount > 1) {
+        // Copy the row |repeatCount|-1 times.
+        unsigned size = (currDst - dst) * sizeof(unsigned);
+        unsigned width = m_size.width();
+        unsigned* end = buffer.bytes().data() + width * m_size.height();
+        currDst = dst + width;
+        for (unsigned i = 1; i < repeatCount; i++) {
+            if (currDst + size > end) // Protect against a buffer overrun from a bogus repeatCount.
+                break;
+            memcpy(currDst, dst, size);
+            currDst += width;
+        }
+    }
 }   
 
 void GIFImageDecoder::frameComplete(unsigned frameIndex, unsigned frameDuration, bool includeInNextFrame)
index 9791419e0360b5496bccc99860a26f5ec2770974..db91b600820af140ecfa3332066fc9421cfc5956 100755 (executable)
 /*
- * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Apple Computer, Inc.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
+ * Portions are Copyright (C) 2001 mozilla.org
  *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ * Other contributors:
+ *   Stuart Parmenter <pavlov@mozilla.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Alternatively, the contents of this file may be used under the terms
+ * of either the Mozilla Public License Version 1.1, found at
+ * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public
+ * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html
+ * (the "GPL"), in which case the provisions of the MPL or the GPL are
+ * applicable instead of those above.  If you wish to allow use of your
+ * version of this file only under the terms of one of those two
+ * licenses (the MPL or the GPL) and not to allow others to use your
+ * version of this file under the LGPL, indicate your decision by
+ * deletingthe provisions above and replace them with the notice and
+ * other provisions required by the MPL or the GPL, as the case may be.
+ * If you do not delete the provisions above, a recipient may use your
+ * version of this file under any of the LGPL, the MPL or the GPL.
  */
 
 #include "PNGImageDecoder.h"
+#include "png.h"
 
 namespace WebCore {
 
-class PNGImageDecoderPrivate
+// Gamma constants.
+const double cMaxGamma = 21474.83;
+const double cDefaultGamma = 2.2;
+const double cInverseGamma = 0.45455;
+
+// Protect against large PNGs. See Mozilla's bug #251381 for more info.
+const long cMaxPNGSize = 1000000L;
+
+// Called if the decoding of the image fails.
+static void PNGAPI decodingFailed(png_structp png_ptr, png_const_charp error_msg);
+
+// Callbacks given to the read struct.  The first is for warnings (we want to treat a particular warning
+// as an error, which is why we have to register this callback.
+static void PNGAPI decodingWarning(png_structp png_ptr, png_const_charp warning_msg);
+
+// Called when we have obtained the header information (including the size).
+static void PNGAPI headerAvailable(png_structp png_ptr, png_infop info_ptr);
+
+// Called when a row is ready.
+static void PNGAPI rowAvailable(png_structp png_ptr, png_bytep new_row,
+                                png_uint_32 row_num, int pass);
+
+// Called when we have completely finished decoding the image.
+static void PNGAPI pngComplete(png_structp png_ptr, png_infop info_ptr);
+
+class PNGImageReader
 {
 public:
-    PNGImageDecoderPrivate()
-        : m_readOffset(0)
+    PNGImageReader(PNGImageDecoder* decoder)
+    : m_readOffset(0), m_decodingSizeOnly(false), m_interlaceBuffer(0), m_hasAlpha(0)
     {
+        m_png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, decodingFailed, decodingWarning);
+        m_info = png_create_info_struct(m_png);
+        png_set_progressive_read_fn(m_png, decoder, headerAvailable, rowAvailable, pngComplete);
     }
 
-    ~PNGImageDecoderPrivate()
+    ~PNGImageReader()
     {
+        close();
+    }
+
+    void close() {
+        if (m_png && m_info)
+            png_destroy_read_struct(&m_png, &m_info, 0);
+        delete []m_interlaceBuffer;
+        m_readOffset = 0;
     }
 
-    bool decode(const ByteArray& data, bool sizeOnly)
+    void decode(const ByteArray& data, bool sizeOnly)
     {
-        // FIXME: Implement
-        return false;
+        m_decodingSizeOnly = sizeOnly;
+
+        // We need to do the setjmp here. Otherwise bad things will happen
+        if (setjmp(m_png->jmpbuf)) {
+            close();
+            return;
+        }
+
+        // Go ahead and assume we consumed all the data.  If we consume less, the
+        // callback will adjust our read offset accordingly.  Do not attempt to adjust the
+        // offset after png_process_data returns.
+        unsigned offset = m_readOffset;
+        unsigned remaining = data.size() - m_readOffset;
+        m_readOffset = data.size();
+        png_process_data(m_png, m_info, (png_bytep)(data.data()) + offset, remaining);
+    }
+
+    bool decodingSizeOnly() const { return m_decodingSizeOnly; }
+    png_structp pngPtr() const { return m_png; }
+    png_infop infoPtr() const { return m_info; }
+    png_bytep interlaceBuffer() const { return m_interlaceBuffer; }
+    bool hasAlpha() const { return m_hasAlpha; }
+
+    void setReadOffset(unsigned offset) { m_readOffset = offset; }
+    void setHasAlpha(bool b) { m_hasAlpha = b; }
+
+    void createInterlaceBuffer(int size) {
+        m_interlaceBuffer = new png_byte[size];
     }
 
 private:
     unsigned m_readOffset;
+    bool m_decodingSizeOnly;
+    png_structp m_png;
+    png_infop m_info;
+    png_bytep m_interlaceBuffer;
+    bool m_hasAlpha;
 };
 
 PNGImageDecoder::PNGImageDecoder()
 : m_sizeAvailable(false)
 , m_failed(false)
-, m_impl(0)
+, m_reader(0)
 {}
 
 PNGImageDecoder::~PNGImageDecoder()
 {
-    delete m_impl;
+    delete m_reader;
 }
 
 // Take the data and store it.
@@ -70,15 +150,15 @@ void PNGImageDecoder::setData(const ByteArray& data, bool allDataReceived)
     ImageDecoder::setData(data, allDataReceived);
 
     // Create the PNG reader.
-    if (!m_impl && !m_failed)
-        m_impl = new PNGImageDecoderPrivate();
+    if (!m_reader && !m_failed)
+        m_reader = new PNGImageReader(this);
 }
 
 // Whether or not the size information has been decoded yet.
 bool PNGImageDecoder::isSizeAvailable() const
 {
     // If we have pending data to decode, send it to the PNG reader now.
-    if (!m_sizeAvailable && m_impl) {
+    if (!m_sizeAvailable && m_reader) {
         if (m_failed)
             return false;
 
@@ -106,7 +186,7 @@ RGBA32Buffer PNGImageDecoder::frameBufferAtIndex(size_t index)
         m_frameBufferCache.resize(1);
 
     const RGBA32Buffer& frame = m_frameBufferCache[0];
-    if (frame.status() != RGBA32Buffer::FrameComplete && m_impl)
+    if (frame.status() != RGBA32Buffer::FrameComplete && m_reader)
         // Decode this frame.
         decode();
 
@@ -119,12 +199,204 @@ void PNGImageDecoder::decode(bool sizeOnly) const
     if (m_failed)
         return;
 
-    m_failed = !m_impl->decode(m_data, sizeOnly);
+    m_reader->decode(m_data, sizeOnly);
+    
+    if (m_failed || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete)) {
+        delete m_reader;
+        m_reader = 0;
+    }
+}
+
+void decodingFailed(png_structp png, png_const_charp errorMsg)
+{
+    static_cast<PNGImageDecoder*>(png_get_progressive_ptr(png))->decodingFailed();
+    longjmp(png->jmpbuf, 1);
+}
+
+void decodingWarning(png_structp png, png_const_charp warningMsg)
+{
+  // Mozilla did this, so we will too.
+  // Convert a tRNS warning to be an error (documented in bugzilla.mozilla.org bug #251381)
+  if (!strncmp(warningMsg, "Missing PLTE before tRNS", 24))
+      png_error(png, warningMsg);
+}
+
+void headerAvailable(png_structp png, png_infop info)
+{
+    static_cast<PNGImageDecoder*>(png_get_progressive_ptr(png))->headerAvailable();
+}
+
+void PNGImageDecoder::headerAvailable()
+{
+    png_structp png = reader()->pngPtr();
+    png_infop info = reader()->infoPtr();
+    png_uint_32 width = png->width;
+    png_uint_32 height = png->height;
+    
+    // Protect against large images.
+    if (png->width > cMaxPNGSize || png->height > cMaxPNGSize) {
+        m_failed = true;
+        longjmp(png->jmpbuf, 1);
+        return;
+    }
+    
+    // We can fill in the size now that the header is available.
+    if (!m_sizeAvailable) {
+        m_sizeAvailable = true;
+        m_size = IntSize(width, height);
+    }
+
+    int bitDepth, colorType, interlaceType, compressionType, filterType, channels;
+    png_get_IHDR(png, info, &width, &height, &bitDepth, &colorType,
+                 &interlaceType, &compressionType, &filterType);
+
+    // The options we set here match what Mozilla does.
+
+    // Expand to ensure we use 24-bit for RGB and 32-bit for RGBA.
+    if (colorType == PNG_COLOR_TYPE_PALETTE ||
+        (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8))
+        png_set_expand(png);
+    
+    png_bytep trns = 0;
+    int trnsCount = 0;
+    if (png_get_valid(png, info, PNG_INFO_tRNS)) {
+        png_get_tRNS(png, info, &trns, &trnsCount, 0);
+        png_set_expand(png);
+    }
+
+    if (bitDepth == 16)
+        png_set_strip_16(png);
+
+    if (colorType == PNG_COLOR_TYPE_GRAY ||
+        colorType == PNG_COLOR_TYPE_GRAY_ALPHA)
+        png_set_gray_to_rgb(png);
+
+    // Deal with gamma and keep it under our control.
+    double gamma;
+    if (png_get_gAMA(png, info, &gamma)) {
+        if ((gamma <= 0.0) || (gamma > cMaxGamma)) {
+            gamma = cInverseGamma;
+            png_set_gAMA(png, info, gamma);
+        }
+        png_set_gamma(png, cDefaultGamma, gamma);
+    }
+    else
+        png_set_gamma(png, cDefaultGamma, cInverseGamma);
+
+    // Tell libpng to send us rows for interlaced pngs.
+    if (interlaceType == PNG_INTERLACE_ADAM7)
+        png_set_interlace_handling(png);
+
+    // Update our info now
+    png_read_update_info(png, info);
+    channels = png_get_channels(png, info);
+    assert(channels == 3 || channels == 4);
+
+    reader()->setHasAlpha(channels == 4);
+
+    if (reader()->decodingSizeOnly()) {
+        // If we only needed the size, halt the reader.     
+        reader()->setReadOffset(m_data.size() - png->buffer_size);
+        png->buffer_size = 0;
+    }
+}
+
+void rowAvailable(png_structp png, png_bytep rowBuffer,
+                  png_uint_32 rowIndex, int interlacePass)
+{
+    static_cast<PNGImageDecoder*>(png_get_progressive_ptr(png))->rowAvailable(rowBuffer, rowIndex, interlacePass);
+}
+
+void PNGImageDecoder::rowAvailable(unsigned char* rowBuffer, unsigned int rowIndex, int interlacePass)
+{
+    if (m_frameBufferCache.isEmpty())
+        return;
+
+    // Resize to the width and height of the image.
+    RGBA32Buffer& buffer = m_frameBufferCache[0];
+    if (buffer.status() == RGBA32Buffer::FrameEmpty) {
+        // Let's resize our buffer now to the correct width/height.
+        RGBA32Array& bytes = buffer.bytes();
+        bytes.resize(m_size.width() * m_size.height());
+        bytes.fill(0);
+
+        // Update our status to be partially complete.
+        buffer.setStatus(RGBA32Buffer::FramePartial);
+
+        if (reader()->pngPtr()->interlaced)
+            reader()->createInterlaceBuffer((reader()->hasAlpha() ? 4 : 3) * m_size.width() * m_size.height());
+    }
+
+    if (rowBuffer == 0)
+        return;
+
+   /* libpng comments (pasted in here to explain what follows)
+    *
+    * this function is called for every row in the image.  If the
+    * image is interlacing, and you turned on the interlace handler,
+    * this function will be called for every row in every pass.
+    * Some of these rows will not be changed from the previous pass.
+    * When the row is not changed, the new_row variable will be NULL.
+    * The rows and passes are called in order, so you don't really
+    * need the row_num and pass, but I'm supplying them because it
+    * may make your life easier.
+    *
+    * For the non-NULL rows of interlaced images, you must call
+    * png_progressive_combine_row() passing in the row and the
+    * old row.  You can call this function for NULL rows (it will
+    * just return) and for non-interlaced images (it just does the
+    * memcpy for you) if it will make the code easier.  Thus, you
+    * can just do this for all cases:
+    *
+    *    png_progressive_combine_row(png_ptr, old_row, new_row);
+    *
+    * where old_row is what was displayed for previous rows.  Note
+    * that the first pass (pass == 0 really) will completely cover
+    * the old row, so the rows do not have to be initialized.  After
+    * the first pass (and only for interlaced images), you will have
+    * to pass the current row, and the function will combine the
+    * old row and the new row.
+    */
     
-    if (m_failed) {
-        delete m_impl;
-        m_impl = 0;
+    png_structp png = reader()->pngPtr();
+    bool hasAlpha = reader()->hasAlpha();
+    unsigned colorChannels = hasAlpha ? 4 : 3;
+    png_bytep row;
+    png_bytep interlaceBuffer = reader()->interlaceBuffer();
+    if (interlaceBuffer) {
+        row = interlaceBuffer + (rowIndex * colorChannels * m_size.width());
+        png_progressive_combine_row(png, row, rowBuffer);
+    }
+    else
+        row = rowBuffer;
+
+    // Copy the data into our buffer.
+    int width = m_size.width();
+    unsigned* dst = buffer.bytes().data() + rowIndex * width;
+    for (unsigned i = 0; i < width; i++) {
+        unsigned red = *row++;
+        unsigned green = *row++;
+        unsigned blue = *row++;
+        unsigned alpha = (hasAlpha ? *row++ : 255);
+        RGBA32Buffer::setRGBA(*dst++, red, blue, green, alpha);
     }
 }
 
+void pngComplete(png_structp png, png_infop info)
+{
+    static_cast<PNGImageDecoder*>(png_get_progressive_ptr(png))->pngComplete();
+}
+
+void PNGImageDecoder::pngComplete()
+{
+    if (m_frameBufferCache.isEmpty())
+        return;
+
+    // Hand back an appropriately sized buffer, even if the image ended up being empty.
+    RGBA32Buffer& buffer = m_frameBufferCache[0];
+    if (buffer.status() == RGBA32Buffer::FrameEmpty)
+        rowAvailable(0, 0, 0);
+    buffer.setStatus(RGBA32Buffer::FrameComplete);
+}
+
 }
index a0fbf183952480a350659a086a26dc295e2c3a86..7c2ae4fa8c7f93428c5b10148147568ca06ebb4b 100755 (executable)
@@ -30,7 +30,7 @@
 
 namespace WebCore {
 
-class PNGImageDecoderPrivate;
+class PNGImageReader;
 
 // This class decodes the PNG image format.
 class PNGImageDecoder : public ImageDecoder
@@ -52,11 +52,21 @@ public:
 
     void decode(bool sizeOnly = false) const;
 
+    void setFailed() { m_failed = true; }
+
+    PNGImageReader* reader() { return m_reader; }
+
+    // Callbacks from libpng
+    void decodingFailed() { m_failed = true; }
+    void headerAvailable();
+    void rowAvailable(unsigned char* rowBuffer, unsigned rowIndex, int interlacePass);
+    void pngComplete();
+
 private:
     bool m_sizeAvailable;
     mutable bool m_failed;
     IntSize m_size;
-    mutable PNGImageDecoderPrivate* m_impl;
+    mutable PNGImageReader* m_reader;
 };
 
 }
index 8204a21d8eb59e13d49468b20724157664ff4176..d0870a17a846045c02a3a7a9b28244feded2d973 100644 (file)
@@ -18,7 +18,7 @@
  * Portions created by the Initial Developer are Copyright (C) 2003
  * the Initial Developer. All Rights Reserved.
  *
- * Contributor(s): Tim Rowley <tor@cs.brown.edu>
+ * Contributor(s): Tim Rowley <tor@cs.brown.edu>, Apple Computer
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -70,7 +70,7 @@
 #define PNG_NO_READ_OPT_PLTE
 #define PNG_NO_MNG_FEATURES
 
-#ifdef MOZ_PNG_WRITE
+#ifdef webkit_png_WRITE
 #define PNG_NO_WRITE_BACKGROUND
 #define PNG_NO_WRITE_DITHER
 #define PNG_NO_WRITE_INVERT
    png_get_io_ptr
 */
 
-/* Mozilla: mangle it anyway. */
-#define png_get_io_ptr                  MOZ_PNG_get_io_ptr
+/* Like Mozilla, we mangle it anyway. */
+#define png_get_io_ptr                  webkit_png_get_io_ptr
 
 /* The following weren't present in libpng-0.88 but have never changed since
    they were first introduced and are not affected by any conditional compile
    choices and therefore don't need to be mangled.  We'll mangle them anyway. */
-#define png_sig_cmp                     MOZ_PNG_sig_cmp               /* 0.90 */
-#define png_memcpy_check                MOZ_PNG_memcpy_ck             /* 1.0.0 */
-#define png_memset_check                MOZ_PNG_memset_ck             /* 1.0.0 */
-#define png_access_version_number       MOZ_PNG_access_vn             /* 1.0.7 */
+#define png_sig_cmp                     webkit_png_sig_cmp               /* 0.90 */
+#define png_memcpy_check                webkit_png_memcpy_ck             /* 1.0.0 */
+#define png_memset_check                webkit_png_memset_ck             /* 1.0.0 */
+#define png_access_version_number       webkit_png_access_vn             /* 1.0.7 */
 
 /* These have never changed since they were first introduced but they
    make direct reference to members of png_ptr that might have been moved,
    so they will be mangled. */
 
-#define png_set_sig_bytes               MOZ_PNG_set_sig_b             /* 0.90 */
-#define png_reset_zstream               MOZ_PNG_reset_zs              /* 1.0.7 */
+#define png_set_sig_bytes               webkit_png_set_sig_b             /* 0.90 */
+#define png_reset_zstream               webkit_png_reset_zs              /* 1.0.7 */
 
 /* The following may have changed, or can be affected by conditional compilation
    choices, and will be mangled. */
-#define png_build_gamma_table           MOZ_PNG_build_gamma_tab
-#define png_build_grayscale_palette     MOZ_PNG_build_g_p
-#define png_calculate_crc               MOZ_PNG_calc_crc
-#define png_check_chunk_name            MOZ_PNG_ck_chunk_name
-#define png_check_sig                   MOZ_PNG_ck_sig
-#define png_chunk_error                 MOZ_PNG_chunk_err
-#define png_chunk_warning               MOZ_PNG_chunk_warn
-#define png_combine_row                 MOZ_PNG_combine_row
-#define png_convert_from_struct_tm      MOZ_PNG_cv_from_struct_tm
-#define png_convert_from_time_t         MOZ_PNG_cv_from_time_t
-#define png_convert_to_rfc1123          MOZ_PNG_cv_to_rfc1123
-#define png_crc_error                   MOZ_PNG_crc_error
-#define png_crc_finish                  MOZ_PNG_crc_finish
-#define png_crc_read                    MOZ_PNG_crc_read
-#define png_create_info_struct          MOZ_PNG_cr_info_str
-#define png_create_read_struct          MOZ_PNG_cr_read_str
-#define png_create_read_struct_2        MOZ_PNG_cr_read_str_2
-#define png_create_struct               MOZ_PNG_create_st
-#define png_create_struct_2             MOZ_PNG_create_s2
-#define png_create_write_struct         MOZ_PNG_cr_write_str
-#define png_create_write_struct_2       MOZ_PNG_cr_write_str_2
-#define png_data_freer                  MOZ_PNG_data_freer
-#define png_decompress_chunk            MOZ_PNG_decomp_chunk
-#define png_default_error               MOZ_PNG_def_error
-#define png_default_flush               MOZ_PNG_def_flush
-#define png_default_read                MOZ_PNG_def_read
-#define png_default_read_data           MOZ_PNG_def_read_data
-#define png_default_warning             MOZ_PNG_def_warning
-#define png_default_write               MOZ_PNG_def_write
-#define png_destroy_info_struct         MOZ_PNG_dest_info_str
-#define png_destroy_read_struct         MOZ_PNG_dest_read_str
-#define png_destroy_struct              MOZ_PNG_dest_str
-#define png_destroy_struct_2            MOZ_PNG_dest_str_2
-#define png_destroy_write_struct        MOZ_PNG_dest_write_str
-#define png_digit                       MOZ_PNG_digit
-#define png_do_background               MOZ_PNG_do_back
-#define png_do_bgr                      MOZ_PNG_do_bgr
-#define png_do_chop                     MOZ_PNG_do_chop
-#define png_do_dither                   MOZ_PNG_do_dith
-#define png_do_expand                   MOZ_PNG_do_expand
-#define png_do_expand_palette           MOZ_PNG_do_expand_plte
-#define png_do_gamma                    MOZ_PNG_do_gamma
-#define png_do_gray_to_rgb              MOZ_PNG_do_g_to_rgb
-#define png_do_invert                   MOZ_PNG_do_invert
-#define png_do_packswap                 MOZ_PNG_do_packswap
-#define png_do_read_filler              MOZ_PNG_do_read_fill
-#define png_do_read_interlace           MOZ_PNG_do_read_int
-#define png_do_read_intrapixel          MOZ_PNG_do_read_intra
-#define png_do_read_invert_alpha        MOZ_PNG_do_read_inv_alph
-#define png_do_read_swap_alpha          MOZ_PNG_do_read_swap_alph
-#define png_do_read_transformations     MOZ_PNG_do_read_trans
-#define png_do_rgb_to_gray              MOZ_PNG_do_rgb_to_g
-#define png_do_strip_filler             MOZ_PNG_do_strip_fill
-#define png_do_swap                     MOZ_PNG_do_swap
-#define png_do_unpack                   MOZ_PNG_do_unpack
-#define png_do_unshift                  MOZ_PNG_do_unshift
-#define png_error                       MOZ_PNG_error
-#define png_format_buffer               MOZ_PNG_format_buf
-#define png_free                        MOZ_PNG_free
-#define png_free_data                   MOZ_PNG_free_data
-#define png_free_default                MOZ_PNG_free_def
-#define png_gamma_shift                 MOZ_PNG_gamma_shift
-#define png_get_IHDR                    MOZ_PNG_get_IHDR
-#define png_get_PLTE                    MOZ_PNG_get_PLTE
-#define png_get_asm_flagmask            MOZ_PNG_get_asm_mask
-#define png_get_asm_flags               MOZ_PNG_get_asm_flags
-#define png_get_bKGD                    MOZ_PNG_get_bKGD
-#define png_get_bit_depth               MOZ_PNG_get_bit_depth
-#define png_get_cHRM                    MOZ_PNG_get_cHRM
-#define png_get_cHRM_fixed              MOZ_PNG_get_cHRM_fixed
-#define png_get_channels                MOZ_PNG_get_channels
-#define png_get_color_type              MOZ_PNG_get_color_type
-#define png_get_compression_buffer_size MOZ_PNG_get_comp_buf_siz
-#define png_get_compression_type        MOZ_PNG_get_comp_type
-#define png_get_copyright               MOZ_PNG_get_copyright
-#define png_get_error_ptr               MOZ_PNG_get_error_ptr
-#define png_get_filter_type             MOZ_PNG_get_filter_type
-#define png_get_gAMA                    MOZ_PNG_get_gAMA
-#define png_get_gAMA_fixed              MOZ_PNG_get_gAMA_fixed
-#define png_get_hIST                    MOZ_PNG_get_hIST
-#define png_get_header_ver              MOZ_PNG_get_hdr_ver
-#define png_get_header_version          MOZ_PNG_get_hdr_vn
-#define png_get_iCCP                    MOZ_PNG_get_iCCP
-#define png_get_image_height            MOZ_PNG_get_image_h
-#define png_get_image_width             MOZ_PNG_get_image_w
-#define png_get_int_32                  MOZ_PNG_get_int_32
-#define png_get_interlace_type          MOZ_PNG_get_interlace_type
-#define png_get_libpng_ver              MOZ_PNG_get_libpng_ver
-#define png_get_mem_ptr                 MOZ_PNG_get_mem_ptr
-#define png_get_mmx_bitdepth_threshold  MOZ_PNG_get_mmx_bitdepth_thr
-#define png_get_mmx_flagmask            MOZ_PNG_get_mmx_flagmask
-#define png_get_mmx_rowbytes_threshold  MOZ_PNG_get_mmx_rowbytes_thr
-#define png_get_oFFs                    MOZ_PNG_get_oFFs
-#define png_get_pCAL                    MOZ_PNG_get_pCAL
-#define png_get_pHYs                    MOZ_PNG_get_pHYs
-#define png_get_pixel_aspect_ratio      MOZ_PNG_get_pixel_aspect_ratio
-#define png_get_pixels_per_meter        MOZ_PNG_get_pixels_p_m
-#define png_get_progressive_ptr         MOZ_PNG_get_progressive_ptr
-#define png_get_rgb_to_gray_status      MOZ_PNG_get_rgb_to_gray_status
-#define png_get_rowbytes                MOZ_PNG_get_rowbytes
-#define png_get_rows                    MOZ_PNG_get_rows
-#define png_get_sBIT                    MOZ_PNG_get_sBIT
-#define png_get_sCAL                    MOZ_PNG_get_sCAL
-#define png_get_sCAL_s                  MOZ_PNG_get_sCAL_s
-#define png_get_sPLT                    MOZ_PNG_get_sPLT
-#define png_get_sRGB                    MOZ_PNG_get_sRGB
-#define png_get_signature               MOZ_PNG_get_signature
-#define png_get_tIME                    MOZ_PNG_get_tIME
-#define png_get_tRNS                    MOZ_PNG_get_tRNS
-#define png_get_text                    MOZ_PNG_get_text
-#define png_get_uint_16                 MOZ_PNG_get_uint_16
-#define png_get_uint_32                 MOZ_PNG_get_uint_32
-#define png_get_unknown_chunks          MOZ_PNG_get_unk_chunks
-#define png_get_user_chunk_ptr          MOZ_PNG_get_user_chunk_ptr
-#define png_get_user_transform_ptr      MOZ_PNG_get_user_transform_ptr
-#define png_get_valid                   MOZ_PNG_get_valid
-#define png_get_x_offset_microns        MOZ_PNG_get_x_offs_microns
-#define png_get_x_offset_pixels         MOZ_PNG_get_x_offs_pixels
-#define png_get_x_pixels_per_meter      MOZ_PNG_get_x_pix_per_meter
-#define png_get_y_offset_microns        MOZ_PNG_get_y_offs_microns
-#define png_get_y_offset_pixels         MOZ_PNG_get_y_offs_pixels
-#define png_get_y_pixels_per_meter      MOZ_PNG_get_y_pix_per_meter
-#define png_handle_IEND                 MOZ_PNG_handle_IEND
-#define png_handle_IHDR                 MOZ_PNG_handle_IHDR
-#define png_handle_PLTE                 MOZ_PNG_handle_PLTE
-#define png_handle_as_unknown           MOZ_PNG_handle_as_unknown
-#define png_handle_bKGD                 MOZ_PNG_handle_bKGD
-#define png_handle_cHRM                 MOZ_PNG_handle_cHRM
-#define png_handle_gAMA                 MOZ_PNG_handle_gAMA
-#define png_handle_hIST                 MOZ_PNG_handle_hIST
-#define png_handle_iCCP                 MOZ_PNG_handle_iCCP
-#define png_handle_oFFs                 MOZ_PNG_handle_oFFs
-#define png_handle_pCAL                 MOZ_PNG_handle_pCAL
-#define png_handle_pHYs                 MOZ_PNG_handle_pHYs
-#define png_handle_sBIT                 MOZ_PNG_handle_sBIT
-#define png_handle_sCAL                 MOZ_PNG_handle_sCAL
-#define png_handle_sPLT                 MOZ_PNG_handle_sPLT
-#define png_handle_sRGB                 MOZ_PNG_handle_sRGB
-#define png_handle_tEXt                 MOZ_PNG_handle_tEXt
-#define png_handle_tIME                 MOZ_PNG_handle_tIME
-#define png_handle_tRNS                 MOZ_PNG_handle_tRNS
-#define png_handle_unknown              MOZ_PNG_handle_unknown
-#define png_handle_zTXt                 MOZ_PNG_handle_zTXt
-#define png_info_destroy                MOZ_PNG_info_dest
-#define png_info_init_3                 MOZ_PNG_info_init_3
-#define png_init_io                     MOZ_PNG_init_io
-#define png_init_mmx_flags              MOZ_PNG_init_mmx_flags
-#define png_init_read_transformations   MOZ_PNG_init_read_transf
-#define png_malloc                      MOZ_PNG_malloc
-#define png_malloc_default              MOZ_PNG_malloc_default
-#define png_malloc_warn                 MOZ_PNG_malloc_warn
-#define png_mmx_support                 MOZ_PNG_mmx_support
-#define png_permit_empty_plte           MOZ_PNG_permit_mng_empty_plte
-#define png_permit_mng_features         MOZ_PNG_permit_mng_features
-#define png_process_IDAT_data           MOZ_PNG_proc_IDAT_data
-#define png_process_data                MOZ_PNG_process_data
-#define png_process_some_data           MOZ_PNG_proc_some_data
-#define png_progressive_combine_row     MOZ_PNG_progressive_combine_row
-#define png_push_crc_finish             MOZ_PNG_push_crc_finish
-#define png_push_crc_skip               MOZ_PNG_push_crc_skip
-#define png_push_fill_buffer            MOZ_PNG_push_fill_buffer
-#define png_push_handle_tEXt            MOZ_PNG_push_handle_tEXt
-#define png_push_handle_unknown         MOZ_PNG_push_handle_unk
-#define png_push_handle_zTXt            MOZ_PNG_push_handle_ztXt
-#define png_push_have_end               MOZ_PNG_push_have_end
-#define png_push_have_info              MOZ_PNG_push_have_info
-#define png_push_have_row               MOZ_PNG_push_have_row
-#define png_push_process_row            MOZ_PNG_push_proc_row
-#define png_push_read_IDAT              MOZ_PNG_push_read_IDAT
-#define png_push_read_chunk             MOZ_PNG_push_read_chunk
-#define png_push_read_sig               MOZ_PNG_push_read_sig
-#define png_push_read_tEXt              MOZ_PNG_push_read_tEXt
-#define png_push_read_zTXt              MOZ_PNG_push_read_zTXt
-#define png_push_restore_buffer         MOZ_PNG_push_rest_buf
-#define png_push_save_buffer            MOZ_PNG_push_save_buf
-#define png_read_data                   MOZ_PNG_read_data
-#define png_read_destroy                MOZ_PNG_read_dest
-#define png_read_end                    MOZ_PNG_read_end
-#define png_read_filter_row             MOZ_PNG_read_filt_row
-#define png_read_finish_row             MOZ_PNG_read_finish_row
-#define png_read_image                  MOZ_PNG_read_image
-#define png_read_info                   MOZ_PNG_read_info
-#define png_read_init_2                 MOZ_PNG_read_init_2
-#define png_read_init_3                 MOZ_PNG_read_init_3
-#define png_read_png                    MOZ_PNG_read_png
-#define png_read_push_finish_row        MOZ_PNG_read_push_finish_row
-#define png_read_row                    MOZ_PNG_read_row
-#define png_read_rows                   MOZ_PNG_read_rows
-#define png_read_start_row              MOZ_PNG_read_start_row
-#define png_read_transform_info         MOZ_PNG_read_transform_info
-#define png_read_update_info            MOZ_PNG_read_update_info
-#define png_reset_crc                   MOZ_PNG_reset_crc
-#define png_set_IHDR                    MOZ_PNG_set_IHDR
-#define png_set_PLTE                    MOZ_PNG_set_PLTE
-#define png_set_asm_flags               MOZ_PNG_set_asm_flags
-#define png_set_bKGD                    MOZ_PNG_set_bKGD
-#define png_set_background              MOZ_PNG_set_background
-#define png_set_bgr                     MOZ_PNG_set_bgr
-#define png_set_cHRM                    MOZ_PNG_set_cHRM
-#define png_set_cHRM_fixed              MOZ_PNG_set_cHRM_fixed
-#define png_set_compression_buffer_size MOZ_PNG_set_comp_buf_siz
-#define png_set_compression_level       MOZ_PNG_set_comp_level
-#define png_set_compression_mem_level   MOZ_PNG_set_comp_mem_lev
-#define png_set_compression_method      MOZ_PNG_set_comp_method
-#define png_set_compression_strategy    MOZ_PNG_set_comp_strategy
-#define png_set_compression_window_bits MOZ_PNG_set_comp_win_bits
-#define png_set_crc_action              MOZ_PNG_set_crc_action
-#define png_set_dither                  MOZ_PNG_set_dither
-#define png_set_error_fn                MOZ_PNG_set_error_fn
-#define png_set_expand                  MOZ_PNG_set_expand
-#define png_set_filler                  MOZ_PNG_set_filler
-#define png_set_filter                  MOZ_PNG_set_filter
-#define png_set_filter_heuristics       MOZ_PNG_set_filter_heur
-#define png_set_flush                   MOZ_PNG_set_flush
-#define png_set_gAMA                    MOZ_PNG_set_gAMA
-#define png_set_gAMA_fixed              MOZ_PNG_set_gAMA_fixed
-#define png_set_gamma                   MOZ_PNG_set_gamma
-#define png_set_gray_1_2_4_to_8         MOZ_PNG_set_gray_1_2_4_to_8
-#define png_set_gray_to_rgb             MOZ_PNG_set_gray_to_rgb
-#define png_set_hIST                    MOZ_PNG_set_hIST
-#define png_set_iCCP                    MOZ_PNG_set_iCCP
-#define png_set_interlace_handling      MOZ_PNG_set_interlace_handling
-#define png_set_invalid                 MOZ_PNG_set_invalid
-#define png_set_invert_alpha            MOZ_PNG_set_invert_alpha
-#define png_set_invert_mono             MOZ_PNG_set_invert_mono
-#define png_set_keep_unknown_chunks     MOZ_PNG_set_keep_unknown_chunks
-#define png_set_mem_fn                  MOZ_PNG_set_mem_fn
-#define png_set_mmx_thresholds          MOZ_PNG_set_mmx_thr
-#define png_set_oFFs                    MOZ_PNG_set_oFFs
-#define png_set_pCAL                    MOZ_PNG_set_pCAL
-#define png_set_pHYs                    MOZ_PNG_set_pHYs
-#define png_set_packing                 MOZ_PNG_set_packing
-#define png_set_packswap                MOZ_PNG_set_packswap
-#define png_set_palette_to_rgb          MOZ_PNG_set_palette_to_rgb
-#define png_set_progressive_read_fn     MOZ_PNG_set_progressive_read_fn
-#define png_set_read_fn                 MOZ_PNG_set_read_fn
-#define png_set_read_status_fn          MOZ_PNG_set_read_status_fn
-#define png_set_read_user_chunk_fn      MOZ_PNG_set_read_user_chunk_fn
-#define png_set_read_user_transform_fn  MOZ_PNG_set_read_user_trans_fn
-#define png_set_rgb_to_gray             MOZ_PNG_set_rgb_to_gray
-#define png_set_rgb_to_gray_fixed       MOZ_PNG_set_rgb_to_gray_fixed
-#define png_set_rows                    MOZ_PNG_set_rows
-#define png_set_sBIT                    MOZ_PNG_set_sBIT
-#define png_set_sCAL                    MOZ_PNG_set_sCAL
-#define png_set_sCAL_s                  MOZ_PNG_set_sCAL_s
-#define png_set_sPLT                    MOZ_PNG_set_sPLT
-#define png_set_sRGB                    MOZ_PNG_set_sRGB
-#define png_set_sRGB_gAMA_and_cHRM      MOZ_PNG_set_sRGB_gAMA_and_cHRM
-#define png_set_shift                   MOZ_PNG_set_shift
-#define png_set_strip_16                MOZ_PNG_set_strip_16
-#define png_set_strip_alpha             MOZ_PNG_set_strip_alpha
-#define png_set_strip_error_numbers     MOZ_PNG_set_strip_err_nums
-#define png_set_swap                    MOZ_PNG_set_swap
-#define png_set_swap_alpha              MOZ_PNG_set_swap_alpha
-#define png_set_tIME                    MOZ_PNG_set_tIME
-#define png_set_tRNS                    MOZ_PNG_set_tRNS
-#define png_set_tRNS_to_alpha           MOZ_PNG_set_tRNS_to_alpha
-#define png_set_text                    MOZ_PNG_set_text
-#define png_set_text_2                  MOZ_PNG_set_text-2
-#define png_set_unknown_chunk_location  MOZ_PNG_set_unknown_chunk_loc
-#define png_set_unknown_chunks          MOZ_PNG_set_unknown_chunks
-#define png_set_user_transform_info     MOZ_PNG_set_user_transform_info
-#define png_set_write_fn                MOZ_PNG_set_write_fn
-#define png_set_write_status_fn         MOZ_PNG_set_write_status_fn
-#define png_set_write_user_transform_fn MOZ_PNG_set_write_user_trans_fn
-#define png_sig_bytes                   MOZ_PNG_sig_bytes
-#define png_start_read_image            MOZ_PNG_start_read_image
-#define png_warning                     MOZ_PNG_warning
-#define png_write_chunk                 MOZ_PNG_write_chunk
-#define png_write_chunk_data            MOZ_PNG_write_chunk_data
-#define png_write_chunk_end             MOZ_PNG_write_chunk_end
-#define png_write_chunk_start           MOZ_PNG_write_chunk_start
-#define png_write_end                   MOZ_PNG_write_end
-#define png_write_flush                 MOZ_PNG_write_flush
-#define png_write_image                 MOZ_PNG_write_image
-#define png_write_info                  MOZ_PNG_write_info
-#define png_write_info_before_PLTE      MOZ_PNG_write_info_before_PLTE
-#define png_write_init                  MOZ_PNG_write_init
-#define png_write_init_2                MOZ_PNG_write_init_2
-#define png_write_init_3                MOZ_PNG_write_init_3
-#define png_write_png                   MOZ_PNG_write_png
-#define png_write_row                   MOZ_PNG_write_row
-#define png_write_rows                  MOZ_PNG_write_rows
-#define png_zalloc                      MOZ_PNG_zalloc
-#define png_zfree                       MOZ_PNG_zfree
+#define png_build_gamma_table           webkit_png_build_gamma_tab
+#define png_build_grayscale_palette     webkit_png_build_g_p
+#define png_calculate_crc               webkit_png_calc_crc
+#define png_check_chunk_name            webkit_png_ck_chunk_name
+#define png_check_sig                   webkit_png_ck_sig
+#define png_chunk_error                 webkit_png_chunk_err
+#define png_chunk_warning               webkit_png_chunk_warn
+#define png_combine_row                 webkit_png_combine_row
+#define png_convert_from_struct_tm      webkit_png_cv_from_struct_tm
+#define png_convert_from_time_t         webkit_png_cv_from_time_t
+#define png_convert_to_rfc1123          webkit_png_cv_to_rfc1123
+#define png_crc_error                   webkit_png_crc_error
+#define png_crc_finish                  webkit_png_crc_finish
+#define png_crc_read                    webkit_png_crc_read
+#define png_create_info_struct          webkit_png_cr_info_str
+#define png_create_read_struct          webkit_png_cr_read_str
+#define png_create_read_struct_2        webkit_png_cr_read_str_2
+#define png_create_struct               webkit_png_create_st
+#define png_create_struct_2             webkit_png_create_s2
+#define png_create_write_struct         webkit_png_cr_write_str
+#define png_create_write_struct_2       webkit_png_cr_write_str_2
+#define png_data_freer                  webkit_png_data_freer
+#define png_decompress_chunk            webkit_png_decomp_chunk
+#define png_default_error               webkit_png_def_error
+#define png_default_flush               webkit_png_def_flush
+#define png_default_read                webkit_png_def_read
+#define png_default_read_data           webkit_png_def_read_data
+#define png_default_warning             webkit_png_def_warning
+#define png_default_write               webkit_png_def_write
+#define png_destroy_info_struct         webkit_png_dest_info_str
+#define png_destroy_read_struct         webkit_png_dest_read_str
+#define png_destroy_struct              webkit_png_dest_str
+#define png_destroy_struct_2            webkit_png_dest_str_2
+#define png_destroy_write_struct        webkit_png_dest_write_str
+#define png_digit                       webkit_png_digit
+#define png_do_background               webkit_png_do_back
+#define png_do_bgr                      webkit_png_do_bgr
+#define png_do_chop                     webkit_png_do_chop
+#define png_do_dither                   webkit_png_do_dith
+#define png_do_expand                   webkit_png_do_expand
+#define png_do_expand_palette           webkit_png_do_expand_plte
+#define png_do_gamma                    webkit_png_do_gamma
+#define png_do_gray_to_rgb              webkit_png_do_g_to_rgb
+#define png_do_invert                   webkit_png_do_invert
+#define png_do_packswap                 webkit_png_do_packswap
+#define png_do_read_filler              webkit_png_do_read_fill
+#define png_do_read_interlace           webkit_png_do_read_int
+#define png_do_read_intrapixel          webkit_png_do_read_intra
+#define png_do_read_invert_alpha        webkit_png_do_read_inv_alph
+#define png_do_read_swap_alpha          webkit_png_do_read_swap_alph
+#define png_do_read_transformations     webkit_png_do_read_trans
+#define png_do_rgb_to_gray              webkit_png_do_rgb_to_g
+#define png_do_strip_filler             webkit_png_do_strip_fill
+#define png_do_swap                     webkit_png_do_swap
+#define png_do_unpack                   webkit_png_do_unpack
+#define png_do_unshift                  webkit_png_do_unshift
+#define png_error                       webkit_png_error
+#define png_format_buffer               webkit_png_format_buf
+#define png_free                        webkit_png_free
+#define png_free_data                   webkit_png_free_data
+#define png_free_default                webkit_png_free_def
+#define png_gamma_shift                 webkit_png_gamma_shift
+#define png_get_IHDR                    webkit_png_get_IHDR
+#define png_get_PLTE                    webkit_png_get_PLTE
+#define png_get_asm_flagmask            webkit_png_get_asm_mask
+#define png_get_asm_flags               webkit_png_get_asm_flags
+#define png_get_bKGD                    webkit_png_get_bKGD
+#define png_get_bit_depth               webkit_png_get_bit_depth
+#define png_get_cHRM                    webkit_png_get_cHRM
+#define png_get_cHRM_fixed              webkit_png_get_cHRM_fixed
+#define png_get_channels                webkit_png_get_channels
+#define png_get_color_type              webkit_png_get_color_type
+#define png_get_compression_buffer_size webkit_png_get_comp_buf_siz
+#define png_get_compression_type        webkit_png_get_comp_type
+#define png_get_copyright               webkit_png_get_copyright
+#define png_get_error_ptr               webkit_png_get_error_ptr
+#define png_get_filter_type             webkit_png_get_filter_type
+#define png_get_gAMA                    webkit_png_get_gAMA
+#define png_get_gAMA_fixed              webkit_png_get_gAMA_fixed
+#define png_get_hIST                    webkit_png_get_hIST
+#define png_get_header_ver              webkit_png_get_hdr_ver
+#define png_get_header_version          webkit_png_get_hdr_vn
+#define png_get_iCCP                    webkit_png_get_iCCP
+#define png_get_image_height            webkit_png_get_image_h
+#define png_get_image_width             webkit_png_get_image_w
+#define png_get_int_32                  webkit_png_get_int_32
+#define png_get_interlace_type          webkit_png_get_interlace_type
+#define png_get_libpng_ver              webkit_png_get_libpng_ver
+#define png_get_mem_ptr                 webkit_png_get_mem_ptr
+#define png_get_mmx_bitdepth_threshold  webkit_png_get_mmx_bitdepth_thr
+#define png_get_mmx_flagmask            webkit_png_get_mmx_flagmask
+#define png_get_mmx_rowbytes_threshold  webkit_png_get_mmx_rowbytes_thr
+#define png_get_oFFs                    webkit_png_get_oFFs
+#define png_get_pCAL                    webkit_png_get_pCAL
+#define png_get_pHYs                    webkit_png_get_pHYs
+#define png_get_pixel_aspect_ratio      webkit_png_get_pixel_aspect_ratio
+#define png_get_pixels_per_meter        webkit_png_get_pixels_p_m
+#define png_get_progressive_ptr         webkit_png_get_progressive_ptr
+#define png_get_rgb_to_gray_status      webkit_png_get_rgb_to_gray_status
+#define png_get_rowbytes                webkit_png_get_rowbytes
+#define png_get_rows                    webkit_png_get_rows
+#define png_get_sBIT                    webkit_png_get_sBIT
+#define png_get_sCAL                    webkit_png_get_sCAL
+#define png_get_sCAL_s                  webkit_png_get_sCAL_s
+#define png_get_sPLT                    webkit_png_get_sPLT
+#define png_get_sRGB                    webkit_png_get_sRGB
+#define png_get_signature               webkit_png_get_signature
+#define png_get_tIME                    webkit_png_get_tIME
+#define png_get_tRNS                    webkit_png_get_tRNS
+#define png_get_text                    webkit_png_get_text
+#define png_get_uint_16                 webkit_png_get_uint_16
+#define png_get_uint_32                 webkit_png_get_uint_32
+#define png_get_unknown_chunks          webkit_png_get_unk_chunks
+#define png_get_user_chunk_ptr          webkit_png_get_user_chunk_ptr
+#define png_get_user_transform_ptr      webkit_png_get_user_transform_ptr
+#define png_get_valid                   webkit_png_get_valid
+#define png_get_x_offset_microns        webkit_png_get_x_offs_microns
+#define png_get_x_offset_pixels         webkit_png_get_x_offs_pixels
+#define png_get_x_pixels_per_meter      webkit_png_get_x_pix_per_meter
+#define png_get_y_offset_microns        webkit_png_get_y_offs_microns
+#define png_get_y_offset_pixels         webkit_png_get_y_offs_pixels
+#define png_get_y_pixels_per_meter      webkit_png_get_y_pix_per_meter
+#define png_handle_IEND                 webkit_png_handle_IEND
+#define png_handle_IHDR                 webkit_png_handle_IHDR
+#define png_handle_PLTE                 webkit_png_handle_PLTE
+#define png_handle_as_unknown           webkit_png_handle_as_unknown
+#define png_handle_bKGD                 webkit_png_handle_bKGD
+#define png_handle_cHRM                 webkit_png_handle_cHRM
+#define png_handle_gAMA                 webkit_png_handle_gAMA
+#define png_handle_hIST                 webkit_png_handle_hIST
+#define png_handle_iCCP                 webkit_png_handle_iCCP
+#define png_handle_oFFs                 webkit_png_handle_oFFs
+#define png_handle_pCAL                 webkit_png_handle_pCAL
+#define png_handle_pHYs                 webkit_png_handle_pHYs
+#define png_handle_sBIT                 webkit_png_handle_sBIT
+#define png_handle_sCAL                 webkit_png_handle_sCAL
+#define png_handle_sPLT                 webkit_png_handle_sPLT
+#define png_handle_sRGB                 webkit_png_handle_sRGB
+#define png_handle_tEXt                 webkit_png_handle_tEXt
+#define png_handle_tIME                 webkit_png_handle_tIME
+#define png_handle_tRNS                 webkit_png_handle_tRNS
+#define png_handle_unknown              webkit_png_handle_unknown
+#define png_handle_zTXt                 webkit_png_handle_zTXt
+#define png_info_destroy                webkit_png_info_dest
+#define png_info_init_3                 webkit_png_info_init_3
+#define png_init_io                     webkit_png_init_io
+#define png_init_mmx_flags              webkit_png_init_mmx_flags
+#define png_init_read_transformations   webkit_png_init_read_transf
+#define png_malloc                      webkit_png_malloc
+#define png_malloc_default              webkit_png_malloc_default
+#define png_malloc_warn                 webkit_png_malloc_warn
+#define png_mmx_support                 webkit_png_mmx_support
+#define png_permit_empty_plte           webkit_png_permit_mng_empty_plte
+#define png_permit_mng_features         webkit_png_permit_mng_features
+#define png_process_IDAT_data           webkit_png_proc_IDAT_data
+#define png_process_data                webkit_png_process_data
+#define png_process_some_data           webkit_png_proc_some_data
+#define png_progressive_combine_row     webkit_png_progressive_combine_row
+#define png_push_crc_finish             webkit_png_push_crc_finish
+#define png_push_crc_skip               webkit_png_push_crc_skip
+#define png_push_fill_buffer            webkit_png_push_fill_buffer
+#define png_push_handle_tEXt            webkit_png_push_handle_tEXt
+#define png_push_handle_unknown         webkit_png_push_handle_unk
+#define png_push_handle_zTXt            webkit_png_push_handle_ztXt
+#define png_push_have_end               webkit_png_push_have_end
+#define png_push_have_info              webkit_png_push_have_info
+#define png_push_have_row               webkit_png_push_have_row
+#define png_push_process_row            webkit_png_push_proc_row
+#define png_push_read_IDAT              webkit_png_push_read_IDAT
+#define png_push_read_chunk             webkit_png_push_read_chunk
+#define png_push_read_sig               webkit_png_push_read_sig
+#define png_push_read_tEXt              webkit_png_push_read_tEXt
+#define png_push_read_zTXt              webkit_png_push_read_zTXt
+#define png_push_restore_buffer         webkit_png_push_rest_buf
+#define png_push_save_buffer            webkit_png_push_save_buf
+#define png_read_data                   webkit_png_read_data
+#define png_read_destroy                webkit_png_read_dest
+#define png_read_end                    webkit_png_read_end
+#define png_read_filter_row             webkit_png_read_filt_row
+#define png_read_finish_row             webkit_png_read_finish_row
+#define png_read_image                  webkit_png_read_image
+#define png_read_info                   webkit_png_read_info
+#define png_read_init_2                 webkit_png_read_init_2
+#define png_read_init_3                 webkit_png_read_init_3
+#define png_read_png                    webkit_png_read_png
+#define png_read_push_finish_row        webkit_png_read_push_finish_row
+#define png_read_row                    webkit_png_read_row
+#define png_read_rows                   webkit_png_read_rows
+#define png_read_start_row              webkit_png_read_start_row
+#define png_read_transform_info         webkit_png_read_transform_info
+#define png_read_update_info            webkit_png_read_update_info
+#define png_reset_crc                   webkit_png_reset_crc
+#define png_set_IHDR                    webkit_png_set_IHDR
+#define png_set_PLTE                    webkit_png_set_PLTE
+#define png_set_asm_flags               webkit_png_set_asm_flags
+#define png_set_bKGD                    webkit_png_set_bKGD
+#define png_set_background              webkit_png_set_background
+#define png_set_bgr                     webkit_png_set_bgr
+#define png_set_cHRM                    webkit_png_set_cHRM
+#define png_set_cHRM_fixed              webkit_png_set_cHRM_fixed
+#define png_set_compression_buffer_size webkit_png_set_comp_buf_siz
+#define png_set_compression_level       webkit_png_set_comp_level
+#define png_set_compression_mem_level   webkit_png_set_comp_mem_lev
+#define png_set_compression_method      webkit_png_set_comp_method
+#define png_set_compression_strategy    webkit_png_set_comp_strategy
+#define png_set_compression_window_bits webkit_png_set_comp_win_bits
+#define png_set_crc_action              webkit_png_set_crc_action
+#define png_set_dither                  webkit_png_set_dither
+#define png_set_error_fn                webkit_png_set_error_fn
+#define png_set_expand                  webkit_png_set_expand
+#define png_set_filler                  webkit_png_set_filler
+#define png_set_filter                  webkit_png_set_filter
+#define png_set_filter_heuristics       webkit_png_set_filter_heur
+#define png_set_flush                   webkit_png_set_flush
+#define png_set_gAMA                    webkit_png_set_gAMA
+#define png_set_gAMA_fixed              webkit_png_set_gAMA_fixed
+#define png_set_gamma                   webkit_png_set_gamma
+#define png_set_gray_1_2_4_to_8         webkit_png_set_gray_1_2_4_to_8
+#define png_set_gray_to_rgb             webkit_png_set_gray_to_rgb
+#define png_set_hIST                    webkit_png_set_hIST
+#define png_set_iCCP                    webkit_png_set_iCCP
+#define png_set_interlace_handling      webkit_png_set_interlace_handling
+#define png_set_invalid                 webkit_png_set_invalid
+#define png_set_invert_alpha            webkit_png_set_invert_alpha
+#define png_set_invert_mono             webkit_png_set_invert_mono
+#define png_set_keep_unknown_chunks     webkit_png_set_keep_unknown_chunks
+#define png_set_mem_fn                  webkit_png_set_mem_fn
+#define png_set_mmx_thresholds          webkit_png_set_mmx_thr
+#define png_set_oFFs                    webkit_png_set_oFFs
+#define png_set_pCAL                    webkit_png_set_pCAL
+#define png_set_pHYs                    webkit_png_set_pHYs
+#define png_set_packing                 webkit_png_set_packing
+#define png_set_packswap                webkit_png_set_packswap
+#define png_set_palette_to_rgb          webkit_png_set_palette_to_rgb
+#define png_set_progressive_read_fn     webkit_png_set_progressive_read_fn
+#define png_set_read_fn                 webkit_png_set_read_fn
+#define png_set_read_status_fn          webkit_png_set_read_status_fn
+#define png_set_read_user_chunk_fn      webkit_png_set_read_user_chunk_fn
+#define png_set_read_user_transform_fn  webkit_png_set_read_user_trans_fn
+#define png_set_rgb_to_gray             webkit_png_set_rgb_to_gray
+#define png_set_rgb_to_gray_fixed       webkit_png_set_rgb_to_gray_fixed
+#define png_set_rows                    webkit_png_set_rows
+#define png_set_sBIT                    webkit_png_set_sBIT
+#define png_set_sCAL                    webkit_png_set_sCAL
+#define png_set_sCAL_s                  webkit_png_set_sCAL_s
+#define png_set_sPLT                    webkit_png_set_sPLT
+#define png_set_sRGB                    webkit_png_set_sRGB
+#define png_set_sRGB_gAMA_and_cHRM      webkit_png_set_sRGB_gAMA_and_cHRM
+#define png_set_shift                   webkit_png_set_shift
+#define png_set_strip_16                webkit_png_set_strip_16
+#define png_set_strip_alpha             webkit_png_set_strip_alpha
+#define png_set_strip_error_numbers     webkit_png_set_strip_err_nums
+#define png_set_swap                    webkit_png_set_swap
+#define png_set_swap_alpha              webkit_png_set_swap_alpha
+#define png_set_tIME                    webkit_png_set_tIME
+#define png_set_tRNS                    webkit_png_set_tRNS
+#define png_set_tRNS_to_alpha           webkit_png_set_tRNS_to_alpha
+#define png_set_text                    webkit_png_set_text
+#define png_set_text_2                  webkit_png_set_text-2
+#define png_set_unknown_chunk_location  webkit_png_set_unknown_chunk_loc
+#define png_set_unknown_chunks          webkit_png_set_unknown_chunks
+#define png_set_user_transform_info     webkit_png_set_user_transform_info
+#define png_set_write_fn                webkit_png_set_write_fn
+#define png_set_write_status_fn         webkit_png_set_write_status_fn
+#define png_set_write_user_transform_fn webkit_png_set_write_user_trans_fn
+#define png_sig_bytes                   webkit_png_sig_bytes
+#define png_start_read_image            webkit_png_start_read_image
+#define png_warning                     webkit_png_warning
+#define png_write_chunk                 webkit_png_write_chunk
+#define png_write_chunk_data            webkit_png_write_chunk_data
+#define png_write_chunk_end             webkit_png_write_chunk_end
+#define png_write_chunk_start           webkit_png_write_chunk_start
+#define png_write_end                   webkit_png_write_end
+#define png_write_flush                 webkit_png_write_flush
+#define png_write_image                 webkit_png_write_image
+#define png_write_info                  webkit_png_write_info
+#define png_write_info_before_PLTE      webkit_png_write_info_before_PLTE
+#define png_write_init                  webkit_png_write_init
+#define png_write_init_2                webkit_png_write_init_2
+#define png_write_init_3                webkit_png_write_init_3
+#define png_write_png                   webkit_png_write_png
+#define png_write_row                   webkit_png_write_row
+#define png_write_rows                  webkit_png_write_rows
+#define png_zalloc                      webkit_png_zalloc
+#define png_zfree                       webkit_png_zfree
 
 /* libpng-1.2.6 additions */
-#define png_convert_size                MOZ_PNG_convert_size
-#define png_get_uint_31                 MOZ_PNG_get_uint_31
-#define png_get_user_height_max         MOZ_PNG_get_user_height_max
-#define png_get_user_width_max          MOZ_PNG_get_user_width_max
-#define png_set_user_limits             MOZ_PNG_set_user_limits
+#define png_convert_size                webkit_png_convert_size
+#define png_get_uint_31                 webkit_png_get_uint_31
+#define png_get_user_height_max         webkit_png_get_user_height_max
+#define png_get_user_width_max          webkit_png_get_user_width_max
+#define png_set_user_limits             webkit_png_set_user_limits
 
 /* libpng-1.2.7 addition */
-#define png_set_add_alpha               MOZ_PNG_set_add_alpha
+#define png_set_add_alpha               webkit_png_set_add_alpha
 
 #endif