OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
933 m_drawingBuffer->bind(); | 933 m_drawingBuffer->bind(); |
934 } | 934 } |
935 | 935 |
936 PassRefPtr<ImageData> WebGLRenderingContext::paintRenderingResultsToImageData() | 936 PassRefPtr<ImageData> WebGLRenderingContext::paintRenderingResultsToImageData() |
937 { | 937 { |
938 if (isContextLost()) | 938 if (isContextLost()) |
939 return 0; | 939 return 0; |
940 | 940 |
941 clearIfComposited(); | 941 clearIfComposited(); |
942 m_drawingBuffer->commit(); | 942 m_drawingBuffer->commit(); |
943 RefPtr<ImageData> imageData = m_context->paintRenderingResultsToImageData(m_
drawingBuffer.get()); | 943 int width, height; |
| 944 RefPtr<Uint8ClampedArray> imageDataPixels = m_context->paintRenderingResults
ToImageData(m_drawingBuffer.get(), width, height); |
| 945 if (!imageDataPixels) |
| 946 return 0; |
944 | 947 |
945 if (m_framebufferBinding) | 948 if (m_framebufferBinding) |
946 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(
m_framebufferBinding.get())); | 949 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(
m_framebufferBinding.get())); |
947 else | 950 else |
948 m_drawingBuffer->bind(); | 951 m_drawingBuffer->bind(); |
949 | 952 |
950 return imageData; | 953 return ImageData::create(IntSize(width, height), imageDataPixels); |
951 } | 954 } |
952 | 955 |
953 void WebGLRenderingContext::reshape(int width, int height) | 956 void WebGLRenderingContext::reshape(int width, int height) |
954 { | 957 { |
955 if (isContextLost()) | 958 if (isContextLost()) |
956 return; | 959 return; |
957 | 960 |
958 // This is an approximation because at WebGLRenderingContext level we don't | 961 // This is an approximation because at WebGLRenderingContext level we don't |
959 // know if the underlying FBO uses textures or renderbuffers. | 962 // know if the underlying FBO uses textures or renderbuffers. |
960 GC3Dint maxSize = std::min(m_maxTextureSize, m_maxRenderbufferSize); | 963 GC3Dint maxSize = std::min(m_maxTextureSize, m_maxRenderbufferSize); |
(...skipping 2467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3428 { | 3431 { |
3429 if (isContextLost() || !pixels || !validateTexFunc("texImage2D", NotTexSubIm
age2D, SourceImageData, target, level, internalformat, pixels->width(), pixels->
height(), 0, format, type, 0, 0)) | 3432 if (isContextLost() || !pixels || !validateTexFunc("texImage2D", NotTexSubIm
age2D, SourceImageData, target, level, internalformat, pixels->width(), pixels->
height(), 0, format, type, 0, 0)) |
3430 return; | 3433 return; |
3431 Vector<uint8_t> data; | 3434 Vector<uint8_t> data; |
3432 bool needConversion = true; | 3435 bool needConversion = true; |
3433 // The data from ImageData is always of format RGBA8. | 3436 // The data from ImageData is always of format RGBA8. |
3434 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. | 3437 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. |
3435 if (!m_unpackFlipY && !m_unpackPremultiplyAlpha && format == GraphicsContext
3D::RGBA && type == GraphicsContext3D::UNSIGNED_BYTE) | 3438 if (!m_unpackFlipY && !m_unpackPremultiplyAlpha && format == GraphicsContext
3D::RGBA && type == GraphicsContext3D::UNSIGNED_BYTE) |
3436 needConversion = false; | 3439 needConversion = false; |
3437 else { | 3440 else { |
3438 if (!m_context->extractImageData(pixels, format, type, m_unpackFlipY, m_
unpackPremultiplyAlpha, data)) { | 3441 if (!m_context->extractImageData(pixels->data()->data(), pixels->size(),
format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) { |
3439 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texImage2D", "b
ad image data"); | 3442 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texImage2D", "b
ad image data"); |
3440 return; | 3443 return; |
3441 } | 3444 } |
3442 } | 3445 } |
3443 if (m_unpackAlignment != 1) | 3446 if (m_unpackAlignment != 1) |
3444 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1); | 3447 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1); |
3445 texImage2DBase(target, level, internalformat, pixels->width(), pixels->heigh
t(), 0, format, type, needConversion ? data.data() : pixels->data()->data(), es)
; | 3448 texImage2DBase(target, level, internalformat, pixels->width(), pixels->heigh
t(), 0, format, type, needConversion ? data.data() : pixels->data()->data(), es)
; |
3446 if (m_unpackAlignment != 1) | 3449 if (m_unpackAlignment != 1) |
3447 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlig
nment); | 3450 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlig
nment); |
3448 } | 3451 } |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3667 if (isContextLost() || !pixels || !validateTexFunc("texSubImage2D", TexSubIm
age2D, SourceImageData, target, level, format, pixels->width(), pixels->height(
), 0, format, type, xoffset, yoffset)) | 3670 if (isContextLost() || !pixels || !validateTexFunc("texSubImage2D", TexSubIm
age2D, SourceImageData, target, level, format, pixels->width(), pixels->height(
), 0, format, type, xoffset, yoffset)) |
3668 return; | 3671 return; |
3669 | 3672 |
3670 Vector<uint8_t> data; | 3673 Vector<uint8_t> data; |
3671 bool needConversion = true; | 3674 bool needConversion = true; |
3672 // The data from ImageData is always of format RGBA8. | 3675 // The data from ImageData is always of format RGBA8. |
3673 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. | 3676 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. |
3674 if (format == GraphicsContext3D::RGBA && type == GraphicsContext3D::UNSIGNED
_BYTE && !m_unpackFlipY && !m_unpackPremultiplyAlpha) | 3677 if (format == GraphicsContext3D::RGBA && type == GraphicsContext3D::UNSIGNED
_BYTE && !m_unpackFlipY && !m_unpackPremultiplyAlpha) |
3675 needConversion = false; | 3678 needConversion = false; |
3676 else { | 3679 else { |
3677 if (!m_context->extractImageData(pixels, format, type, m_unpackFlipY, m_
unpackPremultiplyAlpha, data)) { | 3680 if (!m_context->extractImageData(pixels->data()->data(), pixels->size(),
format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) { |
3678 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texSubImage2D",
"bad image data"); | 3681 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texSubImage2D",
"bad image data"); |
3679 return; | 3682 return; |
3680 } | 3683 } |
3681 } | 3684 } |
3682 if (m_unpackAlignment != 1) | 3685 if (m_unpackAlignment != 1) |
3683 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1); | 3686 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1); |
3684 texSubImage2DBase(target, level, xoffset, yoffset, pixels->width(), pixels->
height(), format, type, needConversion ? data.data() : pixels->data()->data(), e
s); | 3687 texSubImage2DBase(target, level, xoffset, yoffset, pixels->width(), pixels->
height(), format, type, needConversion ? data.data() : pixels->data()->data(), e
s); |
3685 if (m_unpackAlignment != 1) | 3688 if (m_unpackAlignment != 1) |
3686 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlig
nment); | 3689 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlig
nment); |
3687 } | 3690 } |
(...skipping 1949 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5637 if (m_textureUnits[i].m_texture2DBinding | 5640 if (m_textureUnits[i].m_texture2DBinding |
5638 || m_textureUnits[i].m_textureCubeMapBinding) { | 5641 || m_textureUnits[i].m_textureCubeMapBinding) { |
5639 m_onePlusMaxNonDefaultTextureUnit = i + 1; | 5642 m_onePlusMaxNonDefaultTextureUnit = i + 1; |
5640 return; | 5643 return; |
5641 } | 5644 } |
5642 } | 5645 } |
5643 m_onePlusMaxNonDefaultTextureUnit = 0; | 5646 m_onePlusMaxNonDefaultTextureUnit = 0; |
5644 } | 5647 } |
5645 | 5648 |
5646 } // namespace WebCore | 5649 } // namespace WebCore |
OLD | NEW |