Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(545)

Side by Side Diff: Source/WebCore/html/canvas/WebGLRenderingContext.cpp

Issue 12667022: Merge 144241 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1410/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 3690 matching lines...) Expand 10 before | Expand all | Expand 10 after
3701 3701
3702 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, 3702 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat,
3703 GC3Denum format, GC3Denum type, ImageData * pixels, ExceptionCode& ec) 3703 GC3Denum format, GC3Denum type, ImageData * pixels, ExceptionCode& ec)
3704 { 3704 {
3705 ec = 0; 3705 ec = 0;
3706 if (isContextLost()) 3706 if (isContextLost())
3707 return; 3707 return;
3708 Vector<uint8_t> data; 3708 Vector<uint8_t> data;
3709 if (!pixels) 3709 if (!pixels)
3710 return; 3710 return;
3711 if (!validateTexFuncFormatAndType("texImage2D", format, type, level))
3712 return;
3713 if (!validateSettableTexFormat("texImage2D", format))
3714 return;
3711 bool needConversion = true; 3715 bool needConversion = true;
3712 // The data from ImageData is always of format RGBA8. 3716 // The data from ImageData is always of format RGBA8.
3713 // No conversion is needed if destination format is RGBA and type is USIGNED _BYTE and no Flip or Premultiply operation is required. 3717 // No conversion is needed if destination format is RGBA and type is USIGNED _BYTE and no Flip or Premultiply operation is required.
3714 if (!m_unpackFlipY && !m_unpackPremultiplyAlpha && format == GraphicsContext 3D::RGBA && type == GraphicsContext3D::UNSIGNED_BYTE) 3718 if (!m_unpackFlipY && !m_unpackPremultiplyAlpha && format == GraphicsContext 3D::RGBA && type == GraphicsContext3D::UNSIGNED_BYTE)
3715 needConversion = false; 3719 needConversion = false;
3716 else { 3720 else {
3717 if (!m_context->extractImageData(pixels, format, type, m_unpackFlipY, m_ unpackPremultiplyAlpha, data)) { 3721 if (!m_context->extractImageData(pixels, format, type, m_unpackFlipY, m_ unpackPremultiplyAlpha, data)) {
3718 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texImage2D", "b ad image data"); 3722 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texImage2D", "b ad image data");
3719 return; 3723 return;
3720 } 3724 }
(...skipping 28 matching lines...) Expand all
3749 if (isContextLost()) 3753 if (isContextLost())
3750 return; 3754 return;
3751 if (!canvas || !canvas->buffer()) { 3755 if (!canvas || !canvas->buffer()) {
3752 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texImage2D", "no ca nvas"); 3756 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texImage2D", "no ca nvas");
3753 return; 3757 return;
3754 } 3758 }
3755 if (wouldTaintOrigin(canvas)) { 3759 if (wouldTaintOrigin(canvas)) {
3756 ec = SECURITY_ERR; 3760 ec = SECURITY_ERR;
3757 return; 3761 return;
3758 } 3762 }
3763 if (!validateTexFuncFormatAndType("texImage2D", format, type, level))
3764 return;
3765 if (!validateSettableTexFormat("texImage2D", format))
3766 return;
3759 3767
3760 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); 3768 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true);
3761 // If possible, copy from the canvas element directly to the texture 3769 // If possible, copy from the canvas element directly to the texture
3762 // via the GPU, without a read-back to system memory. 3770 // via the GPU, without a read-back to system memory.
3763 // 3771 //
3764 // FIXME: restriction of (RGB || RGBA)/UNSIGNED_BYTE should be lifted when 3772 // FIXME: restriction of (RGB || RGBA)/UNSIGNED_BYTE should be lifted when
3765 // ImageBuffer::copyToPlatformTexture implementations are fully functional. 3773 // ImageBuffer::copyToPlatformTexture implementations are fully functional.
3766 if (GraphicsContext3D::TEXTURE_2D == target && texture && type == texture->g etType(target, level) 3774 if (GraphicsContext3D::TEXTURE_2D == target && texture && type == texture->g etType(target, level)
3767 && (format == GraphicsContext3D::RGB || format == GraphicsContext3D::RGB A) && type == GraphicsContext3D::UNSIGNED_BYTE) { 3775 && (format == GraphicsContext3D::RGB || format == GraphicsContext3D::RGB A) && type == GraphicsContext3D::UNSIGNED_BYTE) {
3768 ImageBuffer* buffer = canvas->buffer(); 3776 ImageBuffer* buffer = canvas->buffer();
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
3890 } 3898 }
3891 m_context->texSubImage2D(target, level, xoffset, yoffset, width, height, for mat, type, pixels); 3899 m_context->texSubImage2D(target, level, xoffset, yoffset, width, height, for mat, type, pixels);
3892 cleanupAfterGraphicsCall(false); 3900 cleanupAfterGraphicsCall(false);
3893 } 3901 }
3894 3902
3895 void WebGLRenderingContext::texSubImage2DImpl(GC3Denum target, GC3Dint level, GC 3Dint xoffset, GC3Dint yoffset, GC3Denum format, GC3Denum type, Image* image, Gr aphicsContext3D::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha , ExceptionCode& ec) 3903 void WebGLRenderingContext::texSubImage2DImpl(GC3Denum target, GC3Dint level, GC 3Dint xoffset, GC3Dint yoffset, GC3Denum format, GC3Denum type, Image* image, Gr aphicsContext3D::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha , ExceptionCode& ec)
3896 { 3904 {
3897 ec = 0; 3905 ec = 0;
3898 if (isContextLost()) 3906 if (isContextLost())
3899 return; 3907 return;
3908 if (!validateTexFuncFormatAndType("texSubImage2D", format, type, level))
3909 return;
3910 if (!validateSettableTexFormat("texSubImage2D", format))
3911 return;
3900 Vector<uint8_t> data; 3912 Vector<uint8_t> data;
3901 GraphicsContext3D::ImageExtractor imageExtractor(image, domSource, premultip lyAlpha, m_unpackColorspaceConversion == GraphicsContext3D::NONE); 3913 GraphicsContext3D::ImageExtractor imageExtractor(image, domSource, premultip lyAlpha, m_unpackColorspaceConversion == GraphicsContext3D::NONE);
3902 if (!imageExtractor.extractSucceeded()) { 3914 if (!imageExtractor.extractSucceeded()) {
3903 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texSubImage2D", "ba d image"); 3915 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texSubImage2D", "ba d image");
3904 return; 3916 return;
3905 } 3917 }
3906 GraphicsContext3D::DataFormat sourceDataFormat = imageExtractor.imageSourceF ormat(); 3918 GraphicsContext3D::DataFormat sourceDataFormat = imageExtractor.imageSourceF ormat();
3907 GraphicsContext3D::AlphaOp alphaOp = imageExtractor.imageAlphaOp(); 3919 GraphicsContext3D::AlphaOp alphaOp = imageExtractor.imageAlphaOp();
3908 const void* imagePixelData = imageExtractor.imagePixelData(); 3920 const void* imagePixelData = imageExtractor.imagePixelData();
3909 3921
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3951 } 3963 }
3952 3964
3953 void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din t xoffset, GC3Dint yoffset, 3965 void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din t xoffset, GC3Dint yoffset,
3954 GC3Denum format, GC3Denum type, ImageD ata* pixels, ExceptionCode& ec) 3966 GC3Denum format, GC3Denum type, ImageD ata* pixels, ExceptionCode& ec)
3955 { 3967 {
3956 ec = 0; 3968 ec = 0;
3957 if (isContextLost()) 3969 if (isContextLost())
3958 return; 3970 return;
3959 if (!pixels) 3971 if (!pixels)
3960 return; 3972 return;
3973 if (!validateTexFuncFormatAndType("texSubImage2D", format, type, level))
3974 return;
3975 if (!validateSettableTexFormat("texSubImage2D", format))
3976 return;
3961 Vector<uint8_t> data; 3977 Vector<uint8_t> data;
3962 bool needConversion = true; 3978 bool needConversion = true;
3963 // The data from ImageData is always of format RGBA8. 3979 // The data from ImageData is always of format RGBA8.
3964 // No conversion is needed if destination format is RGBA and type is USIGNED _BYTE and no Flip or Premultiply operation is required. 3980 // No conversion is needed if destination format is RGBA and type is USIGNED _BYTE and no Flip or Premultiply operation is required.
3965 if (format == GraphicsContext3D::RGBA && type == GraphicsContext3D::UNSIGNED _BYTE && !m_unpackFlipY && !m_unpackPremultiplyAlpha) 3981 if (format == GraphicsContext3D::RGBA && type == GraphicsContext3D::UNSIGNED _BYTE && !m_unpackFlipY && !m_unpackPremultiplyAlpha)
3966 needConversion = false; 3982 needConversion = false;
3967 else { 3983 else {
3968 if (!m_context->extractImageData(pixels, format, type, m_unpackFlipY, m_ unpackPremultiplyAlpha, data)) { 3984 if (!m_context->extractImageData(pixels, format, type, m_unpackFlipY, m_ unpackPremultiplyAlpha, data)) {
3969 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texSubImage2D", "bad image data"); 3985 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texSubImage2D", "bad image data");
3970 return; 3986 return;
(...skipping 28 matching lines...) Expand all
3999 if (isContextLost()) 4015 if (isContextLost())
4000 return; 4016 return;
4001 if (!canvas || !canvas->buffer()) { 4017 if (!canvas || !canvas->buffer()) {
4002 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texSubImage2D", "no canvas"); 4018 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texSubImage2D", "no canvas");
4003 return; 4019 return;
4004 } 4020 }
4005 if (wouldTaintOrigin(canvas)) { 4021 if (wouldTaintOrigin(canvas)) {
4006 ec = SECURITY_ERR; 4022 ec = SECURITY_ERR;
4007 return; 4023 return;
4008 } 4024 }
4025 if (!validateTexFuncFormatAndType("texSubImage2D", format, type, level))
4026 return;
4027 if (!validateSettableTexFormat("texSubImage2D", format))
4028 return;
4009 RefPtr<ImageData> imageData = canvas->getImageData(); 4029 RefPtr<ImageData> imageData = canvas->getImageData();
4010 if (imageData) 4030 if (imageData)
4011 texSubImage2D(target, level, xoffset, yoffset, format, type, imageData.g et(), ec); 4031 texSubImage2D(target, level, xoffset, yoffset, format, type, imageData.g et(), ec);
4012 else 4032 else
4013 texSubImage2DImpl(target, level, xoffset, yoffset, format, type, canvas- >copiedImage(), GraphicsContext3D::HtmlDomCanvas, m_unpackFlipY, m_unpackPremult iplyAlpha, ec); 4033 texSubImage2DImpl(target, level, xoffset, yoffset, format, type, canvas- >copiedImage(), GraphicsContext3D::HtmlDomCanvas, m_unpackFlipY, m_unpackPremult iplyAlpha, ec);
4014 } 4034 }
4015 4035
4016 #if ENABLE(VIDEO) 4036 #if ENABLE(VIDEO)
4017 void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din t xoffset, GC3Dint yoffset, 4037 void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din t xoffset, GC3Dint yoffset,
4018 GC3Denum format, GC3Denum type, HTMLVi deoElement* video, ExceptionCode& ec) 4038 GC3Denum format, GC3Denum type, HTMLVi deoElement* video, ExceptionCode& ec)
(...skipping 1816 matching lines...) Expand 10 before | Expand all | Expand 10 after
5835 5855
5836 IntSize WebGLRenderingContext::clampedCanvasSize() 5856 IntSize WebGLRenderingContext::clampedCanvasSize()
5837 { 5857 {
5838 return IntSize(clamp(canvas()->width(), 1, m_maxViewportDims[0]), 5858 return IntSize(clamp(canvas()->width(), 1, m_maxViewportDims[0]),
5839 clamp(canvas()->height(), 1, m_maxViewportDims[1])); 5859 clamp(canvas()->height(), 1, m_maxViewportDims[1]));
5840 } 5860 }
5841 5861
5842 } // namespace WebCore 5862 } // namespace WebCore
5843 5863
5844 #endif // ENABLE(WEBGL) 5864 #endif // ENABLE(WEBGL)
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698