17839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/*
27839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Copyright 2013 Google Inc.
37839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *
47839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
57839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * found in the LICENSE file.
67839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */
77839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
87839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "gm.h"
97839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkCanvas.h"
107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic void make_bm(SkBitmap* bm) {
127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bm->setConfig(SkBitmap::kARGB_8888_Config, 60, 60);
137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bm->allocPixels();
147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bm->eraseColor(0);
157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkCanvas canvas(*bm);
177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkPaint paint;
187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkPath path;
207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    path.moveTo(6, 6);
217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    path.lineTo(6, 54);
227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    path.lineTo(30, 54);
237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    canvas.drawPath(path, paint);
247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    paint.setStyle(SkPaint::kStroke_Style);
267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    canvas.drawRect(SkRect::MakeLTRB(0.5f, 0.5f, 59.5f, 59.5f), paint);
277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}
287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// This creates a close, but imperfect concatenation of
307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger//      scaling the image up by its dst-rect
317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger//      scaling the image down by the matrix' scale
327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger//  The bug was that for cases like this, we were incorrectly trying to take a
337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger//  fast-path in the bitmapshader, but ended up drawing the last col of pixels
347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger//  twice. The fix resulted in (a) not taking the fast-path, but (b) drawing
357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger//  the image correctly.
367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger//
377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic void test_bitmaprect(SkCanvas* canvas) {
387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkBitmap bm;
397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    make_bm(&bm);
407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    canvas->drawBitmap(bm, 150, 45, NULL);
427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkScalar scale = 0.472560018f;
447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    canvas->save();
457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    canvas->scale(scale, scale);
467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    canvas->drawBitmapRectToRect(bm, NULL, SkRect::MakeXYWH(100, 100, 128, 128), NULL);
477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    canvas->restore();
487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    canvas->scale(-1, 1);
507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    canvas->drawBitmap(bm, -310, 45, NULL);
517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}
527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass BitmapRectTestGM : public skiagm::GM {
547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    BitmapRectTestGM() {
567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual SkString onShortName() {
617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return SkString("bitmaprecttest");
627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual SkISize onISize() {
657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return SkISize::Make(320, 240);
667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        test_bitmaprect(canvas);
707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef skiagm::GM INHERITED;
747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger//////////////////////////////////////////////////////////////////////////////
777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerDEF_GM( return new BitmapRectTestGM; )
79