diff options
Diffstat (limited to 'WebCore/platform/image-encoders')
-rw-r--r-- | WebCore/platform/image-encoders/JPEGImageEncoder.cpp | 135 | ||||
-rw-r--r-- | WebCore/platform/image-encoders/JPEGImageEncoder.h | 33 | ||||
-rw-r--r-- | WebCore/platform/image-encoders/PNGImageEncoder.cpp | 126 | ||||
-rw-r--r-- | WebCore/platform/image-encoders/PNGImageEncoder.h | 33 | ||||
-rw-r--r-- | WebCore/platform/image-encoders/skia/JPEGImageEncoder.cpp | 153 | ||||
-rw-r--r-- | WebCore/platform/image-encoders/skia/JPEGImageEncoder.h | 51 | ||||
-rw-r--r-- | WebCore/platform/image-encoders/skia/PNGImageEncoder.cpp | 94 | ||||
-rw-r--r-- | WebCore/platform/image-encoders/skia/PNGImageEncoder.h | 48 |
8 files changed, 0 insertions, 673 deletions
diff --git a/WebCore/platform/image-encoders/JPEGImageEncoder.cpp b/WebCore/platform/image-encoders/JPEGImageEncoder.cpp deleted file mode 100644 index d707aa8..0000000 --- a/WebCore/platform/image-encoders/JPEGImageEncoder.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2009 Torch Mobile, Inc. All rights reserved. - * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - - -#include "config.h" -#include "JPEGImageEncoder.h" - -#include "IntSize.h" -// FIXME: jpeglib.h requires stdio.h to be included first for FILE -#include <stdio.h> -#include "jpeglib.h" -#include <setjmp.h> - -namespace WebCore { - -class JPEGDestinationManager : public jpeg_destination_mgr { -public: - explicit JPEGDestinationManager(Vector<char>& toDump) - : m_dump(toDump) - { - // Zero base class memory. - jpeg_destination_mgr* base = this; - memset(base, 0, sizeof(jpeg_destination_mgr)); - } - Vector<char> m_buffer; - Vector<char>& m_dump; -}; - -class JPEGCompressErrorMgr : public jpeg_error_mgr { -public: - JPEGCompressErrorMgr() - { - // Zero memory - memset(this, 0, sizeof(JPEGCompressErrorMgr)); - } - - jmp_buf m_setjmpBuffer; -}; - -static void jpegInitializeDestination(j_compress_ptr compressData) -{ - JPEGDestinationManager* dest = static_cast<JPEGDestinationManager*>(compressData->dest); - dest->m_buffer.resize(4096); - dest->next_output_byte = reinterpret_cast<JOCTET*>(dest->m_buffer.data()); - dest->free_in_buffer = dest->m_buffer.size(); -} - -static boolean jpegEmptyOutputBuffer(j_compress_ptr compressData) -{ - JPEGDestinationManager* dest = static_cast<JPEGDestinationManager*>(compressData->dest); - dest->m_dump.append(dest->m_buffer.data(), dest->m_buffer.size() - dest->free_in_buffer); - dest->next_output_byte = reinterpret_cast<JOCTET*>(dest->m_buffer.data()); - dest->free_in_buffer = dest->m_buffer.size(); - return TRUE; -} - -static void jpegTerminateDestination(j_compress_ptr compressData) -{ - JPEGDestinationManager* dest = static_cast<JPEGDestinationManager*>(compressData->dest); - dest->m_dump.append(dest->m_buffer.data(), dest->m_buffer.size() - dest->free_in_buffer); -} - -static void jpegErrorExit(j_common_ptr compressData) -{ - JPEGCompressErrorMgr* err = static_cast<JPEGCompressErrorMgr*>(compressData->err); - longjmp(err->m_setjmpBuffer, -1); -} - -bool compressRGBABigEndianToJPEG(unsigned char* rgbaBigEndianData, const IntSize& size, Vector<char>& jpegData) -{ - struct jpeg_compress_struct compressData = { 0 }; - JPEGCompressErrorMgr err; - compressData.err = jpeg_std_error(&err); - err.error_exit = jpegErrorExit; - - jpeg_create_compress(&compressData); - - JPEGDestinationManager dest(jpegData); - compressData.dest = &dest; - dest.init_destination = jpegInitializeDestination; - dest.empty_output_buffer = jpegEmptyOutputBuffer; - dest.term_destination = jpegTerminateDestination; - - compressData.image_width = size.width(); - compressData.image_height = size.height(); - compressData.input_components = 3; - compressData.in_color_space = JCS_RGB; - jpeg_set_defaults(&compressData); - jpeg_set_quality(&compressData, 65, FALSE); - - // rowBuffer must be defined here so that its destructor is always called even when "setjmp" catches an error. - Vector<JSAMPLE, 600 * 3> rowBuffer; - - if (setjmp(err.m_setjmpBuffer)) - return false; - - jpeg_start_compress(&compressData, TRUE); - rowBuffer.resize(compressData.image_width * 3); - - const unsigned char* pixel = rgbaBigEndianData; - const unsigned char* pixelEnd = pixel + compressData.image_width * compressData.image_height * 4; - while (pixel < pixelEnd) { - JSAMPLE* output = rowBuffer.data(); - for (const unsigned char* rowEnd = pixel + compressData.image_width * 4; pixel < rowEnd;) { - *output++ = static_cast<JSAMPLE>(*pixel++ & 0xFF); // red - *output++ = static_cast<JSAMPLE>(*pixel++ & 0xFF); // green - *output++ = static_cast<JSAMPLE>(*pixel++ & 0xFF); // blue - ++pixel; // skip alpha - } - output = rowBuffer.data(); - jpeg_write_scanlines(&compressData, &output, 1); - } - - jpeg_finish_compress(&compressData); - return true; -} - -} // namespace WebCore diff --git a/WebCore/platform/image-encoders/JPEGImageEncoder.h b/WebCore/platform/image-encoders/JPEGImageEncoder.h deleted file mode 100644 index a373c4f..0000000 --- a/WebCore/platform/image-encoders/JPEGImageEncoder.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2009 Torch Mobile, Inc. All rights reserved. - * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef JPEGImageEncoder_h -#define JPEGImageEncoder_h - -#include <wtf/Vector.h> - -namespace WebCore { - -class IntSize; -bool compressRGBABigEndianToJPEG(unsigned char* rgbaBigEndianData, const IntSize& size, Vector<char>& jpegData); - -} - -#endif // JPEGImageEncoder_h diff --git a/WebCore/platform/image-encoders/PNGImageEncoder.cpp b/WebCore/platform/image-encoders/PNGImageEncoder.cpp deleted file mode 100644 index 358d351..0000000 --- a/WebCore/platform/image-encoders/PNGImageEncoder.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2006-2009, Google Inc. All rights reserved. - * Copyright (c) 2009 Torch Mobile, Inc. All rights reserved. - * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT - * OWNER 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. - */ - -#include "config.h" -#include "PNGImageEncoder.h" - -#include "IntSize.h" -#include "png.h" -#include <wtf/Vector.h> - -namespace WebCore { - -// Encoder -------------------------------------------------------------------- -// -// This section of the code is based on nsPNGEncoder.cpp in Mozilla -// (Copyright 2005 Google Inc.) - -// Passed around as the io_ptr in the png structs so our callbacks know where -// to write data. -struct PNGEncoderState { - PNGEncoderState(Vector<char>* o) : m_dump(o) {} - Vector<char>* m_dump; -}; - -// Called by libpng to flush its internal buffer to ours. -void encoderWriteCallback(png_structp png, png_bytep data, png_size_t size) -{ - PNGEncoderState* state = static_cast<PNGEncoderState*>(png_get_io_ptr(png)); - ASSERT(state->m_dump); - - size_t oldSize = state->m_dump->size(); - state->m_dump->resize(oldSize + size); - char* destination = state->m_dump->data() + oldSize; - memcpy(destination, data, size); -} - -// Automatically destroys the given write structs on destruction to make -// cleanup and error handling code cleaner. -class PNGWriteStructDestroyer { -public: - PNGWriteStructDestroyer(png_struct** ps, png_info** pi) - : m_pngStruct(ps) - , m_pngInfo(pi) - { - } - - ~PNGWriteStructDestroyer() - { - png_destroy_write_struct(m_pngStruct, m_pngInfo); - } - -private: - png_struct** m_pngStruct; - png_info** m_pngInfo; -}; - -bool compressRGBABigEndianToPNG(unsigned char* rgbaBigEndianData, const IntSize& size, Vector<char>& pngData) -{ - png_struct* pngPtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, png_voidp_NULL, png_error_ptr_NULL, png_error_ptr_NULL); - if (!pngPtr) - return false; - - png_info* infoPtr = png_create_info_struct(pngPtr); - if (!infoPtr) { - png_destroy_write_struct(&pngPtr, 0); - return false; - } - PNGWriteStructDestroyer destroyer(&pngPtr, &infoPtr); - - // The destroyer will ensure that the structures are cleaned up in this - // case, even though we may get here as a jump from random parts of the - // PNG library called below. - if (setjmp(png_jmpbuf(pngPtr))) - return false; - - // Set our callback for libpng to give us the data. - PNGEncoderState state(&pngData); - png_set_write_fn(pngPtr, &state, encoderWriteCallback, 0); - - int pngOutputColorType = PNG_COLOR_TYPE_RGB_ALPHA; - - png_set_IHDR(pngPtr, infoPtr, size.width(), size.height(), 8, pngOutputColorType, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, - PNG_FILTER_TYPE_DEFAULT); - png_write_info(pngPtr, infoPtr); - - unsigned bytesPerRow = size.width() * 4; - for (unsigned y = 0; y < size.height(); ++y) { - png_write_row(pngPtr, rgbaBigEndianData); - rgbaBigEndianData += bytesPerRow; - } - - png_write_end(pngPtr, infoPtr); - return true; -} - -} // namespace WebCore diff --git a/WebCore/platform/image-encoders/PNGImageEncoder.h b/WebCore/platform/image-encoders/PNGImageEncoder.h deleted file mode 100644 index 0c09086..0000000 --- a/WebCore/platform/image-encoders/PNGImageEncoder.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2007-2009 Torch Mobile, Inc. - * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef PNGImageEncoder_h -#define PNGImageEncoder_h - -#include <wtf/Vector.h> - -namespace WebCore { - -class IntSize; -bool compressRGBABigEndianToPNG(unsigned char* rgbaBigEndianData, const IntSize& size, Vector<char>& pngData); - -} - -#endif // PNGImageEncoder_h diff --git a/WebCore/platform/image-encoders/skia/JPEGImageEncoder.cpp b/WebCore/platform/image-encoders/skia/JPEGImageEncoder.cpp deleted file mode 100644 index d4e1481..0000000 --- a/WebCore/platform/image-encoders/skia/JPEGImageEncoder.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* - * 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT - * OWNER 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. - */ - -#include "config.h" -#include "JPEGImageEncoder.h" - -#include "IntSize.h" -#include "SkBitmap.h" -#include "SkUnPreMultiply.h" -#include "SkColorPriv.h" -extern "C" { -#include <stdio.h> // jpeglib.h needs stdio.h FILE -#include "jpeglib.h" -#include <setjmp.h> -} - -namespace WebCore { - -struct JPEGOutputBuffer : public jpeg_destination_mgr { - Vector<unsigned char>* output; - Vector<unsigned char> buffer; -}; - -static void prepareOutput(j_compress_ptr cinfo) -{ - JPEGOutputBuffer* out = static_cast<JPEGOutputBuffer*>(cinfo->dest); - const size_t internalBufferSize = 8192; - out->buffer.resize(internalBufferSize); - out->next_output_byte = out->buffer.data(); - out->free_in_buffer = out->buffer.size(); -} - -static boolean writeOutput(j_compress_ptr cinfo) -{ - JPEGOutputBuffer* out = static_cast<JPEGOutputBuffer*>(cinfo->dest); - out->output->append(out->buffer.data(), out->buffer.size()); - out->next_output_byte = out->buffer.data(); - out->free_in_buffer = out->buffer.size(); - return TRUE; -} - -static void finishOutput(j_compress_ptr cinfo) -{ - JPEGOutputBuffer* out = static_cast<JPEGOutputBuffer*>(cinfo->dest); - const size_t size = out->buffer.size() - out->free_in_buffer; - out->output->append(out->buffer.data(), size); -} - -static void handleError(j_common_ptr common) -{ - jmp_buf* jumpBufferPtr = static_cast<jmp_buf*>(common->client_data); - longjmp(*jumpBufferPtr, -1); -} - -// FIXME: is alpha unpremultiplication correct, or should the alpha channel -// be ignored? See bug http://webkit.org/b/40147. -void preMultipliedBGRAtoRGB(const SkPMColor* input, unsigned int pixels, unsigned char* output) -{ - static const SkUnPreMultiply::Scale* scale = SkUnPreMultiply::GetScaleTable(); - - for (; pixels-- > 0; ++input) { - const unsigned alpha = SkGetPackedA32(*input); - if ((alpha != 0) && (alpha != 255)) { - *output++ = SkUnPreMultiply::ApplyScale(scale[alpha], SkGetPackedR32(*input)); - *output++ = SkUnPreMultiply::ApplyScale(scale[alpha], SkGetPackedG32(*input)); - *output++ = SkUnPreMultiply::ApplyScale(scale[alpha], SkGetPackedB32(*input)); - } else { - *output++ = SkGetPackedR32(*input); - *output++ = SkGetPackedG32(*input); - *output++ = SkGetPackedB32(*input); - } - } -} - -bool JPEGImageEncoder::encode(const SkBitmap& bitmap, int quality, Vector<unsigned char>* output) -{ - if (bitmap.config() != SkBitmap::kARGB_8888_Config) - return false; // Only support ARGB 32 bpp skia bitmaps. - - SkAutoLockPixels bitmapLock(bitmap); - IntSize imageSize(bitmap.width(), bitmap.height()); - imageSize.clampNegativeToZero(); - JPEGOutputBuffer destination; - destination.output = output; - Vector<JSAMPLE> row; - - jpeg_compress_struct cinfo; - jpeg_error_mgr error; - cinfo.err = jpeg_std_error(&error); - error.error_exit = handleError; - jmp_buf jumpBuffer; - cinfo.client_data = &jumpBuffer; - - if (setjmp(jumpBuffer)) { - jpeg_destroy_compress(&cinfo); - return false; - } - - jpeg_create_compress(&cinfo); - cinfo.dest = &destination; - cinfo.dest->init_destination = prepareOutput; - cinfo.dest->empty_output_buffer = writeOutput; - cinfo.dest->term_destination = finishOutput; - cinfo.image_height = imageSize.height(); - cinfo.image_width = imageSize.width(); - cinfo.in_color_space = JCS_RGB; - cinfo.input_components = 3; - - jpeg_set_defaults(&cinfo); - jpeg_set_quality(&cinfo, quality, TRUE); - jpeg_start_compress(&cinfo, TRUE); - - const SkPMColor* pixels = static_cast<SkPMColor*>(bitmap.getPixels()); - row.resize(cinfo.image_width * cinfo.input_components); - while (cinfo.next_scanline < cinfo.image_height) { - preMultipliedBGRAtoRGB(pixels, cinfo.image_width, row.data()); - jpeg_write_scanlines(&cinfo, row.dataSlot(), 1); - pixels += cinfo.image_width; - } - - jpeg_finish_compress(&cinfo); - jpeg_destroy_compress(&cinfo); - return true; -} - -} // namespace WebCore diff --git a/WebCore/platform/image-encoders/skia/JPEGImageEncoder.h b/WebCore/platform/image-encoders/skia/JPEGImageEncoder.h deleted file mode 100644 index f2ac52d..0000000 --- a/WebCore/platform/image-encoders/skia/JPEGImageEncoder.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT - * OWNER 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. - */ - -#ifndef JPEGImageEncoder_h -#define JPEGImageEncoder_h - -#include "Vector.h" - -class SkBitmap; - -namespace WebCore { - -class JPEGImageEncoder { -public: - // Encode the input bitmap with a compression quality in [0-100]. - static bool encode(const SkBitmap&, int quality, Vector<unsigned char>*); - - // For callers: provide a reasonable compression quality default. - enum Quality { DefaultCompressionQuality = 92 }; -}; - -} // namespace WebCore - -#endif diff --git a/WebCore/platform/image-encoders/skia/PNGImageEncoder.cpp b/WebCore/platform/image-encoders/skia/PNGImageEncoder.cpp deleted file mode 100644 index 9fc82c4..0000000 --- a/WebCore/platform/image-encoders/skia/PNGImageEncoder.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - * 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT - * OWNER 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. - */ - -#include "config.h" -#include "PNGImageEncoder.h" - -#include "IntSize.h" -#include "SkBitmap.h" -#include "SkUnPreMultiply.h" -extern "C" { -#include "png.h" -} - -namespace WebCore { - -static void writeOutput(png_structp png, png_bytep data, png_size_t size) -{ - static_cast<Vector<unsigned char>*>(png->io_ptr)->append(data, size); -} - -static void preMultipliedBGRAtoRGBA(const SkPMColor* input, int pixels, unsigned char* output) -{ - while (pixels-- > 0) { - SkColor unmultiplied = SkUnPreMultiply::PMColorToColor(*input++); - *output++ = SkColorGetR(unmultiplied); - *output++ = SkColorGetG(unmultiplied); - *output++ = SkColorGetB(unmultiplied); - *output++ = SkColorGetA(unmultiplied); - } -} - -bool PNGImageEncoder::encode(const SkBitmap& bitmap, Vector<unsigned char>* output) -{ - if (bitmap.config() != SkBitmap::kARGB_8888_Config) - return false; // Only support ARGB 32 bpp skia bitmaps. - - SkAutoLockPixels bitmapLock(bitmap); - IntSize imageSize(bitmap.width(), bitmap.height()); - imageSize.clampNegativeToZero(); - Vector<unsigned char> row; - - png_struct* png = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0); - png_info* info = png_create_info_struct(png); - if (!png || !info || setjmp(png_jmpbuf(png))) { - png_destroy_write_struct(png ? &png : 0, info ? &info : 0); - return false; - } - - png_set_write_fn(png, output, writeOutput, 0); - png_set_IHDR(png, info, imageSize.width(), imageSize.height(), - 8, PNG_COLOR_TYPE_RGB_ALPHA, 0, 0, 0); - png_write_info(png, info); - - const SkPMColor* pixels = static_cast<SkPMColor*>(bitmap.getPixels()); - row.resize(imageSize.width() * bitmap.bytesPerPixel()); - for (int y = 0; y < imageSize.height(); ++y) { - preMultipliedBGRAtoRGBA(pixels, imageSize.width(), row.data()); - png_write_row(png, row.data()); - pixels += imageSize.width(); - } - - png_write_end(png, info); - png_destroy_write_struct(&png, &info); - return true; -} - -} // namespace WebCore diff --git a/WebCore/platform/image-encoders/skia/PNGImageEncoder.h b/WebCore/platform/image-encoders/skia/PNGImageEncoder.h deleted file mode 100644 index b8dfec3..0000000 --- a/WebCore/platform/image-encoders/skia/PNGImageEncoder.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT - * OWNER 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. - */ - -#ifndef PNGImageEncoder_h -#define PNGImageEncoder_h - -#include "Vector.h" - -class SkBitmap; - -namespace WebCore { - -// Interface for encoding PNG data. This is a wrapper around libpng. -class PNGImageEncoder { -public: - static bool encode(const SkBitmap&, Vector<unsigned char>* output); -}; - -} // namespace WebCore - -#endif |