skia2/gm/bitmaptiled.cpp
Brian Osman c7ad40f76f Remove SK_SUPPORT_GPU checks in tool-only code
Most of this is (obviously) not necessary to do, but once
I started, I figured I'd just get it all. Tools (nanobench,
DM, skiaserve), all GMs, benches, and unit tests, plus support
code (command line parsing and config stuff).

This is almost entirely mechanical.

Bug: skia:
Change-Id: I209500f8df8c5bd43f8298ff26440d1c4d7425fb
Reviewed-on: https://skia-review.googlesource.com/131153
Reviewed-by: Mike Klein <mtklein@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
2018-05-31 18:59:44 +00:00

73 lines
2.9 KiB
C++

/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "gm.h"
#include "GrContext.h"
// This test exercises Ganesh's drawing of tiled bitmaps. In particular, that the offsets and the
// extents of the tiles don't causes gaps between tiles.
static void draw_tile_bitmap_with_fractional_offset(SkCanvas* canvas, bool vertical) {
GrContext* context = canvas->getGrContext();
if (!context) {
skiagm::GM::DrawGpuOnlyMessage(canvas);
return;
}
// This should match kBmpSmallTileSize in SkGpuDevice.cpp. Note that our canvas size is tuned
// to this constant as well.
const int kTileSize = 1 << 10;
// We're going to draw a section of the bitmap that intersects 3 tiles (3x1 or 1x3).
// We need that to be < 50% of the total image, so our image is 7 tiles (7x1 or 1x7).
const int kBitmapLongEdge = 7 * kTileSize;
const int kBitmapShortEdge = 1 * kTileSize;
// To trigger tiling, we also need the image to be more than 50% of the cache, so we ensure the
// cache is sized to make that true.
const int kBitmapArea = kBitmapLongEdge * kBitmapShortEdge;
const size_t kBitmapBytes = kBitmapArea * sizeof(SkPMColor);
int oldMaxResources;
size_t oldMaxResourceBytes;
context->getResourceCacheLimits(&oldMaxResources, &oldMaxResourceBytes);
const size_t newMaxResourceBytes = kBitmapBytes + (kBitmapBytes / 2);
context->setResourceCacheLimits(oldMaxResources, newMaxResourceBytes);
// Construct our bitmap as either very wide or very tall
SkBitmap bmp;
bmp.allocN32Pixels(vertical ? kBitmapShortEdge : kBitmapLongEdge,
vertical ? kBitmapLongEdge : kBitmapShortEdge, true);
bmp.eraseColor(SK_ColorWHITE);
// Draw ten strips with varying fractional offset to catch any rasterization issues with tiling
for (int i = 0; i < 10; ++i) {
float offset = i * 0.1f;
if (vertical) {
canvas->drawBitmapRect(bmp, SkRect::MakeXYWH(0.0f, (kTileSize - 50) + offset,
32.0f, 1124.0f),
SkRect::MakeXYWH(37.0f * i, 0.0f, 32.0f, 1124.0f), nullptr);
} else {
canvas->drawBitmapRect(bmp, SkRect::MakeXYWH((kTileSize - 50) + offset, 0.0f,
1124.0f, 32.0f),
SkRect::MakeXYWH(0.0f, 37.0f * i, 1124.0f, 32.0f), nullptr);
}
}
// Restore the cache
context->setResourceCacheLimits(oldMaxResources, oldMaxResourceBytes);
}
DEF_SIMPLE_GM_BG(bitmaptiled_fractional_horizontal, canvas, 1124, 365, SK_ColorBLACK) {
draw_tile_bitmap_with_fractional_offset(canvas, false);
}
DEF_SIMPLE_GM_BG(bitmaptiled_fractional_vertical, canvas, 365, 1124, SK_ColorBLACK) {
draw_tile_bitmap_with_fractional_offset(canvas, true);
}