147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2011 Google Inc. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license that can be 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * found in the LICENSE file. 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "gm.h" 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "SkCanvas.h" 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "SkPath.h" 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/** Draw a 2px border around the target, then red behind the target; 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org set the clip to match the target, then draw >> the target in blue. 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org*/ 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic void draw(SkCanvas* canvas, SkRect& target, int x, int y) { 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkPaint borderPaint; 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org borderPaint.setColor(SkColorSetRGB(0x0, 0xDD, 0x0)); 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org borderPaint.setAntiAlias(true); 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkPaint backgroundPaint; 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org backgroundPaint.setColor(SkColorSetRGB(0xDD, 0x0, 0x0)); 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org backgroundPaint.setAntiAlias(true); 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkPaint foregroundPaint; 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org foregroundPaint.setColor(SkColorSetRGB(0x0, 0x0, 0xDD)); 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org foregroundPaint.setAntiAlias(true); 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->save(); 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org target.inset(SkIntToScalar(-2), SkIntToScalar(-2)); 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->drawRect(target, borderPaint); 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org target.inset(SkIntToScalar(2), SkIntToScalar(2)); 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->drawRect(target, backgroundPaint); 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->clipRect(target, SkRegion::kIntersect_Op, true); 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org target.inset(SkIntToScalar(-4), SkIntToScalar(-4)); 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->drawRect(target, foregroundPaint); 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->restore(); 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic void draw_square(SkCanvas* canvas, int x, int y) { 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 10 * SK_Scalar1)); 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org draw(canvas, target, x, y); 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic void draw_column(SkCanvas* canvas, int x, int y) { 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkRect target (SkRect::MakeWH(1 * SK_Scalar1, 10 * SK_Scalar1)); 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org draw(canvas, target, x, y); 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic void draw_bar(SkCanvas* canvas, int x, int y) { 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 1 * SK_Scalar1)); 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org draw(canvas, target, x, y); 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic void draw_rect_tests(SkCanvas* canvas) { 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org draw_square(canvas, 10, 10); 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org draw_column(canvas, 30, 10); 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org draw_bar(canvas, 10, 30); 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/** 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Test a set of clipping problems discovered while writing blitAntiRect, 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org and test all the code paths through the clipping blitters. 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Each region should show as a blue center surrounded by a 2px green 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org border, with no red. 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org*/ 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AAClipGM : public skiagm::GM { 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgpublic: 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AAClipGM() { 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgprotected: 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual SkString onShortName() SK_OVERRIDE { 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SkString("aaclip"); 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual SkISize onISize() SK_OVERRIDE { 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SkISize::Make(240, 120); 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Initial pixel-boundary-aligned draw 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org draw_rect_tests(canvas); 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Repeat 4x with .2, .4, .6, .8 px offsets 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->translate(SkIntToScalar(50), 0); 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org draw_rect_tests(canvas); 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->translate(SkIntToScalar(50), 0); 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org draw_rect_tests(canvas); 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->translate(SkIntToScalar(50), 0); 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org draw_rect_tests(canvas); 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->translate(SkIntToScalar(50), 0); 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org draw_rect_tests(canvas); 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; } 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgprivate: 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef skiagm::GM INHERITED; 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgDEF_GM( return SkNEW(AAClipGM); ) 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org///////////////////////////////////////////////////////////////////////// 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef SK_BUILD_FOR_MAC 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic SkCanvas* make_canvas(const SkBitmap& bm) { 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const SkImageInfo& info = bm.info(); 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (info.bytesPerPixel() == 4) { 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SkCanvas::NewRasterDirectN32(info.width(), info.height(), 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org (SkPMColor*)bm.getPixels(), 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bm.rowBytes()); 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else { 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SkNEW_ARGS(SkCanvas, (bm)); 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "SkCGUtils.h" 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic void test_image(SkCanvas* canvas, const SkImageInfo& info) { 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkBitmap bm; 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bm.allocPixels(info); 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkAutoTUnref<SkCanvas> newc(make_canvas(bm)); 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (info.isOpaque()) { 13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bm.eraseColor(SK_ColorGREEN); 13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else { 13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bm.eraseColor(0); 13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkPaint paint; 14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org paint.setAntiAlias(true); 14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org paint.setColor(SK_ColorBLUE); 14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org newc->drawCircle(50, 50, 49, paint); 14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->drawBitmap(bm, 10, 10); 14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CGImageRef image = SkCreateCGImageRefWithColorspace(bm, NULL); 14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkBitmap bm2; 14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkCreateBitmapFromCGImage(&bm2, image); 14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CGImageRelease(image); 15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->drawBitmap(bm2, 10, 120); 15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass CGImageGM : public skiagm::GM { 15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgpublic: 15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CGImageGM() {} 15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgprotected: 15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual SkString onShortName() SK_OVERRIDE { 16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SkString("cgimage"); 16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual SkISize onISize() SK_OVERRIDE { 16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return SkISize::Make(800, 250); 16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const struct { 16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkColorType fCT; 17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkAlphaType fAT; 17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } rec[] = { 17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { kRGB_565_SkColorType, kOpaque_SkAlphaType }, 17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { kRGBA_8888_SkColorType, kPremul_SkAlphaType }, 17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { kRGBA_8888_SkColorType, kUnpremul_SkAlphaType }, 17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { kRGBA_8888_SkColorType, kOpaque_SkAlphaType }, 17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { kBGRA_8888_SkColorType, kPremul_SkAlphaType }, 17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { kBGRA_8888_SkColorType, kUnpremul_SkAlphaType }, 18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { kBGRA_8888_SkColorType, kOpaque_SkAlphaType }, 18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org }; 18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (size_t i = 0; i < SK_ARRAY_COUNT(rec); ++i) { 18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SkImageInfo info = SkImageInfo::Make(100, 100, rec[i].fCT, rec[i].fAT); 18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org test_image(canvas, info); 18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org canvas->translate(info.width() + 10, 0); 18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual uint32_t onGetFlags() const SK_OVERRIDE { return kSkipPipe_Flag; } 19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgprivate: 19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef skiagm::GM INHERITED; 19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if 0 // Disabled pending fix from reed@ 19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgDEF_GM( return SkNEW(CGImageGM); ) 19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org