verylargebitmap.cpp revision ae933ce0ea5fd9d21cb6ef2cee7e729d32690aac
17eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com/*
27eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com * Copyright 2012 Google Inc.
37eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com *
47eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com * Use of this source code is governed by a BSD-style license that can be
57eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com * found in the LICENSE file.
67eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com */
77eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
87eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com#include "gm.h"
97eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com#include "SkCanvas.h"
107eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com#include "SkPath.h"
117eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
127eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.comstatic void make_bm(SkBitmap* bm, int width, int height, SkColor color) {
137eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    bm->setConfig(SkBitmap::kARGB_8888_Config, width, height);
147eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    bm->allocPixels();
157eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    bm->eraseColor(color);
167eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    bm->setImmutable();
177eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com}
187eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
197eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.comstatic void show_bm(SkCanvas* canvas, int width, int height, SkColor color) {
207eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    SkBitmap bm;
217eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    make_bm(&bm, width, height, color);
227eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
237eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    SkPaint paint;
247eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    SkRect r;
257eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    SkIRect ir;
267eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
277eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    paint.setStyle(SkPaint::kStroke_Style);
287eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
297eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    ir.set(0, 0, 128, 128);
307eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    r.set(ir);
317eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
327eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    canvas->save();
337eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    canvas->clipRect(r);
347eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    canvas->drawBitmap(bm, 0, 0, NULL);
357eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    canvas->restore();
367eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    canvas->drawRect(r, paint);
377eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
387eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    r.offset(SkIntToScalar(150), 0);
397eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    // exercises extract bitmap, but not shader
407eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    canvas->drawBitmapRect(bm, &ir, r, NULL);
417eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    canvas->drawRect(r, paint);
427eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
437eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    r.offset(SkIntToScalar(150), 0);
447eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    // exercises bitmapshader
457eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    canvas->drawBitmapRect(bm, NULL, r, NULL);
467eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    canvas->drawRect(r, paint);
477eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com}
487eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
497eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.comclass VeryLargeBitmapGM : public skiagm::GM {
507eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.compublic:
517eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    VeryLargeBitmapGM() {}
527eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
537eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.comprotected:
547eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    virtual SkString onShortName() SK_OVERRIDE {
557eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        return SkString("verylargebitmap");
567eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    }
577eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
587eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    virtual SkISize onISize() SK_OVERRIDE {
597eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        return SkISize::Make(640, 480);
607eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    }
617eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
627eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
637eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        int veryBig = 100*1024; // 64K < size
647eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        int big = 60*1024;      // 32K < size < 64K
657eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        int small = 300;
667eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
677eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
687eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        show_bm(canvas, small, small, SK_ColorRED);
697eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        canvas->translate(0, SkIntToScalar(150));
707eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
717eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        show_bm(canvas, big, small, SK_ColorBLUE);
727eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        canvas->translate(0, SkIntToScalar(150));
73ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
747eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        // as of this writing, the raster code will fail to draw the scaled version
757eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        // since it has a 64K limit on x,y coordinates... (but gpu should succeed)
767eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com        show_bm(canvas, veryBig, small, SK_ColorGREEN);
777eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    }
787eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
797eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.comprivate:
807eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com    typedef skiagm::GM INHERITED;
817eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com};
827eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
837eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com//////////////////////////////////////////////////////////////////////////////
847eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.com
8524e8999b4b813d1f382e59c4b2793ce5671ea283borenet@google.com// This GM allocates more memory than Android devices are capable of fulfilling.
8624e8999b4b813d1f382e59c4b2793ce5671ea283borenet@google.com#ifndef SK_BUILD_FOR_ANDROID
877eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.comstatic skiagm::GM* MyFactory(void*) { return new VeryLargeBitmapGM; }
887eb3a2653bf18e7c3cadaa5663d4d0060c728b5areed@google.comstatic skiagm::GMRegistry reg(MyFactory);
8924e8999b4b813d1f382e59c4b2793ce5671ea283borenet@google.com#endif
90