diff options
Diffstat (limited to 'o3d/core')
-rw-r--r-- | o3d/core/cross/canvas.cc | 2 | ||||
-rw-r--r-- | o3d/core/cross/canvas.h | 4 | ||||
-rw-r--r-- | o3d/core/cross/canvas_paint.cc | 125 | ||||
-rw-r--r-- | o3d/core/cross/canvas_paint.h | 2 | ||||
-rw-r--r-- | o3d/core/cross/canvas_shader.cc | 4 | ||||
-rw-r--r-- | o3d/core/cross/canvas_shader.h | 4 | ||||
-rw-r--r-- | o3d/core/cross/canvas_utils.h | 2 |
7 files changed, 127 insertions, 16 deletions
diff --git a/o3d/core/cross/canvas.cc b/o3d/core/cross/canvas.cc index d196fcc..26fabbd 100644 --- a/o3d/core/cross/canvas.cc +++ b/o3d/core/cross/canvas.cc @@ -39,7 +39,7 @@ #include "core/cross/client.h" #include "core/cross/error.h" -#include "third_party/skia/files/include/core/SkPath.h" +#include "third_party/skia/include/core/SkPath.h" namespace o3d { diff --git a/o3d/core/cross/canvas.h b/o3d/core/cross/canvas.h index 07c39f0..5c9c62e 100644 --- a/o3d/core/cross/canvas.h +++ b/o3d/core/cross/canvas.h @@ -41,8 +41,8 @@ #include "core/cross/param.h" #include "core/cross/texture.h" -#include "third_party/skia/files/include/core/SkBitmap.h" -#include "third_party/skia/files/include/core/SkCanvas.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkCanvas.h" namespace o3d { diff --git a/o3d/core/cross/canvas_paint.cc b/o3d/core/cross/canvas_paint.cc index fe56453..3e37877 100644 --- a/o3d/core/cross/canvas_paint.cc +++ b/o3d/core/cross/canvas_paint.cc @@ -37,14 +37,125 @@ #include "core/cross/canvas_utils.h" #include "core/cross/client.h" -#include "third_party/skia/files/include/core/SkDrawLooper.h" -#include "third_party/skia/files/include/core/SkPaint.h" -#include "third_party/skia/files/include/core/SkTypeface.h" -#include "third_party/skia/files/include/effects/SkBlurDrawLooper.h" -#include "third_party/skia/files/include/effects/SkStrokeDrawLooper.h" +#include "third_party/skia/include/core/SkCanvas.h" +#include "third_party/skia/include/core/SkColor.h" +#include "third_party/skia/include/core/SkDrawLooper.h" +#include "third_party/skia/include/core/SkPaint.h" +#include "third_party/skia/include/core/SkTypeface.h" +#include "third_party/skia/include/effects/SkBlurDrawLooper.h" namespace o3d { +namespace { + +/** StrokeDrawLooper This class draws an outline of the +* object, and then draws the original object in its original +* position. +*/ +class StrokeDrawLooper : public SkDrawLooper { + public: + StrokeDrawLooper(SkScalar radius, SkColor color); + virtual ~StrokeDrawLooper() {} + virtual void init(SkCanvas* canvas, SkPaint* paint); + virtual bool next(); + virtual void restore(); + + protected: + virtual Factory getFactory() { return CreateProc; } + void flatten(SkFlattenableWriteBuffer& buffer); + StrokeDrawLooper(SkFlattenableReadBuffer& buffer); + + private: + SkCanvas* fCanvas; + SkPaint* fPaint; + + // These are to save the state attributes that we want to change so + // we can restore them after we draw the stroke. + SkPaint::Style fSavedStyle; + SkScalar fSavedStrokeWidth; + SkColor fSavedColor; + + // These are the attribues of the stroke. + SkScalar fRadius; + SkColor fColor; + + // Possible machine states for this object. + enum State { + kBeforeEdge, + kAfterEdge, + kDone, + }; + State fState; + + // Factory method for ressurecting a StrokeDrawLooper. + static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { + return SkNEW_ARGS(StrokeDrawLooper, (buffer)); } + + typedef SkDrawLooper INHERITED; +}; + +StrokeDrawLooper::StrokeDrawLooper(SkScalar radius, SkColor color) + : fColor(color), fRadius(radius) { +} + +void StrokeDrawLooper::init(SkCanvas* canvas, SkPaint* paint) { + fState = kBeforeEdge; + fCanvas = canvas; + fPaint = paint; +} + +bool StrokeDrawLooper::next() { + switch (fState) { + case kBeforeEdge: + // Save the original values. + fSavedStyle = fPaint->getStyle(); + fSavedStrokeWidth = fPaint->getStrokeWidth(); + fSavedColor = fPaint->getColor(); + + // Override with stroke values. + fPaint->setColor(fColor); + fPaint->setStrokeWidth(fRadius); + fPaint->setStyle(SkPaint::kStroke_Style); + + // Change states. + fState = kAfterEdge; + return true; + case kAfterEdge: + // Restore original values. + fPaint->setColor(fSavedColor); + fPaint->setStrokeWidth(fSavedStrokeWidth); + fPaint->setStyle(fSavedStyle); + + // Now we're done. + fState = kDone; + return true; + default: + SkASSERT(kDone == fState); + return false; + } +} + +void StrokeDrawLooper::restore() { + if (kAfterEdge == fState) { + fPaint->setColor(fSavedColor); + fPaint->setStrokeWidth(fSavedStrokeWidth); + fPaint->setStyle(fSavedStyle); + fState = kDone; + } +} + +void StrokeDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) { + buffer.writeScalar(fRadius); + buffer.write32(fColor); +} + +StrokeDrawLooper::StrokeDrawLooper(SkFlattenableReadBuffer& buffer) { + fRadius = buffer.readScalar(); + fColor = buffer.readU32(); +} + +} // end anonymous namespace + O3D_DEFN_CLASS(CanvasPaint, ParamObject); static SkPaint::Align ToSKAlign(CanvasPaint::TextAlign align) { @@ -88,8 +199,8 @@ void CanvasPaint::UpdateNativePaint() { // Note that shadow and ouline cannot both be active at the same time. if (outline_radius_ != 0.0) { - SkDrawLooper* l = new SkStrokeDrawLooper(SkFloatToScalar(outline_radius_), - Float4ToSkColor(outline_color_)); + SkDrawLooper* l = new StrokeDrawLooper(SkFloatToScalar(outline_radius_), + Float4ToSkColor(outline_color_)); sk_paint_.setLooper(l); l->unref(); } else if (shadow_radius_ != 0.0) { diff --git a/o3d/core/cross/canvas_paint.h b/o3d/core/cross/canvas_paint.h index ac76a70..aaec72a 100644 --- a/o3d/core/cross/canvas_paint.h +++ b/o3d/core/cross/canvas_paint.h @@ -39,7 +39,7 @@ #include "core/cross/param.h" #include "core/cross/canvas_shader.h" -#include "third_party/skia/files/include/core/SkPaint.h" +#include "third_party/skia/include/core/SkPaint.h" namespace o3d { diff --git a/o3d/core/cross/canvas_shader.cc b/o3d/core/cross/canvas_shader.cc index 9a5cb93..aeff7df 100644 --- a/o3d/core/cross/canvas_shader.cc +++ b/o3d/core/cross/canvas_shader.cc @@ -38,8 +38,8 @@ #include "core/cross/canvas_utils.h" #include "core/cross/error.h" -#include "third_party/skia/files/include/core/SkShader.h" -#include "third_party/skia/files/include/effects/SkGradientShader.h" +#include "third_party/skia/include/core/SkShader.h" +#include "third_party/skia/include/effects/SkGradientShader.h" namespace o3d { diff --git a/o3d/core/cross/canvas_shader.h b/o3d/core/cross/canvas_shader.h index ac86926..cf9fd0b 100644 --- a/o3d/core/cross/canvas_shader.h +++ b/o3d/core/cross/canvas_shader.h @@ -40,8 +40,8 @@ #include "core/cross/param_object.h" #include "core/cross/param.h" -#include "third_party/skia/files/include/core/SkColor.h" -#include "third_party/skia/files/include/core/SkPoint.h" +#include "third_party/skia/include/core/SkColor.h" +#include "third_party/skia/include/core/SkPoint.h" class SkShader; diff --git a/o3d/core/cross/canvas_utils.h b/o3d/core/cross/canvas_utils.h index 36e400e..87ce013 100644 --- a/o3d/core/cross/canvas_utils.h +++ b/o3d/core/cross/canvas_utils.h @@ -34,7 +34,7 @@ #define O3D_CORE_CROSS_CANVAS_UTILS_H_ #include "core/cross/float_n.h" -#include "third_party/skia/files/include/core/SkColor.h" +#include "third_party/skia/include/core/SkColor.h" // Helper function to convert from Float4 to an SkColor static SkColor Float4ToSkColor(const o3d::Float4& color) { |