
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "SampleCode.h"
#include "SkView.h"
#include "SkCanvas.h"

class SpiralView : public SampleView {
public:
	SpiralView() {
        this->setBGColor(0xFFDDDDDD);
	}
	
protected:
    // overrides from SkEventSink
    virtual bool onQuery(SkEvent* evt)  {
        if (SampleCode::TitleQ(*evt)) {
            SampleCode::TitleR(evt, "Spiral");
            return true;
        }
        return this->INHERITED::onQuery(evt);
    }
	
    virtual void onDrawContent(SkCanvas* canvas) {
        SkPaint paint;
        paint.setAntiAlias(true);
        paint.setStyle(SkPaint::kStroke_Style);
        paint.setStrokeWidth(SkScalarHalf(SkIntToScalar(3)));
        paint.setStyle(SkPaint::kFill_Style);
        
        SkRect r;
        SkScalar l,t,x,y;
        l = SampleCode::GetAnimScalar(SkIntToScalar(10),
                                      SkIntToScalar(400));
        t = SampleCode::GetAnimScalar(SkIntToScalar(5),
                                      SkIntToScalar(200));
        
        canvas->translate(320,240);
        for (int i = 0; i < 35; i++) {
            paint.setColor(0xFFF00FF0 - i * 0x04000000);
            SkScalar step = SK_ScalarPI / (55 - i);
            SkScalar angle = t * step;
            x = (20 + SkIntToScalar(i) * 5) * SkScalarSinCos(angle, &y);
            y *= (20 + SkIntToScalar(i) * 5);
            r.set(x, y, x + SkIntToScalar(10), y + SkIntToScalar(10));
            canvas->drawRect(r, paint);
        }

        this->inval(NULL);
    }
	
private:
    typedef SampleView INHERITED;
};

//////////////////////////////////////////////////////////////////////////////

static SkView* MyFactory() { return new SpiralView; }
static SkViewRegister reg(MyFactory);