| 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 4161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4172 bool needConversion = true; | 4172 bool needConversion = true; |
| 4173 if (type == GL_UNSIGNED_BYTE && sourceDataFormat == WebGLImageConversion::Da
taFormatRGBA8 && format == GL_RGBA && alphaOp == WebGLImageConversion::AlphaDoNo
thing && !flipY) { | 4173 if (type == GL_UNSIGNED_BYTE && sourceDataFormat == WebGLImageConversion::Da
taFormatRGBA8 && format == GL_RGBA && alphaOp == WebGLImageConversion::AlphaDoNo
thing && !flipY) { |
| 4174 needConversion = false; | 4174 needConversion = false; |
| 4175 } else { | 4175 } else { |
| 4176 if (!WebGLImageConversion::packImageData(image, imagePixelData, format,
type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtrac
tor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) { | 4176 if (!WebGLImageConversion::packImageData(image, imagePixelData, format,
type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtrac
tor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) { |
| 4177 synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "packImage error")
; | 4177 synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "packImage error")
; |
| 4178 return; | 4178 return; |
| 4179 } | 4179 } |
| 4180 } | 4180 } |
| 4181 | 4181 |
| 4182 resetUnpackParameters(); | 4182 if (m_unpackAlignment != 1) |
| 4183 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 4183 texImage2DBase(target, level, internalformat, imageExtractor.imageWidth(), i
mageExtractor.imageHeight(), 0, format, type, needConversion ? data.data() : ima
gePixelData); | 4184 texImage2DBase(target, level, internalformat, imageExtractor.imageWidth(), i
mageExtractor.imageHeight(), 0, format, type, needConversion ? data.data() : ima
gePixelData); |
| 4184 restoreUnpackParameters(); | 4185 if (m_unpackAlignment != 1) |
| 4186 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 4185 } | 4187 } |
| 4186 | 4188 |
| 4187 bool WebGLRenderingContextBase::validateTexFunc(const char* functionName, TexIma
geFunctionType functionType, TexFuncValidationSourceType sourceType, GLenum targ
et, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint bor
der, GLenum format, GLenum type, GLint xoffset, GLint yoffset) | 4189 bool WebGLRenderingContextBase::validateTexFunc(const char* functionName, TexIma
geFunctionType functionType, TexFuncValidationSourceType sourceType, GLenum targ
et, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint bor
der, GLenum format, GLenum type, GLint xoffset, GLint yoffset) |
| 4188 { | 4190 { |
| 4189 if (!validateTexFuncLevel(functionName, target, level)) | 4191 if (!validateTexFuncLevel(functionName, target, level)) |
| 4190 return false; | 4192 return false; |
| 4191 WebGLTexture* texture = validateTextureBinding(functionName, target, true); | 4193 WebGLTexture* texture = validateTextureBinding(functionName, target, true); |
| 4192 if (!texture) | 4194 if (!texture) |
| 4193 return false; | 4195 return false; |
| 4194 | 4196 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4293 void* data = pixels ? pixels->baseAddress() : 0; | 4295 void* data = pixels ? pixels->baseAddress() : 0; |
| 4294 Vector<uint8_t> tempData; | 4296 Vector<uint8_t> tempData; |
| 4295 bool changeUnpackAlignment = false; | 4297 bool changeUnpackAlignment = false; |
| 4296 if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) { | 4298 if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) { |
| 4297 if (!WebGLImageConversion::extractTextureData(width, height, format, typ
e, m_unpackAlignment, m_unpackFlipY, m_unpackPremultiplyAlpha, data, tempData)) | 4299 if (!WebGLImageConversion::extractTextureData(width, height, format, typ
e, m_unpackAlignment, m_unpackFlipY, m_unpackPremultiplyAlpha, data, tempData)) |
| 4298 return; | 4300 return; |
| 4299 data = tempData.data(); | 4301 data = tempData.data(); |
| 4300 changeUnpackAlignment = true; | 4302 changeUnpackAlignment = true; |
| 4301 } | 4303 } |
| 4302 if (changeUnpackAlignment) | 4304 if (changeUnpackAlignment) |
| 4303 resetUnpackParameters(); | 4305 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 4304 texImage2DBase(target, level, internalformat, width, height, border, format,
type, data); | 4306 texImage2DBase(target, level, internalformat, width, height, border, format,
type, data); |
| 4305 if (changeUnpackAlignment) | 4307 if (changeUnpackAlignment) |
| 4306 restoreUnpackParameters(); | 4308 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 4307 } | 4309 } |
| 4308 | 4310 |
| 4309 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum in
ternalformat, | 4311 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum in
ternalformat, |
| 4310 GLenum format, GLenum type, ImageData* pixels) | 4312 GLenum format, GLenum type, ImageData* pixels) |
| 4311 { | 4313 { |
| 4312 if (!pixels) { | 4314 if (!pixels) { |
| 4313 synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "no image data"); | 4315 synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "no image data"); |
| 4314 return; | 4316 return; |
| 4315 } | 4317 } |
| 4316 if (isContextLost() || !validateTexFunc("texImage2D", NotTexSubImage2D, Sour
ceImageData, target, level, internalformat, pixels->width(), pixels->height(), 0
, format, type, 0, 0)) | 4318 if (isContextLost() || !validateTexFunc("texImage2D", NotTexSubImage2D, Sour
ceImageData, target, level, internalformat, pixels->width(), pixels->height(), 0
, format, type, 0, 0)) |
| 4317 return; | 4319 return; |
| 4318 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { | 4320 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { |
| 4319 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. | 4321 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. |
| 4320 type = GL_FLOAT; | 4322 type = GL_FLOAT; |
| 4321 } | 4323 } |
| 4322 Vector<uint8_t> data; | 4324 Vector<uint8_t> data; |
| 4323 bool needConversion = true; | 4325 bool needConversion = true; |
| 4324 // The data from ImageData is always of format RGBA8. | 4326 // The data from ImageData is always of format RGBA8. |
| 4325 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. | 4327 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. |
| 4326 if (!m_unpackFlipY && !m_unpackPremultiplyAlpha && format == GL_RGBA && type
== GL_UNSIGNED_BYTE) { | 4328 if (!m_unpackFlipY && !m_unpackPremultiplyAlpha && format == GL_RGBA && type
== GL_UNSIGNED_BYTE) { |
| 4327 needConversion = false; | 4329 needConversion = false; |
| 4328 } else { | 4330 } else { |
| 4329 if (!WebGLImageConversion::extractImageData(pixels->data()->data(), pixe
ls->size(), format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) { | 4331 if (!WebGLImageConversion::extractImageData(pixels->data()->data(), pixe
ls->size(), format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) { |
| 4330 synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "bad image data"); | 4332 synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "bad image data"); |
| 4331 return; | 4333 return; |
| 4332 } | 4334 } |
| 4333 } | 4335 } |
| 4334 resetUnpackParameters(); | 4336 if (m_unpackAlignment != 1) |
| 4337 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 4335 texImage2DBase(target, level, internalformat, pixels->width(), pixels->heigh
t(), 0, format, type, needConversion ? data.data() : pixels->data()->data()); | 4338 texImage2DBase(target, level, internalformat, pixels->width(), pixels->heigh
t(), 0, format, type, needConversion ? data.data() : pixels->data()->data()); |
| 4336 restoreUnpackParameters(); | 4339 if (m_unpackAlignment != 1) |
| 4340 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 4337 } | 4341 } |
| 4338 | 4342 |
| 4339 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum in
ternalformat, | 4343 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum in
ternalformat, |
| 4340 GLenum format, GLenum type, HTMLImageElement* image, ExceptionState& excepti
onState) | 4344 GLenum format, GLenum type, HTMLImageElement* image, ExceptionState& excepti
onState) |
| 4341 { | 4345 { |
| 4342 if (isContextLost() || !validateHTMLImageElement("texImage2D", image, except
ionState)) | 4346 if (isContextLost() || !validateHTMLImageElement("texImage2D", image, except
ionState)) |
| 4343 return; | 4347 return; |
| 4344 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { | 4348 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { |
| 4345 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. | 4349 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. |
| 4346 type = GL_FLOAT; | 4350 type = GL_FLOAT; |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4591 bool needConversion = true; | 4595 bool needConversion = true; |
| 4592 if (type == GL_UNSIGNED_BYTE && sourceDataFormat == WebGLImageConversion::Da
taFormatRGBA8 && format == GL_RGBA && alphaOp == WebGLImageConversion::AlphaDoNo
thing && !flipY) { | 4596 if (type == GL_UNSIGNED_BYTE && sourceDataFormat == WebGLImageConversion::Da
taFormatRGBA8 && format == GL_RGBA && alphaOp == WebGLImageConversion::AlphaDoNo
thing && !flipY) { |
| 4593 needConversion = false; | 4597 needConversion = false; |
| 4594 } else { | 4598 } else { |
| 4595 if (!WebGLImageConversion::packImageData(image, imagePixelData, format,
type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtrac
tor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) { | 4599 if (!WebGLImageConversion::packImageData(image, imagePixelData, format,
type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtrac
tor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) { |
| 4596 synthesizeGLError(GL_INVALID_VALUE, "texSubImage2D", "bad image data
"); | 4600 synthesizeGLError(GL_INVALID_VALUE, "texSubImage2D", "bad image data
"); |
| 4597 return; | 4601 return; |
| 4598 } | 4602 } |
| 4599 } | 4603 } |
| 4600 | 4604 |
| 4601 resetUnpackParameters(); | 4605 if (m_unpackAlignment != 1) |
| 4606 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 4602 webContext()->texSubImage2D(target, level, xoffset, yoffset, imageExtractor.
imageWidth(), imageExtractor.imageHeight(), format, type, needConversion ? data
.data() : imagePixelData); | 4607 webContext()->texSubImage2D(target, level, xoffset, yoffset, imageExtractor.
imageWidth(), imageExtractor.imageHeight(), format, type, needConversion ? data
.data() : imagePixelData); |
| 4603 restoreUnpackParameters(); | 4608 if (m_unpackAlignment != 1) |
| 4609 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 4604 } | 4610 } |
| 4605 | 4611 |
| 4606 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint
xoffset, GLint yoffset, | 4612 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint
xoffset, GLint yoffset, |
| 4607 GLsizei width, GLsizei height, | 4613 GLsizei width, GLsizei height, |
| 4608 GLenum format, GLenum type, DOMArrayBufferView* pixels) | 4614 GLenum format, GLenum type, DOMArrayBufferView* pixels) |
| 4609 { | 4615 { |
| 4610 if (isContextLost() || !validateTexFunc("texSubImage2D", TexSubImage2D, Sour
ceArrayBufferView, target, level, 0, width, height, 0, format, type, xoffset, yo
ffset) | 4616 if (isContextLost() || !validateTexFunc("texSubImage2D", TexSubImage2D, Sour
ceArrayBufferView, target, level, 0, width, height, 0, format, type, xoffset, yo
ffset) |
| 4611 || !validateTexFuncData("texSubImage2D", level, width, height, 1, format
, type, pixels, NullNotAllowed)) | 4617 || !validateTexFuncData("texSubImage2D", level, width, height, 1, format
, type, pixels, NullNotAllowed)) |
| 4612 return; | 4618 return; |
| 4613 void* data = pixels->baseAddress(); | 4619 void* data = pixels->baseAddress(); |
| 4614 Vector<uint8_t> tempData; | 4620 Vector<uint8_t> tempData; |
| 4615 bool changeUnpackAlignment = false; | 4621 bool changeUnpackAlignment = false; |
| 4616 if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) { | 4622 if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) { |
| 4617 if (!WebGLImageConversion::extractTextureData(width, height, format, typ
e, | 4623 if (!WebGLImageConversion::extractTextureData(width, height, format, typ
e, |
| 4618 m_unpackAlignment, m_unpackFlipY, m_unpackPremultiplyAlpha, data, te
mpData)) | 4624 m_unpackAlignment, m_unpackFlipY, m_unpackPremultiplyAlpha, data, te
mpData)) |
| 4619 return; | 4625 return; |
| 4620 data = tempData.data(); | 4626 data = tempData.data(); |
| 4621 changeUnpackAlignment = true; | 4627 changeUnpackAlignment = true; |
| 4622 } | 4628 } |
| 4623 if (changeUnpackAlignment) | 4629 if (changeUnpackAlignment) |
| 4624 resetUnpackParameters(); | 4630 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 4625 webContext()->texSubImage2D(target, level, xoffset, yoffset, width, height,
format, type, data); | 4631 webContext()->texSubImage2D(target, level, xoffset, yoffset, width, height,
format, type, data); |
| 4626 if (changeUnpackAlignment) | 4632 if (changeUnpackAlignment) |
| 4627 restoreUnpackParameters(); | 4633 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 4628 } | 4634 } |
| 4629 | 4635 |
| 4630 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint
xoffset, GLint yoffset, | 4636 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint
xoffset, GLint yoffset, |
| 4631 GLenum format, GLenum type, ImageData* pixels) | 4637 GLenum format, GLenum type, ImageData* pixels) |
| 4632 { | 4638 { |
| 4633 if (!pixels) { | 4639 if (!pixels) { |
| 4634 synthesizeGLError(GL_INVALID_VALUE, "texSubImage2D", "no image data"); | 4640 synthesizeGLError(GL_INVALID_VALUE, "texSubImage2D", "no image data"); |
| 4635 return; | 4641 return; |
| 4636 } | 4642 } |
| 4637 if (isContextLost() || !validateTexFunc("texSubImage2D", TexSubImage2D, Sour
ceImageData, target, level, 0, pixels->width(), pixels->height(), 0, format, ty
pe, xoffset, yoffset)) | 4643 if (isContextLost() || !validateTexFunc("texSubImage2D", TexSubImage2D, Sour
ceImageData, target, level, 0, pixels->width(), pixels->height(), 0, format, ty
pe, xoffset, yoffset)) |
| 4638 return; | 4644 return; |
| 4639 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { | 4645 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { |
| 4640 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. | 4646 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. |
| 4641 type = GL_FLOAT; | 4647 type = GL_FLOAT; |
| 4642 } | 4648 } |
| 4643 Vector<uint8_t> data; | 4649 Vector<uint8_t> data; |
| 4644 bool needConversion = true; | 4650 bool needConversion = true; |
| 4645 // The data from ImageData is always of format RGBA8. | 4651 // The data from ImageData is always of format RGBA8. |
| 4646 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. | 4652 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. |
| 4647 if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && !m_unpackFlipY && !m_un
packPremultiplyAlpha) { | 4653 if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && !m_unpackFlipY && !m_un
packPremultiplyAlpha) { |
| 4648 needConversion = false; | 4654 needConversion = false; |
| 4649 } else { | 4655 } else { |
| 4650 if (!WebGLImageConversion::extractImageData(pixels->data()->data(), pixe
ls->size(), format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) { | 4656 if (!WebGLImageConversion::extractImageData(pixels->data()->data(), pixe
ls->size(), format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) { |
| 4651 synthesizeGLError(GL_INVALID_VALUE, "texSubImage2D", "bad image data
"); | 4657 synthesizeGLError(GL_INVALID_VALUE, "texSubImage2D", "bad image data
"); |
| 4652 return; | 4658 return; |
| 4653 } | 4659 } |
| 4654 } | 4660 } |
| 4655 resetUnpackParameters(); | 4661 if (m_unpackAlignment != 1) |
| 4662 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 4656 webContext()->texSubImage2D(target, level, xoffset, yoffset, pixels->width()
, pixels->height(), format, type, needConversion ? data.data() : pixels->data()-
>data()); | 4663 webContext()->texSubImage2D(target, level, xoffset, yoffset, pixels->width()
, pixels->height(), format, type, needConversion ? data.data() : pixels->data()-
>data()); |
| 4657 restoreUnpackParameters(); | 4664 if (m_unpackAlignment != 1) |
| 4665 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 4658 } | 4666 } |
| 4659 | 4667 |
| 4660 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint
xoffset, GLint yoffset, | 4668 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint
xoffset, GLint yoffset, |
| 4661 GLenum format, GLenum type, HTMLImageElement* image, ExceptionState& excepti
onState) | 4669 GLenum format, GLenum type, HTMLImageElement* image, ExceptionState& excepti
onState) |
| 4662 { | 4670 { |
| 4663 if (isContextLost() || !validateHTMLImageElement("texSubImage2D", image, exc
eptionState)) | 4671 if (isContextLost() || !validateHTMLImageElement("texSubImage2D", image, exc
eptionState)) |
| 4664 return; | 4672 return; |
| 4665 | 4673 |
| 4666 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { | 4674 if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { |
| 4667 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. | 4675 // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. |
| (...skipping 2251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6919 } | 6927 } |
| 6920 | 6928 |
| 6921 return totalBytesPerPixel; | 6929 return totalBytesPerPixel; |
| 6922 } | 6930 } |
| 6923 | 6931 |
| 6924 DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const | 6932 DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const |
| 6925 { | 6933 { |
| 6926 return m_drawingBuffer.get(); | 6934 return m_drawingBuffer.get(); |
| 6927 } | 6935 } |
| 6928 | 6936 |
| 6929 void WebGLRenderingContextBase::resetUnpackParameters() | |
| 6930 { | |
| 6931 if (m_unpackAlignment != 1) | |
| 6932 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1); | |
| 6933 } | |
| 6934 | |
| 6935 void WebGLRenderingContextBase::restoreUnpackParameters() | |
| 6936 { | |
| 6937 if (m_unpackAlignment != 1) | |
| 6938 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); | |
| 6939 } | |
| 6940 | |
| 6941 } // namespace blink | 6937 } // namespace blink |
| OLD | NEW |