diff --git a/dom/canvas/BasicRenderingContext2D.h b/dom/canvas/BasicRenderingContext2D.h new file mode 100644 index 000000000000..3320736d8a1c --- /dev/null +++ b/dom/canvas/BasicRenderingContext2D.h @@ -0,0 +1,201 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BasicRenderingContext2D_h +#define BasicRenderingContext2D_h + +#include "mozilla/dom/CanvasRenderingContext2DBinding.h" + +namespace mozilla { +namespace dom { + +class HTMLImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap; +typedef HTMLImageElementOrHTMLCanvasElementOrHTMLVideoElementOrImageBitmap + CanvasImageSource; + +/* + * BasicRenderingContext2D + */ +class BasicRenderingContext2D +{ +public: + // + // CanvasState + // + virtual void Save() = 0; + virtual void Restore() = 0; + + // + // CanvasTransform + // + virtual void Scale(double aX, double aY, mozilla::ErrorResult& aError) = 0; + virtual void Rotate(double aAngle, mozilla::ErrorResult& aError) = 0; + virtual void Translate(double aX, + double aY, + mozilla::ErrorResult& aError) = 0; + virtual void Transform(double aM11, + double aM12, + double aM21, + double aM22, + double aDx, + double aDy, + mozilla::ErrorResult& aError) = 0; + virtual void SetTransform(double aM11, + double aM12, + double aM21, + double aM22, + double aDx, + double aDy, + mozilla::ErrorResult& aError) = 0; + virtual void ResetTransform(mozilla::ErrorResult& aError) = 0; + + // + // CanvasCompositing + // + virtual double GlobalAlpha() = 0; + virtual void SetGlobalAlpha(double aGlobalAlpha) = 0; + virtual void GetGlobalCompositeOperation(nsAString& aOp, + mozilla::ErrorResult& aError) = 0; + virtual void SetGlobalCompositeOperation(const nsAString& aOp, + mozilla::ErrorResult& aError) = 0; + + // + // CanvasImageSmoothing + // + virtual bool ImageSmoothingEnabled() = 0; + virtual void SetImageSmoothingEnabled(bool aImageSmoothingEnabled) = 0; + + // + // CanvasFillStrokeStyles + // + virtual void GetStrokeStyle( + OwningStringOrCanvasGradientOrCanvasPattern& aValue) = 0; + virtual void SetStrokeStyle( + const StringOrCanvasGradientOrCanvasPattern& aValue) = 0; + virtual void GetFillStyle( + OwningStringOrCanvasGradientOrCanvasPattern& aValue) = 0; + virtual void SetFillStyle( + const StringOrCanvasGradientOrCanvasPattern& aValue) = 0; + virtual already_AddRefed CreateLinearGradient(double aX0, + double aY0, + double aX1, + double aY1) = 0; + virtual already_AddRefed CreateRadialGradient( + double aX0, + double aY0, + double aR0, + double aX1, + double aY1, + double aR1, + ErrorResult& aError) = 0; + virtual already_AddRefed CreatePattern( + const CanvasImageSource& aElement, + const nsAString& aRepeat, + ErrorResult& aError) = 0; + // + // CanvasShadowStyles + // + virtual double ShadowOffsetX() = 0; + virtual void SetShadowOffsetX(double aShadowOffsetX) = 0; + virtual double ShadowOffsetY() = 0; + virtual void SetShadowOffsetY(double aShadowOffsetY) = 0; + virtual double ShadowBlur() = 0; + virtual void SetShadowBlur(double aShadowBlur) = 0; + virtual void GetShadowColor(nsAString& aShadowColor) = 0; + virtual void SetShadowColor(const nsAString& aShadowColor) = 0; + + // + // CanvasRect + // + virtual void ClearRect(double aX, double aY, double aW, double aH) = 0; + virtual void FillRect(double aX, double aY, double aW, double aH) = 0; + virtual void StrokeRect(double aX, double aY, double aW, double aH) = 0; + + // + // CanvasDrawImage + // + virtual void DrawImage(const CanvasImageSource& aImage, + double aDx, + double aDy, + mozilla::ErrorResult& aError) = 0; + virtual void DrawImage(const CanvasImageSource& aImage, + double aDx, + double aDy, + double aDw, + double aDh, + mozilla::ErrorResult& aError) = 0; + virtual void DrawImage(const CanvasImageSource& aImage, + double aSx, + double aSy, + double aSw, + double aSh, + double aDx, + double aDy, + double aDw, + double aDh, + mozilla::ErrorResult& aError) = 0; + + // + // CanvasPathDrawingStyles + // + virtual double LineWidth() = 0; + virtual void SetLineWidth(double aWidth) = 0; + virtual void GetLineCap(nsAString& aLinecapStyle) = 0; + virtual void SetLineCap(const nsAString& aLinecapStyle) = 0; + virtual void GetLineJoin(nsAString& aLinejoinStyle, + mozilla::ErrorResult& aError) = 0; + virtual void SetLineJoin(const nsAString& aLinejoinStyle) = 0; + virtual double MiterLimit() = 0; + virtual void SetMiterLimit(double aMiter) = 0; + virtual void SetLineDash(const Sequence& aSegments, + mozilla::ErrorResult& aRv) = 0; + virtual void GetLineDash(nsTArray& aSegments) const = 0; + virtual void SetLineDashOffset(double aOffset) = 0; + virtual double LineDashOffset() const = 0; + + // + // CanvasPath + // + virtual void ClosePath() = 0; + virtual void MoveTo(double aX, double aY) = 0; + virtual void LineTo(double aX, double aY) = 0; + virtual void QuadraticCurveTo(double aCpx, + double aCpy, + double aX, + double aY) = 0; + virtual void BezierCurveTo(double aCp1x, + double aCp1y, + double aCp2x, + double aCp2y, + double aX, + double aY) = 0; + virtual void ArcTo(double aX1, + double aY1, + double aX2, + double aY2, + double aRadius, + mozilla::ErrorResult& aError) = 0; + virtual void Rect(double aX, double aY, double aW, double aH) = 0; + virtual void Arc(double aX, + double aY, + double aRadius, + double aStartAngle, + double aEndAngle, + bool aAnticlockwise, + mozilla::ErrorResult& aError) = 0; + virtual void Ellipse(double aX, + double aY, + double aRadiusX, + double aRadiusY, + double aRotation, + double aStartAngle, + double aEndAngle, + bool aAnticlockwise, + ErrorResult& aError) = 0; +}; + +} // namespace dom +} // namespace mozilla + +#endif /* BasicRenderingContext2D_h */ diff --git a/dom/canvas/CanvasRenderingContext2D.h b/dom/canvas/CanvasRenderingContext2D.h index 6feccc37c199..5fdb847dfc81 100644 --- a/dom/canvas/CanvasRenderingContext2D.h +++ b/dom/canvas/CanvasRenderingContext2D.h @@ -15,6 +15,7 @@ #include "mozilla/dom/HTMLVideoElement.h" #include "gfxTextRun.h" #include "mozilla/ErrorResult.h" +#include "mozilla/dom/BasicRenderingContext2D.h" #include "mozilla/dom/CanvasGradient.h" #include "mozilla/dom/CanvasRenderingContext2DBinding.h" #include "mozilla/dom/CanvasPattern.h" @@ -61,7 +62,8 @@ class CanvasShutdownObserver; **/ class CanvasRenderingContext2D final : public nsICanvasRenderingContextInternal, - public nsWrapperCache + public nsWrapperCache, + public BasicRenderingContext2D { virtual ~CanvasRenderingContext2D(); @@ -80,18 +82,18 @@ public: return mCanvasElement->GetOriginalCanvas(); } - void Save(); - void Restore(); - void Scale(double aX, double aY, mozilla::ErrorResult& aError); - void Rotate(double aAngle, mozilla::ErrorResult& aError); - void Translate(double aX, double aY, mozilla::ErrorResult& aError); - void Transform(double aM11, double aM12, double aM21, double aM22, double aDx, - double aDy, mozilla::ErrorResult& aError); - void SetTransform(double aM11, double aM12, double aM21, double aM22, double aDx, - double aDy, mozilla::ErrorResult& aError); - void ResetTransform(mozilla::ErrorResult& aError); + void Save() override; + void Restore() override; + void Scale(double aX, double aY, mozilla::ErrorResult& aError) override; + void Rotate(double aAngle, mozilla::ErrorResult& aError) override; + void Translate(double aX, double aY, mozilla::ErrorResult& aError) override; + void Transform(double aM11, double aM12, double aM21, double aM22, + double aDx, double aDy, mozilla::ErrorResult& aError) override; + void SetTransform(double aM11, double aM12, double aM21, double aM22, + double aDx, double aDy, mozilla::ErrorResult& aError) override; + void ResetTransform(mozilla::ErrorResult& aError) override; - double GlobalAlpha() + double GlobalAlpha() override { return CurrentState().globalAlpha; } @@ -99,79 +101,85 @@ public: // Useful for silencing cast warnings static mozilla::gfx::Float ToFloat(double aValue) { return mozilla::gfx::Float(aValue); } - void SetGlobalAlpha(double aGlobalAlpha) + void SetGlobalAlpha(double aGlobalAlpha) override { if (aGlobalAlpha >= 0.0 && aGlobalAlpha <= 1.0) { CurrentState().globalAlpha = ToFloat(aGlobalAlpha); } } - void GetGlobalCompositeOperation(nsAString& aOp, mozilla::ErrorResult& aError); + void GetGlobalCompositeOperation(nsAString& aOp, + mozilla::ErrorResult& aError) override; void SetGlobalCompositeOperation(const nsAString& aOp, - mozilla::ErrorResult& aError); + mozilla::ErrorResult& aError) override; - void GetStrokeStyle(OwningStringOrCanvasGradientOrCanvasPattern& aValue) + void + GetStrokeStyle(OwningStringOrCanvasGradientOrCanvasPattern& aValue) override { GetStyleAsUnion(aValue, Style::STROKE); } - void SetStrokeStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) + void + SetStrokeStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) override { SetStyleFromUnion(aValue, Style::STROKE); } - void GetFillStyle(OwningStringOrCanvasGradientOrCanvasPattern& aValue) + void + GetFillStyle(OwningStringOrCanvasGradientOrCanvasPattern& aValue) override { GetStyleAsUnion(aValue, Style::FILL); } - void SetFillStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) + void + SetFillStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) override { SetStyleFromUnion(aValue, Style::FILL); } already_AddRefed - CreateLinearGradient(double aX0, double aY0, double aX1, double aY1); + CreateLinearGradient(double aX0, double aY0, double aX1, double aY1) override; already_AddRefed - CreateRadialGradient(double aX0, double aY0, double aR0, double aX1, double aY1, - double aR1, ErrorResult& aError); + CreateRadialGradient(double aX0, double aY0, double aR0, + double aX1, double aY1, double aR1, + ErrorResult& aError) override; already_AddRefed CreatePattern(const CanvasImageSource& aElement, - const nsAString& aRepeat, ErrorResult& aError); + const nsAString& aRepeat, ErrorResult& aError) override; - double ShadowOffsetX() + double ShadowOffsetX() override { return CurrentState().shadowOffset.x; } - void SetShadowOffsetX(double aShadowOffsetX) + void SetShadowOffsetX(double aShadowOffsetX) override { CurrentState().shadowOffset.x = ToFloat(aShadowOffsetX); } - double ShadowOffsetY() + double ShadowOffsetY() override { return CurrentState().shadowOffset.y; } - void SetShadowOffsetY(double aShadowOffsetY) + void SetShadowOffsetY(double aShadowOffsetY) override { CurrentState().shadowOffset.y = ToFloat(aShadowOffsetY); } - double ShadowBlur() + double ShadowBlur() override { return CurrentState().shadowBlur; } - void SetShadowBlur(double aShadowBlur) + void SetShadowBlur(double aShadowBlur) override { if (aShadowBlur >= 0.0) { CurrentState().shadowBlur = ToFloat(aShadowBlur); } } - void GetShadowColor(nsAString& aShadowColor) + void GetShadowColor(nsAString& aShadowColor) override { StyleColorToString(CurrentState().shadowColor, aShadowColor); } @@ -181,11 +189,11 @@ public: aFilter = CurrentState().filterString; } - void SetShadowColor(const nsAString& aShadowColor); + void SetShadowColor(const nsAString& aShadowColor) override; void SetFilter(const nsAString& aFilter, mozilla::ErrorResult& aError); - void ClearRect(double aX, double aY, double aW, double aH); - void FillRect(double aX, double aY, double aW, double aH); - void StrokeRect(double aX, double aY, double aW, double aH); + void ClearRect(double aX, double aY, double aW, double aH) override; + void FillRect(double aX, double aY, double aW, double aH) override; + void StrokeRect(double aX, double aY, double aW, double aH) override; void BeginPath(); void Fill(const CanvasWindingRule& aWinding); void Fill(const CanvasPath& aPath, const CanvasWindingRule& aWinding); @@ -212,22 +220,22 @@ public: void RemoveHitRegion(const nsAString& aId); void ClearHitRegions(); - void DrawImage(const CanvasImageSource& aImage, - double aDx, double aDy, mozilla::ErrorResult& aError) + void DrawImage(const CanvasImageSource& aImage, double aDx, double aDy, + mozilla::ErrorResult& aError) override { DrawImage(aImage, 0.0, 0.0, 0.0, 0.0, aDx, aDy, 0.0, 0.0, 0, aError); } - void DrawImage(const CanvasImageSource& aImage, - double aDx, double aDy, double aDw, double aDh, - mozilla::ErrorResult& aError) + void DrawImage(const CanvasImageSource& aImage, double aDx, double aDy, + double aDw, double aDh, mozilla::ErrorResult& aError) override { DrawImage(aImage, 0.0, 0.0, 0.0, 0.0, aDx, aDy, aDw, aDh, 2, aError); } void DrawImage(const CanvasImageSource& aImage, - double aSx, double aSy, double aSw, double aSh, double aDx, - double aDy, double aDw, double aDh, mozilla::ErrorResult& aError) + double aSx, double aSy, double aSw, double aSh, + double aDx, double aDy, double aDw, double aDh, + mozilla::ErrorResult& aError) override { DrawImage(aImage, aSx, aSy, aSw, aSh, aDx, aDy, aDw, aDh, 6, aError); } @@ -248,28 +256,29 @@ public: double aDirtyWidth, double aDirtyHeight, mozilla::ErrorResult& aError); - double LineWidth() + double LineWidth() override { return CurrentState().lineWidth; } - void SetLineWidth(double aWidth) + void SetLineWidth(double aWidth) override { if (aWidth > 0.0) { CurrentState().lineWidth = ToFloat(aWidth); } } - void GetLineCap(nsAString& aLinecapStyle); - void SetLineCap(const nsAString& aLinecapStyle); - void GetLineJoin(nsAString& aLinejoinStyle, mozilla::ErrorResult& aError); - void SetLineJoin(const nsAString& aLinejoinStyle); + void GetLineCap(nsAString& aLinecapStyle) override; + void SetLineCap(const nsAString& aLinecapStyle) override; + void GetLineJoin(nsAString& aLinejoinStyle, + mozilla::ErrorResult& aError) override; + void SetLineJoin(const nsAString& aLinejoinStyle) override; - double MiterLimit() + double MiterLimit() override { return CurrentState().miterLimit; } - void SetMiterLimit(double aMiter) + void SetMiterLimit(double aMiter) override { if (aMiter > 0.0) { CurrentState().miterLimit = ToFloat(aMiter); @@ -287,7 +296,7 @@ public: void GetTextBaseline(nsAString& aTextBaseline); void SetTextBaseline(const nsAString& aTextBaseline); - void ClosePath() + void ClosePath() override { EnsureWritablePath(); @@ -298,7 +307,7 @@ public: } } - void MoveTo(double aX, double aY) + void MoveTo(double aX, double aY) override { EnsureWritablePath(); @@ -310,14 +319,14 @@ public: } } - void LineTo(double aX, double aY) + void LineTo(double aX, double aY) override { EnsureWritablePath(); LineTo(mozilla::gfx::Point(ToFloat(aX), ToFloat(aY))); } - void QuadraticCurveTo(double aCpx, double aCpy, double aX, double aY) + void QuadraticCurveTo(double aCpx, double aCpy, double aX, double aY) override { EnsureWritablePath(); @@ -333,7 +342,8 @@ public: } } - void BezierCurveTo(double aCp1x, double aCp1y, double aCp2x, double aCp2y, double aX, double aY) + void BezierCurveTo(double aCp1x, double aCp1y, double aCp2x, double aCp2y, + double aX, double aY) override { EnsureWritablePath(); @@ -342,14 +352,15 @@ public: mozilla::gfx::Point(ToFloat(aX), ToFloat(aY))); } - void ArcTo(double aX1, double aY1, double aX2, double aY2, double aRadius, - mozilla::ErrorResult& aError); - void Rect(double aX, double aY, double aW, double aH); + void ArcTo(double aX1, double aY1, double aX2, double aY2, + double aRadius, mozilla::ErrorResult& aError) override; + void Rect(double aX, double aY, double aW, double aH) override; void Arc(double aX, double aY, double aRadius, double aStartAngle, - double aEndAngle, bool aAnticlockwise, mozilla::ErrorResult& aError); + double aEndAngle, bool aAnticlockwise, + mozilla::ErrorResult& aError) override; void Ellipse(double aX, double aY, double aRadiusX, double aRadiusY, double aRotation, double aStartAngle, double aEndAngle, - bool aAnticlockwise, ErrorResult& aError); + bool aAnticlockwise, ErrorResult& aError) override; void GetMozCurrentTransform(JSContext* aCx, JS::MutableHandle aResult, @@ -367,11 +378,11 @@ public: void SetFillRule(const nsAString& aFillRule); void SetLineDash(const Sequence& aSegments, - mozilla::ErrorResult& aRv); - void GetLineDash(nsTArray& aSegments) const; + mozilla::ErrorResult& aRv) override; + void GetLineDash(nsTArray& aSegments) const override; - void SetLineDashOffset(double aOffset); - double LineDashOffset() const; + void SetLineDashOffset(double aOffset) override; + double LineDashOffset() const override; void GetMozTextStyle(nsAString& aMozTextStyle) { @@ -384,12 +395,12 @@ public: SetFont(aMozTextStyle, aError); } - bool ImageSmoothingEnabled() + bool ImageSmoothingEnabled() override { return CurrentState().imageSmoothingEnabled; } - void SetImageSmoothingEnabled(bool aImageSmoothingEnabled) + void SetImageSmoothingEnabled(bool aImageSmoothingEnabled) override { if (aImageSmoothingEnabled != CurrentState().imageSmoothingEnabled) { CurrentState().imageSmoothingEnabled = aImageSmoothingEnabled; diff --git a/dom/canvas/moz.build b/dom/canvas/moz.build index 6030615f059a..3b050a00da62 100644 --- a/dom/canvas/moz.build +++ b/dom/canvas/moz.build @@ -55,6 +55,7 @@ EXPORTS.mozilla.ipc += [ ] EXPORTS.mozilla.dom += [ + 'BasicRenderingContext2D.h', 'CanvasGradient.h', 'CanvasPath.h', 'CanvasPattern.h',