提交 a1807a1b 编写于 作者: A Adam Barth

Remove weak handle from sky.Paint

This patch converts sky.Paint to be a pure Dart object, which means we don't
need to open a weak handle to sky.Paint. Avoiding the weak handle reduces the
amount of weak handle callbacks we need to process at the end of GC and
therefore reduces jank.
上级 5bd6cbd7
......@@ -55,34 +55,29 @@ void beginFrame(double timeStamp) {
..setOffset(const sky.Offset(150.0, 0.0))
..setColorMode(sky.TransferMode.src)
..setPaintBits(sky.PaintBits.all),
(sky.Paint layerPaint) {
layerPaint.color = const sky.Color.fromARGB(128, 255, 255, 0);
layerPaint.setColorFilter(new sky.ColorFilter.mode(
const sky.Color.fromARGB(128, 0, 0, 255), sky.TransferMode.srcIn));
layerPaint.setMaskFilter(new sky.MaskFilter.blur(
sky.BlurStyle.normal, 3.0, highQuality: true));
})
new sky.Paint()
..color = const sky.Color.fromARGB(128, 255, 255, 0)
..setColorFilter(new sky.ColorFilter.mode(
const sky.Color.fromARGB(128, 0, 0, 255), sky.TransferMode.srcIn))
..setMaskFilter(new sky.MaskFilter.blur(
sky.BlurStyle.normal, 3.0, highQuality: true)))
..addLayerOnTop(
new sky.DrawLooperLayerInfo()
..setOffset(const sky.Offset(75.0, 75.0))
..setColorMode(sky.TransferMode.src)
..setPaintBits(sky.PaintBits.shader),
(sky.Paint layerPaint) {
sky.Gradient redYellow = new sky.Gradient.radial(
new sky.Point(0.0, 0.0), radius/3.0,
[const sky.Color(0xFFFFFF00), const sky.Color(0xFFFF0000)],
null, sky.TileMode.mirror);
layerPaint.setShader(redYellow);
// Since we're don't set sky.PaintBits.maskFilter, this has no effect.
layerPaint.setMaskFilter(new sky.MaskFilter.blur(
sky.BlurStyle.normal, 50.0, highQuality: true));
})
new sky.Paint()
..setShader(new sky.Gradient.radial(
new sky.Point(0.0, 0.0), radius/3.0,
[const sky.Color(0xFFFFFF00), const sky.Color(0xFFFF0000)],
null, sky.TileMode.mirror))
// Since we're don't set sky.PaintBits.maskFilter, this has no effect.
..setMaskFilter(new sky.MaskFilter.blur(
sky.BlurStyle.normal, 50.0, highQuality: true)))
..addLayerOnTop(
new sky.DrawLooperLayerInfo()..setOffset(const sky.Offset(225.0, 75.0)),
(sky.Paint layerPaint) {
// Since this layer uses a DST color mode, this has no effect.
layerPaint.color = const sky.Color.fromARGB(128, 255, 0, 0);
});
// Since this layer uses a DST color mode, this has no effect.
new sky.Paint()..color = const sky.Color.fromARGB(128, 255, 0, 0));
paint.setDrawLooper(builder.build());
canvas.drawCircle(sky.Point.origin, radius, paint);
......
......@@ -27,7 +27,7 @@ void beginFrame(double timeStamp) {
new MaskFilter.blur(BlurStyle.normal, 5.0, highQuality: true));
})
// Main layer.
..addLayerOnTop(new DrawLooperLayerInfo(), (Paint) {});
..addLayerOnTop(new DrawLooperLayerInfo(), new Paint());
paint.setDrawLooper(builder.build());
canvas.drawPaint(
......
......@@ -119,6 +119,7 @@ CPP_SPECIAL_CONVERSION_RULES = {
# instead of calling cpp_type.
'Float32List': 'Float32List',
'Offset': 'Offset',
'Paint': 'Paint',
'Point': 'Point',
'Rect': 'Rect',
'Size': 'Size',
......@@ -371,6 +372,7 @@ DART_TO_CPP_VALUE = {
'Color': pass_by_value_format('CanvasColor'),
'Float32List': pass_by_value_format('Float32List'),
'Offset': pass_by_value_format('Offset'),
'Paint': pass_by_value_format('Paint'),
'Point': pass_by_value_format('Point'),
'RSTransform': pass_by_value_format('RSTransform'),
'Rect': pass_by_value_format('Rect'),
......
......@@ -425,8 +425,6 @@ sky_core_files = [
"painting/Drawable.h",
"painting/DrawLooper.cpp",
"painting/DrawLooper.h",
"painting/DrawLooperAddLayerCallback.cpp",
"painting/DrawLooperAddLayerCallback.h",
"painting/DrawLooperLayerInfo.cpp",
"painting/DrawLooperLayerInfo.h",
"painting/FilterQuality.h",
......@@ -672,14 +670,12 @@ core_idl_files = get_path_info([
"painting/ColorFilter.idl",
"painting/Drawable.idl",
"painting/DrawLooper.idl",
"painting/DrawLooperAddLayerCallback.idl",
"painting/DrawLooperLayerInfo.idl",
"painting/Gradient.idl",
"painting/Image.idl",
"painting/LayerDrawLooperBuilder.idl",
"painting/LayoutRoot.idl",
"painting/MaskFilter.idl",
"painting/Paint.idl",
"painting/PaintingNode.idl",
"painting/Path.idl",
"painting/Picture.idl",
......@@ -701,10 +697,11 @@ core_dart_files = get_path_info([
"painting/MaskFilter.dart",
"painting/Offset.dart",
"painting/OffsetBase.dart",
"painting/Paint.dart",
"painting/PaintingStyle.dart",
"painting/Point.dart",
"painting/RSTransform.dart",
"painting/Rect.dart",
"painting/RSTransform.dart",
"painting/Size.dart",
"painting/TransferMode.dart",
],
......
......@@ -32,12 +32,12 @@ void Canvas::save()
m_canvas->save();
}
void Canvas::saveLayer(const Rect& bounds, const Paint* paint)
void Canvas::saveLayer(const Rect& bounds, const Paint& paint)
{
if (!m_canvas)
return;
m_canvas->saveLayer(!bounds.is_null ? &bounds.sk_rect : nullptr,
paint ? &paint->paint() : nullptr);
paint.paint());
}
void Canvas::restore()
......@@ -164,86 +164,78 @@ void Canvas::drawColor(SkColor color, SkXfermode::Mode transferMode)
m_canvas->drawColor(color, transferMode);
}
void Canvas::drawLine(const Point& p1, const Point& p2, const Paint* paint)
void Canvas::drawLine(const Point& p1, const Point& p2, const Paint& paint)
{
if (!m_canvas)
return;
ASSERT(paint);
m_canvas->drawLine(p1.sk_point.x(), p1.sk_point.y(), p2.sk_point.x(), p2.sk_point.y(), paint->paint());
m_canvas->drawLine(p1.sk_point.x(), p1.sk_point.y(), p2.sk_point.x(), p2.sk_point.y(), paint.sk_paint);
}
void Canvas::drawPaint(const Paint* paint)
void Canvas::drawPaint(const Paint& paint)
{
if (!m_canvas)
return;
ASSERT(paint);
m_canvas->drawPaint(paint->paint());
m_canvas->drawPaint(paint.sk_paint);
}
void Canvas::drawRect(const Rect& rect, const Paint* paint)
void Canvas::drawRect(const Rect& rect, const Paint& paint)
{
if (!m_canvas)
return;
ASSERT(paint);
m_canvas->drawRect(rect.sk_rect, paint->paint());
m_canvas->drawRect(rect.sk_rect, paint.sk_paint);
}
void Canvas::drawRRect(const RRect* rrect, const Paint* paint)
void Canvas::drawRRect(const RRect* rrect, const Paint& paint)
{
if (!m_canvas)
return;
ASSERT(rrect);
ASSERT(paint);
m_canvas->drawRRect(rrect->rrect(), paint->paint());
m_canvas->drawRRect(rrect->rrect(), paint.sk_paint);
}
void Canvas::drawDRRect(const RRect* outer, const RRect* inner, const Paint* paint)
void Canvas::drawDRRect(const RRect* outer, const RRect* inner, const Paint& paint)
{
if (!m_canvas)
return;
ASSERT(outer);
ASSERT(inner);
ASSERT(paint);
m_canvas->drawDRRect(outer->rrect(), inner->rrect(), paint->paint());
m_canvas->drawDRRect(outer->rrect(), inner->rrect(), paint.sk_paint);
}
void Canvas::drawOval(const Rect& rect, const Paint* paint)
void Canvas::drawOval(const Rect& rect, const Paint& paint)
{
if (!m_canvas)
return;
ASSERT(paint);
m_canvas->drawOval(rect.sk_rect, paint->paint());
m_canvas->drawOval(rect.sk_rect, paint.sk_paint);
}
void Canvas::drawCircle(const Point& c, float radius, const Paint* paint)
void Canvas::drawCircle(const Point& c, float radius, const Paint& paint)
{
if (!m_canvas)
return;
ASSERT(paint);
m_canvas->drawCircle(c.sk_point.x(), c.sk_point.y(), radius, paint->paint());
m_canvas->drawCircle(c.sk_point.x(), c.sk_point.y(), radius, paint.sk_paint);
}
void Canvas::drawPath(const CanvasPath* path, const Paint* paint)
void Canvas::drawPath(const CanvasPath* path, const Paint& paint)
{
if (!m_canvas)
return;
ASSERT(path);
ASSERT(paint);
m_canvas->drawPath(path->path(), paint->paint());
m_canvas->drawPath(path->path(), paint.sk_paint);
}
void Canvas::drawImage(const CanvasImage* image, const Point& p, const Paint* paint) {
void Canvas::drawImage(const CanvasImage* image, const Point& p, const Paint& paint) {
if (!m_canvas)
return;
ASSERT(image);
m_canvas->drawImage(image->image(), p.sk_point.x(), p.sk_point.y(), &paint->paint());
m_canvas->drawImage(image->image(), p.sk_point.x(), p.sk_point.y(), paint.paint());
}
void Canvas::drawImageRect(const CanvasImage* image, Rect& src, Rect& dst, Paint* paint) {
void Canvas::drawImageRect(const CanvasImage* image, Rect& src, Rect& dst, const Paint& paint) {
if (!m_canvas)
return;
ASSERT(image);
m_canvas->drawImageRect(image->image(), &src.sk_rect, dst.sk_rect, &paint->paint());
m_canvas->drawImageRect(image->image(), &src.sk_rect, dst.sk_rect, paint.paint());
}
void Canvas::drawPicture(Picture* picture)
......@@ -275,7 +267,7 @@ void Canvas::drawPaintingNode(PaintingNode* paintingNode, const Point& p)
void Canvas::drawAtlas(CanvasImage* atlas,
const Vector<RSTransform>& transforms, const Vector<Rect>& rects,
const Vector<SkColor>& colors, SkXfermode::Mode mode,
const Rect& cullRect, Paint* paint, ExceptionState& es)
const Rect& cullRect, const Paint& paint, ExceptionState& es)
{
if (!m_canvas)
return;
......@@ -309,7 +301,7 @@ void Canvas::drawAtlas(CanvasImage* atlas,
skXForms.size(),
mode,
cullRect.is_null ? nullptr : &cullRect.sk_rect,
paint ? &paint->paint() : nullptr
paint.paint()
);
}
......
......@@ -61,7 +61,7 @@ public:
~Canvas() override;
void save();
void saveLayer(const Rect& bounds, const Paint* paint = nullptr);
void saveLayer(const Rect& bounds, const Paint& paint);
void restore();
void translate(float dx, float dy);
......@@ -78,16 +78,16 @@ public:
void clipPath(const CanvasPath* path);
void drawColor(SkColor color, SkXfermode::Mode transferMode);
void drawLine(const Point& p1, const Point& p2, const Paint* paint);
void drawPaint(const Paint* paint);
void drawRect(const Rect& rect, const Paint* paint);
void drawRRect(const RRect* rrect, const Paint* paint);
void drawDRRect(const RRect* outer, const RRect* inner, const Paint* paint);
void drawOval(const Rect& rect, const Paint* paint);
void drawCircle(const Point& c, float radius, const Paint* paint);
void drawPath(const CanvasPath* path, const Paint* paint);
void drawImage(const CanvasImage* image, const Point& p, const Paint* paint);
void drawImageRect(const CanvasImage* image, Rect& src, Rect& dst, Paint* paint);
void drawLine(const Point& p1, const Point& p2, const Paint& paint);
void drawPaint(const Paint& paint);
void drawRect(const Rect& rect, const Paint& paint);
void drawRRect(const RRect* rrect, const Paint& paint);
void drawDRRect(const RRect* outer, const RRect* inner, const Paint& paint);
void drawOval(const Rect& rect, const Paint& paint);
void drawCircle(const Point& c, float radius, const Paint& paint);
void drawPath(const CanvasPath* path, const Paint& paint);
void drawImage(const CanvasImage* image, const Point& p, const Paint& paint);
void drawImageRect(const CanvasImage* image, Rect& src, Rect& dst, const Paint& paint);
void drawPicture(Picture* picture);
void drawDrawable(Drawable* drawable);
void drawPaintingNode(PaintingNode* paintingNode, const Point& p);
......@@ -95,7 +95,7 @@ public:
void drawAtlas(CanvasImage* atlas,
const Vector<RSTransform>& transforms, const Vector<Rect>& rects,
const Vector<SkColor>& colors, SkXfermode::Mode mode,
const Rect& cullRect, Paint* paint, ExceptionState&);
const Rect& cullRect, const Paint& paint, ExceptionState&);
SkCanvas* skCanvas() { return m_canvas; }
void clearSkCanvas() { m_canvas = nullptr; }
......
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "sky/engine/core/painting/DrawLooperAddLayerCallback.h"
namespace blink {
DrawLooperAddLayerCallback::~DrawLooperAddLayerCallback() {
}
} // namespace blink
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SKY_ENGINE_CORE_PAINTING_DRAWLOOPERADDLAYERCALLBACK_H_
#define SKY_ENGINE_CORE_PAINTING_DRAWLOOPERADDLAYERCALLBACK_H_
namespace blink {
class Paint;
class DrawLooperAddLayerCallback {
public:
virtual ~DrawLooperAddLayerCallback();
virtual void handleEvent(Paint* context) = 0;
};
} // namespace blink
#endif // SKY_ENGINE_CORE_PAINTING_DRAWLOOPERADDLAYERCALLBACK_H_
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
callback interface DrawLooperAddLayerCallback {
void handleEvent(Paint paint);
};
......@@ -5,7 +5,6 @@
#include "sky/engine/core/painting/LayerDrawLooperBuilder.h"
#include "sky/engine/core/painting/DrawLooper.h"
#include "sky/engine/core/painting/DrawLooperAddLayerCallback.h"
#include "sky/engine/core/painting/DrawLooperLayerInfo.h"
#include "sky/engine/core/painting/Paint.h"
#include "third_party/skia/include/core/SkColorFilter.h"
......@@ -23,15 +22,11 @@ PassRefPtr<DrawLooper> LayerDrawLooperBuilder::build() {
}
void LayerDrawLooperBuilder::addLayerOnTop(
DrawLooperLayerInfo* layer_info,
PassOwnPtr<DrawLooperAddLayerCallback> callback) {
DrawLooperLayerInfo* layer_info, const Paint& paint) {
SkPaint* sk_paint =
draw_looper_builder_.addLayerOnTop(layer_info->layer_info());
RefPtr<Paint> paint = Paint::create();
paint->setPaint(*sk_paint);
callback->handleEvent(paint.get());
*sk_paint = paint->paint();
if (!paint.is_null)
*sk_paint = paint.sk_paint;
}
} // namespace blink
......@@ -5,6 +5,7 @@
#ifndef SKY_ENGINE_CORE_PAINTING_LAYERDRAWLOOPERBUILDER_H_
#define SKY_ENGINE_CORE_PAINTING_LAYERDRAWLOOPERBUILDER_H_
#include "sky/engine/core/painting/Paint.h"
#include "sky/engine/tonic/dart_wrappable.h"
#include "sky/engine/wtf/PassRefPtr.h"
#include "sky/engine/wtf/RefCounted.h"
......@@ -13,7 +14,6 @@
namespace blink {
class DrawLooper;
class DrawLooperAddLayerCallback;
class DrawLooperLayerInfo;
class LayerDrawLooperBuilder : public RefCounted<LayerDrawLooperBuilder>,
......@@ -26,8 +26,7 @@ class LayerDrawLooperBuilder : public RefCounted<LayerDrawLooperBuilder>,
}
PassRefPtr<DrawLooper> build();
void addLayerOnTop(DrawLooperLayerInfo* layer_info,
PassOwnPtr<DrawLooperAddLayerCallback>);
void addLayerOnTop(DrawLooperLayerInfo* layer_info, const Paint& paint);
private:
LayerDrawLooperBuilder();
......
......@@ -8,5 +8,5 @@
// builder back to a default state.
DrawLooper build();
void addLayerOnTop(DrawLooperLayerInfo info, DrawLooperAddLayerCallback callback);
void addLayerOnTop(DrawLooperLayerInfo info, Paint paint);
};
......@@ -4,88 +4,95 @@
#include "sky/engine/core/painting/Paint.h"
#include "sky/engine/core/painting/CanvasColor.h"
#include "sky/engine/core/painting/ColorFilter.h"
#include "sky/engine/core/painting/DrawLooper.h"
#include "sky/engine/core/painting/FilterQuality.h"
#include "sky/engine/core/painting/MaskFilter.h"
#include "sky/engine/core/painting/PaintingStyle.h"
#include "sky/engine/core/painting/Shader.h"
#include "sky/engine/core/painting/TransferMode.h"
#include "sky/engine/core/script/dom_dart_state.h"
#include "sky/engine/wtf/text/StringBuilder.h"
#include "third_party/skia/include/core/SkColorFilter.h"
#include "third_party/skia/include/core/SkMaskFilter.h"
#include "third_party/skia/include/core/SkShader.h"
#include "third_party/skia/include/core/SkString.h"
namespace blink {
#include <iostream>
namespace blink {
namespace {
template <typename T>
void SkToString(const char* title, const T* sk_object, StringBuilder* result) {
if (!sk_object)
return;
SkString string;
sk_object->toString(&string);
result->append(String::format(", %s: %s", title, string.c_str()));
}
}
Paint::Paint() {
setIsAntiAlias(true);
}
Paint::~Paint() {
}
void Paint::setDrawLooper(DrawLooper* looper) {
ASSERT(looper);
paint_.setLooper(looper->looper());
}
void Paint::setColorFilter(ColorFilter* filter) {
ASSERT(filter);
paint_.setColorFilter(filter->filter());
}
void Paint::setMaskFilter(MaskFilter* filter) {
ASSERT(filter);
paint_.setMaskFilter(filter->filter());
}
void Paint::setShader(Shader* shader) {
ASSERT(shader);
paint_.setShader(shader->shader());
}
void Paint::setStyle(SkPaint::Style style) {
paint_.setStyle(style);
}
enum PaintFields {
kStrokeWidth,
kIsAntiAlias,
kColor,
kColorFilter,
kDrawLooper,
kFilterQuality,
kMaskFilter,
kShader,
kStyle,
kTransferMode,
// kNumberOfPaintFields must be last.
kNumberOfPaintFields,
};
void Paint::setTransferMode(SkXfermode::Mode transfer_mode) {
paint_.setXfermodeMode(transfer_mode);
}
void Paint::setFilterQuality(SkFilterQuality filter_quality) {
paint_.setFilterQuality(filter_quality);
Paint DartConverter<Paint>::FromDart(Dart_Handle dart_paint) {
Paint result;
result.is_null = true;
if (Dart_IsNull(dart_paint))
return result;
Dart_Handle value_handle = DOMDartState::Current()->value_handle();
Dart_Handle data = Dart_GetField(dart_paint, value_handle);
DCHECK(Dart_IsList(data));
intptr_t length;
Dart_ListLength(data, &length);
CHECK_EQ(length, kNumberOfPaintFields);
Dart_Handle values[kNumberOfPaintFields];
for (int i = 0; i < kNumberOfPaintFields; ++i)
values[i] = Dart_ListGetAt(data, i);
SkPaint& paint = result.sk_paint;
if (!Dart_IsNull(values[kStrokeWidth]))
paint.setStrokeWidth(DartConverter<SkScalar>::FromDart(values[kStrokeWidth]));
if (!Dart_IsNull(values[kIsAntiAlias]))
paint.setAntiAlias(DartConverter<bool>::FromDart(values[kIsAntiAlias]));
if (!Dart_IsNull(values[kColor]))
paint.setColor(DartConverter<CanvasColor>::FromDart(values[kColor]));
if (!Dart_IsNull(values[kColorFilter]))
paint.setColorFilter(DartConverter<ColorFilter*>::FromDart(values[kColorFilter])->filter());
if (!Dart_IsNull(values[kDrawLooper]))
paint.setLooper(DartConverter<DrawLooper*>::FromDart(values[kDrawLooper])->looper());
if (!Dart_IsNull(values[kFilterQuality]))
paint.setFilterQuality(DartConverter<FilterQuality>::FromDart(values[kFilterQuality]));
if (!Dart_IsNull(values[kMaskFilter]))
paint.setMaskFilter(DartConverter<MaskFilter*>::FromDart(values[kMaskFilter])->filter());
if (!Dart_IsNull(values[kShader]))
paint.setShader(DartConverter<Shader*>::FromDart(values[kShader])->shader());
if (!Dart_IsNull(values[kStyle]))
paint.setStyle(DartConverter<PaintingStyle>::FromDart(values[kStyle]));
if (!Dart_IsNull(values[kTransferMode]))
paint.setXfermodeMode(DartConverter<TransferMode>::FromDart(values[kTransferMode]));
result.is_null = false;
return result;
}
String Paint::toString() const {
StringBuilder result;
result.append("Paint(");
result.append(String::format("color:Color(0x%.8x)", paint_.getColor()));
SkToString("shader", paint_.getShader(), &result);
SkToString("colorFilter", paint_.getColorFilter(), &result);
SkToString("maskFilter", paint_.getMaskFilter(), &result);
if (paint_.getLooper()) {
// TODO(mpcomplete): Figure out how to show a drawLooper.
result.append(", drawLooper:true");
}
result.append(")");
return result.toString();
Paint DartConverter<Paint>::FromArgumentsWithNullCheck(Dart_NativeArguments args,
int index,
Dart_Handle& exception) {
Dart_Handle dart_rect = Dart_GetNativeArgument(args, index);
DCHECK(!LogIfError(dart_rect));
return FromDart(dart_rect);
}
} // namespace blink
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
part of dart.sky;
class Paint {
void setColorFilter(ColorFilter colorFilter) {
_colorFilter = colorFilter;
}
void setDrawLooper(DrawLooper drawLooper) {
_drawLooper = drawLooper;
}
void setFilterQuality(FilterQuality filterQuality) {
_filterQuality = filterQuality;
}
void setMaskFilter(MaskFilter maskFilter) {
_maskFilter = maskFilter;
}
void setStyle(PaintingStyle style) {
_style = style;
}
void setShader(Shader shader) {
_shader = shader;
}
void setTransferMode(TransferMode transferMode) {
_transferMode = transferMode;
}
double strokeWidth;
bool isAntiAlias = true;
Color color = const Color(0xFF000000);
ColorFilter _colorFilter;
DrawLooper _drawLooper;
FilterQuality _filterQuality;
MaskFilter _maskFilter;
Shader _shader;
PaintingStyle _style;
TransferMode _transferMode;
// Must match PaintFields enum in Paint.cpp.
List<dynamic> get _value {
return [
strokeWidth,
isAntiAlias,
color,
_colorFilter,
_drawLooper,
_filterQuality,
_maskFilter,
_shader,
_style,
_transferMode,
];
}
String toString() {
String result = 'Paint(color:$color';
if (_shader != null)
result += ', shader: $_shader';
if (_colorFilter != null)
result += ', colorFilter: $_colorFilter';
if (_maskFilter != null)
result += ', maskFilter: $_maskFilter';
// TODO(mpcomplete): Figure out how to show a drawLooper.
if (_drawLooper != null)
result += ', drawLooper:true';
result += ')';
return result;
}
}
......@@ -22,40 +22,20 @@ class ColorFilter;
class MaskFilter;
class Shader;
class Paint : public RefCounted<Paint>, public DartWrappable {
DEFINE_WRAPPERTYPEINFO();
class Paint {
public:
~Paint() override;
static PassRefPtr<Paint> create() { return adoptRef(new Paint); }
SkPaint sk_paint;
bool is_null;
bool isAntiAlias() const { return paint_.isAntiAlias(); }
void setIsAntiAlias(bool value) { paint_.setAntiAlias(value); }
SkColor color() const { return paint_.getColor(); }
void setColor(SkColor color) { paint_.setColor(color); }
SkScalar strokeWidth() const { return paint_.getStrokeWidth(); }
void setStrokeWidth(SkScalar strokeWidth) {
paint_.setStrokeWidth(strokeWidth);
}
void setDrawLooper(DrawLooper* looper);
void setColorFilter(ColorFilter* filter);
void setMaskFilter(MaskFilter* filter);
void setShader(Shader* shader);
void setStyle(SkPaint::Style style);
void setTransferMode(SkXfermode::Mode transfer_mode);
void setFilterQuality(SkFilterQuality filter_quality);
const SkPaint& paint() const { return paint_; }
void setPaint(const SkPaint& paint) { paint_ = paint; }
String toString() const;
private:
Paint();
const SkPaint* paint() const { return is_null ? nullptr : &sk_paint; }
};
SkPaint paint_;
template <>
struct DartConverter<Paint> {
static Paint FromDart(Dart_Handle handle);
static Paint FromArgumentsWithNullCheck(Dart_NativeArguments args,
int index,
Dart_Handle& exception);
};
} // namespace blink
......
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
[
Constructor(),
] interface Paint {
attribute float strokeWidth;
attribute boolean isAntiAlias;
attribute Color color;
void setDrawLooper(DrawLooper looper);
void setColorFilter(ColorFilter filter);
void setMaskFilter(MaskFilter filter);
void setShader(Shader shader);
void setStyle(PaintingStyle style);
void setTransferMode(TransferMode transferMode);
void setFilterQuality(FilterQuality filterQuality);
DOMString toString();
};
......@@ -166,9 +166,12 @@ struct DartConverterEnum {
static T FromArguments(Dart_NativeArguments args,
int index,
Dart_Handle& exception) {
Dart_Handle enum_handle = Dart_GetNativeArgument(args, index);
return FromDart(Dart_GetNativeArgument(args, index));
}
static T FromDart(Dart_Handle handle) {
Dart_Handle index_handle =
Dart_GetField(enum_handle, DartState::Current()->index_handle());
Dart_GetField(handle, DartState::Current()->index_handle());
uint64_t enum_index = 0;
Dart_IntegerToUint64(index_handle, &enum_index);
......
......@@ -15,15 +15,13 @@ class ShadowDrawLooperBuilder {
..setPaintBits(sky.PaintBits.all)
..setOffset(offset)
..setColorMode(sky.TransferMode.src),
(sky.Paint layerPaint) {
layerPaint.color = color;
layerPaint.setMaskFilter(
new sky.MaskFilter.blur(sky.BlurStyle.normal, blur));
});
new sky.Paint()
..color = color
..setMaskFilter(new sky.MaskFilter.blur(sky.BlurStyle.normal, blur)));
}
sky.DrawLooper build() {
builder_.addLayerOnTop(new sky.DrawLooperLayerInfo(), (_) {});
builder_.addLayerOnTop(new sky.DrawLooperLayerInfo(), new sky.Paint());
return builder_.build();
}
}
......@@ -20,6 +20,7 @@ void main() {
// So only scale to 1x in the z direction.
matrix.scale(2.0, 2.0, 1.0);
canvas.setMatrix(matrix.storage);
canvas.drawPaint(new Paint()..color = const Color(0xFF00FF00));
expect(canvas.getTotalMatrix(), equals(matrix.storage));
});
......
......@@ -5,7 +5,7 @@ PAINT FOR FRAME #1 ----------------------------------------------
1 | TestPaintingCanvas() constructor: 800.0 x 600.0
1 | paintChild RenderDecoratedBox at Point(0.0, 0.0)
1 | | TestPaintingCanvas() constructor: 800.0 x 600.0
1 | | drawRect(Rect.fromLTRB(0.0, 0.0, 800.0, 600.0), Paint(color:Color(0xff00ff00), shader: SkRadialGradient: (center: (0, 0) radius: 500 2 colors: FFFFEB3B, FF2196F3 clamp), drawLooper:true))
1 | | drawRect(Rect.fromLTRB(0.0, 0.0, 800.0, 600.0), Paint(color:Color(0xff00ff00), shader: Instance of 'Gradient', drawLooper:true))
------------------------------------------------------------------------
PASS: should size to render view
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册