Bug 1331857 - Create class BasicRenderingContext2D. r=gwright

This commit is contained in:
Kevin Chen 2017-02-02 22:43:00 +01:00
parent d8a07d33fc
commit 3f7720742d
3 changed files with 278 additions and 65 deletions

View File

@ -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<CanvasGradient> CreateLinearGradient(double aX0,
double aY0,
double aX1,
double aY1) = 0;
virtual already_AddRefed<CanvasGradient> CreateRadialGradient(
double aX0,
double aY0,
double aR0,
double aX1,
double aY1,
double aR1,
ErrorResult& aError) = 0;
virtual already_AddRefed<CanvasPattern> 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<double>& aSegments,
mozilla::ErrorResult& aRv) = 0;
virtual void GetLineDash(nsTArray<double>& 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 */

View File

@ -15,6 +15,7 @@
#include "mozilla/dom/HTMLVideoElement.h" #include "mozilla/dom/HTMLVideoElement.h"
#include "gfxTextRun.h" #include "gfxTextRun.h"
#include "mozilla/ErrorResult.h" #include "mozilla/ErrorResult.h"
#include "mozilla/dom/BasicRenderingContext2D.h"
#include "mozilla/dom/CanvasGradient.h" #include "mozilla/dom/CanvasGradient.h"
#include "mozilla/dom/CanvasRenderingContext2DBinding.h" #include "mozilla/dom/CanvasRenderingContext2DBinding.h"
#include "mozilla/dom/CanvasPattern.h" #include "mozilla/dom/CanvasPattern.h"
@ -61,7 +62,8 @@ class CanvasShutdownObserver;
**/ **/
class CanvasRenderingContext2D final : class CanvasRenderingContext2D final :
public nsICanvasRenderingContextInternal, public nsICanvasRenderingContextInternal,
public nsWrapperCache public nsWrapperCache,
public BasicRenderingContext2D
{ {
virtual ~CanvasRenderingContext2D(); virtual ~CanvasRenderingContext2D();
@ -80,18 +82,18 @@ public:
return mCanvasElement->GetOriginalCanvas(); return mCanvasElement->GetOriginalCanvas();
} }
void Save(); void Save() override;
void Restore(); void Restore() override;
void Scale(double aX, double aY, mozilla::ErrorResult& aError); void Scale(double aX, double aY, mozilla::ErrorResult& aError) override;
void Rotate(double aAngle, mozilla::ErrorResult& aError); void Rotate(double aAngle, mozilla::ErrorResult& aError) override;
void Translate(double aX, double aY, mozilla::ErrorResult& aError); void Translate(double aX, double aY, mozilla::ErrorResult& aError) override;
void Transform(double aM11, double aM12, double aM21, double aM22, double aDx, void Transform(double aM11, double aM12, double aM21, double aM22,
double aDy, mozilla::ErrorResult& aError); double aDx, double aDy, mozilla::ErrorResult& aError) override;
void SetTransform(double aM11, double aM12, double aM21, double aM22, double aDx, void SetTransform(double aM11, double aM12, double aM21, double aM22,
double aDy, mozilla::ErrorResult& aError); double aDx, double aDy, mozilla::ErrorResult& aError) override;
void ResetTransform(mozilla::ErrorResult& aError); void ResetTransform(mozilla::ErrorResult& aError) override;
double GlobalAlpha() double GlobalAlpha() override
{ {
return CurrentState().globalAlpha; return CurrentState().globalAlpha;
} }
@ -99,79 +101,85 @@ public:
// Useful for silencing cast warnings // Useful for silencing cast warnings
static mozilla::gfx::Float ToFloat(double aValue) { return mozilla::gfx::Float(aValue); } 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) { if (aGlobalAlpha >= 0.0 && aGlobalAlpha <= 1.0) {
CurrentState().globalAlpha = ToFloat(aGlobalAlpha); CurrentState().globalAlpha = ToFloat(aGlobalAlpha);
} }
} }
void GetGlobalCompositeOperation(nsAString& aOp, mozilla::ErrorResult& aError); void GetGlobalCompositeOperation(nsAString& aOp,
mozilla::ErrorResult& aError) override;
void SetGlobalCompositeOperation(const nsAString& aOp, 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); GetStyleAsUnion(aValue, Style::STROKE);
} }
void SetStrokeStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) void
SetStrokeStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) override
{ {
SetStyleFromUnion(aValue, Style::STROKE); SetStyleFromUnion(aValue, Style::STROKE);
} }
void GetFillStyle(OwningStringOrCanvasGradientOrCanvasPattern& aValue) void
GetFillStyle(OwningStringOrCanvasGradientOrCanvasPattern& aValue) override
{ {
GetStyleAsUnion(aValue, Style::FILL); GetStyleAsUnion(aValue, Style::FILL);
} }
void SetFillStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) void
SetFillStyle(const StringOrCanvasGradientOrCanvasPattern& aValue) override
{ {
SetStyleFromUnion(aValue, Style::FILL); SetStyleFromUnion(aValue, Style::FILL);
} }
already_AddRefed<CanvasGradient> already_AddRefed<CanvasGradient>
CreateLinearGradient(double aX0, double aY0, double aX1, double aY1); CreateLinearGradient(double aX0, double aY0, double aX1, double aY1) override;
already_AddRefed<CanvasGradient> already_AddRefed<CanvasGradient>
CreateRadialGradient(double aX0, double aY0, double aR0, double aX1, double aY1, CreateRadialGradient(double aX0, double aY0, double aR0,
double aR1, ErrorResult& aError); double aX1, double aY1, double aR1,
ErrorResult& aError) override;
already_AddRefed<CanvasPattern> already_AddRefed<CanvasPattern>
CreatePattern(const CanvasImageSource& aElement, CreatePattern(const CanvasImageSource& aElement,
const nsAString& aRepeat, ErrorResult& aError); const nsAString& aRepeat, ErrorResult& aError) override;
double ShadowOffsetX() double ShadowOffsetX() override
{ {
return CurrentState().shadowOffset.x; return CurrentState().shadowOffset.x;
} }
void SetShadowOffsetX(double aShadowOffsetX) void SetShadowOffsetX(double aShadowOffsetX) override
{ {
CurrentState().shadowOffset.x = ToFloat(aShadowOffsetX); CurrentState().shadowOffset.x = ToFloat(aShadowOffsetX);
} }
double ShadowOffsetY() double ShadowOffsetY() override
{ {
return CurrentState().shadowOffset.y; return CurrentState().shadowOffset.y;
} }
void SetShadowOffsetY(double aShadowOffsetY) void SetShadowOffsetY(double aShadowOffsetY) override
{ {
CurrentState().shadowOffset.y = ToFloat(aShadowOffsetY); CurrentState().shadowOffset.y = ToFloat(aShadowOffsetY);
} }
double ShadowBlur() double ShadowBlur() override
{ {
return CurrentState().shadowBlur; return CurrentState().shadowBlur;
} }
void SetShadowBlur(double aShadowBlur) void SetShadowBlur(double aShadowBlur) override
{ {
if (aShadowBlur >= 0.0) { if (aShadowBlur >= 0.0) {
CurrentState().shadowBlur = ToFloat(aShadowBlur); CurrentState().shadowBlur = ToFloat(aShadowBlur);
} }
} }
void GetShadowColor(nsAString& aShadowColor) void GetShadowColor(nsAString& aShadowColor) override
{ {
StyleColorToString(CurrentState().shadowColor, aShadowColor); StyleColorToString(CurrentState().shadowColor, aShadowColor);
} }
@ -181,11 +189,11 @@ public:
aFilter = CurrentState().filterString; aFilter = CurrentState().filterString;
} }
void SetShadowColor(const nsAString& aShadowColor); void SetShadowColor(const nsAString& aShadowColor) override;
void SetFilter(const nsAString& aFilter, mozilla::ErrorResult& aError); void SetFilter(const nsAString& aFilter, mozilla::ErrorResult& aError);
void ClearRect(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); void FillRect(double aX, double aY, double aW, double aH) override;
void StrokeRect(double aX, double aY, double aW, double aH); void StrokeRect(double aX, double aY, double aW, double aH) override;
void BeginPath(); void BeginPath();
void Fill(const CanvasWindingRule& aWinding); void Fill(const CanvasWindingRule& aWinding);
void Fill(const CanvasPath& aPath, const CanvasWindingRule& aWinding); void Fill(const CanvasPath& aPath, const CanvasWindingRule& aWinding);
@ -212,22 +220,22 @@ public:
void RemoveHitRegion(const nsAString& aId); void RemoveHitRegion(const nsAString& aId);
void ClearHitRegions(); void ClearHitRegions();
void DrawImage(const CanvasImageSource& aImage, void DrawImage(const CanvasImageSource& aImage, double aDx, double aDy,
double aDx, double aDy, mozilla::ErrorResult& aError) mozilla::ErrorResult& aError) override
{ {
DrawImage(aImage, 0.0, 0.0, 0.0, 0.0, aDx, aDy, 0.0, 0.0, 0, aError); DrawImage(aImage, 0.0, 0.0, 0.0, 0.0, aDx, aDy, 0.0, 0.0, 0, aError);
} }
void DrawImage(const CanvasImageSource& aImage, void DrawImage(const CanvasImageSource& aImage, double aDx, double aDy,
double aDx, double aDy, double aDw, double aDh, double aDw, double aDh, mozilla::ErrorResult& aError) override
mozilla::ErrorResult& aError)
{ {
DrawImage(aImage, 0.0, 0.0, 0.0, 0.0, aDx, aDy, aDw, aDh, 2, aError); DrawImage(aImage, 0.0, 0.0, 0.0, 0.0, aDx, aDy, aDw, aDh, 2, aError);
} }
void DrawImage(const CanvasImageSource& aImage, void DrawImage(const CanvasImageSource& aImage,
double aSx, double aSy, double aSw, double aSh, double aDx, double aSx, double aSy, double aSw, double aSh,
double aDy, double aDw, double aDh, mozilla::ErrorResult& aError) double aDx, double aDy, double aDw, double aDh,
mozilla::ErrorResult& aError) override
{ {
DrawImage(aImage, aSx, aSy, aSw, aSh, aDx, aDy, aDw, aDh, 6, aError); DrawImage(aImage, aSx, aSy, aSw, aSh, aDx, aDy, aDw, aDh, 6, aError);
} }
@ -248,28 +256,29 @@ public:
double aDirtyWidth, double aDirtyHeight, double aDirtyWidth, double aDirtyHeight,
mozilla::ErrorResult& aError); mozilla::ErrorResult& aError);
double LineWidth() double LineWidth() override
{ {
return CurrentState().lineWidth; return CurrentState().lineWidth;
} }
void SetLineWidth(double aWidth) void SetLineWidth(double aWidth) override
{ {
if (aWidth > 0.0) { if (aWidth > 0.0) {
CurrentState().lineWidth = ToFloat(aWidth); CurrentState().lineWidth = ToFloat(aWidth);
} }
} }
void GetLineCap(nsAString& aLinecapStyle); void GetLineCap(nsAString& aLinecapStyle) override;
void SetLineCap(const nsAString& aLinecapStyle); void SetLineCap(const nsAString& aLinecapStyle) override;
void GetLineJoin(nsAString& aLinejoinStyle, mozilla::ErrorResult& aError); void GetLineJoin(nsAString& aLinejoinStyle,
void SetLineJoin(const nsAString& aLinejoinStyle); mozilla::ErrorResult& aError) override;
void SetLineJoin(const nsAString& aLinejoinStyle) override;
double MiterLimit() double MiterLimit() override
{ {
return CurrentState().miterLimit; return CurrentState().miterLimit;
} }
void SetMiterLimit(double aMiter) void SetMiterLimit(double aMiter) override
{ {
if (aMiter > 0.0) { if (aMiter > 0.0) {
CurrentState().miterLimit = ToFloat(aMiter); CurrentState().miterLimit = ToFloat(aMiter);
@ -287,7 +296,7 @@ public:
void GetTextBaseline(nsAString& aTextBaseline); void GetTextBaseline(nsAString& aTextBaseline);
void SetTextBaseline(const nsAString& aTextBaseline); void SetTextBaseline(const nsAString& aTextBaseline);
void ClosePath() void ClosePath() override
{ {
EnsureWritablePath(); EnsureWritablePath();
@ -298,7 +307,7 @@ public:
} }
} }
void MoveTo(double aX, double aY) void MoveTo(double aX, double aY) override
{ {
EnsureWritablePath(); EnsureWritablePath();
@ -310,14 +319,14 @@ public:
} }
} }
void LineTo(double aX, double aY) void LineTo(double aX, double aY) override
{ {
EnsureWritablePath(); EnsureWritablePath();
LineTo(mozilla::gfx::Point(ToFloat(aX), ToFloat(aY))); 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(); 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(); EnsureWritablePath();
@ -342,14 +352,15 @@ public:
mozilla::gfx::Point(ToFloat(aX), ToFloat(aY))); mozilla::gfx::Point(ToFloat(aX), ToFloat(aY)));
} }
void ArcTo(double aX1, double aY1, double aX2, double aY2, double aRadius, void ArcTo(double aX1, double aY1, double aX2, double aY2,
mozilla::ErrorResult& aError); double aRadius, mozilla::ErrorResult& aError) override;
void Rect(double aX, double aY, double aW, double aH); void Rect(double aX, double aY, double aW, double aH) override;
void Arc(double aX, double aY, double aRadius, double aStartAngle, 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, void Ellipse(double aX, double aY, double aRadiusX, double aRadiusY,
double aRotation, double aStartAngle, double aEndAngle, double aRotation, double aStartAngle, double aEndAngle,
bool aAnticlockwise, ErrorResult& aError); bool aAnticlockwise, ErrorResult& aError) override;
void GetMozCurrentTransform(JSContext* aCx, void GetMozCurrentTransform(JSContext* aCx,
JS::MutableHandle<JSObject*> aResult, JS::MutableHandle<JSObject*> aResult,
@ -367,11 +378,11 @@ public:
void SetFillRule(const nsAString& aFillRule); void SetFillRule(const nsAString& aFillRule);
void SetLineDash(const Sequence<double>& aSegments, void SetLineDash(const Sequence<double>& aSegments,
mozilla::ErrorResult& aRv); mozilla::ErrorResult& aRv) override;
void GetLineDash(nsTArray<double>& aSegments) const; void GetLineDash(nsTArray<double>& aSegments) const override;
void SetLineDashOffset(double aOffset); void SetLineDashOffset(double aOffset) override;
double LineDashOffset() const; double LineDashOffset() const override;
void GetMozTextStyle(nsAString& aMozTextStyle) void GetMozTextStyle(nsAString& aMozTextStyle)
{ {
@ -384,12 +395,12 @@ public:
SetFont(aMozTextStyle, aError); SetFont(aMozTextStyle, aError);
} }
bool ImageSmoothingEnabled() bool ImageSmoothingEnabled() override
{ {
return CurrentState().imageSmoothingEnabled; return CurrentState().imageSmoothingEnabled;
} }
void SetImageSmoothingEnabled(bool aImageSmoothingEnabled) void SetImageSmoothingEnabled(bool aImageSmoothingEnabled) override
{ {
if (aImageSmoothingEnabled != CurrentState().imageSmoothingEnabled) { if (aImageSmoothingEnabled != CurrentState().imageSmoothingEnabled) {
CurrentState().imageSmoothingEnabled = aImageSmoothingEnabled; CurrentState().imageSmoothingEnabled = aImageSmoothingEnabled;

View File

@ -55,6 +55,7 @@ EXPORTS.mozilla.ipc += [
] ]
EXPORTS.mozilla.dom += [ EXPORTS.mozilla.dom += [
'BasicRenderingContext2D.h',
'CanvasGradient.h', 'CanvasGradient.h',
'CanvasPath.h', 'CanvasPath.h',
'CanvasPattern.h', 'CanvasPattern.h',