#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"

#include "SkOSFile.h"
#include "SkStream.h"

#define SPECIFIC_IMAGE  "/skimages/main.gif"

class BitmapRectView : public SkView {
public:
    SkBitmap fBitmap;
    int      fCurrX, fCurrY;

	BitmapRectView() {
        SkImageDecoder::DecodeFile(SPECIFIC_IMAGE, &fBitmap);
        fCurrX = fCurrY = 0;
    }
    
protected:
    // overrides from SkEventSink
    virtual bool onQuery(SkEvent* evt)
    {
        if (SampleCode::TitleQ(*evt))
        {
            SkString str("BitmapRect: ");
            str.append(SPECIFIC_IMAGE);
            SampleCode::TitleR(evt, str.c_str());
            return true;
        }
        return this->INHERITED::onQuery(evt);
    }
    
    void drawBG(SkCanvas* canvas)
    {
        canvas->drawColor(SK_ColorGRAY);
    }
    
    virtual void onDraw(SkCanvas* canvas)
    {
        this->drawBG(canvas);
        
        canvas->drawBitmap(fBitmap, 0, 0, NULL);
        
        SkIRect subset;
        const int SRC_WIDTH = 16;
        const int SRC_HEIGHT = 16;
        
        subset.set(0, 0, SRC_WIDTH, SRC_HEIGHT);
        subset.offset(fCurrX, fCurrY);
        
        SkDebugf("---- src x=%d y=%d\n", subset.fLeft, subset.fTop);
        
        SkRect  dst0, dst1;
        SkScalar y = SkIntToScalar(fBitmap.height() + 16);
        
        dst0.set(SkIntToScalar(50), y,
                 SkIntToScalar(50+SRC_WIDTH),
                 y + SkIntToScalar(SRC_HEIGHT));
        dst1 = dst0;
        dst1.offset(SkIntToScalar(200), 0);
        dst1.fRight = dst1.fLeft + 8 * dst0.width();
        dst1.fBottom = dst1.fTop + 8 * dst0.height();
        
        canvas->drawBitmapRect(fBitmap, &subset, dst0, NULL);
        canvas->drawBitmapRect(fBitmap, &subset, dst1, NULL);
        
        SkPaint paint;
        paint.setColor(0x88FF0000);
        canvas->drawRect(dst0, paint);
        paint.setColor(0x880000FF);
        canvas->drawRect(dst1, paint);
    }
    
    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) 
    {
        return new Click(this);
    }
    
    virtual bool onClick(Click* click) 
    {
        fCurrX = click->fICurr.fX;
        fCurrY = click->fICurr.fY;
        this->inval(NULL);
        return true;
    }
    
private:
    typedef SkView INHERITED;
};

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

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

