summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/context/GraphicsOperation.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/graphics/android/context/GraphicsOperation.h')
-rw-r--r--Source/WebCore/platform/graphics/android/context/GraphicsOperation.h809
1 files changed, 809 insertions, 0 deletions
diff --git a/Source/WebCore/platform/graphics/android/context/GraphicsOperation.h b/Source/WebCore/platform/graphics/android/context/GraphicsOperation.h
new file mode 100644
index 0000000..927ff0a
--- /dev/null
+++ b/Source/WebCore/platform/graphics/android/context/GraphicsOperation.h
@@ -0,0 +1,809 @@
+/*
+ * Copyright 2012, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GraphicsOperation_h
+#define GraphicsOperation_h
+
+#if USE(ACCELERATED_COMPOSITING)
+
+#include "Color.h"
+#include "FloatRect.h"
+#include "GlyphBuffer.h"
+#include "Font.h"
+#include "IntRect.h"
+#include "PlatformGraphicsContext.h"
+#include "PlatformGraphicsContextSkia.h"
+#include "SkCanvas.h"
+#include "SkShader.h"
+#include "SkRefCnt.h"
+
+#include <utils/threads.h>
+#include <wtf/text/CString.h>
+
+#define TYPE_CASE(type) case type: return #type;
+
+namespace WebCore {
+
+namespace GraphicsOperation {
+
+class Operation : public SkRefCnt {
+public:
+ typedef enum { UndefinedOperation
+ // State management
+ , BeginTransparencyLayerOperation
+ , EndTransparencyLayerOperation
+ , SaveOperation
+ , RestoreOperation
+ // State setters
+ , SetAlphaOperation
+ , SetCompositeOpOperation
+ , SetFillColorOperation
+ , SetFillShaderOperation
+ , SetLineCapOperation
+ , SetLineDashOperation
+ , SetLineJoinOperation
+ , SetMiterLimitOperation
+ , SetShadowOperation
+ , SetShouldAntialiasOperation
+ , SetStrokeColorOperation
+ , SetStrokeShaderOperation
+ , SetStrokeStyleOperation
+ , SetStrokeThicknessOperation
+ // Paint setup
+ , SetupPaintFillOperation
+ , SetupPaintShadowOperation
+ , SetupPaintStrokeOperation
+ // Matrix operations
+ , ConcatCTMOperation
+ , ScaleOperation
+ , RotateOperation
+ , TranslateOperation
+ // Clipping
+ , InnerRoundedRectClipOperation
+ , ClipOperation
+ , ClipPathOperation
+ , ClipOutOperation
+ , ClearRectOperation
+ // Drawing
+ , DrawBitmapPatternOperation
+ , DrawBitmapRectOperation
+ , DrawEllipseOperation
+ , DrawLineOperation
+ , DrawLineForTextOperation
+ , DrawLineForTextCheckingOperation
+ , DrawRectOperation
+ , FillPathOperation
+ , FillRectOperation
+ , FillRoundedRectOperation
+ , StrokeArcOperation
+ , StrokePathOperation
+ , StrokeRectOperation
+ // Text
+ , DrawComplexTextOperation
+ , DrawTextOperation
+ } OperationType;
+
+ virtual void apply(PlatformGraphicsContext* context) = 0;
+ virtual ~Operation() {}
+ virtual OperationType type() { return UndefinedOperation; }
+ virtual String parameters() { return ""; }
+ String name()
+ {
+ switch (type()) {
+ TYPE_CASE(UndefinedOperation)
+ // State management
+ TYPE_CASE(BeginTransparencyLayerOperation)
+ TYPE_CASE(EndTransparencyLayerOperation)
+ TYPE_CASE(SaveOperation)
+ TYPE_CASE(RestoreOperation)
+ // State setters
+ TYPE_CASE(SetAlphaOperation)
+ TYPE_CASE(SetCompositeOpOperation)
+ TYPE_CASE(SetFillColorOperation)
+ TYPE_CASE(SetFillShaderOperation)
+ TYPE_CASE(SetLineCapOperation)
+ TYPE_CASE(SetLineDashOperation)
+ TYPE_CASE(SetLineJoinOperation)
+ TYPE_CASE(SetMiterLimitOperation)
+ TYPE_CASE(SetShadowOperation)
+ TYPE_CASE(SetShouldAntialiasOperation)
+ TYPE_CASE(SetStrokeColorOperation)
+ TYPE_CASE(SetStrokeShaderOperation)
+ TYPE_CASE(SetStrokeStyleOperation)
+ TYPE_CASE(SetStrokeThicknessOperation)
+ // Paint setup
+ TYPE_CASE(SetupPaintFillOperation)
+ TYPE_CASE(SetupPaintShadowOperation)
+ TYPE_CASE(SetupPaintStrokeOperation)
+ // Matrix operations
+ TYPE_CASE(ConcatCTMOperation)
+ TYPE_CASE(ScaleOperation)
+ TYPE_CASE(RotateOperation)
+ TYPE_CASE(TranslateOperation)
+ // Clipping
+ TYPE_CASE(InnerRoundedRectClipOperation)
+ TYPE_CASE(ClipOperation)
+ TYPE_CASE(ClipPathOperation)
+ TYPE_CASE(ClipOutOperation)
+ TYPE_CASE(ClearRectOperation)
+ // Drawing
+ TYPE_CASE(DrawBitmapPatternOperation)
+ TYPE_CASE(DrawBitmapRectOperation)
+ TYPE_CASE(DrawEllipseOperation)
+ TYPE_CASE(DrawLineOperation)
+ TYPE_CASE(DrawLineForTextOperation)
+ TYPE_CASE(DrawLineForTextCheckingOperation)
+ TYPE_CASE(DrawRectOperation)
+ TYPE_CASE(FillPathOperation)
+ TYPE_CASE(FillRectOperation)
+ TYPE_CASE(FillRoundedRectOperation)
+ TYPE_CASE(StrokeArcOperation)
+ TYPE_CASE(StrokePathOperation)
+ TYPE_CASE(StrokeRectOperation)
+ // Text
+ TYPE_CASE(DrawComplexTextOperation)
+ TYPE_CASE(DrawTextOperation)
+ }
+ return "Undefined";
+ }
+};
+
+//**************************************
+// State management
+//**************************************
+
+class BeginTransparencyLayer : public Operation {
+public:
+ BeginTransparencyLayer(const float opacity) : m_opacity(opacity) {}
+ virtual void apply(PlatformGraphicsContext* context) { context->beginTransparencyLayer(m_opacity); }
+ virtual OperationType type() { return BeginTransparencyLayerOperation; }
+private:
+ float m_opacity;
+};
+class EndTransparencyLayer : public Operation {
+public:
+ EndTransparencyLayer() {}
+ virtual void apply(PlatformGraphicsContext* context) { context->endTransparencyLayer(); }
+ virtual OperationType type() { return EndTransparencyLayerOperation; }
+};
+class Save : public Operation {
+public:
+ virtual void apply(PlatformGraphicsContext* context) { context->save(); }
+ virtual OperationType type() { return SaveOperation; }
+};
+class Restore : public Operation {
+public:
+ virtual void apply(PlatformGraphicsContext* context) { context->restore(); }
+ virtual OperationType type() { return RestoreOperation; }
+};
+
+//**************************************
+// State setters
+//**************************************
+
+class SetAlpha : public Operation {
+public:
+ SetAlpha(const float alpha) : m_alpha(alpha) {}
+ virtual void apply(PlatformGraphicsContext* context) { context->setAlpha(m_alpha); }
+ virtual OperationType type() { return SetAlphaOperation; }
+private:
+ float m_alpha;
+};
+
+class SetCompositeOperation : public Operation {
+public:
+ SetCompositeOperation(CompositeOperator op) : m_operator(op) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setCompositeOperation(m_operator);
+ }
+ virtual OperationType type() { return SetCompositeOpOperation; }
+private:
+ CompositeOperator m_operator;
+};
+
+class SetFillColor : public Operation {
+public:
+ SetFillColor(Color color) : m_color(color) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setFillColor(m_color);
+ }
+ virtual OperationType type() { return SetFillColorOperation; }
+ virtual String parameters() {
+ return String::format("r: %d g: %d b: %d a: %d",
+ m_color.red(),
+ m_color.green(),
+ m_color.blue(),
+ m_color.alpha());
+ }
+private:
+ Color m_color;
+};
+
+class SetFillShader : public Operation {
+public:
+ SetFillShader(SkShader* shader) : m_shader(shader) {
+ SkSafeRef(m_shader);
+ }
+ ~SetFillShader() { SkSafeUnref(m_shader); }
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setFillShader(m_shader);
+ }
+ virtual OperationType type() { return SetFillShaderOperation; }
+private:
+ SkShader* m_shader;
+};
+
+class SetLineCap : public Operation {
+public:
+ SetLineCap(LineCap cap) : m_cap(cap) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setLineCap(m_cap);
+ }
+ virtual OperationType type() { return SetLineCapOperation; }
+private:
+ LineCap m_cap;
+};
+
+class SetLineDash : public Operation {
+public:
+ SetLineDash(const DashArray& dashes, float dashOffset)
+ : m_dashes(dashes), m_dashOffset(dashOffset) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setLineDash(m_dashes, m_dashOffset);
+ }
+ virtual OperationType type() { return SetLineDashOperation; }
+private:
+ DashArray m_dashes;
+ float m_dashOffset;
+};
+
+class SetLineJoin : public Operation {
+public:
+ SetLineJoin(LineJoin join) : m_join(join) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setLineJoin(m_join);
+ }
+ virtual OperationType type() { return SetLineJoinOperation; }
+private:
+ LineJoin m_join;
+};
+
+class SetMiterLimit : public Operation {
+public:
+ SetMiterLimit(float limit) : m_limit(limit) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setMiterLimit(m_limit);
+ }
+ virtual OperationType type() { return SetMiterLimitOperation; }
+private:
+ float m_limit;
+};
+
+class SetShadow : public Operation {
+public:
+ SetShadow(int radius, int dx, int dy, SkColor c)
+ : m_radius(radius), m_dx(dx), m_dy(dy), m_color(c) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setShadow(m_radius, m_dx, m_dy, m_color);
+ }
+ virtual OperationType type() { return SetShadowOperation; }
+private:
+ int m_radius;
+ int m_dx;
+ int m_dy;
+ SkColor m_color;
+};
+
+class SetShouldAntialias : public Operation {
+public:
+ SetShouldAntialias(bool useAA) : m_useAA(useAA) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setShouldAntialias(m_useAA);
+ }
+ virtual OperationType type() { return SetShouldAntialiasOperation; }
+private:
+ bool m_useAA;
+};
+
+class SetStrokeColor : public Operation {
+public:
+ SetStrokeColor(const Color& c) : m_color(c) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setStrokeColor(m_color);
+ }
+ virtual OperationType type() { return SetStrokeColorOperation; }
+private:
+ Color m_color;
+};
+
+class SetStrokeShader : public Operation {
+public:
+ SetStrokeShader(SkShader* strokeShader) : m_shader(strokeShader) {
+ SkSafeRef(m_shader);
+ }
+ ~SetStrokeShader() { SkSafeUnref(m_shader); }
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setStrokeShader(m_shader);
+ }
+ virtual OperationType type() { return SetStrokeShaderOperation; }
+private:
+ SkShader* m_shader;
+};
+
+class SetStrokeStyle : public Operation {
+public:
+ SetStrokeStyle(StrokeStyle style) : m_style(style) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setStrokeStyle(m_style);
+ }
+ virtual OperationType type() { return SetStrokeStyleOperation; }
+private:
+ StrokeStyle m_style;
+};
+
+class SetStrokeThickness : public Operation {
+public:
+ SetStrokeThickness(float thickness) : m_thickness(thickness) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setStrokeThickness(m_thickness);
+ }
+ virtual OperationType type() { return SetStrokeThicknessOperation; }
+private:
+ float m_thickness;
+};
+
+//**************************************
+// Paint setup
+//**************************************
+
+class SetupPaintFill : public Operation {
+public:
+ SetupPaintFill(SkPaint* paint) : m_paint(*paint) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setupPaintFill(&m_paint);
+ }
+ virtual OperationType type() { return SetupPaintFillOperation; }
+private:
+ SkPaint m_paint;
+};
+
+class SetupPaintShadow : public Operation {
+public:
+ SetupPaintShadow(SkPaint* paint, SkPoint* offset)
+ : m_paint(*paint), m_offset(*offset) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setupPaintShadow(&m_paint, &m_offset);
+ }
+ virtual OperationType type() { return SetupPaintShadowOperation; }
+private:
+ SkPaint m_paint;
+ SkPoint m_offset;
+};
+
+class SetupPaintStroke : public Operation {
+public:
+ SetupPaintStroke(SkPaint* paint, SkRect* rect, bool isHLine)
+ : m_paint(*paint), m_rect(*rect), m_isHLine(isHLine) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->setupPaintStroke(&m_paint, &m_rect, m_isHLine);
+ }
+ virtual OperationType type() { return SetupPaintStrokeOperation; }
+private:
+ SkPaint m_paint;
+ SkRect m_rect;
+ bool m_isHLine;
+};
+
+//**************************************
+// Matrix operations
+//**************************************
+
+class ConcatCTM : public Operation {
+public:
+ ConcatCTM(const AffineTransform& affine) : m_matrix(affine) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->concatCTM(m_matrix);
+ }
+ virtual OperationType type() { return ConcatCTMOperation; }
+private:
+ AffineTransform m_matrix;
+};
+
+class Rotate : public Operation {
+public:
+ Rotate(float angleInRadians) : m_angle(angleInRadians) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->rotate(m_angle);
+ }
+ virtual OperationType type() { return RotateOperation; }
+private:
+ float m_angle;
+};
+
+class Scale : public Operation {
+public:
+ Scale(const FloatSize& size) : m_scale(size) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->scale(m_scale);
+ }
+ virtual OperationType type() { return ScaleOperation; }
+private:
+ FloatSize m_scale;
+};
+
+class Translate : public Operation {
+public:
+ Translate(float x, float y) : m_x(x), m_y(y) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->translate(m_x, m_y);
+ }
+ virtual OperationType type() { return TranslateOperation; }
+private:
+ float m_x;
+ float m_y;
+};
+
+//**************************************
+// Clipping
+//**************************************
+
+class InnerRoundedRectClip : public Operation {
+public:
+ InnerRoundedRectClip(const IntRect& rect, int thickness)
+ : m_rect(rect), m_thickness(thickness) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->addInnerRoundedRectClip(m_rect, m_thickness);
+ }
+ virtual OperationType type() { return InnerRoundedRectClipOperation; }
+private:
+ IntRect m_rect;
+ int m_thickness;
+};
+
+class Clip : public Operation {
+public:
+ Clip(const FloatRect& rect) : m_rect(rect) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->clip(m_rect);
+ }
+ virtual OperationType type() { return ClipOperation; }
+private:
+ const FloatRect m_rect;
+};
+
+class ClipPath : public Operation {
+public:
+ ClipPath(const Path& path, bool clipout = false)
+ : m_path(path), m_clipOut(clipout), m_hasWindRule(false) {}
+ void setWindRule(WindRule rule) { m_windRule = rule; m_hasWindRule = true; }
+ virtual void apply(PlatformGraphicsContext* context) {
+ if (m_hasWindRule) {
+ context->clipPath(m_path, m_windRule);
+ return;
+ }
+ if (m_clipOut)
+ context->clipOut(m_path);
+ else
+ context->clip(m_path);
+ }
+ virtual OperationType type() { return ClipPathOperation; }
+private:
+ const Path m_path;
+ bool m_clipOut;
+ WindRule m_windRule;
+ bool m_hasWindRule;
+};
+
+class ClipOut : public Operation {
+public:
+ ClipOut(const IntRect& rect) : m_rect(rect) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->clipOut(m_rect);
+ }
+ virtual OperationType type() { return ClipOutOperation; }
+private:
+ const IntRect m_rect;
+};
+
+class ClearRect : public Operation {
+public:
+ ClearRect(const FloatRect& rect) : m_rect(rect) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->clearRect(m_rect);
+ }
+ virtual OperationType type() { return ClearRectOperation; }
+private:
+ FloatRect m_rect;
+};
+
+//**************************************
+// Drawing
+//**************************************
+
+class DrawBitmapPattern : public Operation {
+public:
+ DrawBitmapPattern(const SkBitmap& bitmap, const SkMatrix& matrix,
+ CompositeOperator op, const FloatRect& destRect)
+ : m_bitmap(bitmap), m_matrix(matrix), m_operator(op), m_destRect(destRect) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->drawBitmapPattern(m_bitmap, m_matrix, m_operator, m_destRect);
+ }
+ virtual OperationType type() { return DrawBitmapPatternOperation; }
+private:
+ // TODO: use refcounted bitmap
+ const SkBitmap m_bitmap;
+ SkMatrix m_matrix;
+ CompositeOperator m_operator;
+ FloatRect m_destRect;
+};
+
+class DrawBitmapRect : public Operation {
+public:
+ DrawBitmapRect(const SkBitmap& bitmap, const SkIRect& srcR,
+ const SkRect& dstR, CompositeOperator op)
+ : m_bitmap(bitmap), m_srcR(srcR), m_dstR(dstR), m_operator(op) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->drawBitmapRect(m_bitmap, &m_srcR, m_dstR, m_operator);
+ }
+ virtual OperationType type() { return DrawBitmapRectOperation; }
+ virtual String parameters() {
+ return String::format("%.2f, %.2f - %.2f x %.2f",
+ m_dstR.fLeft, m_dstR.fTop,
+ m_dstR.width(), m_dstR.height());
+ }
+private:
+ const SkBitmap& m_bitmap;
+ SkIRect m_srcR;
+ SkRect m_dstR;
+ CompositeOperator m_operator;
+};
+
+class DrawEllipse : public Operation {
+public:
+ DrawEllipse(const IntRect& rect) : m_rect(rect) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->drawEllipse(m_rect);
+ }
+ virtual OperationType type() { return DrawEllipseOperation; }
+private:
+ IntRect m_rect;
+};
+
+class DrawLine : public Operation {
+public:
+ DrawLine(const IntPoint& point1, const IntPoint& point2)
+ : m_point1(point1), m_point2(point2) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->drawLine(m_point1, m_point2);
+ }
+ virtual OperationType type() { return DrawLineOperation; }
+private:
+ IntPoint m_point1;
+ IntPoint m_point2;
+};
+
+class DrawLineForText : public Operation {
+public:
+ DrawLineForText(const FloatPoint& pt, float width)
+ : m_point(pt), m_width(width) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->drawLineForText(m_point, m_width);
+ }
+ virtual OperationType type() { return DrawLineForTextOperation; }
+private:
+ FloatPoint m_point;
+ float m_width;
+};
+
+class DrawLineForTextChecking : public Operation {
+public:
+ DrawLineForTextChecking(const FloatPoint& pt, float width,
+ GraphicsContext::TextCheckingLineStyle lineStyle)
+ : m_point(pt), m_width(width), m_lineStyle(lineStyle) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->drawLineForTextChecking(m_point, m_width, m_lineStyle);
+ }
+ virtual OperationType type() { return DrawLineForTextCheckingOperation; }
+private:
+ FloatPoint m_point;
+ float m_width;
+ GraphicsContext::TextCheckingLineStyle m_lineStyle;
+};
+
+class DrawRect : public Operation {
+public:
+ DrawRect(const IntRect& rect) : m_rect(rect) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->drawRect(m_rect);
+ }
+ virtual OperationType type() { return DrawRectOperation; }
+private:
+ IntRect m_rect;
+};
+
+class FillPath : public Operation {
+public:
+ FillPath(const Path& pathToFill, WindRule fillRule)
+ : m_path(pathToFill), m_fillRule(fillRule) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->fillPath(m_path, m_fillRule);
+ }
+ virtual OperationType type() { return FillPathOperation; }
+private:
+ Path m_path;
+ WindRule m_fillRule;
+};
+
+class FillRect : public Operation {
+public:
+ FillRect(const FloatRect& rect) : m_rect(rect), m_hasColor(false) {}
+ void setColor(Color c) { m_color = c; m_hasColor = true; }
+ virtual void apply(PlatformGraphicsContext* context) {
+ if (m_hasColor)
+ context->fillRect(m_rect, m_color);
+ else
+ context->fillRect(m_rect);
+ }
+ virtual OperationType type() { return FillRectOperation; }
+private:
+ FloatRect m_rect;
+ Color m_color;
+ bool m_hasColor;
+};
+
+class FillRoundedRect : public Operation {
+public:
+ FillRoundedRect(const IntRect& rect,
+ const IntSize& topLeft,
+ const IntSize& topRight,
+ const IntSize& bottomLeft,
+ const IntSize& bottomRight,
+ const Color& color)
+ : m_rect(rect)
+ , m_topLeft(topLeft)
+ , m_topRight(topRight)
+ , m_bottomLeft(bottomLeft)
+ , m_bottomRight(bottomRight)
+ , m_color(color)
+ {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->fillRoundedRect(m_rect, m_topLeft, m_topRight,
+ m_bottomLeft, m_bottomRight,
+ m_color);
+ }
+ virtual OperationType type() { return FillRoundedRectOperation; }
+private:
+ IntRect m_rect;
+ IntSize m_topLeft;
+ IntSize m_topRight;
+ IntSize m_bottomLeft;
+ IntSize m_bottomRight;
+ Color m_color;
+};
+
+class StrokeArc : public Operation {
+public:
+ StrokeArc(const IntRect& r, int startAngle, int angleSpan)
+ : m_rect(r)
+ , m_startAngle(startAngle)
+ , m_angleSpan(angleSpan)
+ {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->strokeArc(m_rect, m_startAngle, m_angleSpan);
+ }
+ virtual OperationType type() { return StrokeArcOperation; }
+private:
+ IntRect m_rect;
+ int m_startAngle;
+ int m_angleSpan;
+};
+
+class StrokePath : public Operation {
+public:
+ StrokePath(const Path& path) : m_path(path) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->strokePath(m_path);
+ }
+ virtual OperationType type() { return StrokePathOperation; }
+private:
+ Path m_path;
+};
+
+
+class StrokeRect : public Operation {
+public:
+ StrokeRect(const FloatRect& rect, float lineWidth)
+ : m_rect(rect), m_lineWidth(lineWidth) {}
+ virtual void apply(PlatformGraphicsContext* context) {
+ context->strokeRect(m_rect, m_lineWidth);
+ }
+ virtual OperationType type() { return StrokeRectOperation; }
+private:
+ FloatRect m_rect;
+ float m_lineWidth;
+};
+
+//**************************************
+// Text
+//**************************************
+
+class DrawComplexText : public Operation {
+public:
+ DrawComplexText(SkPicture* picture) : m_picture(picture) {
+ SkSafeRef(m_picture);
+ }
+ ~DrawComplexText() { SkSafeUnref(m_picture); }
+ virtual void apply(PlatformGraphicsContext* context) {
+ if (!context->getCanvas())
+ return;
+ context->getCanvas()->drawPicture(*m_picture);
+ }
+ virtual OperationType type() { return DrawComplexTextOperation; }
+private:
+ SkPicture* m_picture;
+};
+
+class DrawText : public Operation {
+public:
+ DrawText(const Font* font, const SimpleFontData* simpleFont,
+ const GlyphBuffer& glyphBuffer,
+ int from, int numGlyphs, const FloatPoint& point)
+ : m_font(font), m_simpleFont(simpleFont)
+ , m_glyphBuffer(glyphBuffer), m_from(from)
+ , m_numGlyphs(numGlyphs), m_point(point) {
+
+ SkPicture* picture = new SkPicture();
+ SkCanvas* canvas = picture->beginRecording(0, 0, 0);
+ PlatformGraphicsContextSkia platformContext(canvas);
+ GraphicsContext graphicsContext(&platformContext);
+ m_font->drawGlyphs(&graphicsContext, m_simpleFont,
+ m_glyphBuffer, m_from, m_numGlyphs, m_point);
+ picture->endRecording();
+ m_picture = picture;
+ }
+ ~DrawText() { SkSafeUnref(m_picture); }
+ virtual void apply(PlatformGraphicsContext* context) {
+ if (!context->getCanvas())
+ return;
+ context->getCanvas()->drawPicture(*m_picture);
+ }
+ virtual OperationType type() { return DrawTextOperation; }
+private:
+ SkPicture* m_picture;
+ const Font* m_font;
+ const SimpleFontData* m_simpleFont;
+ const GlyphBuffer m_glyphBuffer;
+ int m_from;
+ int m_numGlyphs;
+ const FloatPoint m_point;
+};
+
+}
+
+}
+
+#endif // USE(ACCELERATED_COMPOSITING)
+
+#endif // GraphicsOperation_h