Index: tools/viewer/Viewer.cpp |
diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp |
index 499673572b4d296541768aafcd1c08e84a3815e8..465a7aad4d31434f57b863c879c660c2e3fc912b 100644 |
--- a/tools/viewer/Viewer.cpp |
+++ b/tools/viewer/Viewer.cpp |
@@ -8,10 +8,12 @@ |
#include "Viewer.h" |
#include "GMSlide.h" |
+#include "ImageSlide.h" |
#include "SKPSlide.h" |
#include "SkCanvas.h" |
#include "SkCommonFlags.h" |
+#include "SkMetaData.h" |
#include "SkOSFile.h" |
#include "SkRandom.h" |
#include "SkStream.h" |
@@ -52,10 +54,13 @@ DEFINE_string2(match, m, nullptr, |
"^ and $ requires an exact match\n" |
"If a bench does not match any list entry,\n" |
"it is skipped unless some list entry starts with ~"); |
-DEFINE_string(skps, "skps", "Directory to read skps from."); |
#ifdef SK_BUILD_FOR_ANDROID |
+DEFINE_string(skps, "/data/local/tmp/skia", "Directory to read skps from."); |
+DEFINE_string(jpgs, "/data/local/tmp/skia", "Directory to read jpgs from."); |
DEFINE_bool(vulkan, false, "Run with Vulkan."); |
#else |
+DEFINE_string(skps, "skps", "Directory to read skps from."); |
+DEFINE_string(jpgs, "jpgs", "Directory to read jpgs from."); |
DEFINE_bool(vulkan, true, "Run with Vulkan."); |
#endif |
@@ -73,10 +78,14 @@ const char* kBackendStateName = "Backend"; |
const char* kSoftkeyStateName = "Softkey"; |
const char* kSoftkeyHint = "Please select a softkey"; |
const char* kFpsStateName = "FPS"; |
+const char* kSplitScreenStateName = "Split screen"; |
+const char* kON = "ON"; |
+const char* kOFF = "OFF"; |
Viewer::Viewer(int argc, char** argv, void* platformData) |
: fCurrentMeasurement(0) |
, fDisplayStats(false) |
+ , fSplitScreen(false) |
, fBackendType(sk_app::Window::kVulkan_BackendType) |
, fZoomCenterX(0.0f) |
, fZoomCenterY(0.0f) |
@@ -224,6 +233,19 @@ void Viewer::initSlides() { |
} |
} |
} |
+ |
+ // JPGs |
+ for (int i = 0; i < FLAGS_jpgs.count(); i++) { |
+ SkOSFile::Iter it(FLAGS_jpgs[i], ".jpg"); |
+ SkString jpgName; |
+ while (it.next(&jpgName)) { |
+ SkString path = SkOSPath::Join(FLAGS_jpgs[i], jpgName.c_str()); |
+ sk_sp<ImageSlide> slide(new ImageSlide(jpgName, path)); |
+ if (slide) { |
+ fSlides.push_back(slide); |
+ } |
+ } |
+ } |
} |
@@ -247,6 +269,9 @@ void Viewer::setupCurrentSlide(int previousSlide) { |
return; // no change; do nothing |
} |
+ // prepare dimensions for image slides |
+ fSlides[fCurrentSlide]->load(); |
+ |
fGesture.reset(); |
fDefaultMatrix.reset(); |
fDefaultMatrixInv.reset(); |
@@ -272,7 +297,6 @@ void Viewer::setupCurrentSlide(int previousSlide) { |
this->updateTitle(); |
this->updateUIState(); |
- fSlides[fCurrentSlide]->load(); |
if (previousSlide >= 0) { |
fSlides[previousSlide]->unload(); |
} |
@@ -317,11 +341,16 @@ SkMatrix Viewer::computeMatrix() { |
return m; |
} |
-void Viewer::onPaint(SkCanvas* canvas) { |
+void Viewer::drawSlide(SkCanvas* canvas, bool inSplitScreen) { |
+ SkASSERT(!inSplitScreen || fWindow->supportsContentRect()); |
+ |
int count = canvas->save(); |
if (fWindow->supportsContentRect()) { |
SkRect contentRect = fWindow->getContentRect(); |
+ // If inSplitScreen, translate the image half screen to the right. |
+ // Thus we have two copies of the image on each half of the screen. |
+ contentRect.fLeft += inSplitScreen ? (contentRect.fRight - contentRect.fLeft) * 0.5 : 0; |
canvas->clipRect(contentRect); |
canvas->translate(contentRect.fLeft, contentRect.fTop); |
} |
@@ -330,8 +359,16 @@ void Viewer::onPaint(SkCanvas* canvas) { |
canvas->concat(fDefaultMatrix); |
canvas->concat(computeMatrix()); |
+ canvas->getMetaData().setBool(kImageColorXformMetaData, inSplitScreen); |
fSlides[fCurrentSlide]->draw(canvas); |
canvas->restoreToCount(count); |
+} |
+ |
+void Viewer::onPaint(SkCanvas* canvas) { |
+ drawSlide(canvas, false); |
+ if (fSplitScreen && fWindow->supportsContentRect()) { |
+ drawSlide(canvas, true); |
+ } |
if (fDisplayStats) { |
drawStats(canvas); |
@@ -461,11 +498,20 @@ void Viewer::updateUIState() { |
fpsState[kValue] = SkStringPrintf("%8.3lf ms", measurement).c_str(); |
fpsState[kOptions] = Json::Value(Json::arrayValue); |
+ // Split screen state |
+ Json::Value splitScreenState(Json::objectValue); |
+ splitScreenState[kName] = kSplitScreenStateName; |
+ splitScreenState[kValue] = fSplitScreen ? kON : kOFF; |
+ splitScreenState[kOptions] = Json::Value(Json::arrayValue); |
+ splitScreenState[kOptions].append(kON); |
+ splitScreenState[kOptions].append(kOFF); |
+ |
Json::Value state(Json::arrayValue); |
state.append(slideState); |
state.append(backendState); |
state.append(softkeyState); |
state.append(fpsState); |
+ state.append(splitScreenState); |
fWindow->setUIState(state); |
} |
@@ -508,6 +554,13 @@ void Viewer::onUIStateChanged(const SkString& stateName, const SkString& stateVa |
fCommands.onSoftkey(stateValue); |
updateUIState(); // This is still needed to reset the value to kSoftkeyHint |
} |
+ } else if (stateName.equals(kSplitScreenStateName)) { |
+ bool newSplitScreen = stateValue.equals(kON); |
+ if (newSplitScreen != fSplitScreen) { |
+ fSplitScreen = newSplitScreen; |
+ fWindow->inval(); |
+ updateUIState(); |
+ } |
} else { |
SkDebugf("Unknown stateName: %s", stateName.c_str()); |
} |