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 "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<CanvasGradient>
CreateLinearGradient(double aX0, double aY0, double aX1, double aY1);
CreateLinearGradient(double aX0, double aY0, double aX1, double aY1) override;
already_AddRefed<CanvasGradient>
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<CanvasPattern>
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<JSObject*> aResult,
@ -367,11 +378,11 @@ public:
void SetFillRule(const nsAString& aFillRule);
void SetLineDash(const Sequence<double>& aSegments,
mozilla::ErrorResult& aRv);
void GetLineDash(nsTArray<double>& aSegments) const;
mozilla::ErrorResult& aRv) override;
void GetLineDash(nsTArray<double>& 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;

View File

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