Index: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
index ebed1a63bf97b77e8b8df2cf6e7183f5125193fd..8b7603878fc650ce7d6436cf0e1b066233e4aaa8 100644 |
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
@@ -514,6 +514,29 @@ private: |
Member<WebGLRenderingContextBase> m_context; |
}; |
+class ScopedUnpackParametersResetRestore { |
+ STACK_ALLOCATED(); |
+ |
+public: |
+ explicit ScopedUnpackParametersResetRestore(WebGLRenderingContextBase* context, bool enabled = true) |
+ : m_context(context) |
+ , m_enabled(enabled) |
+ { |
+ if (enabled) |
+ m_context->resetUnpackParameters(); |
+ } |
+ |
+ ~ScopedUnpackParametersResetRestore() |
+ { |
+ if (m_enabled) |
+ m_context->restoreUnpackParameters(); |
+ } |
+ |
+private: |
+ Member<WebGLRenderingContextBase> m_context; |
+ bool m_enabled; |
+}; |
+ |
static void formatWebGLStatusString(const String& glInfo, const String& infostring, String& statusMessage) |
{ |
if (!infostring.isEmpty()) |
@@ -4024,7 +4047,7 @@ void WebGLRenderingContextBase::texImageImpl(TexImageFunctionID functionID, GLen |
} |
} |
- resetUnpackParameters(); |
+ ScopedUnpackParametersResetRestore temporaryResetUnpack(this); |
if (functionID == TexImage2D) { |
texImage2DBase(target, level, internalformat, imageExtractor.imageWidth(), imageExtractor.imageHeight(), 0, format, type, needConversion ? data.data() : imagePixelData); |
} else if (functionID == TexSubImage2D) { |
@@ -4033,7 +4056,6 @@ void WebGLRenderingContextBase::texImageImpl(TexImageFunctionID functionID, GLen |
DCHECK_EQ(functionID, TexSubImage3D); |
contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, imageExtractor.imageWidth(), imageExtractor.imageHeight(), 1, format, type, needConversion ? data.data() : imagePixelData); |
} |
- restoreUnpackParameters(); |
} |
bool WebGLRenderingContextBase::validateTexFunc(const char* functionName, TexImageFunctionType functionType, TexFuncValidationSourceType sourceType, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLint xoffset, GLint yoffset, GLint zoffset) |
@@ -4175,14 +4197,11 @@ void WebGLRenderingContextBase::texImageHelperDOMArrayBufferView(TexImageFunctio |
return; |
} |
- if (changeUnpackAlignment) |
- resetUnpackParameters(); |
+ ScopedUnpackParametersResetRestore temporaryResetUnpack(this, changeUnpackAlignment); |
if (functionID == TexImage2D) |
texImage2DBase(target, level, internalformat, width, height, border, format, type, data); |
else if (functionID == TexSubImage2D) |
contextGL()->TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, data); |
- if (changeUnpackAlignment) |
- restoreUnpackParameters(); |
} |
void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint internalformat, |
@@ -4232,7 +4251,7 @@ void WebGLRenderingContextBase::texImageHelperImageData(TexImageFunctionID funct |
return; |
} |
} |
- resetUnpackParameters(); |
+ ScopedUnpackParametersResetRestore temporaryResetUnpack(this); |
if (functionID == TexImage2D) { |
texImage2DBase(target, level, internalformat, pixels->width(), pixels->height(), border, format, type, needConversion ? data.data() : pixels->data()->data()); |
} else if (functionID == TexSubImage2D) { |
@@ -4241,7 +4260,6 @@ void WebGLRenderingContextBase::texImageHelperImageData(TexImageFunctionID funct |
DCHECK_EQ(functionID, TexSubImage3D); |
contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, pixels->width(), pixels->height(), depth, format, type, needConversion ? data.data() : pixels->data()->data()); |
} |
- restoreUnpackParameters(); |
} |
void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint internalformat, |
@@ -4479,6 +4497,13 @@ void WebGLRenderingContextBase::texImageHelperHTMLVideoElement(TexImageFunctionI |
} |
} |
+ { |
+ ScopedUnpackParametersResetRestore(this, m_unpackFlipY || m_unpackPremultiplyAlpha); |
+ if (video->texImageImpl(getTexImageFunctionName(functionID), target, contextGL(), level, internalformat, format, type, xoffset, yoffset, zoffset, |
+ m_unpackFlipY, m_unpackPremultiplyAlpha && m_unpackColorspaceConversion == GL_NONE)) |
+ return; |
+ } |
+ |
RefPtr<Image> image = videoFrameToImage(video); |
if (!image) |
return; |
@@ -4559,7 +4584,7 @@ void WebGLRenderingContextBase::texImageHelperImageBitmap(TexImageFunctionID fun |
return; |
} |
} |
- resetUnpackParameters(); |
+ ScopedUnpackParametersResetRestore temporaryResetUnpack(this); |
if (functionID == TexImage2D) { |
texImage2DBase(target, level, internalformat, bitmap->width(), bitmap->height(), 0, format, type, needConversion ? data.data() : pixelDataPtr); |
} else if (functionID == TexSubImage2D) { |
@@ -4568,7 +4593,6 @@ void WebGLRenderingContextBase::texImageHelperImageBitmap(TexImageFunctionID fun |
DCHECK_EQ(functionID, TexSubImage3D); |
contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, bitmap->width(), bitmap->height(), 1, format, type, needConversion ? data.data() : pixelDataPtr); |
} |
- restoreUnpackParameters(); |
} |
void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint internalformat, |