diff options
author | reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2009-02-06 13:30:58 +0000 |
---|---|---|
committer | reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2009-02-06 13:30:58 +0000 |
commit | c07d23a6e220c0aff36e3e4e06c1b685a440108e (patch) | |
tree | 7d4a82a92693d62d09516fde0864841075dbbce1 /samplecode/SamplePathClip.cpp | |
parent | 3a859a00342ed078af683fd1901fd26c93dd40f0 (diff) |
Chop quads exactly on the clip bounds, so we don't spend CPU cycles walking them
when we're above or below the clip.
Still to do:
- chop in X to avoid 16.16. overflow in the edgelist
- apply the same logic for cubics (tho much harder math)
git-svn-id: http://skia.googlecode.com/svn/trunk@88 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode/SamplePathClip.cpp')
-rw-r--r-- | samplecode/SamplePathClip.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/samplecode/SamplePathClip.cpp b/samplecode/SamplePathClip.cpp new file mode 100644 index 0000000000..f4dd032d13 --- /dev/null +++ b/samplecode/SamplePathClip.cpp @@ -0,0 +1,85 @@ +#include "SampleCode.h" +#include "SkView.h" +#include "SkCanvas.h" +#include "SkGradientShader.h" +#include "SkGraphics.h" +#include "SkImageDecoder.h" +#include "SkPath.h" +#include "SkPorterDuff.h" +#include "SkRegion.h" +#include "SkShader.h" +#include "SkUtils.h" +#include "SkXfermode.h" +#include "SkColorPriv.h" +#include "SkColorFilter.h" +#include "SkTime.h" +#include "SkTypeface.h" + +class PathClipView : public SkView { +public: + SkRect fOval; + SkPoint fCenter; + + PathClipView() { + fOval.set(0, 0, SkIntToScalar(200), SkIntToScalar(50)); + fCenter.set(SkIntToScalar(250), SkIntToScalar(250)); + } + + virtual ~PathClipView() {} + +protected: + // overrides from SkEventSink + virtual bool onQuery(SkEvent* evt) { + if (SampleCode::TitleQ(*evt)) { + SampleCode::TitleR(evt, "PathClip"); + return true; + } + return this->INHERITED::onQuery(evt); + } + + void drawBG(SkCanvas* canvas) { + canvas->drawColor(SK_ColorWHITE); + } + + virtual void onDraw(SkCanvas* canvas) { + this->drawBG(canvas); + + SkRect oval = fOval; + oval.offset(fCenter.fX - oval.centerX(), fCenter.fY - oval.centerY()); + + SkPaint p; + p.setAntiAlias(true); + + p.setStyle(SkPaint::kStroke_Style); + canvas->drawOval(oval, p); + + SkRect r; + r.set(SkIntToScalar(200), SkIntToScalar(200), + SkIntToScalar(300), SkIntToScalar(300)); + canvas->clipRect(r); + + p.setStyle(SkPaint::kFill_Style); + p.setColor(SK_ColorRED); + canvas->drawRect(r, p); + + p.setColor(0x800000FF); + r.set(SkIntToScalar(150), SkIntToScalar(10), + SkIntToScalar(250), SkIntToScalar(400)); + canvas->drawOval(oval, p); + } + + virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { + fCenter.set(x, y); + this->inval(NULL); + return NULL; + } + +private: + typedef SkView INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +static SkView* MyFactory() { return new PathClipView; } +static SkViewRegister reg(MyFactory); + |