Add tiled rendering option to viewer
Bug: skia: Change-Id: I4bb5e0107d06798040a37609499b4e2b48cf7e29 Reviewed-on: https://skia-review.googlesource.com/c/172962 Reviewed-by: Mike Klein <mtklein@google.com> Commit-Queue: Brian Osman <brianosman@google.com>
This commit is contained in:
parent
d003d22eb0
commit
e9ed0f0906
@ -190,6 +190,9 @@ Viewer::Viewer(int argc, char** argv, void* platformData)
|
||||
, fRotation(0.0f)
|
||||
, fOffset{0.5f, 0.5f}
|
||||
, fGestureDevice(GestureDevice::kNone)
|
||||
, fTiled(false)
|
||||
, fDrawTileBoundaries(false)
|
||||
, fTileScale{0.25f, 0.25f}
|
||||
, fPerspectiveMode(kPerspective_Off)
|
||||
{
|
||||
SkGraphics::Init();
|
||||
@ -1097,6 +1100,19 @@ void Viewer::drawSlide(SkCanvas* canvas) {
|
||||
fSaveToSKP = false;
|
||||
}
|
||||
|
||||
// Grab some things we'll need to make surfaces (for tiling or general offscreen rendering)
|
||||
SkColorType colorType = (ColorMode::kColorManagedF16 == fColorMode) ? kRGBA_F16_SkColorType
|
||||
: kN32_SkColorType;
|
||||
SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType);
|
||||
canvas->getProps(&props);
|
||||
|
||||
auto make_surface = [=](int w, int h) {
|
||||
SkImageInfo info = SkImageInfo::Make(w, h, colorType, kPremul_SkAlphaType, colorSpace);
|
||||
return Window::kRaster_BackendType == this->fBackendType
|
||||
? SkSurface::MakeRaster(info, &props)
|
||||
: canvas->makeSurface(info, &props);
|
||||
};
|
||||
|
||||
// We need to render offscreen if we're...
|
||||
// ... in fake perspective or zooming (so we have a snapped copy of the results)
|
||||
// ... in any raster mode, because the window surface is actually GL
|
||||
@ -1107,28 +1123,51 @@ void Viewer::drawSlide(SkCanvas* canvas) {
|
||||
Window::kRaster_BackendType == fBackendType ||
|
||||
colorSpace != nullptr) {
|
||||
|
||||
SkColorType colorType = (ColorMode::kColorManagedF16 == fColorMode)
|
||||
? kRGBA_F16_SkColorType : kN32_SkColorType;
|
||||
SkImageInfo info = SkImageInfo::Make(fWindow->width(), fWindow->height(), colorType,
|
||||
kPremul_SkAlphaType, colorSpace);
|
||||
SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType);
|
||||
canvas->getProps(&props);
|
||||
offscreenSurface = Window::kRaster_BackendType == fBackendType
|
||||
? SkSurface::MakeRaster(info, &props)
|
||||
: canvas->makeSurface(info);
|
||||
offscreenSurface = make_surface(fWindow->width(), fWindow->height());
|
||||
slideCanvas = offscreenSurface->getCanvas();
|
||||
}
|
||||
|
||||
int count = slideCanvas->save();
|
||||
slideCanvas->clear(SK_ColorWHITE);
|
||||
slideCanvas->concat(computeMatrix());
|
||||
// Time the painting logic of the slide
|
||||
fStatsLayer.beginTiming(fPaintTimer);
|
||||
if (fTiled) {
|
||||
int tileW = SkScalarCeilToInt(fWindow->width() * fTileScale.width());
|
||||
int tileH = SkScalarCeilToInt(fWindow->height() * fTileScale.height());
|
||||
sk_sp<SkSurface> tileSurface = make_surface(tileW, tileH);
|
||||
SkCanvas* tileCanvas = tileSurface->getCanvas();
|
||||
SkMatrix m = this->computeMatrix();
|
||||
for (int y = 0; y < fWindow->height(); y += tileH) {
|
||||
for (int x = 0; x < fWindow->width(); x += tileW) {
|
||||
SkAutoCanvasRestore acr(tileCanvas, true);
|
||||
tileCanvas->translate(-x, -y);
|
||||
tileCanvas->clear(SK_ColorTRANSPARENT);
|
||||
tileCanvas->concat(m);
|
||||
OveridePaintFilterCanvas filterCanvas(tileCanvas, &fPaint, &fPaintOverrides);
|
||||
fSlides[fCurrentSlide]->draw(&filterCanvas);
|
||||
tileSurface->draw(slideCanvas, x, y, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
// Draw borders between tiles
|
||||
if (fDrawTileBoundaries) {
|
||||
SkPaint border;
|
||||
border.setColor(0x60FF00FF);
|
||||
border.setStyle(SkPaint::kStroke_Style);
|
||||
for (int y = 0; y < fWindow->height(); y += tileH) {
|
||||
for (int x = 0; x < fWindow->width(); x += tileW) {
|
||||
slideCanvas->drawRect(SkRect::MakeXYWH(x, y, tileW, tileH), border);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
slideCanvas->concat(this->computeMatrix());
|
||||
if (kPerspective_Real == fPerspectiveMode) {
|
||||
slideCanvas->clipRect(SkRect::MakeWH(fWindow->width(), fWindow->height()));
|
||||
}
|
||||
// Time the painting logic of the slide
|
||||
fStatsLayer.beginTiming(fPaintTimer);
|
||||
OveridePaintFilterCanvas filterCanvas(slideCanvas, &fPaint, &fPaintOverrides);
|
||||
fSlides[fCurrentSlide]->draw(&filterCanvas);
|
||||
}
|
||||
fStatsLayer.endTiming(fPaintTimer);
|
||||
slideCanvas->restoreToCount(count);
|
||||
|
||||
@ -1549,6 +1588,12 @@ void Viewer::drawImGui() {
|
||||
paramsChanged = true;
|
||||
fOffset = {0.5f, 0.5f};
|
||||
}
|
||||
if (ImGui::CollapsingHeader("Tiling")) {
|
||||
ImGui::Checkbox("Enable", &fTiled);
|
||||
ImGui::Checkbox("Draw Boundaries", &fDrawTileBoundaries);
|
||||
ImGui::SliderFloat("Horizontal", &fTileScale.fWidth, 0.1f, 1.0f);
|
||||
ImGui::SliderFloat("Vertical", &fTileScale.fHeight, 0.1f, 1.0f);
|
||||
}
|
||||
int perspectiveMode = static_cast<int>(fPerspectiveMode);
|
||||
if (ImGui::Combo("Perspective", &perspectiveMode, "Off\0Real\0Fake\0\0")) {
|
||||
fPerspectiveMode = static_cast<PerspectiveMode>(perspectiveMode);
|
||||
|
@ -159,6 +159,10 @@ private:
|
||||
// identity unless the window initially scales the content to fit the screen.
|
||||
SkMatrix fDefaultMatrix;
|
||||
|
||||
bool fTiled;
|
||||
bool fDrawTileBoundaries;
|
||||
SkSize fTileScale;
|
||||
|
||||
enum PerspectiveMode {
|
||||
kPerspective_Off,
|
||||
kPerspective_Real,
|
||||
|
Loading…
Reference in New Issue
Block a user