diff options
Diffstat (limited to 'dom/canvas')
-rw-r--r-- | dom/canvas/CanvasRenderingContext2D.cpp | 42 | ||||
-rw-r--r-- | dom/canvas/CanvasRenderingContext2D.h | 9 | ||||
-rw-r--r-- | dom/canvas/ImageBitmap.cpp | 11 | ||||
-rw-r--r-- | dom/canvas/WebGLContext.cpp | 32 | ||||
-rw-r--r-- | dom/canvas/WebGLContextDraw.cpp | 21 | ||||
-rw-r--r-- | dom/canvas/test/webgl-mochitest/driver-info.js | 3 |
6 files changed, 55 insertions, 63 deletions
diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp index 15df2b337..18af28e9f 100644 --- a/dom/canvas/CanvasRenderingContext2D.cpp +++ b/dom/canvas/CanvasRenderingContext2D.cpp @@ -105,6 +105,7 @@ #include "mozilla/dom/CanvasPath.h" #include "mozilla/dom/HTMLImageElement.h" #include "mozilla/dom/HTMLVideoElement.h" +#include "mozilla/dom/SVGImageElement.h" #include "mozilla/dom/SVGMatrix.h" #include "mozilla/dom/TextMetrics.h" #include "mozilla/dom/SVGMatrix.h" @@ -140,10 +141,6 @@ using mozilla::gl::GLContextProvider; #include "gfxWindowsPlatform.h" #endif -#ifdef MOZ_WIDGET_GONK -#include "mozilla/layers/ShadowLayers.h" -#endif - // windows.h (included by chromium code) defines this, in its infinite wisdom #undef DrawText @@ -1865,8 +1862,6 @@ CanvasRenderingContext2D::GetHeight() const NS_IMETHODIMP CanvasRenderingContext2D::SetDimensions(int32_t aWidth, int32_t aHeight) { - ClearTarget(); - // Zero sized surfaces can cause problems. mZero = false; if (aHeight == 0) { @@ -1877,14 +1872,14 @@ CanvasRenderingContext2D::SetDimensions(int32_t aWidth, int32_t aHeight) aWidth = 1; mZero = true; } - mWidth = aWidth; - mHeight = aHeight; + + ClearTarget(aWidth, aHeight); return NS_OK; } void -CanvasRenderingContext2D::ClearTarget() +CanvasRenderingContext2D::ClearTarget(int32_t aWidth, int32_t aHeight) { Reset(); @@ -1892,6 +1887,12 @@ CanvasRenderingContext2D::ClearTarget() SetInitialState(); + // Update dimensions only if new (strictly positive) values were passed. + if (aWidth > 0 && aHeight > 0) { + mWidth = aWidth; + mHeight = aHeight; + } + // For vertical writing-mode, unless text-orientation is sideways, // we'll modify the initial value of textBaseline to 'middle'. RefPtr<nsStyleContext> canvasStyle; @@ -2477,10 +2478,10 @@ CanvasRenderingContext2D::CreatePattern(const CanvasImageSource& aSource, return nullptr; } - Element* htmlElement; + Element* element; if (aSource.IsHTMLCanvasElement()) { HTMLCanvasElement* canvas = &aSource.GetAsHTMLCanvasElement(); - htmlElement = canvas; + element = canvas; nsIntSize size = canvas->GetSize(); if (size.width == 0 || size.height == 0) { @@ -2505,7 +2506,7 @@ CanvasRenderingContext2D::CreatePattern(const CanvasImageSource& aSource, } RefPtr<CanvasPattern> pat = - new CanvasPattern(this, srcSurf, repeatMode, htmlElement->NodePrincipal(), canvas->IsWriteOnly(), false); + new CanvasPattern(this, srcSurf, repeatMode, element->NodePrincipal(), canvas->IsWriteOnly(), false); return pat.forget(); } @@ -2516,11 +2517,19 @@ CanvasRenderingContext2D::CreatePattern(const CanvasImageSource& aSource, return nullptr; } - htmlElement = img; + element = img; + } else if (aSource.IsSVGImageElement()) { + SVGImageElement* img = &aSource.GetAsSVGImageElement(); + if (img->IntrinsicState().HasState(NS_EVENT_STATE_BROKEN)) { + aError.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); + return nullptr; + } + + element = img; } else if (aSource.IsHTMLVideoElement()) { auto& video = aSource.GetAsHTMLVideoElement(); video.MarkAsContentSource(mozilla::dom::HTMLVideoElement::CallerAPI::CREATE_PATTERN); - htmlElement = &video; + element = &video; } else { // Special case for ImageBitmap ImageBitmap& imgBitmap = aSource.GetAsImageBitmap(); @@ -2559,7 +2568,7 @@ CanvasRenderingContext2D::CreatePattern(const CanvasImageSource& aSource, // The canvas spec says that createPattern should use the first frame // of animated images nsLayoutUtils::SurfaceFromElementResult res = - nsLayoutUtils::SurfaceFromElement(htmlElement, + nsLayoutUtils::SurfaceFromElement(element, nsLayoutUtils::SFE_WANT_FIRST_FRAME, mTarget); if (!res.GetSourceSurface()) { @@ -4949,6 +4958,9 @@ CanvasRenderingContext2D::DrawImage(const CanvasImageSource& aImage, if (aImage.IsHTMLImageElement()) { HTMLImageElement* img = &aImage.GetAsHTMLImageElement(); element = img; + } else if (aImage.IsSVGImageElement()) { + SVGImageElement* img = &aImage.GetAsSVGImageElement(); + element = img; } else { HTMLVideoElement* video = &aImage.GetAsHTMLVideoElement(); video->MarkAsContentSource(mozilla::dom::HTMLVideoElement::CallerAPI::DRAW_IMAGE); diff --git a/dom/canvas/CanvasRenderingContext2D.h b/dom/canvas/CanvasRenderingContext2D.h index c3ee3bdcb..848b3ee08 100644 --- a/dom/canvas/CanvasRenderingContext2D.h +++ b/dom/canvas/CanvasRenderingContext2D.h @@ -38,8 +38,8 @@ class SourceSurface; } // namespace gl namespace dom { -class HTMLImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap; -typedef HTMLImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap CanvasImageSource; +class HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap; +typedef HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap CanvasImageSource; class ImageData; class StringOrCanvasGradientOrCanvasPattern; class OwningStringOrCanvasGradientOrCanvasPattern; @@ -669,8 +669,11 @@ protected: /** * Disposes an old target and prepares to lazily create a new target. + * + * Parameters are the new dimensions to be used, or if either is negative, + * existing dimensions will be left unchanged. */ - void ClearTarget(); + void ClearTarget(int32_t aWidth = -1, int32_t aHeight = -1); /* * Returns the target to the buffer provider. i.e. this will queue a frame for diff --git a/dom/canvas/ImageBitmap.cpp b/dom/canvas/ImageBitmap.cpp index 6588e0aa3..e45cdfc6f 100644 --- a/dom/canvas/ImageBitmap.cpp +++ b/dom/canvas/ImageBitmap.cpp @@ -950,7 +950,7 @@ ImageBitmap::CreateInternal(nsIGlobalObject* aGlobal, ImageData& aImageData, imageSize, aCropRect, getter_AddRefs(data)); - task->Dispatch(aRv); + task->Dispatch(Terminating, aRv); } if (NS_WARN_IF(!data)) { @@ -1377,10 +1377,10 @@ private: RefPtr<DecodeBlobInMainThreadSyncTask> task = new DecodeBlobInMainThreadSyncTask(mWorkerPrivate, *mBlob, mCropRect, getter_AddRefs(data), sourceSize); - task->Dispatch(rv); // This is a synchronous call. + task->Dispatch(Terminating, rv); // This is a synchronous call. + // In case the worker is terminating, this rejection can be handled. if (NS_WARN_IF(rv.Failed())) { - // XXXbz does this really make sense if we're shutting down? Ah, well. mPromise->MaybeReject(rv); return nullptr; } @@ -2104,7 +2104,10 @@ ImageBitmap::Create(nsIGlobalObject* aGlobal, aFormat, aLayout, getter_AddRefs(data)); - task->Dispatch(aRv); + task->Dispatch(Terminating, aRv); + if (aRv.Failed()) { + return promise.forget(); + } } if (NS_WARN_IF(!data)) { diff --git a/dom/canvas/WebGLContext.cpp b/dom/canvas/WebGLContext.cpp index 176d56f8c..32eed6354 100644 --- a/dom/canvas/WebGLContext.cpp +++ b/dom/canvas/WebGLContext.cpp @@ -9,7 +9,6 @@ #include "AccessCheck.h" #include "gfxContext.h" -#include "gfxCrashReporterUtils.h" #include "gfxPattern.h" #include "gfxPrefs.h" #include "gfxUtils.h" @@ -51,10 +50,6 @@ #include "VRManagerChild.h" #include "mozilla/layers/TextureClientSharedSurface.h" -#ifdef MOZ_WIDGET_GONK -#include "mozilla/layers/ShadowLayers.h" -#endif - // Local #include "CanvasUtils.h" #include "WebGL1Context.h" @@ -545,30 +540,6 @@ BaseCaps(const WebGLContextOptions& options, WebGLContext* webgl) // for now it's just behind a pref for testing/evaluation. baseCaps.bpp16 = gfxPrefs::WebGLPrefer16bpp(); -#ifdef MOZ_WIDGET_GONK - do { - auto canvasElement = webgl->GetCanvas(); - if (!canvasElement) - break; - - auto ownerDoc = canvasElement->OwnerDoc(); - nsIWidget* docWidget = nsContentUtils::WidgetForDocument(ownerDoc); - if (!docWidget) - break; - - layers::LayerManager* layerManager = docWidget->GetLayerManager(); - if (!layerManager) - break; - - // XXX we really want "AsSurfaceAllocator" here for generality - layers::ShadowLayerForwarder* forwarder = layerManager->AsShadowForwarder(); - if (!forwarder) - break; - - baseCaps.surfaceAllocator = forwarder->GetTextureForwarder(); - } while (false); -#endif - // Done with baseCaps construction. if (!gfxPrefs::WebGLForceMSAA()) { @@ -984,7 +955,6 @@ WebGLContext::SetDimensions(int32_t signedWidth, int32_t signedHeight) // Alright, now let's start trying. bool forceEnabled = gfxPrefs::WebGLForceEnabled(); - ScopedGfxFeatureReporter reporter("WebGL", forceEnabled); MOZ_ASSERT(!gl); std::vector<FailureReason> failReasons; @@ -1115,8 +1085,6 @@ WebGLContext::SetDimensions(int32_t signedWidth, int32_t signedHeight) ////// - reporter.SetSuccessful(); - failureId = NS_LITERAL_CSTRING("SUCCESS"); return NS_OK; } diff --git a/dom/canvas/WebGLContextDraw.cpp b/dom/canvas/WebGLContextDraw.cpp index 867e47cbd..fd9ee4957 100644 --- a/dom/canvas/WebGLContextDraw.cpp +++ b/dom/canvas/WebGLContextDraw.cpp @@ -216,7 +216,21 @@ WebGLContext::BindFakeBlack(uint32_t texUnit, TexTarget target, FakeBlackType fa UniquePtr<FakeBlackTexture>& fakeBlackTex = *slot; if (!fakeBlackTex) { + gl->fPixelStorei(LOCAL_GL_UNPACK_ALIGNMENT, 1); + if (IsWebGL2()) { + gl->fPixelStorei(LOCAL_GL_UNPACK_SKIP_PIXELS, 0); + gl->fPixelStorei(LOCAL_GL_UNPACK_SKIP_ROWS, 0); + gl->fPixelStorei(LOCAL_GL_UNPACK_SKIP_IMAGES, 0); + } + fakeBlackTex = FakeBlackTexture::Create(gl, target, fakeBlack); + + gl->fPixelStorei(LOCAL_GL_UNPACK_ALIGNMENT, mPixelStore_UnpackAlignment); + if (IsWebGL2()) { + gl->fPixelStorei(LOCAL_GL_UNPACK_SKIP_PIXELS, mPixelStore_UnpackSkipPixels); + gl->fPixelStorei(LOCAL_GL_UNPACK_SKIP_ROWS, mPixelStore_UnpackSkipRows); + gl->fPixelStorei(LOCAL_GL_UNPACK_SKIP_IMAGES, mPixelStore_UnpackSkipImages); + } if (!fakeBlackTex) { return false; } @@ -1212,13 +1226,8 @@ WebGLContext::FakeBlackTexture::Create(gl::GLContext* gl, TexTarget target, gl->fTexParameteri(target.get(), LOCAL_GL_TEXTURE_MIN_FILTER, LOCAL_GL_NEAREST); gl->fTexParameteri(target.get(), LOCAL_GL_TEXTURE_MAG_FILTER, LOCAL_GL_NEAREST); - // We allocate our zeros on the heap, and we overallocate (16 bytes instead of 4) to - // minimize the risk of running into a driver bug in texImage2D, as it is a bit - // unusual maybe to create 1x1 textures, and the stack may not have the alignment that - // TexImage2D expects. - const webgl::DriverUnpackInfo dui = {texFormat, texFormat, LOCAL_GL_UNSIGNED_BYTE}; - UniqueBuffer zeros = moz_xcalloc(1, 16); // Infallible allocation. + UniqueBuffer zeros = moz_xcalloc(1, 4); // Infallible allocation. MOZ_ASSERT(gl->IsCurrent()); diff --git a/dom/canvas/test/webgl-mochitest/driver-info.js b/dom/canvas/test/webgl-mochitest/driver-info.js index e2f6e003a..3f2fe102c 100644 --- a/dom/canvas/test/webgl-mochitest/driver-info.js +++ b/dom/canvas/test/webgl-mochitest/driver-info.js @@ -81,9 +81,6 @@ DriverInfo = (function() { var versionMatch = /Mac OS X (\d+.\d+)/.exec(navigator.userAgent); version = versionMatch ? parseFloat(versionMatch[1]) : null; - } else if (runtime.widgetToolkit == 'gonk') { - os = OS.B2G; - } else if (navigator.appVersion.indexOf('Android') != -1) { os = OS.ANDROID; // From layout/tools/reftest/reftest.js: |