1 /* 2 * Copyright 2017 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "gm.h" 9 10 #if SK_SUPPORT_GPU 11 #include "GrContext.h" 12 13 // This test exercises Ganesh's drawing of tiled bitmaps. In particular, that the offsets and the 14 // extents of the tiles don't causes gaps between tiles. 15 static void draw_tile_bitmap_with_fractional_offset(SkCanvas* canvas, bool vertical) { 16 GrContext* context = canvas->getGrContext(); 17 if (!context) { 18 skiagm::GM::DrawGpuOnlyMessage(canvas); 19 return; 20 } 21 22 // This should match kBmpSmallTileSize in SkGpuDevice.cpp. Note that our canvas size is tuned 23 // to this constant as well. 24 const int kTileSize = 1 << 10; 25 26 // We're going to draw a section of the bitmap that intersects 3 tiles (3x1 or 1x3). 27 // We need that to be < 50% of the total image, so our image is 7 tiles (7x1 or 1x7). 28 const int kBitmapLongEdge = 7 * kTileSize; 29 const int kBitmapShortEdge = 1 * kTileSize; 30 31 // To trigger tiling, we also need the image to be more than 50% of the cache, so we ensure the 32 // cache is sized to make that true. 33 const int kBitmapArea = kBitmapLongEdge * kBitmapShortEdge; 34 const size_t kBitmapBytes = kBitmapArea * sizeof(SkPMColor); 35 36 int oldMaxResources; 37 size_t oldMaxResourceBytes; 38 context->getResourceCacheLimits(&oldMaxResources, &oldMaxResourceBytes); 39 40 const size_t newMaxResourceBytes = kBitmapBytes + (kBitmapBytes / 2); 41 context->setResourceCacheLimits(oldMaxResources, newMaxResourceBytes); 42 43 // Construct our bitmap as either very wide or very tall 44 SkBitmap bmp; 45 bmp.allocN32Pixels(vertical ? kBitmapShortEdge : kBitmapLongEdge, 46 vertical ? kBitmapLongEdge : kBitmapShortEdge, true); 47 bmp.eraseColor(SK_ColorWHITE); 48 49 // Draw ten strips with varying fractional offset to catch any rasterization issues with tiling 50 for (int i = 0; i < 10; ++i) { 51 float offset = i * 0.1f; 52 if (vertical) { 53 canvas->drawBitmapRect(bmp, SkRect::MakeXYWH(0.0f, (kTileSize - 50) + offset, 54 32.0f, 1124.0f), 55 SkRect::MakeXYWH(37.0f * i, 0.0f, 32.0f, 1124.0f), nullptr); 56 } else { 57 canvas->drawBitmapRect(bmp, SkRect::MakeXYWH((kTileSize - 50) + offset, 0.0f, 58 1124.0f, 32.0f), 59 SkRect::MakeXYWH(0.0f, 37.0f * i, 1124.0f, 32.0f), nullptr); 60 } 61 } 62 63 // Restore the cache 64 context->setResourceCacheLimits(oldMaxResources, oldMaxResourceBytes); 65 } 66 67 DEF_SIMPLE_GM_BG(bitmaptiled_fractional_horizontal, canvas, 1124, 365, SK_ColorBLACK) { 68 draw_tile_bitmap_with_fractional_offset(canvas, false); 69 } 70 71 DEF_SIMPLE_GM_BG(bitmaptiled_fractional_vertical, canvas, 365, 1124, SK_ColorBLACK) { 72 draw_tile_bitmap_with_fractional_offset(canvas, true); 73 } 74 75 #endif 76