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

Side by Side Diff: Source/core/html/canvas/WebGLRenderingContextBase.cpp

Issue 735623003: WebGL: accelerated texImage2D and texSubImage2D for canvas (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years 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
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 3439 matching lines...) Expand 10 before | Expand all | Expand 10 after
3450 } 3450 }
3451 } 3451 }
3452 3452
3453 if (m_unpackAlignment != 1) 3453 if (m_unpackAlignment != 1)
3454 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1); 3454 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1);
3455 texImage2DBase(target, level, internalformat, imageExtractor.imageWidth(), i mageExtractor.imageHeight(), 0, format, type, needConversion ? data.data() : ima gePixelData, exceptionState); 3455 texImage2DBase(target, level, internalformat, imageExtractor.imageWidth(), i mageExtractor.imageHeight(), 0, format, type, needConversion ? data.data() : ima gePixelData, exceptionState);
3456 if (m_unpackAlignment != 1) 3456 if (m_unpackAlignment != 1)
3457 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); 3457 webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment);
3458 } 3458 }
3459 3459
3460 bool WebGLRenderingContextBase::validateTexFunc(const char* functionName, TexFun cValidationFunctionType functionType, TexFuncValidationSourceType sourceType, GL enum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLint xoffset, GLint yoffset) 3460 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)
3461 { 3461 {
3462 if (!validateTexFuncParameters(functionName, functionType, target, level, in ternalformat, width, height, border, format, type)) 3462 if (!validateTexFuncParameters(functionName, functionType, target, level, in ternalformat, width, height, border, format, type))
3463 return false; 3463 return false;
3464 3464
3465 WebGLTexture* texture = validateTextureBinding(functionName, target, true); 3465 WebGLTexture* texture = validateTextureBinding(functionName, target, true);
3466 if (!texture) 3466 if (!texture)
3467 return false; 3467 return false;
3468 3468
3469 if (functionType == NotTexSubImage2D) { 3469 if (functionType == NotTexSubImage2D) {
3470 if (level && WebGLTexture::isNPOT(width, height)) { 3470 if (level && WebGLTexture::isNPOT(width, height)) {
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
3586 RefPtr<Image> imageForRender = image->cachedImage()->imageForRenderer(image- >renderer()); 3586 RefPtr<Image> imageForRender = image->cachedImage()->imageForRenderer(image- >renderer());
3587 if (imageForRender->isSVGImage()) 3587 if (imageForRender->isSVGImage())
3588 imageForRender = drawImageIntoBuffer(imageForRender.get(), image->width( ), image->height(), "texImage2D"); 3588 imageForRender = drawImageIntoBuffer(imageForRender.get(), image->width( ), image->height(), "texImage2D");
3589 3589
3590 if (!imageForRender || !validateTexFunc("texImage2D", NotTexSubImage2D, Sour ceHTMLImageElement, target, level, internalformat, imageForRender->width(), imag eForRender->height(), 0, format, type, 0, 0)) 3590 if (!imageForRender || !validateTexFunc("texImage2D", NotTexSubImage2D, Sour ceHTMLImageElement, target, level, internalformat, imageForRender->width(), imag eForRender->height(), 0, format, type, 0, 0))
3591 return; 3591 return;
3592 3592
3593 texImage2DImpl(target, level, internalformat, format, type, imageForRender.g et(), WebGLImageConversion::HtmlDomImage, m_unpackFlipY, m_unpackPremultiplyAlph a, exceptionState); 3593 texImage2DImpl(target, level, internalformat, format, type, imageForRender.g et(), WebGLImageConversion::HtmlDomImage, m_unpackFlipY, m_unpackPremultiplyAlph a, exceptionState);
3594 } 3594 }
3595 3595
3596 void WebGLRenderingContextBase::texImage2DCanvasByGPU(TexImageFunctionType funct ionType, WebGLTexture* texture, GLenum target,
3597 GLint level, GLenum internalformat, GLenum type, GLint xoffset, GLint yoffse t, HTMLCanvasElement* canvas)
3598 {
3599 ScopedTexture2DRestorer restorer(this);
3600
3601 Platform3DObject targetTexture = texture->object();
3602 GLenum targetType = type;
3603 GLenum targetInternalformat = internalformat;
3604 GLint targetLevel = level;
3605 bool possibleDirectCopy = false;
3606 if (functionType == NotTexSubImage2D) {
3607 possibleDirectCopy = GL_TEXTURE_2D == target && Extensions3DUtil::canUse CopyTextureCHROMIUM(internalformat, type, level);
3608 } else if (functionType == TexSubImage2D) {
3609 possibleDirectCopy = false;
3610 }
3611 // if direct copy is not possible, create a temporary texture and then copy from canvas to temporary texture to target texture.
3612 if (!possibleDirectCopy) {
3613 targetLevel = 0;
3614 targetInternalformat = GL_RGBA;
3615 targetType = GL_UNSIGNED_BYTE;
3616 targetTexture = webContext()->createTexture();
3617 webContext()->bindTexture(GL_TEXTURE_2D, targetTexture);
3618 webContext()->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEA REST);
3619 webContext()->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEA REST);
3620 webContext()->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_T O_EDGE);
3621 webContext()->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_T O_EDGE);
3622 webContext()->texImage2D(GL_TEXTURE_2D, 0, targetInternalformat, canvas- >width(),
3623 canvas->height(), 0, GL_RGBA, targetType, 0);
3624 }
3625
3626 if (!canvas->is3D()) {
3627 ImageBuffer* buffer = canvas->buffer();
3628 if (!buffer)
3629 return;
3630 if (!buffer->copyToPlatformTexture(webContext(), targetTexture, targetIn ternalformat, targetType,
3631 targetLevel, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
3632 ASSERT_NOT_REACHED();
3633 }
3634 } else {
3635 WebGLRenderingContextBase* gl = toWebGLRenderingContextBase(canvas->rend eringContext());
3636 if (!gl)
3637 return;
3638 ScopedTexture2DRestorer restorer(gl);
3639 if (!gl->drawingBuffer()->copyToPlatformTexture(webContext(), targetText ure, targetInternalformat, targetType,
3640 targetLevel, m_unpackPremultiplyAlpha, !m_unpackFlipY, BackBuffer)) {
3641 ASSERT_NOT_REACHED();
3642 }
3643 }
3644
3645 if (!possibleDirectCopy) {
3646 WebGLId tmpFBO = webContext()->createFramebuffer();
3647 webContext()->bindFramebuffer(GL_FRAMEBUFFER, tmpFBO);
3648 webContext()->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTexture, 0);
3649 webContext()->bindTexture(texture->getTarget(), texture->object());
3650 if (functionType == NotTexSubImage2D) {
3651 webContext()->copyTexImage2D(target, level, internalformat, 0, 0, ca nvas->width(), canvas->height(), 0);
3652 } else if (functionType == TexSubImage2D) {
3653 webContext()->copyTexSubImage2D(target, level, xoffset, yoffset, 0, 0, canvas->width(), canvas->height());
3654 }
3655 webContext()->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
3656 restoreCurrentFramebuffer();
3657 webContext()->deleteFramebuffer(tmpFBO);
3658 webContext()->deleteTexture(targetTexture);
3659 }
3660 }
3661
3596 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum in ternalformat, 3662 void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum in ternalformat,
3597 GLenum format, GLenum type, HTMLCanvasElement* canvas, ExceptionState& excep tionState) 3663 GLenum format, GLenum type, HTMLCanvasElement* canvas, ExceptionState& excep tionState)
3598 { 3664 {
3599 if (isContextLost() || !validateHTMLCanvasElement("texImage2D", canvas, exce ptionState) || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLCanvas Element, target, level, internalformat, canvas->width(), canvas->height(), 0, fo rmat, type, 0, 0)) 3665 if (isContextLost() || !validateHTMLCanvasElement("texImage2D", canvas, exce ptionState) || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLCanvas Element, target, level, internalformat, canvas->width(), canvas->height(), 0, fo rmat, type, 0, 0))
3600 return; 3666 return;
3601 3667
3602 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); 3668 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true);
3669 ASSERT(texture);
3603 3670
3604 // If possible, copy from the canvas element directly to the texture 3671 if (!canvas->renderingContext() || !canvas->renderingContext()->isAccelerate d()) {
3605 // via the GPU, without a read-back to system memory. 3672 ASSERT(!canvas->renderingContext() || canvas->renderingContext()->is2d() );
3606 if (GL_TEXTURE_2D == target && texture) { 3673 texImage2DImpl(target, level, internalformat, format, type, canvas->copi edImage(),
3607 ScopedTexture2DRestorer restorer(this); 3674 WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY, m_unpackPremulti plyAlpha, exceptionState);
3608 3675 return;
3609 if (!canvas->is3D()) {
3610 ImageBuffer* buffer = canvas->buffer();
3611 if (buffer && buffer->copyToPlatformTexture(webContext(), texture->o bject(), internalformat, type,
3612 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
3613 texture->setLevelInfo(target, level, internalformat, canvas->wid th(), canvas->height(), type);
3614 return;
3615 }
3616 } else {
3617 WebGLRenderingContextBase* gl = toWebGLRenderingContextBase(canvas-> renderingContext());
3618 ScopedTexture2DRestorer restorer(gl);
3619 if (gl && gl->drawingBuffer()->copyToPlatformTexture(webContext(), t exture->object(), internalformat, type,
3620 level, m_unpackPremultiplyAlpha, !m_unpackFlipY, BackBuffer)) {
3621 texture->setLevelInfo(target, level, internalformat, canvas->wid th(), canvas->height(), type);
3622 return;
3623 }
3624 }
3625 } 3676 }
3626 3677
3627 texImage2DImpl(target, level, internalformat, format, type, canvas->copiedIm age(BackBuffer), WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY, m_unpackPre multiplyAlpha, exceptionState); 3678 texImage2DCanvasByGPU(NotTexSubImage2D, texture, target, level, internalform at, type, 0, 0, canvas);
3679 texture->setLevelInfo(target, level, internalformat, canvas->width(), canvas ->height(), type);
3628 } 3680 }
3629 3681
3630 PassRefPtr<Image> WebGLRenderingContextBase::videoFrameToImage(HTMLVideoElement* video, BackingStoreCopy backingStoreCopy) 3682 PassRefPtr<Image> WebGLRenderingContextBase::videoFrameToImage(HTMLVideoElement* video, BackingStoreCopy backingStoreCopy)
3631 { 3683 {
3632 IntSize size(video->videoWidth(), video->videoHeight()); 3684 IntSize size(video->videoWidth(), video->videoHeight());
3633 ImageBuffer* buf = m_generatedImageCache.imageBuffer(size); 3685 ImageBuffer* buf = m_generatedImageCache.imageBuffer(size);
3634 if (!buf) { 3686 if (!buf) {
3635 synthesizeGLError(GL_OUT_OF_MEMORY, "texImage2D", "out of memory"); 3687 synthesizeGLError(GL_OUT_OF_MEMORY, "texImage2D", "out of memory");
3636 return nullptr; 3688 return nullptr;
3637 } 3689 }
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
3851 texSubImage2DImpl(target, level, xoffset, yoffset, format, type, imageForRen der.get(), WebGLImageConversion::HtmlDomImage, m_unpackFlipY, m_unpackPremultipl yAlpha, exceptionState); 3903 texSubImage2DImpl(target, level, xoffset, yoffset, format, type, imageForRen der.get(), WebGLImageConversion::HtmlDomImage, m_unpackFlipY, m_unpackPremultipl yAlpha, exceptionState);
3852 } 3904 }
3853 3905
3854 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, 3906 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
3855 GLenum format, GLenum type, HTMLCanvasElement* canvas, ExceptionState& excep tionState) 3907 GLenum format, GLenum type, HTMLCanvasElement* canvas, ExceptionState& excep tionState)
3856 { 3908 {
3857 if (isContextLost() || !validateHTMLCanvasElement("texSubImage2D", canvas, e xceptionState) 3909 if (isContextLost() || !validateHTMLCanvasElement("texSubImage2D", canvas, e xceptionState)
3858 || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceHTMLCanvasElem ent, target, level, format, canvas->width(), canvas->height(), 0, format, type, xoffset, yoffset)) 3910 || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceHTMLCanvasElem ent, target, level, format, canvas->width(), canvas->height(), 0, format, type, xoffset, yoffset))
3859 return; 3911 return;
3860 3912
3861 texSubImage2DImpl(target, level, xoffset, yoffset, format, type, canvas->cop iedImage(BackBuffer), WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY, m_unpa ckPremultiplyAlpha, exceptionState); 3913 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true);
3914 ASSERT(texture);
3915
3916 if (!canvas->renderingContext() || !canvas->renderingContext()->isAccelerate d()) {
3917 ASSERT(!canvas->renderingContext() || canvas->renderingContext()->is2d() );
3918 texSubImage2DImpl(target, level, xoffset, yoffset, format, type, canvas- >copiedImage(),
3919 WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY, m_unpackPremulti plyAlpha, exceptionState);
3920 return;
3921 }
3922
3923 texImage2DCanvasByGPU(TexSubImage2D, texture, target, level, GL_RGBA, type, xoffset, yoffset, canvas);
3862 } 3924 }
3863 3925
3864 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, 3926 void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
3865 GLenum format, GLenum type, HTMLVideoElement* video, ExceptionState& excepti onState) 3927 GLenum format, GLenum type, HTMLVideoElement* video, ExceptionState& excepti onState)
3866 { 3928 {
3867 if (isContextLost() || !validateHTMLVideoElement("texSubImage2D", video, exc eptionState) 3929 if (isContextLost() || !validateHTMLVideoElement("texSubImage2D", video, exc eptionState)
3868 || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceHTMLVideoEleme nt, target, level, format, video->videoWidth(), video->videoHeight(), 0, format, type, xoffset, yoffset)) 3930 || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceHTMLVideoEleme nt, target, level, format, video->videoWidth(), video->videoHeight(), 0, format, type, xoffset, yoffset))
3869 return; 3931 return;
3870 3932
3871 RefPtr<Image> image = videoFrameToImage(video, ImageBuffer::fastCopyImageMod e()); 3933 RefPtr<Image> image = videoFrameToImage(video, ImageBuffer::fastCopyImageMod e());
(...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after
4812 synthesizeGLError(GL_INVALID_VALUE, functionName, "level out of rang e"); 4874 synthesizeGLError(GL_INVALID_VALUE, functionName, "level out of rang e");
4813 return false; 4875 return false;
4814 } 4876 }
4815 break; 4877 break;
4816 } 4878 }
4817 // This function only checks if level is legal, so we return true and don't 4879 // This function only checks if level is legal, so we return true and don't
4818 // generate INVALID_ENUM if target is illegal. 4880 // generate INVALID_ENUM if target is illegal.
4819 return true; 4881 return true;
4820 } 4882 }
4821 4883
4822 bool WebGLRenderingContextBase::validateTexFuncDimensions(const char* functionNa me, TexFuncValidationFunctionType functionType, 4884 bool WebGLRenderingContextBase::validateTexFuncDimensions(const char* functionNa me, TexImageFunctionType functionType,
4823 GLenum target, GLint level, GLsizei width, GLsizei height) 4885 GLenum target, GLint level, GLsizei width, GLsizei height)
4824 { 4886 {
4825 if (width < 0 || height < 0) { 4887 if (width < 0 || height < 0) {
4826 synthesizeGLError(GL_INVALID_VALUE, functionName, "width or height < 0") ; 4888 synthesizeGLError(GL_INVALID_VALUE, functionName, "width or height < 0") ;
4827 return false; 4889 return false;
4828 } 4890 }
4829 4891
4830 switch (target) { 4892 switch (target) {
4831 case GL_TEXTURE_2D: 4893 case GL_TEXTURE_2D:
4832 if (width > (m_maxTextureSize >> level) || height > (m_maxTextureSize >> level)) { 4894 if (width > (m_maxTextureSize >> level) || height > (m_maxTextureSize >> level)) {
(...skipping 18 matching lines...) Expand all
4851 return false; 4913 return false;
4852 } 4914 }
4853 break; 4915 break;
4854 default: 4916 default:
4855 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target"); 4917 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target");
4856 return false; 4918 return false;
4857 } 4919 }
4858 return true; 4920 return true;
4859 } 4921 }
4860 4922
4861 bool WebGLRenderingContextBase::validateTexFuncParameters(const char* functionNa me, TexFuncValidationFunctionType functionType, GLenum target, 4923 bool WebGLRenderingContextBase::validateTexFuncParameters(const char* functionNa me, TexImageFunctionType functionType, GLenum target,
4862 GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint bor der, GLenum format, GLenum type) 4924 GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint bor der, GLenum format, GLenum type)
4863 { 4925 {
4864 // We absolutely have to validate the format and type combination. 4926 // We absolutely have to validate the format and type combination.
4865 // The texImage2D entry points taking HTMLImage, etc. will produce 4927 // The texImage2D entry points taking HTMLImage, etc. will produce
4866 // temporary data based on this combination, so it must be legal. 4928 // temporary data based on this combination, so it must be legal.
4867 if (!validateTexFuncFormatAndType(functionName, format, type, level) || !val idateTexFuncLevel(functionName, target, level)) 4929 if (!validateTexFuncFormatAndType(functionName, format, type, level) || !val idateTexFuncLevel(functionName, target, level))
4868 return false; 4930 return false;
4869 4931
4870 if (!validateTexFuncDimensions(functionName, functionType, target, level, wi dth, height)) 4932 if (!validateTexFuncDimensions(functionName, functionType, target, level, wi dth, height))
4871 return false; 4933 return false;
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
5024 } 5086 }
5025 5087
5026 if (pixels->byteLength() != bytesRequired) { 5088 if (pixels->byteLength() != bytesRequired) {
5027 synthesizeGLError(GL_INVALID_VALUE, functionName, "length of ArrayBuffer View is not correct for dimensions"); 5089 synthesizeGLError(GL_INVALID_VALUE, functionName, "length of ArrayBuffer View is not correct for dimensions");
5028 return false; 5090 return false;
5029 } 5091 }
5030 5092
5031 return true; 5093 return true;
5032 } 5094 }
5033 5095
5034 bool WebGLRenderingContextBase::validateCompressedTexDimensions(const char* func tionName, TexFuncValidationFunctionType functionType, GLenum target, GLint level , GLsizei width, GLsizei height, GLenum format) 5096 bool WebGLRenderingContextBase::validateCompressedTexDimensions(const char* func tionName, TexImageFunctionType functionType, GLenum target, GLint level, GLsizei width, GLsizei height, GLenum format)
5035 { 5097 {
5036 if (!validateTexFuncDimensions(functionName, functionType, target, level, wi dth, height)) 5098 if (!validateTexFuncDimensions(functionName, functionType, target, level, wi dth, height))
5037 return false; 5099 return false;
5038 5100
5039 bool widthValid = false; 5101 bool widthValid = false;
5040 bool heightValid = false; 5102 bool heightValid = false;
5041 5103
5042 switch (format) { 5104 switch (format) {
5043 case GC3D_COMPRESSED_ATC_RGB_AMD: 5105 case GC3D_COMPRESSED_ATC_RGB_AMD:
5044 case GC3D_COMPRESSED_ATC_RGBA_EXPLICIT_ALPHA_AMD: 5106 case GC3D_COMPRESSED_ATC_RGBA_EXPLICIT_ALPHA_AMD:
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after
5866 return m_sharedWebGraphicsContext3D ? m_sharedWebGraphicsContext3D->drawingB uffer() : 0; 5928 return m_sharedWebGraphicsContext3D ? m_sharedWebGraphicsContext3D->drawingB uffer() : 0;
5867 } 5929 }
5868 #else 5930 #else
5869 DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const 5931 DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const
5870 { 5932 {
5871 return m_drawingBuffer.get(); 5933 return m_drawingBuffer.get();
5872 } 5934 }
5873 #endif 5935 #endif
5874 5936
5875 } // namespace blink 5937 } // namespace blink
OLDNEW
« Source/core/html/HTMLCanvasElement.cpp ('K') | « Source/core/html/canvas/WebGLRenderingContextBase.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698