11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SampleCode.h"
90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorPriv.h"
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkShader.h"
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h"
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h"
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h"
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkBitmap make_bitmap() {
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkBitmap bm;
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const int N = 1;
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkColorTable* ctable = new SkColorTable(N);
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPMColor* c = ctable->lockColors();
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    for (int i = 0; i < N; i++) {
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        c[i] = SkPackARGB32(0x80, 0x80, 0, 0);
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ctable->unlockColors(true);
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm.setConfig(SkBitmap::kIndex8_Config, 1, 1);
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm.allocPixels(ctable);
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ctable->unref();
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm.lockPixels();
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    for (int y = 0; y < bm.height(); y++) {
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        uint8_t* p = bm.getAddr8(0, y);
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (int x = 0; x < bm.width(); x++) {
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            p[x] = 0;
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm.unlockPixels();
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return bm;
380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass TinyBitmapView : public SampleView {
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkBitmap    fBM;
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	TinyBitmapView() {
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fBM = make_bitmap();
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        this->setBGColor(0xFFDDDDDD);
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected:
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // overrides from SkEventSink
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onQuery(SkEvent* evt) {
510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (SampleCode::TitleQ(*evt)) {
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SampleCode::TitleR(evt, "TinyBitmap");
530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            return true;
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return this->INHERITED::onQuery(evt);
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static void setBitmapOpaque(SkBitmap* bm, bool isOpaque) {
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkAutoLockPixels alp(*bm);  // needed for ctable
600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        bm->setIsOpaque(isOpaque);
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkColorTable* ctable = bm->getColorTable();
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (ctable) {
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            ctable->setIsOpaque(isOpaque);
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void onDrawContent(SkCanvas* canvas) {
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkShader* s = SkShader::CreateBitmapShader(fBM, SkShader::kRepeat_TileMode,
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                   SkShader::kMirror_TileMode);
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPaint paint;
710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setShader(s)->unref();
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawPaint(paint);
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    typedef SkView INHERITED;
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//////////////////////////////////////////////////////////////////////////////
800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new TinyBitmapView; }
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory);
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
84