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.h629
1 files changed, 218 insertions, 411 deletions
diff --git a/Source/WebCore/platform/graphics/android/context/GraphicsOperation.h b/Source/WebCore/platform/graphics/android/context/GraphicsOperation.h
index 927ff0a..c9c382a 100644
--- a/Source/WebCore/platform/graphics/android/context/GraphicsOperation.h
+++ b/Source/WebCore/platform/graphics/android/context/GraphicsOperation.h
@@ -26,8 +26,6 @@
#ifndef GraphicsOperation_h
#define GraphicsOperation_h
-#if USE(ACCELERATED_COMPOSITING)
-
#include "Color.h"
#include "FloatRect.h"
#include "GlyphBuffer.h"
@@ -44,37 +42,54 @@
#define TYPE_CASE(type) case type: return #type;
+#define DEBUG_GRAPHICS_OPERATIONS false
+
+#if DEBUG_GRAPHICS_OPERATIONS
+#define TYPE(x) virtual OperationType type() { return x; }
+#else
+#define TYPE(x)
+#endif
+
namespace WebCore {
+class CanvasState;
+class LinearAllocator;
+
namespace GraphicsOperation {
-class Operation : public SkRefCnt {
+class Operation {
public:
+ Operation()
+ : m_state(0)
+ , m_canvasState(0)
+ {}
+
+ void* operator new(size_t size, LinearAllocator* allocator);
+
+ // Purposely not implemented - use a LinearAllocator please
+ void* operator new(size_t size);
+ void operator delete(void* ptr);
+
+ // This m_state is applied by ourselves
+ PlatformGraphicsContext::State* m_state;
+ // This is the canvas state that this operation needs
+ // Only used for drawing operations, state operations will be undefined
+ CanvasState* m_canvasState;
+
+ bool apply(PlatformGraphicsContext* context) {
+ if (m_state)
+ context->setRawState(m_state);
+ return applyImpl(context);
+ }
+ virtual bool applyImpl(PlatformGraphicsContext* context) = 0;
+ virtual ~Operation() {}
+
+ virtual const IntRect* opaqueRect() { return 0; }
+ virtual bool isOpaque() { return false; }
+ virtual void setOpaqueRect(const IntRect& bounds) {}
+
+#if DEBUG_GRAPHICS_OPERATIONS
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
@@ -89,7 +104,9 @@ public:
// Drawing
, DrawBitmapPatternOperation
, DrawBitmapRectOperation
+ , DrawConvexPolygonQuadOperation
, DrawEllipseOperation
+ , DrawFocusRingOperation
, DrawLineOperation
, DrawLineForTextOperation
, DrawLineForTextCheckingOperation
@@ -100,43 +117,15 @@ public:
, StrokeArcOperation
, StrokePathOperation
, StrokeRectOperation
+ , DrawMediaButtonOperation
// Text
- , DrawComplexTextOperation
- , DrawTextOperation
+ , DrawPosTextOperation
} OperationType;
- virtual void apply(PlatformGraphicsContext* context) = 0;
- virtual ~Operation() {}
- virtual OperationType type() { return UndefinedOperation; }
- virtual String parameters() { return ""; }
- String name()
+ const char* 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)
@@ -151,7 +140,9 @@ public:
// Drawing
TYPE_CASE(DrawBitmapPatternOperation)
TYPE_CASE(DrawBitmapRectOperation)
+ TYPE_CASE(DrawConvexPolygonQuadOperation)
TYPE_CASE(DrawEllipseOperation)
+ TYPE_CASE(DrawFocusRingOperation)
TYPE_CASE(DrawLineOperation)
TYPE_CASE(DrawLineForTextOperation)
TYPE_CASE(DrawLineForTextCheckingOperation)
@@ -162,258 +153,23 @@ public:
TYPE_CASE(StrokeArcOperation)
TYPE_CASE(StrokePathOperation)
TYPE_CASE(StrokeRectOperation)
+ TYPE_CASE(DrawMediaButtonOperation)
// Text
- TYPE_CASE(DrawComplexTextOperation)
- TYPE_CASE(DrawTextOperation)
+ TYPE_CASE(DrawPosTextOperation)
}
return "Undefined";
}
+#endif
+ TYPE(UndefinedOperation)
};
-//**************************************
-// 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 {
+class PossiblyOpaqueOperation : 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;
-};
+ virtual const IntRect* opaqueRect() { return &m_absoluteOpaqueRect; }
+ virtual void setOpaqueRect(const IntRect& bounds) { m_absoluteOpaqueRect = bounds; }
-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;
+ IntRect m_absoluteOpaqueRect;
};
//**************************************
@@ -423,10 +179,11 @@ private:
class ConcatCTM : public Operation {
public:
ConcatCTM(const AffineTransform& affine) : m_matrix(affine) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->concatCTM(m_matrix);
+ return true;
}
- virtual OperationType type() { return ConcatCTMOperation; }
+ TYPE(ConcatCTMOperation)
private:
AffineTransform m_matrix;
};
@@ -434,10 +191,11 @@ private:
class Rotate : public Operation {
public:
Rotate(float angleInRadians) : m_angle(angleInRadians) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->rotate(m_angle);
+ return true;
}
- virtual OperationType type() { return RotateOperation; }
+ TYPE(RotateOperation)
private:
float m_angle;
};
@@ -445,10 +203,11 @@ private:
class Scale : public Operation {
public:
Scale(const FloatSize& size) : m_scale(size) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->scale(m_scale);
+ return true;
}
- virtual OperationType type() { return ScaleOperation; }
+ TYPE(ScaleOperation)
private:
FloatSize m_scale;
};
@@ -456,10 +215,11 @@ private:
class Translate : public Operation {
public:
Translate(float x, float y) : m_x(x), m_y(y) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->translate(m_x, m_y);
+ return true;
}
- virtual OperationType type() { return TranslateOperation; }
+ TYPE(TranslateOperation)
private:
float m_x;
float m_y;
@@ -473,10 +233,11 @@ class InnerRoundedRectClip : public Operation {
public:
InnerRoundedRectClip(const IntRect& rect, int thickness)
: m_rect(rect), m_thickness(thickness) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->addInnerRoundedRectClip(m_rect, m_thickness);
+ return true;
}
- virtual OperationType type() { return InnerRoundedRectClipOperation; }
+ TYPE(InnerRoundedRectClipOperation)
private:
IntRect m_rect;
int m_thickness;
@@ -485,10 +246,10 @@ private:
class Clip : public Operation {
public:
Clip(const FloatRect& rect) : m_rect(rect) {}
- virtual void apply(PlatformGraphicsContext* context) {
- context->clip(m_rect);
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
+ return context->clip(m_rect);
}
- virtual OperationType type() { return ClipOperation; }
+ TYPE(ClipOperation)
private:
const FloatRect m_rect;
};
@@ -498,17 +259,16 @@ 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) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
if (m_hasWindRule) {
- context->clipPath(m_path, m_windRule);
- return;
+ return context->clipPath(m_path, m_windRule);
}
if (m_clipOut)
- context->clipOut(m_path);
+ return context->clipOut(m_path);
else
- context->clip(m_path);
+ return context->clip(m_path);
}
- virtual OperationType type() { return ClipPathOperation; }
+ TYPE(ClipPathOperation)
private:
const Path m_path;
bool m_clipOut;
@@ -519,10 +279,10 @@ private:
class ClipOut : public Operation {
public:
ClipOut(const IntRect& rect) : m_rect(rect) {}
- virtual void apply(PlatformGraphicsContext* context) {
- context->clipOut(m_rect);
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
+ return context->clipOut(m_rect);
}
- virtual OperationType type() { return ClipOutOperation; }
+ TYPE(ClipOutOperation)
private:
const IntRect m_rect;
};
@@ -530,10 +290,11 @@ private:
class ClearRect : public Operation {
public:
ClearRect(const FloatRect& rect) : m_rect(rect) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->clearRect(m_rect);
+ return true;
}
- virtual OperationType type() { return ClearRectOperation; }
+ TYPE(ClearRectOperation)
private:
FloatRect m_rect;
};
@@ -542,63 +303,101 @@ private:
// Drawing
//**************************************
-class DrawBitmapPattern : public Operation {
+class DrawBitmapPattern : public PossiblyOpaqueOperation {
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) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->drawBitmapPattern(m_bitmap, m_matrix, m_operator, m_destRect);
+ return true;
}
- virtual OperationType type() { return DrawBitmapPatternOperation; }
+ virtual bool isOpaque() { return m_bitmap.isOpaque(); }
+ TYPE(DrawBitmapPatternOperation)
+
private:
- // TODO: use refcounted bitmap
- const SkBitmap m_bitmap;
+ SkBitmap m_bitmap;
SkMatrix m_matrix;
CompositeOperator m_operator;
FloatRect m_destRect;
};
-class DrawBitmapRect : public Operation {
+class DrawBitmapRect : public PossiblyOpaqueOperation {
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) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->drawBitmapRect(m_bitmap, &m_srcR, m_dstR, m_operator);
+ return true;
}
- 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());
- }
+ virtual bool isOpaque() { return m_bitmap.isOpaque(); }
+ TYPE(DrawBitmapRectOperation)
private:
- const SkBitmap& m_bitmap;
+ SkBitmap m_bitmap;
SkIRect m_srcR;
SkRect m_dstR;
CompositeOperator m_operator;
};
+class DrawConvexPolygonQuad : public Operation {
+public:
+ DrawConvexPolygonQuad(const FloatPoint* points, bool shouldAntiAlias)
+ : m_shouldAntiAlias(shouldAntiAlias)
+ {
+ memcpy(m_points, points, 4 * sizeof(FloatPoint));
+ }
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
+ context->drawConvexPolygon(4, m_points, m_shouldAntiAlias);
+ return true;
+ }
+ TYPE(DrawConvexPolygonQuadOperation)
+private:
+ bool m_shouldAntiAlias;
+ FloatPoint m_points[4];
+};
+
class DrawEllipse : public Operation {
public:
DrawEllipse(const IntRect& rect) : m_rect(rect) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->drawEllipse(m_rect);
+ return true;
}
- virtual OperationType type() { return DrawEllipseOperation; }
+ TYPE(DrawEllipseOperation)
private:
IntRect m_rect;
};
+class DrawFocusRing : public Operation {
+public:
+ DrawFocusRing(const Vector<IntRect>& rects, int width, int offset, const Color& color)
+ : m_rects(rects)
+ , m_width(width)
+ , m_offset(offset)
+ , m_color(color)
+ {}
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
+ context->drawFocusRing(m_rects, m_width, m_offset, m_color);
+ return true;
+ }
+ TYPE(DrawFocusRingOperation)
+private:
+ Vector<IntRect> m_rects;
+ int m_width;
+ int m_offset;
+ Color m_color;
+};
+
class DrawLine : public Operation {
public:
DrawLine(const IntPoint& point1, const IntPoint& point2)
: m_point1(point1), m_point2(point2) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->drawLine(m_point1, m_point2);
+ return true;
}
- virtual OperationType type() { return DrawLineOperation; }
+ TYPE(DrawLineOperation)
private:
IntPoint m_point1;
IntPoint m_point2;
@@ -608,10 +407,11 @@ class DrawLineForText : public Operation {
public:
DrawLineForText(const FloatPoint& pt, float width)
: m_point(pt), m_width(width) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->drawLineForText(m_point, m_width);
+ return true;
}
- virtual OperationType type() { return DrawLineForTextOperation; }
+ TYPE(DrawLineForTextOperation)
private:
FloatPoint m_point;
float m_width;
@@ -622,10 +422,11 @@ public:
DrawLineForTextChecking(const FloatPoint& pt, float width,
GraphicsContext::TextCheckingLineStyle lineStyle)
: m_point(pt), m_width(width), m_lineStyle(lineStyle) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->drawLineForTextChecking(m_point, m_width, m_lineStyle);
+ return true;
}
- virtual OperationType type() { return DrawLineForTextCheckingOperation; }
+ TYPE(DrawLineForTextCheckingOperation)
private:
FloatPoint m_point;
float m_width;
@@ -635,10 +436,11 @@ private:
class DrawRect : public Operation {
public:
DrawRect(const IntRect& rect) : m_rect(rect) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->drawRect(m_rect);
+ return true;
}
- virtual OperationType type() { return DrawRectOperation; }
+ TYPE(DrawRectOperation)
private:
IntRect m_rect;
};
@@ -647,26 +449,30 @@ class FillPath : public Operation {
public:
FillPath(const Path& pathToFill, WindRule fillRule)
: m_path(pathToFill), m_fillRule(fillRule) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->fillPath(m_path, m_fillRule);
+ return true;
}
- virtual OperationType type() { return FillPathOperation; }
+ TYPE(FillPathOperation)
private:
Path m_path;
WindRule m_fillRule;
};
-class FillRect : public Operation {
+class FillRect : public PossiblyOpaqueOperation {
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) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
if (m_hasColor)
context->fillRect(m_rect, m_color);
else
context->fillRect(m_rect);
+ return true;
}
- virtual OperationType type() { return FillRectOperation; }
+ virtual bool isOpaque() { return (m_hasColor && !m_color.hasAlpha())
+ || (!m_hasColor && SkColorGetA(m_state->fillColor) == 0xFF); }
+ TYPE(FillRectOperation)
private:
FloatRect m_rect;
Color m_color;
@@ -688,12 +494,13 @@ public:
, m_bottomRight(bottomRight)
, m_color(color)
{}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->fillRoundedRect(m_rect, m_topLeft, m_topRight,
m_bottomLeft, m_bottomRight,
m_color);
+ return true;
}
- virtual OperationType type() { return FillRoundedRectOperation; }
+ TYPE(FillRoundedRectOperation)
private:
IntRect m_rect;
IntSize m_topLeft;
@@ -710,10 +517,11 @@ public:
, m_startAngle(startAngle)
, m_angleSpan(angleSpan)
{}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->strokeArc(m_rect, m_startAngle, m_angleSpan);
+ return true;
}
- virtual OperationType type() { return StrokeArcOperation; }
+ TYPE(StrokeArcOperation)
private:
IntRect m_rect;
int m_startAngle;
@@ -723,10 +531,11 @@ private:
class StrokePath : public Operation {
public:
StrokePath(const Path& path) : m_path(path) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->strokePath(m_path);
+ return true;
}
- virtual OperationType type() { return StrokePathOperation; }
+ TYPE(StrokePathOperation)
private:
Path m_path;
};
@@ -736,74 +545,72 @@ class StrokeRect : public Operation {
public:
StrokeRect(const FloatRect& rect, float lineWidth)
: m_rect(rect), m_lineWidth(lineWidth) {}
- virtual void apply(PlatformGraphicsContext* context) {
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
context->strokeRect(m_rect, m_lineWidth);
+ return true;
}
- virtual OperationType type() { return StrokeRectOperation; }
+ TYPE(StrokeRectOperation)
private:
FloatRect m_rect;
float m_lineWidth;
};
-//**************************************
-// Text
-//**************************************
-
-class DrawComplexText : public Operation {
+class DrawMediaButton : 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);
+ DrawMediaButton(const IntRect& rect, RenderSkinMediaButton::MediaButton buttonType,
+ bool translucent, bool drawBackground,
+ const IntRect& thumb)
+ : m_rect(rect)
+ , m_thumb(thumb)
+ , m_buttonType(buttonType)
+ , m_translucent(translucent)
+ , m_drawBackground(drawBackground)
+ {}
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
+ context->drawMediaButton(m_rect, m_buttonType, m_translucent, m_drawBackground, m_thumb);
+ return true;
}
- virtual OperationType type() { return DrawComplexTextOperation; }
+ TYPE(DrawMediaButtonOperation)
private:
- SkPicture* m_picture;
+ IntRect m_rect;
+ IntRect m_thumb;
+ RenderSkinMediaButton::MediaButton m_buttonType;
+ bool m_translucent : 1;
+ bool m_drawBackground : 1;
};
-class DrawText : public Operation {
+//**************************************
+// Text
+//**************************************
+
+class DrawPosText : 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;
+ DrawPosText(const void* text, size_t byteLength,
+ const SkPoint pos[], const SkPaint& paint)
+ : m_byteLength(byteLength)
+ , m_paint(paint)
+ {
+ size_t points = paint.countText(text, byteLength);
+ m_pos = new SkPoint[points];
+ memcpy(m_pos, pos, sizeof(SkPoint) * points);
+ m_text = malloc(byteLength);
+ memcpy(m_text, text, byteLength);
+ }
+ ~DrawPosText() { delete m_pos; free(m_text); }
+ virtual bool applyImpl(PlatformGraphicsContext* context) {
+ context->drawPosText(m_text, m_byteLength, m_pos, m_paint);
+ return true;
+ }
+ TYPE(DrawPosTextOperation)
+private:
+ void* m_text;
+ size_t m_byteLength;
+ SkPoint* m_pos;
+ SkPaint m_paint;
};
}
}
-#endif // USE(ACCELERATED_COMPOSITING)
-
#endif // GraphicsOperation_h