summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/image-decoders
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/image-decoders')
-rw-r--r--WebCore/platform/image-decoders/ImageDecoder.cpp14
-rw-r--r--WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp123
-rw-r--r--WebCore/platform/image-decoders/webp/WEBPImageDecoder.h56
3 files changed, 193 insertions, 0 deletions
diff --git a/WebCore/platform/image-decoders/ImageDecoder.cpp b/WebCore/platform/image-decoders/ImageDecoder.cpp
index 1c3dcf8..10c0b3b 100644
--- a/WebCore/platform/image-decoders/ImageDecoder.cpp
+++ b/WebCore/platform/image-decoders/ImageDecoder.cpp
@@ -31,6 +31,7 @@
#include "ICOImageDecoder.h"
#include "JPEGImageDecoder.h"
#include "PNGImageDecoder.h"
+#include "WEBPImageDecoder.h"
#include "SharedBuffer.h"
using namespace std;
@@ -78,6 +79,19 @@ ImageDecoder* ImageDecoder::create(const SharedBuffer& data, bool premultiplyAlp
if (!memcmp(contents, "\xFF\xD8\xFF", 3))
return new JPEGImageDecoder(premultiplyAlpha);
+#if USE(WEBP)
+ if (!memcmp(contents, "RIFF", 4)) {
+ static const unsigned webpExtraMarker = 6;
+ static const unsigned webpExtraMarkeroffset = 8;
+ char header[webpExtraMarker];
+ unsigned length = copyFromSharedBuffer(header, webpExtraMarker, data, webpExtraMarkeroffset);
+ if (length >= webpExtraMarker) {
+ if (!memcmp(header, "WEBPVP", webpExtraMarker))
+ return new WEBPImageDecoder(premultiplyAlpha);
+ }
+ }
+#endif
+
// BMP
if (strncmp(contents, "BM", 2) == 0)
return new BMPImageDecoder(premultiplyAlpha);
diff --git a/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp b/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp
new file mode 100644
index 0000000..5794fd6
--- /dev/null
+++ b/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * 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.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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.
+ */
+
+#include "config.h"
+#include "WEBPImageDecoder.h"
+
+#if USE(WEBP)
+
+#include "webp/decode.h"
+
+namespace WebCore {
+
+WEBPImageDecoder::WEBPImageDecoder(bool premultiplyAlpha)
+ : ImageDecoder(premultiplyAlpha)
+{
+}
+
+WEBPImageDecoder::~WEBPImageDecoder()
+{
+}
+
+bool WEBPImageDecoder::isSizeAvailable()
+{
+ if (!ImageDecoder::isSizeAvailable())
+ decode(true);
+
+ return ImageDecoder::isSizeAvailable();
+}
+
+RGBA32Buffer* WEBPImageDecoder::frameBufferAtIndex(size_t index)
+{
+ if (index)
+ return 0;
+
+ if (m_frameBufferCache.isEmpty()) {
+ m_frameBufferCache.resize(1);
+ m_frameBufferCache[0].setPremultiplyAlpha(m_premultiplyAlpha);
+ }
+
+ RGBA32Buffer& frame = m_frameBufferCache[0];
+ if (frame.status() != RGBA32Buffer::FrameComplete)
+ decode(false);
+ return &frame;
+}
+
+
+bool WEBPImageDecoder::decode(bool onlySize)
+{
+ // Minimum number of bytes needed to ensure one can parse size information.
+ static const size_t sizeOfHeader = 30;
+ // Number of bytes per pixel.
+ static const int bytesPerPixel = 3;
+
+ if (failed())
+ return false;
+ const size_t dataSize = m_data->buffer().size();
+ const uint8_t* dataBytes =
+ reinterpret_cast<const uint8_t*>(m_data->buffer().data());
+ int width, height;
+ if (dataSize < sizeOfHeader)
+ return true;
+ if (!WebPGetInfo(dataBytes, dataSize, &width, &height))
+ return setFailed();
+ if (onlySize)
+ return setSize(width, height) || setFailed();
+
+ // FIXME: Add support for progressive decoding.
+ if (!isAllDataReceived())
+ return true;
+ if (m_frameBufferCache.isEmpty())
+ return true;
+ RGBA32Buffer& buffer = m_frameBufferCache[0];
+ if (buffer.status() == RGBA32Buffer::FrameEmpty) {
+ ASSERT(width == size().width());
+ ASSERT(height == size().height());
+ if (!buffer.setSize(width, height))
+ return setFailed();
+ }
+ const int stride = width * bytesPerPixel;
+ Vector<uint8_t> rgb;
+ rgb.reserveCapacity(height * stride);
+ if (!WebPDecodeBGRInto(dataBytes, dataSize, &rgb[0], height * stride, stride))
+ return setFailed();
+ // FIXME: remove this data copy.
+ for (int y = 0; y < height; ++y) {
+ const uint8_t* const src = &rgb[y * stride];
+ for (int x = 0; x < width; ++x)
+ buffer.setRGBA(x, y, src[bytesPerPixel * x + 2], src[bytesPerPixel * x + 1], src[bytesPerPixel * x + 0], 0xff);
+ }
+ buffer.setStatus(RGBA32Buffer::FrameComplete);
+ buffer.setHasAlpha(false);
+ buffer.setRect(IntRect(IntPoint(), size()));
+ return true;
+}
+
+}
+
+#endif
diff --git a/WebCore/platform/image-decoders/webp/WEBPImageDecoder.h b/WebCore/platform/image-decoders/webp/WEBPImageDecoder.h
new file mode 100644
index 0000000..266c0ff
--- /dev/null
+++ b/WebCore/platform/image-decoders/webp/WEBPImageDecoder.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * 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.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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.
+ */
+
+#ifndef WEBPImageDecoder_h
+#define WEBPImageDecoder_h
+
+#include "ImageDecoder.h"
+
+#if USE(WEBP)
+
+namespace WebCore {
+
+class WEBPImageDecoder : public ImageDecoder {
+public:
+ WEBPImageDecoder(bool premultiplyAlpha);
+ virtual ~WEBPImageDecoder();
+ virtual String filenameExtension() const { return "vp8"; }
+ virtual bool isSizeAvailable();
+ virtual RGBA32Buffer* frameBufferAtIndex(size_t index);
+ virtual bool supportsAlpha() const { return false; }
+
+private:
+ // Returns false in case of decoding failure.
+ bool decode(bool onlySize);
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif