new optional aspect-ratio argument to snapshot chain (javascript through

c++ display plugin). When non-zero, it pulls out the largest piece from
the center that maintains that ratio.  Snapshot button uses 1.91.
This commit is contained in:
howard-stearns 2016-08-18 16:29:42 -07:00
parent 01fcaa024d
commit f6670a6374
10 changed files with 26 additions and 15 deletions

View file

@ -5130,13 +5130,13 @@ void Application::toggleLogDialog() {
}
}
void Application::takeSnapshot(bool notify) {
void Application::takeSnapshot(bool notify, float aspectRatio) {
QMediaPlayer* player = new QMediaPlayer();
QFileInfo inf = QFileInfo(PathUtils::resourcesPath() + "sounds/snap.wav");
player->setMedia(QUrl::fromLocalFile(inf.absoluteFilePath()));
player->play();
QString path = Snapshot::saveSnapshot(getActiveDisplayPlugin()->getScreenshot());
QString path = Snapshot::saveSnapshot(getActiveDisplayPlugin()->getScreenshot(aspectRatio));
emit DependencyManager::get<WindowScriptingInterface>()->snapshotTaken(path, notify);
}

View file

@ -250,7 +250,7 @@ public:
float getAvatarSimrate() const { return _avatarSimCounter.rate(); }
float getAverageSimsPerSecond() const { return _simCounter.rate(); }
void takeSnapshot(bool notify);
void takeSnapshot(bool notify, float aspectRatio = 0.0f);
void shareSnapshot(const QString& filename);
model::SkyboxPointer getDefaultSkybox() const { return _defaultSkybox; }

View file

@ -204,10 +204,10 @@ void WindowScriptingInterface::copyToClipboard(const QString& text) {
QApplication::clipboard()->setText(text);
}
void WindowScriptingInterface::takeSnapshot(bool notify) {
void WindowScriptingInterface::takeSnapshot(bool notify, float aspectRatio) {
// only evil-doers call takeSnapshot from a random thread
qApp->postLambdaEvent([notify] {
qApp->takeSnapshot(notify);
qApp->postLambdaEvent([notify, aspectRatio] {
qApp->takeSnapshot(notify, aspectRatio);
});
}

View file

@ -55,7 +55,7 @@ public slots:
QScriptValue save(const QString& title = "", const QString& directory = "", const QString& nameFilter = "");
void showAssetServer(const QString& upload = "");
void copyToClipboard(const QString& text);
void takeSnapshot(bool notify);
void takeSnapshot(bool notify = true, float aspectRatio = 0.0f);
void shareSnapshot(const QString& path);
signals:

View file

@ -31,6 +31,6 @@ void NullDisplayPlugin::submitFrame(const gpu::FramePointer& frame) {
}
}
QImage NullDisplayPlugin::getScreenshot() const {
QImage NullDisplayPlugin::getScreenshot(float aspectRatio) const {
return QImage();
}

View file

@ -18,7 +18,7 @@ public:
glm::uvec2 getRecommendedRenderSize() const override;
bool hasFocus() const override;
void submitFrame(const gpu::FramePointer& newFrame) override;
QImage getScreenshot() const override;
QImage getScreenshot(float aspectRatio = 0.0f) const override;
private:
static const QString NAME;
};

View file

@ -659,15 +659,26 @@ void OpenGLDisplayPlugin::withMainThreadContext(std::function<void()> f) const {
_container->makeRenderingContextCurrent();
}
QImage OpenGLDisplayPlugin::getScreenshot() const {
QImage OpenGLDisplayPlugin::getScreenshot(float aspectRatio) const {
auto size = _compositeFramebuffer->getSize();
if (isHmd()) {
size.x /= 2;
}
auto bestSize = size;
uvec2 corner(0);
if (aspectRatio != 0.0f) { // Pick out the largest piece of the center that produces the requested width/height aspectRatio
if (((size.y * aspectRatio) + 0.5f) < size.x) {
bestSize.x = round(size.y * aspectRatio);
} else {
bestSize.y = round(size.x / aspectRatio);
}
corner.x = round((size.x - bestSize.x) / 2.0f);
corner.y = round((size.y - bestSize.y) / 2.0f);
}
auto glBackend = const_cast<OpenGLDisplayPlugin&>(*this).getGLBackend();
QImage screenshot(size.x, size.y, QImage::Format_ARGB32);
QImage screenshot(bestSize.x, bestSize.y, QImage::Format_ARGB32);
withMainThreadContext([&] {
glBackend->downloadFramebuffer(_compositeFramebuffer, ivec4(uvec2(0), size), screenshot);
glBackend->downloadFramebuffer(_compositeFramebuffer, ivec4(corner, bestSize), screenshot);
});
return screenshot.mirrored(false, true);
}

View file

@ -54,7 +54,7 @@ public:
return getSurfaceSize();
}
QImage getScreenshot() const override;
QImage getScreenshot(float aspectRatio = 0.0f) const override;
float presentRate() const override;

View file

@ -172,7 +172,7 @@ public:
}
// Fetch the most recently displayed image as a QImage
virtual QImage getScreenshot() const = 0;
virtual QImage getScreenshot(float aspectRatio = 0.0f) const = 0;
// will query the underlying hmd api to compute the most recent head pose
virtual bool beginFrameRender(uint32_t frameIndex) { return true; }

View file

@ -116,7 +116,7 @@ function onClicked() {
// take snapshot (with no notification)
Script.setTimeout(function () {
Window.takeSnapshot(false);
Window.takeSnapshot(false, 1.91);
}, SNAPSHOT_DELAY);
}