
/*
 * 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"
#include "SkImageDecoder.h"
#include "SkStream.h"

static const struct {
    SkBitmap::Config    fPrefConfig;
    bool                fDither;
} gRec[] = {
    { SkBitmap::kIndex8_Config,     false },
    { SkBitmap::kARGB_8888_Config,  false },
    { SkBitmap::kARGB_4444_Config,  false },
    { SkBitmap::kARGB_4444_Config,  true },
    { SkBitmap::kRGB_565_Config,    false },
    { SkBitmap::kRGB_565_Config,    true },
};

class DecodeView : public SkView {
public:
    SkBitmap fBitmap[SK_ARRAY_COUNT(gRec)];

	DecodeView() {
        SkFILEStream stream("/skimages/index.png");
        SkImageDecoder* codec = SkImageDecoder::Factory(&stream);
        if (codec) {
            for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); i++) {
                stream.rewind();
                codec->setDitherImage(gRec[i].fDither);
                codec->decode(&stream, &fBitmap[i], gRec[i].fPrefConfig,
                              SkImageDecoder::kDecodePixels_Mode);
            }
        }
    }
    
protected:
    // overrides from SkEventSink
    virtual bool onQuery(SkEvent* evt) {
        if (SampleCode::TitleQ(*evt)) {
            SampleCode::TitleR(evt, "ImageDecoder");
            return true;
        }
        return this->INHERITED::onQuery(evt);
    }
    
    void drawBG(SkCanvas* canvas) {
        canvas->drawColor(0xFFDDDDDD);
//        canvas->drawColor(SK_ColorWHITE);
    }
    
    virtual void onDraw(SkCanvas* canvas) {
        this->drawBG(canvas);
        
        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
        
        for (size_t i = 0; i < SK_ARRAY_COUNT(fBitmap); i++) {
            canvas->drawBitmap(fBitmap[i], 0, 0);
            canvas->translate(SkIntToScalar(fBitmap[i].width()), 0);
        }
    }
private:
    typedef SkView INHERITED;
};

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

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

