| Index: Source/core/platform/graphics/GraphicsContext3DImagePacking.cpp
|
| diff --git a/Source/core/platform/graphics/GraphicsContext3DImagePacking.cpp b/Source/core/platform/graphics/GraphicsContext3DImagePacking.cpp
|
| deleted file mode 100644
|
| index aa8ff22110543334f8f95a752a5f3882fb2a617b..0000000000000000000000000000000000000000
|
| --- a/Source/core/platform/graphics/GraphicsContext3DImagePacking.cpp
|
| +++ /dev/null
|
| @@ -1,1588 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2013 Google Inc. All rights reserved.
|
| - * Copyright (C) 2010 Mozilla Corporation. 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.
|
| - *
|
| - * 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.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "core/platform/graphics/GraphicsContext3D.h"
|
| -
|
| -#include "core/platform/graphics/cpu/arm/GraphicsContext3DNEON.h"
|
| -#include "core/platform/image-decoders/ImageDecoder.h"
|
| -#include "platform/graphics/ImageObserver.h"
|
| -
|
| -namespace WebCore {
|
| -
|
| -namespace {
|
| -
|
| -GraphicsContext3D::DataFormat getDataFormat(GC3Denum destinationFormat, GC3Denum destinationType)
|
| -{
|
| - GraphicsContext3D::DataFormat dstFormat = GraphicsContext3D::DataFormatRGBA8;
|
| - switch (destinationType) {
|
| - case GraphicsContext3D::UNSIGNED_BYTE:
|
| - switch (destinationFormat) {
|
| - case GraphicsContext3D::RGB:
|
| - dstFormat = GraphicsContext3D::DataFormatRGB8;
|
| - break;
|
| - case GraphicsContext3D::RGBA:
|
| - dstFormat = GraphicsContext3D::DataFormatRGBA8;
|
| - break;
|
| - case GraphicsContext3D::ALPHA:
|
| - dstFormat = GraphicsContext3D::DataFormatA8;
|
| - break;
|
| - case GraphicsContext3D::LUMINANCE:
|
| - dstFormat = GraphicsContext3D::DataFormatR8;
|
| - break;
|
| - case GraphicsContext3D::LUMINANCE_ALPHA:
|
| - dstFormat = GraphicsContext3D::DataFormatRA8;
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| - break;
|
| - case GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4:
|
| - dstFormat = GraphicsContext3D::DataFormatRGBA4444;
|
| - break;
|
| - case GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1:
|
| - dstFormat = GraphicsContext3D::DataFormatRGBA5551;
|
| - break;
|
| - case GraphicsContext3D::UNSIGNED_SHORT_5_6_5:
|
| - dstFormat = GraphicsContext3D::DataFormatRGB565;
|
| - break;
|
| - case GraphicsContext3D::HALF_FLOAT_OES: // OES_texture_half_float
|
| - switch (destinationFormat) {
|
| - case GraphicsContext3D::RGB:
|
| - dstFormat = GraphicsContext3D::DataFormatRGB16F;
|
| - break;
|
| - case GraphicsContext3D::RGBA:
|
| - dstFormat = GraphicsContext3D::DataFormatRGBA16F;
|
| - break;
|
| - case GraphicsContext3D::ALPHA:
|
| - dstFormat = GraphicsContext3D::DataFormatA16F;
|
| - break;
|
| - case GraphicsContext3D::LUMINANCE:
|
| - dstFormat = GraphicsContext3D::DataFormatR16F;
|
| - break;
|
| - case GraphicsContext3D::LUMINANCE_ALPHA:
|
| - dstFormat = GraphicsContext3D::DataFormatRA16F;
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| - break;
|
| - case GraphicsContext3D::FLOAT: // OES_texture_float
|
| - switch (destinationFormat) {
|
| - case GraphicsContext3D::RGB:
|
| - dstFormat = GraphicsContext3D::DataFormatRGB32F;
|
| - break;
|
| - case GraphicsContext3D::RGBA:
|
| - dstFormat = GraphicsContext3D::DataFormatRGBA32F;
|
| - break;
|
| - case GraphicsContext3D::ALPHA:
|
| - dstFormat = GraphicsContext3D::DataFormatA32F;
|
| - break;
|
| - case GraphicsContext3D::LUMINANCE:
|
| - dstFormat = GraphicsContext3D::DataFormatR32F;
|
| - break;
|
| - case GraphicsContext3D::LUMINANCE_ALPHA:
|
| - dstFormat = GraphicsContext3D::DataFormatRA32F;
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| - return dstFormat;
|
| -}
|
| -
|
| -// Following Float to Half-Float converion code is from the implementation of ftp://www.fox-toolkit.org/pub/fasthalffloatconversion.pdf,
|
| -// "Fast Half Float Conversions" by Jeroen van der Zijp, November 2008 (Revised September 2010).
|
| -// Specially, the basetable[512] and shifttable[512] are generated as follows:
|
| -/*
|
| -unsigned short basetable[512];
|
| -unsigned char shifttable[512];
|
| -
|
| -void generatetables(){
|
| - unsigned int i;
|
| - int e;
|
| - for (i = 0; i < 256; ++i){
|
| - e = i - 127;
|
| - if (e < -24){ // Very small numbers map to zero
|
| - basetable[i | 0x000] = 0x0000;
|
| - basetable[i | 0x100] = 0x8000;
|
| - shifttable[i | 0x000] = 24;
|
| - shifttable[i | 0x100] = 24;
|
| - }
|
| - else if (e < -14) { // Small numbers map to denorms
|
| - basetable[i | 0x000] = (0x0400>>(-e-14));
|
| - basetable[i | 0x100] = (0x0400>>(-e-14)) | 0x8000;
|
| - shifttable[i | 0x000] = -e-1;
|
| - shifttable[i | 0x100] = -e-1;
|
| - }
|
| - else if (e <= 15){ // Normal numbers just lose precision
|
| - basetable[i | 0x000] = ((e+15)<<10);
|
| - basetable[i| 0x100] = ((e+15)<<10) | 0x8000;
|
| - shifttable[i|0x000] = 13;
|
| - shifttable[i|0x100] = 13;
|
| - }
|
| - else if (e<128){ // Large numbers map to Infinity
|
| - basetable[i|0x000] = 0x7C00;
|
| - basetable[i|0x100] = 0xFC00;
|
| - shifttable[i|0x000] = 24;
|
| - shifttable[i|0x100] = 24;
|
| - }
|
| - else { // Infinity and NaN's stay Infinity and NaN's
|
| - basetable[i|0x000] = 0x7C00;
|
| - basetable[i|0x100] = 0xFC00;
|
| - shifttable[i|0x000] = 13;
|
| - shifttable[i|0x100] = 13;
|
| - }
|
| - }
|
| -}
|
| -*/
|
| -
|
| -unsigned short baseTable[512] = {
|
| -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
| -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
| -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
| -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
| -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
| -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
| -0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 8, 16, 32, 64, 128, 256,
|
| -512, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336, 15360,
|
| -16384, 17408, 18432, 19456, 20480, 21504, 22528, 23552, 24576, 25600, 26624, 27648, 28672, 29696, 30720, 31744,
|
| -31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744,
|
| -31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744,
|
| -31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744,
|
| -31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744,
|
| -31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744,
|
| -31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744,
|
| -31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744, 31744,
|
| -32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768,
|
| -32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768,
|
| -32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768,
|
| -32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768,
|
| -32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768,
|
| -32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768,
|
| -32768, 32768, 32768, 32768, 32768, 32768, 32768, 32769, 32770, 32772, 32776, 32784, 32800, 32832, 32896, 33024,
|
| -33280, 33792, 34816, 35840, 36864, 37888, 38912, 39936, 40960, 41984, 43008, 44032, 45056, 46080, 47104, 48128,
|
| -49152, 50176, 51200, 52224, 53248, 54272, 55296, 56320, 57344, 58368, 59392, 60416, 61440, 62464, 63488, 64512,
|
| -64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512,
|
| -64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512,
|
| -64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512,
|
| -64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512,
|
| -64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512,
|
| -64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512,
|
| -64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512, 64512
|
| -};
|
| -
|
| -unsigned char shiftTable[512] = {
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15,
|
| -14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
| -13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 13,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15,
|
| -14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
| -13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
| -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 13
|
| -};
|
| -
|
| -unsigned short convertFloatToHalfFloat(float f)
|
| -{
|
| - unsigned temp = *(reinterpret_cast<unsigned *>(&f));
|
| - unsigned signexp = (temp >> 23) & 0x1ff;
|
| - return baseTable[signexp] + ((temp & 0x007fffff) >> shiftTable[signexp]);
|
| -}
|
| -
|
| -/* BEGIN CODE SHARED WITH MOZILLA FIREFOX */
|
| -
|
| -// The following packing and unpacking routines are expressed in terms of function templates and inline functions to achieve generality and speedup.
|
| -// Explicit template specializations correspond to the cases that would occur.
|
| -// Some code are merged back from Mozilla code in http://mxr.mozilla.org/mozilla-central/source/content/canvas/src/WebGLTexelConversions.h
|
| -
|
| -//----------------------------------------------------------------------
|
| -// Pixel unpacking routines.
|
| -template<int format, typename SourceType, typename DstType>
|
| -void unpack(const SourceType*, DstType*, unsigned)
|
| -{
|
| - ASSERT_NOT_REACHED();
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatRGB8, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - destination[1] = source[1];
|
| - destination[2] = source[2];
|
| - destination[3] = 0xFF;
|
| - source += 3;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatBGR8, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[2];
|
| - destination[1] = source[1];
|
| - destination[2] = source[0];
|
| - destination[3] = 0xFF;
|
| - source += 3;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatARGB8, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[1];
|
| - destination[1] = source[2];
|
| - destination[2] = source[3];
|
| - destination[3] = source[0];
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatABGR8, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[3];
|
| - destination[1] = source[2];
|
| - destination[2] = source[1];
|
| - destination[3] = source[0];
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatBGRA8, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - const uint32_t* source32 = reinterpret_cast_ptr<const uint32_t*>(source);
|
| - uint32_t* destination32 = reinterpret_cast_ptr<uint32_t*>(destination);
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - uint32_t bgra = source32[i];
|
| -#if CPU(BIG_ENDIAN)
|
| - uint32_t brMask = 0xff00ff00;
|
| - uint32_t gaMask = 0x00ff00ff;
|
| -#else
|
| - uint32_t brMask = 0x00ff00ff;
|
| - uint32_t gaMask = 0xff00ff00;
|
| -#endif
|
| - uint32_t rgba = (((bgra >> 16) | (bgra << 16)) & brMask) | (bgra & gaMask);
|
| - destination32[i] = rgba;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatRGBA5551, uint16_t, uint8_t>(const uint16_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| -#if HAVE(ARM_NEON_INTRINSICS)
|
| - SIMD::unpackOneRowOfRGBA5551ToRGBA8(source, destination, pixelsPerRow);
|
| -#endif
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - uint16_t packedValue = source[0];
|
| - uint8_t r = packedValue >> 11;
|
| - uint8_t g = (packedValue >> 6) & 0x1F;
|
| - uint8_t b = (packedValue >> 1) & 0x1F;
|
| - destination[0] = (r << 3) | (r & 0x7);
|
| - destination[1] = (g << 3) | (g & 0x7);
|
| - destination[2] = (b << 3) | (b & 0x7);
|
| - destination[3] = (packedValue & 0x1) ? 0xFF : 0x0;
|
| - source += 1;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatRGBA4444, uint16_t, uint8_t>(const uint16_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| -#if HAVE(ARM_NEON_INTRINSICS)
|
| - SIMD::unpackOneRowOfRGBA4444ToRGBA8(source, destination, pixelsPerRow);
|
| -#endif
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - uint16_t packedValue = source[0];
|
| - uint8_t r = packedValue >> 12;
|
| - uint8_t g = (packedValue >> 8) & 0x0F;
|
| - uint8_t b = (packedValue >> 4) & 0x0F;
|
| - uint8_t a = packedValue & 0x0F;
|
| - destination[0] = r << 4 | r;
|
| - destination[1] = g << 4 | g;
|
| - destination[2] = b << 4 | b;
|
| - destination[3] = a << 4 | a;
|
| - source += 1;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatRGB565, uint16_t, uint8_t>(const uint16_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| -#if HAVE(ARM_NEON_INTRINSICS)
|
| - SIMD::unpackOneRowOfRGB565ToRGBA8(source, destination, pixelsPerRow);
|
| -#endif
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - uint16_t packedValue = source[0];
|
| - uint8_t r = packedValue >> 11;
|
| - uint8_t g = (packedValue >> 5) & 0x3F;
|
| - uint8_t b = packedValue & 0x1F;
|
| - destination[0] = (r << 3) | (r & 0x7);
|
| - destination[1] = (g << 2) | (g & 0x3);
|
| - destination[2] = (b << 3) | (b & 0x7);
|
| - destination[3] = 0xFF;
|
| - source += 1;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatR8, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - destination[1] = source[0];
|
| - destination[2] = source[0];
|
| - destination[3] = 0xFF;
|
| - source += 1;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatRA8, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - destination[1] = source[0];
|
| - destination[2] = source[0];
|
| - destination[3] = source[1];
|
| - source += 2;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatAR8, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[1];
|
| - destination[1] = source[1];
|
| - destination[2] = source[1];
|
| - destination[3] = source[0];
|
| - source += 2;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatA8, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = 0x0;
|
| - destination[1] = 0x0;
|
| - destination[2] = 0x0;
|
| - destination[3] = source[0];
|
| - source += 1;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatRGBA8, uint8_t, float>(const uint8_t* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - const float scaleFactor = 1.0f / 255.0f;
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0] * scaleFactor;
|
| - destination[1] = source[1] * scaleFactor;
|
| - destination[2] = source[2] * scaleFactor;
|
| - destination[3] = source[3] * scaleFactor;
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatBGRA8, uint8_t, float>(const uint8_t* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - const float scaleFactor = 1.0f / 255.0f;
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[2] * scaleFactor;
|
| - destination[1] = source[1] * scaleFactor;
|
| - destination[2] = source[0] * scaleFactor;
|
| - destination[3] = source[3] * scaleFactor;
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatABGR8, uint8_t, float>(const uint8_t* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - const float scaleFactor = 1.0f / 255.0f;
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[3] * scaleFactor;
|
| - destination[1] = source[2] * scaleFactor;
|
| - destination[2] = source[1] * scaleFactor;
|
| - destination[3] = source[0] * scaleFactor;
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatARGB8, uint8_t, float>(const uint8_t* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - const float scaleFactor = 1.0f / 255.0f;
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[1] * scaleFactor;
|
| - destination[1] = source[2] * scaleFactor;
|
| - destination[2] = source[3] * scaleFactor;
|
| - destination[3] = source[0] * scaleFactor;
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatRGB8, uint8_t, float>(const uint8_t* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - const float scaleFactor = 1.0f / 255.0f;
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0] * scaleFactor;
|
| - destination[1] = source[1] * scaleFactor;
|
| - destination[2] = source[2] * scaleFactor;
|
| - destination[3] = 1;
|
| - source += 3;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatBGR8, uint8_t, float>(const uint8_t* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - const float scaleFactor = 1.0f / 255.0f;
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[2] * scaleFactor;
|
| - destination[1] = source[1] * scaleFactor;
|
| - destination[2] = source[0] * scaleFactor;
|
| - destination[3] = 1;
|
| - source += 3;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatRGB32F, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - destination[1] = source[1];
|
| - destination[2] = source[2];
|
| - destination[3] = 1;
|
| - source += 3;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatR32F, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - destination[1] = source[0];
|
| - destination[2] = source[0];
|
| - destination[3] = 1;
|
| - source += 1;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatRA32F, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - destination[1] = source[0];
|
| - destination[2] = source[0];
|
| - destination[3] = source[1];
|
| - source += 2;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void unpack<GraphicsContext3D::DataFormatA32F, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = 0;
|
| - destination[1] = 0;
|
| - destination[2] = 0;
|
| - destination[3] = source[0];
|
| - source += 1;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -//----------------------------------------------------------------------
|
| -// Pixel packing routines.
|
| -//
|
| -
|
| -template<int format, int alphaOp, typename SourceType, typename DstType>
|
| -void pack(const SourceType*, DstType*, unsigned)
|
| -{
|
| - ASSERT_NOT_REACHED();
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatA8, GraphicsContext3D::AlphaDoNothing, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[3];
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatR8, GraphicsContext3D::AlphaDoNothing, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatR8, GraphicsContext3D::AlphaDoPremultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] / 255.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - destination[0] = sourceR;
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -// FIXME: this routine is lossy and must be removed.
|
| -template<> void pack<GraphicsContext3D::DataFormatR8, GraphicsContext3D::AlphaDoUnmultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 255.0f / source[3] : 1.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - destination[0] = sourceR;
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRA8, GraphicsContext3D::AlphaDoNothing, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - destination[1] = source[3];
|
| - source += 4;
|
| - destination += 2;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRA8, GraphicsContext3D::AlphaDoPremultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] / 255.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - destination[0] = sourceR;
|
| - destination[1] = source[3];
|
| - source += 4;
|
| - destination += 2;
|
| - }
|
| -}
|
| -
|
| -// FIXME: this routine is lossy and must be removed.
|
| -template<> void pack<GraphicsContext3D::DataFormatRA8, GraphicsContext3D::AlphaDoUnmultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 255.0f / source[3] : 1.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - destination[0] = sourceR;
|
| - destination[1] = source[3];
|
| - source += 4;
|
| - destination += 2;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB8, GraphicsContext3D::AlphaDoNothing, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - destination[1] = source[1];
|
| - destination[2] = source[2];
|
| - source += 4;
|
| - destination += 3;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB8, GraphicsContext3D::AlphaDoPremultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] / 255.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - uint8_t sourceG = static_cast<uint8_t>(static_cast<float>(source[1]) * scaleFactor);
|
| - uint8_t sourceB = static_cast<uint8_t>(static_cast<float>(source[2]) * scaleFactor);
|
| - destination[0] = sourceR;
|
| - destination[1] = sourceG;
|
| - destination[2] = sourceB;
|
| - source += 4;
|
| - destination += 3;
|
| - }
|
| -}
|
| -
|
| -// FIXME: this routine is lossy and must be removed.
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB8, GraphicsContext3D::AlphaDoUnmultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 255.0f / source[3] : 1.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - uint8_t sourceG = static_cast<uint8_t>(static_cast<float>(source[1]) * scaleFactor);
|
| - uint8_t sourceB = static_cast<uint8_t>(static_cast<float>(source[2]) * scaleFactor);
|
| - destination[0] = sourceR;
|
| - destination[1] = sourceG;
|
| - destination[2] = sourceB;
|
| - source += 4;
|
| - destination += 3;
|
| - }
|
| -}
|
| -
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA8, GraphicsContext3D::AlphaDoNothing, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - memcpy(destination, source, pixelsPerRow * 4);
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA8, GraphicsContext3D::AlphaDoPremultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] / 255.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - uint8_t sourceG = static_cast<uint8_t>(static_cast<float>(source[1]) * scaleFactor);
|
| - uint8_t sourceB = static_cast<uint8_t>(static_cast<float>(source[2]) * scaleFactor);
|
| - destination[0] = sourceR;
|
| - destination[1] = sourceG;
|
| - destination[2] = sourceB;
|
| - destination[3] = source[3];
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -// FIXME: this routine is lossy and must be removed.
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA8, GraphicsContext3D::AlphaDoUnmultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 255.0f / source[3] : 1.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - uint8_t sourceG = static_cast<uint8_t>(static_cast<float>(source[1]) * scaleFactor);
|
| - uint8_t sourceB = static_cast<uint8_t>(static_cast<float>(source[2]) * scaleFactor);
|
| - destination[0] = sourceR;
|
| - destination[1] = sourceG;
|
| - destination[2] = sourceB;
|
| - destination[3] = source[3];
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA4444, GraphicsContext3D::AlphaDoNothing, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| -#if HAVE(ARM_NEON_INTRINSICS)
|
| - SIMD::packOneRowOfRGBA8ToUnsignedShort4444(source, destination, pixelsPerRow);
|
| -#endif
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - *destination = (((source[0] & 0xF0) << 8)
|
| - | ((source[1] & 0xF0) << 4)
|
| - | (source[2] & 0xF0)
|
| - | (source[3] >> 4));
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA4444, GraphicsContext3D::AlphaDoPremultiply, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] / 255.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - uint8_t sourceG = static_cast<uint8_t>(static_cast<float>(source[1]) * scaleFactor);
|
| - uint8_t sourceB = static_cast<uint8_t>(static_cast<float>(source[2]) * scaleFactor);
|
| - *destination = (((sourceR & 0xF0) << 8)
|
| - | ((sourceG & 0xF0) << 4)
|
| - | (sourceB & 0xF0)
|
| - | (source[3] >> 4));
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -// FIXME: this routine is lossy and must be removed.
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA4444, GraphicsContext3D::AlphaDoUnmultiply, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 255.0f / source[3] : 1.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - uint8_t sourceG = static_cast<uint8_t>(static_cast<float>(source[1]) * scaleFactor);
|
| - uint8_t sourceB = static_cast<uint8_t>(static_cast<float>(source[2]) * scaleFactor);
|
| - *destination = (((sourceR & 0xF0) << 8)
|
| - | ((sourceG & 0xF0) << 4)
|
| - | (sourceB & 0xF0)
|
| - | (source[3] >> 4));
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA5551, GraphicsContext3D::AlphaDoNothing, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| -#if HAVE(ARM_NEON_INTRINSICS)
|
| - SIMD::packOneRowOfRGBA8ToUnsignedShort5551(source, destination, pixelsPerRow);
|
| -#endif
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - *destination = (((source[0] & 0xF8) << 8)
|
| - | ((source[1] & 0xF8) << 3)
|
| - | ((source[2] & 0xF8) >> 2)
|
| - | (source[3] >> 7));
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA5551, GraphicsContext3D::AlphaDoPremultiply, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] / 255.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - uint8_t sourceG = static_cast<uint8_t>(static_cast<float>(source[1]) * scaleFactor);
|
| - uint8_t sourceB = static_cast<uint8_t>(static_cast<float>(source[2]) * scaleFactor);
|
| - *destination = (((sourceR & 0xF8) << 8)
|
| - | ((sourceG & 0xF8) << 3)
|
| - | ((sourceB & 0xF8) >> 2)
|
| - | (source[3] >> 7));
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -// FIXME: this routine is lossy and must be removed.
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA5551, GraphicsContext3D::AlphaDoUnmultiply, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 255.0f / source[3] : 1.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - uint8_t sourceG = static_cast<uint8_t>(static_cast<float>(source[1]) * scaleFactor);
|
| - uint8_t sourceB = static_cast<uint8_t>(static_cast<float>(source[2]) * scaleFactor);
|
| - *destination = (((sourceR & 0xF8) << 8)
|
| - | ((sourceG & 0xF8) << 3)
|
| - | ((sourceB & 0xF8) >> 2)
|
| - | (source[3] >> 7));
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB565, GraphicsContext3D::AlphaDoNothing, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| -#if HAVE(ARM_NEON_INTRINSICS)
|
| - SIMD::packOneRowOfRGBA8ToUnsignedShort565(source, destination, pixelsPerRow);
|
| -#endif
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - *destination = (((source[0] & 0xF8) << 8)
|
| - | ((source[1] & 0xFC) << 3)
|
| - | ((source[2] & 0xF8) >> 3));
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB565, GraphicsContext3D::AlphaDoPremultiply, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] / 255.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - uint8_t sourceG = static_cast<uint8_t>(static_cast<float>(source[1]) * scaleFactor);
|
| - uint8_t sourceB = static_cast<uint8_t>(static_cast<float>(source[2]) * scaleFactor);
|
| - *destination = (((sourceR & 0xF8) << 8)
|
| - | ((sourceG & 0xFC) << 3)
|
| - | ((sourceB & 0xF8) >> 3));
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -// FIXME: this routine is lossy and must be removed.
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB565, GraphicsContext3D::AlphaDoUnmultiply, uint8_t, uint16_t>(const uint8_t* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 255.0f / source[3] : 1.0f;
|
| - uint8_t sourceR = static_cast<uint8_t>(static_cast<float>(source[0]) * scaleFactor);
|
| - uint8_t sourceG = static_cast<uint8_t>(static_cast<float>(source[1]) * scaleFactor);
|
| - uint8_t sourceB = static_cast<uint8_t>(static_cast<float>(source[2]) * scaleFactor);
|
| - *destination = (((sourceR & 0xF8) << 8)
|
| - | ((sourceG & 0xFC) << 3)
|
| - | ((sourceB & 0xF8) >> 3));
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB32F, GraphicsContext3D::AlphaDoNothing, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - destination[1] = source[1];
|
| - destination[2] = source[2];
|
| - source += 4;
|
| - destination += 3;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB32F, GraphicsContext3D::AlphaDoPremultiply, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3];
|
| - destination[0] = source[0] * scaleFactor;
|
| - destination[1] = source[1] * scaleFactor;
|
| - destination[2] = source[2] * scaleFactor;
|
| - source += 4;
|
| - destination += 3;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB32F, GraphicsContext3D::AlphaDoUnmultiply, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
|
| - destination[0] = source[0] * scaleFactor;
|
| - destination[1] = source[1] * scaleFactor;
|
| - destination[2] = source[2] * scaleFactor;
|
| - source += 4;
|
| - destination += 3;
|
| - }
|
| -}
|
| -
|
| -// Used only during RGBA8 or BGRA8 -> floating-point uploads.
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA32F, GraphicsContext3D::AlphaDoNothing, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - memcpy(destination, source, pixelsPerRow * 4 * sizeof(float));
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA32F, GraphicsContext3D::AlphaDoPremultiply, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3];
|
| - destination[0] = source[0] * scaleFactor;
|
| - destination[1] = source[1] * scaleFactor;
|
| - destination[2] = source[2] * scaleFactor;
|
| - destination[3] = source[3];
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA32F, GraphicsContext3D::AlphaDoUnmultiply, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
|
| - destination[0] = source[0] * scaleFactor;
|
| - destination[1] = source[1] * scaleFactor;
|
| - destination[2] = source[2] * scaleFactor;
|
| - destination[3] = source[3];
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatA32F, GraphicsContext3D::AlphaDoNothing, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[3];
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatR32F, GraphicsContext3D::AlphaDoNothing, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatR32F, GraphicsContext3D::AlphaDoPremultiply, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3];
|
| - destination[0] = source[0] * scaleFactor;
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatR32F, GraphicsContext3D::AlphaDoUnmultiply, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
|
| - destination[0] = source[0] * scaleFactor;
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRA32F, GraphicsContext3D::AlphaDoNothing, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = source[0];
|
| - destination[1] = source[3];
|
| - source += 4;
|
| - destination += 2;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRA32F, GraphicsContext3D::AlphaDoPremultiply, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3];
|
| - destination[0] = source[0] * scaleFactor;
|
| - destination[1] = source[3];
|
| - source += 4;
|
| - destination += 2;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRA32F, GraphicsContext3D::AlphaDoUnmultiply, float, float>(const float* source, float* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned int i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
|
| - destination[0] = source[0] * scaleFactor;
|
| - destination[1] = source[3];
|
| - source += 4;
|
| - destination += 2;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA16F, GraphicsContext3D::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = convertFloatToHalfFloat(source[0]);
|
| - destination[1] = convertFloatToHalfFloat(source[1]);
|
| - destination[2] = convertFloatToHalfFloat(source[2]);
|
| - destination[3] = convertFloatToHalfFloat(source[3]);
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA16F, GraphicsContext3D::AlphaDoPremultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3];
|
| - destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
|
| - destination[1] = convertFloatToHalfFloat(source[1] * scaleFactor);
|
| - destination[2] = convertFloatToHalfFloat(source[2] * scaleFactor);
|
| - destination[3] = convertFloatToHalfFloat(source[3]);
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGBA16F, GraphicsContext3D::AlphaDoUnmultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
|
| - destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
|
| - destination[1] = convertFloatToHalfFloat(source[1] * scaleFactor);
|
| - destination[2] = convertFloatToHalfFloat(source[2] * scaleFactor);
|
| - destination[3] = convertFloatToHalfFloat(source[3]);
|
| - source += 4;
|
| - destination += 4;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB16F, GraphicsContext3D::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = convertFloatToHalfFloat(source[0]);
|
| - destination[1] = convertFloatToHalfFloat(source[1]);
|
| - destination[2] = convertFloatToHalfFloat(source[2]);
|
| - source += 4;
|
| - destination += 3;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB16F, GraphicsContext3D::AlphaDoPremultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3];
|
| - destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
|
| - destination[1] = convertFloatToHalfFloat(source[1] * scaleFactor);
|
| - destination[2] = convertFloatToHalfFloat(source[2] * scaleFactor);
|
| - source += 4;
|
| - destination += 3;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRGB16F, GraphicsContext3D::AlphaDoUnmultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
|
| - destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
|
| - destination[1] = convertFloatToHalfFloat(source[1] * scaleFactor);
|
| - destination[2] = convertFloatToHalfFloat(source[2] * scaleFactor);
|
| - source += 4;
|
| - destination += 3;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRA16F, GraphicsContext3D::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = convertFloatToHalfFloat(source[0]);
|
| - destination[1] = convertFloatToHalfFloat(source[3]);
|
| - source += 4;
|
| - destination += 2;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRA16F, GraphicsContext3D::AlphaDoPremultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3];
|
| - destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
|
| - destination[1] = convertFloatToHalfFloat(source[3]);
|
| - source += 4;
|
| - destination += 2;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatRA16F, GraphicsContext3D::AlphaDoUnmultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
|
| - destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
|
| - destination[1] = convertFloatToHalfFloat(source[3]);
|
| - source += 4;
|
| - destination += 2;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatR16F, GraphicsContext3D::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = convertFloatToHalfFloat(source[0]);
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatR16F, GraphicsContext3D::AlphaDoPremultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3];
|
| - destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatR16F, GraphicsContext3D::AlphaDoUnmultiply, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
|
| - destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -template<> void pack<GraphicsContext3D::DataFormatA16F, GraphicsContext3D::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, unsigned pixelsPerRow)
|
| -{
|
| - for (unsigned i = 0; i < pixelsPerRow; ++i) {
|
| - destination[0] = convertFloatToHalfFloat(source[3]);
|
| - source += 4;
|
| - destination += 1;
|
| - }
|
| -}
|
| -
|
| -bool HasAlpha(int format)
|
| -{
|
| - return format == GraphicsContext3D::DataFormatA8
|
| - || format == GraphicsContext3D::DataFormatA16F
|
| - || format == GraphicsContext3D::DataFormatA32F
|
| - || format == GraphicsContext3D::DataFormatRA8
|
| - || format == GraphicsContext3D::DataFormatAR8
|
| - || format == GraphicsContext3D::DataFormatRA16F
|
| - || format == GraphicsContext3D::DataFormatRA32F
|
| - || format == GraphicsContext3D::DataFormatRGBA8
|
| - || format == GraphicsContext3D::DataFormatBGRA8
|
| - || format == GraphicsContext3D::DataFormatARGB8
|
| - || format == GraphicsContext3D::DataFormatABGR8
|
| - || format == GraphicsContext3D::DataFormatRGBA16F
|
| - || format == GraphicsContext3D::DataFormatRGBA32F
|
| - || format == GraphicsContext3D::DataFormatRGBA4444
|
| - || format == GraphicsContext3D::DataFormatRGBA5551;
|
| -}
|
| -
|
| -bool HasColor(int format)
|
| -{
|
| - return format == GraphicsContext3D::DataFormatRGBA8
|
| - || format == GraphicsContext3D::DataFormatRGBA16F
|
| - || format == GraphicsContext3D::DataFormatRGBA32F
|
| - || format == GraphicsContext3D::DataFormatRGB8
|
| - || format == GraphicsContext3D::DataFormatRGB16F
|
| - || format == GraphicsContext3D::DataFormatRGB32F
|
| - || format == GraphicsContext3D::DataFormatBGR8
|
| - || format == GraphicsContext3D::DataFormatBGRA8
|
| - || format == GraphicsContext3D::DataFormatARGB8
|
| - || format == GraphicsContext3D::DataFormatABGR8
|
| - || format == GraphicsContext3D::DataFormatRGBA5551
|
| - || format == GraphicsContext3D::DataFormatRGBA4444
|
| - || format == GraphicsContext3D::DataFormatRGB565
|
| - || format == GraphicsContext3D::DataFormatR8
|
| - || format == GraphicsContext3D::DataFormatR16F
|
| - || format == GraphicsContext3D::DataFormatR32F
|
| - || format == GraphicsContext3D::DataFormatRA8
|
| - || format == GraphicsContext3D::DataFormatRA16F
|
| - || format == GraphicsContext3D::DataFormatRA32F
|
| - || format == GraphicsContext3D::DataFormatAR8;
|
| -}
|
| -
|
| -template<int Format>
|
| -struct IsFloatFormat {
|
| - static const bool Value =
|
| - Format == GraphicsContext3D::DataFormatRGBA32F
|
| - || Format == GraphicsContext3D::DataFormatRGB32F
|
| - || Format == GraphicsContext3D::DataFormatRA32F
|
| - || Format == GraphicsContext3D::DataFormatR32F
|
| - || Format == GraphicsContext3D::DataFormatA32F;
|
| -};
|
| -
|
| -template<int Format>
|
| -struct IsHalfFloatFormat {
|
| - static const bool Value =
|
| - Format == GraphicsContext3D::DataFormatRGBA16F
|
| - || Format == GraphicsContext3D::DataFormatRGB16F
|
| - || Format == GraphicsContext3D::DataFormatRA16F
|
| - || Format == GraphicsContext3D::DataFormatR16F
|
| - || Format == GraphicsContext3D::DataFormatA16F;
|
| -};
|
| -
|
| -template<int Format>
|
| -struct Is16bppFormat {
|
| - static const bool Value =
|
| - Format == GraphicsContext3D::DataFormatRGBA5551
|
| - || Format == GraphicsContext3D::DataFormatRGBA4444
|
| - || Format == GraphicsContext3D::DataFormatRGB565;
|
| -};
|
| -
|
| -template<int Format, bool IsFloat = IsFloatFormat<Format>::Value, bool IsHalfFloat = IsHalfFloatFormat<Format>::Value, bool Is16bpp = Is16bppFormat<Format>::Value>
|
| -struct DataTypeForFormat {
|
| - typedef uint8_t Type;
|
| -};
|
| -
|
| -template<int Format>
|
| -struct DataTypeForFormat<Format, true, false, false> {
|
| - typedef float Type;
|
| -};
|
| -
|
| -template<int Format>
|
| -struct DataTypeForFormat<Format, false, true, false> {
|
| - typedef uint16_t Type;
|
| -};
|
| -
|
| -template<int Format>
|
| -struct DataTypeForFormat<Format, false, false, true> {
|
| - typedef uint16_t Type;
|
| -};
|
| -
|
| -template<int Format>
|
| -struct IntermediateFormat {
|
| - static const int Value = (IsFloatFormat<Format>::Value || IsHalfFloatFormat<Format>::Value) ? GraphicsContext3D::DataFormatRGBA32F : GraphicsContext3D::DataFormatRGBA8;
|
| -};
|
| -
|
| -unsigned TexelBytesForFormat(GraphicsContext3D::DataFormat format)
|
| -{
|
| - switch (format) {
|
| - case GraphicsContext3D::DataFormatR8:
|
| - case GraphicsContext3D::DataFormatA8:
|
| - return 1;
|
| - case GraphicsContext3D::DataFormatRA8:
|
| - case GraphicsContext3D::DataFormatAR8:
|
| - case GraphicsContext3D::DataFormatRGBA5551:
|
| - case GraphicsContext3D::DataFormatRGBA4444:
|
| - case GraphicsContext3D::DataFormatRGB565:
|
| - case GraphicsContext3D::DataFormatA16F:
|
| - case GraphicsContext3D::DataFormatR16F:
|
| - return 2;
|
| - case GraphicsContext3D::DataFormatRGB8:
|
| - case GraphicsContext3D::DataFormatBGR8:
|
| - return 3;
|
| - case GraphicsContext3D::DataFormatRGBA8:
|
| - case GraphicsContext3D::DataFormatARGB8:
|
| - case GraphicsContext3D::DataFormatABGR8:
|
| - case GraphicsContext3D::DataFormatBGRA8:
|
| - case GraphicsContext3D::DataFormatR32F:
|
| - case GraphicsContext3D::DataFormatA32F:
|
| - case GraphicsContext3D::DataFormatRA16F:
|
| - return 4;
|
| - case GraphicsContext3D::DataFormatRGB16F:
|
| - return 6;
|
| - case GraphicsContext3D::DataFormatRA32F:
|
| - case GraphicsContext3D::DataFormatRGBA16F:
|
| - return 8;
|
| - case GraphicsContext3D::DataFormatRGB32F:
|
| - return 12;
|
| - case GraphicsContext3D::DataFormatRGBA32F:
|
| - return 16;
|
| - default:
|
| - return 0;
|
| - }
|
| -}
|
| -
|
| -/* END CODE SHARED WITH MOZILLA FIREFOX */
|
| -
|
| -class FormatConverter {
|
| -public:
|
| - FormatConverter(unsigned width, unsigned height,
|
| - const void* srcStart, void* dstStart, int srcStride, int dstStride)
|
| - : m_width(width), m_height(height), m_srcStart(srcStart), m_dstStart(dstStart), m_srcStride(srcStride), m_dstStride(dstStride), m_success(false)
|
| - {
|
| - const unsigned MaxNumberOfComponents = 4;
|
| - const unsigned MaxBytesPerComponent = 4;
|
| - m_unpackedIntermediateSrcData = adoptArrayPtr(new uint8_t[m_width * MaxNumberOfComponents *MaxBytesPerComponent]);
|
| - ASSERT(m_unpackedIntermediateSrcData.get());
|
| - }
|
| -
|
| - void convert(GraphicsContext3D::DataFormat srcFormat, GraphicsContext3D::DataFormat dstFormat, GraphicsContext3D::AlphaOp);
|
| - bool Success() const { return m_success; }
|
| -
|
| -private:
|
| - template<GraphicsContext3D::DataFormat SrcFormat>
|
| - void convert(GraphicsContext3D::DataFormat dstFormat, GraphicsContext3D::AlphaOp);
|
| -
|
| - template<GraphicsContext3D::DataFormat SrcFormat, GraphicsContext3D::DataFormat DstFormat>
|
| - void convert(GraphicsContext3D::AlphaOp);
|
| -
|
| - template<GraphicsContext3D::DataFormat SrcFormat, GraphicsContext3D::DataFormat DstFormat, GraphicsContext3D::AlphaOp alphaOp>
|
| - void convert();
|
| -
|
| - const unsigned m_width, m_height;
|
| - const void* const m_srcStart;
|
| - void* const m_dstStart;
|
| - const int m_srcStride, m_dstStride;
|
| - bool m_success;
|
| - OwnPtr<uint8_t[]> m_unpackedIntermediateSrcData;
|
| -};
|
| -
|
| -void FormatConverter::convert(GraphicsContext3D::DataFormat srcFormat, GraphicsContext3D::DataFormat dstFormat, GraphicsContext3D::AlphaOp alphaOp)
|
| -{
|
| -#define FORMATCONVERTER_CASE_SRCFORMAT(SrcFormat) \
|
| - case SrcFormat: \
|
| - return convert<SrcFormat>(dstFormat, alphaOp);
|
| -
|
| - switch (srcFormat) {
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatR8)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatA8)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatR32F)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatA32F)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatRA8)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatRA32F)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatRGB8)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatBGR8)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatRGB565)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatRGB32F)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatRGBA8)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatARGB8)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatABGR8)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatAR8)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatBGRA8)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatRGBA5551)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatRGBA4444)
|
| - FORMATCONVERTER_CASE_SRCFORMAT(GraphicsContext3D::DataFormatRGBA32F)
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| -#undef FORMATCONVERTER_CASE_SRCFORMAT
|
| -}
|
| -
|
| -template<GraphicsContext3D::DataFormat SrcFormat>
|
| -void FormatConverter::convert(GraphicsContext3D::DataFormat dstFormat, GraphicsContext3D::AlphaOp alphaOp)
|
| -{
|
| -#define FORMATCONVERTER_CASE_DSTFORMAT(DstFormat) \
|
| - case DstFormat: \
|
| - return convert<SrcFormat, DstFormat>(alphaOp);
|
| -
|
| - switch (dstFormat) {
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatR8)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatR16F)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatR32F)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatA8)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatA16F)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatA32F)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRA8)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRA16F)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRA32F)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGB8)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGB565)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGB16F)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGB32F)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGBA8)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGBA5551)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGBA4444)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGBA16F)
|
| - FORMATCONVERTER_CASE_DSTFORMAT(GraphicsContext3D::DataFormatRGBA32F)
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| -
|
| -#undef FORMATCONVERTER_CASE_DSTFORMAT
|
| -}
|
| -
|
| -template<GraphicsContext3D::DataFormat SrcFormat, GraphicsContext3D::DataFormat DstFormat>
|
| -void FormatConverter::convert(GraphicsContext3D::AlphaOp alphaOp)
|
| -{
|
| -#define FORMATCONVERTER_CASE_ALPHAOP(alphaOp) \
|
| - case alphaOp: \
|
| - return convert<SrcFormat, DstFormat, alphaOp>();
|
| -
|
| - switch (alphaOp) {
|
| - FORMATCONVERTER_CASE_ALPHAOP(GraphicsContext3D::AlphaDoNothing)
|
| - FORMATCONVERTER_CASE_ALPHAOP(GraphicsContext3D::AlphaDoPremultiply)
|
| - FORMATCONVERTER_CASE_ALPHAOP(GraphicsContext3D::AlphaDoUnmultiply)
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| -#undef FORMATCONVERTER_CASE_ALPHAOP
|
| -}
|
| -
|
| -template<GraphicsContext3D::DataFormat SrcFormat, GraphicsContext3D::DataFormat DstFormat, GraphicsContext3D::AlphaOp alphaOp>
|
| -void FormatConverter::convert()
|
| -{
|
| - // Many instantiations of this template function will never be entered, so we try
|
| - // to return immediately in these cases to avoid the compiler to generate useless code.
|
| - if (SrcFormat == DstFormat && alphaOp == GraphicsContext3D::AlphaDoNothing) {
|
| - ASSERT_NOT_REACHED();
|
| - return;
|
| - }
|
| - if (!IsFloatFormat<DstFormat>::Value && IsFloatFormat<SrcFormat>::Value) {
|
| - ASSERT_NOT_REACHED();
|
| - return;
|
| - }
|
| -
|
| - // Only textures uploaded from DOM elements or ImageData can allow DstFormat != SrcFormat.
|
| - const bool srcFormatComesFromDOMElementOrImageData = GraphicsContext3D::srcFormatComeFromDOMElementOrImageData(SrcFormat);
|
| - if (!srcFormatComesFromDOMElementOrImageData && SrcFormat != DstFormat) {
|
| - ASSERT_NOT_REACHED();
|
| - return;
|
| - }
|
| - // Likewise, only textures uploaded from DOM elements or ImageData can possibly have to be unpremultiplied.
|
| - if (!srcFormatComesFromDOMElementOrImageData && alphaOp == GraphicsContext3D::AlphaDoUnmultiply) {
|
| - ASSERT_NOT_REACHED();
|
| - return;
|
| - }
|
| - if ((!HasAlpha(SrcFormat) || !HasColor(SrcFormat) || !HasColor(DstFormat)) && alphaOp != GraphicsContext3D::AlphaDoNothing) {
|
| - ASSERT_NOT_REACHED();
|
| - return;
|
| - }
|
| -
|
| - typedef typename DataTypeForFormat<SrcFormat>::Type SrcType;
|
| - typedef typename DataTypeForFormat<DstFormat>::Type DstType;
|
| - const int IntermediateSrcFormat = IntermediateFormat<DstFormat>::Value;
|
| - typedef typename DataTypeForFormat<IntermediateSrcFormat>::Type IntermediateSrcType;
|
| - const ptrdiff_t srcStrideInElements = m_srcStride / sizeof(SrcType);
|
| - const ptrdiff_t dstStrideInElements = m_dstStride / sizeof(DstType);
|
| - const bool trivialUnpack = (SrcFormat == GraphicsContext3D::DataFormatRGBA8 && !IsFloatFormat<DstFormat>::Value && !IsHalfFloatFormat<DstFormat>::Value) || SrcFormat == GraphicsContext3D::DataFormatRGBA32F;
|
| - const bool trivialPack = (DstFormat == GraphicsContext3D::DataFormatRGBA8 || DstFormat == GraphicsContext3D::DataFormatRGBA32F) && alphaOp == GraphicsContext3D::AlphaDoNothing && m_dstStride > 0;
|
| - ASSERT(!trivialUnpack || !trivialPack);
|
| -
|
| - const SrcType *srcRowStart = static_cast<const SrcType*>(m_srcStart);
|
| - DstType* dstRowStart = static_cast<DstType*>(m_dstStart);
|
| - if (!trivialUnpack && trivialPack) {
|
| - for (size_t i = 0; i < m_height; ++i) {
|
| - unpack<SrcFormat>(srcRowStart, dstRowStart, m_width);
|
| - srcRowStart += srcStrideInElements;
|
| - dstRowStart += dstStrideInElements;
|
| - }
|
| - } else if (!trivialUnpack && !trivialPack) {
|
| - for (size_t i = 0; i < m_height; ++i) {
|
| - unpack<SrcFormat>(srcRowStart, reinterpret_cast<IntermediateSrcType*>(m_unpackedIntermediateSrcData.get()), m_width);
|
| - pack<DstFormat, alphaOp>(reinterpret_cast<IntermediateSrcType*>(m_unpackedIntermediateSrcData.get()), dstRowStart, m_width);
|
| - srcRowStart += srcStrideInElements;
|
| - dstRowStart += dstStrideInElements;
|
| - }
|
| - } else {
|
| - for (size_t i = 0; i < m_height; ++i) {
|
| - pack<DstFormat, alphaOp>(srcRowStart, dstRowStart, m_width);
|
| - srcRowStart += srcStrideInElements;
|
| - dstRowStart += dstStrideInElements;
|
| - }
|
| - }
|
| - m_success = true;
|
| - return;
|
| -}
|
| -
|
| -} // anonymous namespace
|
| -
|
| -bool GraphicsContext3D::packImageData(
|
| - Image* image,
|
| - const void* pixels,
|
| - GC3Denum format,
|
| - GC3Denum type,
|
| - bool flipY,
|
| - AlphaOp alphaOp,
|
| - DataFormat sourceFormat,
|
| - unsigned width,
|
| - unsigned height,
|
| - unsigned sourceUnpackAlignment,
|
| - Vector<uint8_t>& data)
|
| -{
|
| - if (!pixels)
|
| - return false;
|
| -
|
| - unsigned packedSize;
|
| - // Output data is tightly packed (alignment == 1).
|
| - if (computeImageSizeInBytes(format, type, width, height, 1, &packedSize, 0) != GraphicsContext3D::NO_ERROR)
|
| - return false;
|
| - data.resize(packedSize);
|
| -
|
| - if (!packPixels(reinterpret_cast<const uint8_t*>(pixels), sourceFormat, width, height, sourceUnpackAlignment, format, type, alphaOp, data.data(), flipY))
|
| - return false;
|
| - if (ImageObserver *observer = image->imageObserver())
|
| - observer->didDraw(image);
|
| - return true;
|
| -}
|
| -
|
| -bool GraphicsContext3D::extractImageData(
|
| - const uint8_t* imageData,
|
| - const IntSize& imageDataSize,
|
| - GC3Denum format,
|
| - GC3Denum type,
|
| - bool flipY,
|
| - bool premultiplyAlpha,
|
| - Vector<uint8_t>& data)
|
| -{
|
| - if (!imageData)
|
| - return false;
|
| - int width = imageDataSize.width();
|
| - int height = imageDataSize.height();
|
| -
|
| - unsigned packedSize;
|
| - // Output data is tightly packed (alignment == 1).
|
| - if (computeImageSizeInBytes(format, type, width, height, 1, &packedSize, 0) != GraphicsContext3D::NO_ERROR)
|
| - return false;
|
| - data.resize(packedSize);
|
| -
|
| - if (!packPixels(imageData, DataFormatRGBA8, width, height, 0, format, type, premultiplyAlpha ? AlphaDoPremultiply : AlphaDoNothing, data.data(), flipY))
|
| - return false;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool GraphicsContext3D::extractTextureData(
|
| - unsigned width,
|
| - unsigned height,
|
| - GC3Denum format, GC3Denum type,
|
| - unsigned unpackAlignment,
|
| - bool flipY, bool premultiplyAlpha,
|
| - const void* pixels,
|
| - Vector<uint8_t>& data)
|
| -{
|
| - // Assumes format, type, etc. have already been validated.
|
| - DataFormat sourceDataFormat = getDataFormat(format, type);
|
| -
|
| - // Resize the output buffer.
|
| - unsigned int componentsPerPixel, bytesPerComponent;
|
| - if (!computeFormatAndTypeParameters(format, type, &componentsPerPixel, &bytesPerComponent))
|
| - return false;
|
| - unsigned bytesPerPixel = componentsPerPixel * bytesPerComponent;
|
| - data.resize(width * height * bytesPerPixel);
|
| -
|
| - if (!packPixels(static_cast<const uint8_t*>(pixels), sourceDataFormat, width, height, unpackAlignment, format, type, (premultiplyAlpha ? AlphaDoPremultiply : AlphaDoNothing), data.data(), flipY))
|
| - return false;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool GraphicsContext3D::packPixels(
|
| - const uint8_t* sourceData,
|
| - DataFormat sourceDataFormat,
|
| - unsigned width,
|
| - unsigned height,
|
| - unsigned sourceUnpackAlignment,
|
| - unsigned destinationFormat,
|
| - unsigned destinationType,
|
| - AlphaOp alphaOp,
|
| - void* destinationData,
|
| - bool flipY)
|
| -{
|
| - int validSrc = width * TexelBytesForFormat(sourceDataFormat);
|
| - int remainder = sourceUnpackAlignment ? (validSrc % sourceUnpackAlignment) : 0;
|
| - int srcStride = remainder ? (validSrc + sourceUnpackAlignment - remainder) : validSrc;
|
| -
|
| - DataFormat dstDataFormat = getDataFormat(destinationFormat, destinationType);
|
| - int dstStride = width * TexelBytesForFormat(dstDataFormat);
|
| - if (flipY) {
|
| - destinationData = static_cast<uint8_t*>(destinationData) + dstStride*(height - 1);
|
| - dstStride = -dstStride;
|
| - }
|
| - if (!HasAlpha(sourceDataFormat) || !HasColor(sourceDataFormat) || !HasColor(dstDataFormat))
|
| - alphaOp = AlphaDoNothing;
|
| -
|
| - if (sourceDataFormat == dstDataFormat && alphaOp == AlphaDoNothing) {
|
| - const uint8_t* ptr = sourceData;
|
| - const uint8_t* ptrEnd = sourceData + srcStride * height;
|
| - unsigned rowSize = (dstStride > 0) ? dstStride: -dstStride;
|
| - uint8_t* dst = static_cast<uint8_t*>(destinationData);
|
| - while (ptr < ptrEnd) {
|
| - memcpy(dst, ptr, rowSize);
|
| - ptr += srcStride;
|
| - dst += dstStride;
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - FormatConverter converter(width, height, sourceData, destinationData, srcStride, dstStride);
|
| - converter.convert(sourceDataFormat, dstDataFormat, alphaOp);
|
| - if (!converter.Success())
|
| - return false;
|
| - return true;
|
| -}
|
| -
|
| -} // namespace WebCore
|
| -
|
|
|