diff --git a/src/celestia/celestiacore.cpp b/src/celestia/celestiacore.cpp index 48e8c46ce..a7a5497ed 100644 --- a/src/celestia/celestiacore.cpp +++ b/src/celestia/celestiacore.cpp @@ -4745,22 +4745,25 @@ View* CelestiaCore::getViewByObserver(const Observer *obs) const return nullptr; } -Image CelestiaCore::captureImage() const +void CelestiaCore::getCaptureInfo(std::array& viewport, celestia::PixelFormat& format) const { - // Get the dimensions of the current viewport - array viewport; - getRenderer()->getViewport(viewport); + renderer->getViewport(viewport); + format = renderer->getPreferredCaptureFormat(); +} - PixelFormat format = renderer->getPreferredCaptureFormat(); - - Image image(format, viewport[2], viewport[3]); - if (!renderer->captureFrame(viewport[0], viewport[1], - viewport[2], viewport[3], - format, image.getPixels())) +bool CelestiaCore::captureImage(std::uint8_t* buffer, + const std::array& viewport, + celestia::PixelFormat format) const +{ + if (renderer->captureFrame(viewport[0], viewport[1], + viewport[2], viewport[3], + format, buffer)) { - GetLogger()->error(_("Unable to capture a frame!\n")); + return true; } - return image; + + GetLogger()->error(_("Unable to capture a frame!\n")); + return false; } bool CelestiaCore::saveScreenShot(const fs::path& filename, ContentType type) const @@ -4774,8 +4777,11 @@ bool CelestiaCore::saveScreenShot(const fs::path& filename, ContentType type) co return false; } - Image image = captureImage(); - if (!image.isValid()) + std::array viewport; + PixelFormat format; + getCaptureInfo(viewport, format); + Image image(format, viewport[2], viewport[3]); + if (!captureImage(image.getPixels(), viewport, format)) return false; switch (type) diff --git a/src/celestia/celestiacore.h b/src/celestia/celestiacore.h index 6127da84f..db465f940 100644 --- a/src/celestia/celestiacore.h +++ b/src/celestia/celestiacore.h @@ -10,6 +10,7 @@ #ifndef _CELESTIACORE_H_ #define _CELESTIACORE_H_ +#include #include #include #include @@ -19,6 +20,7 @@ // #include #include #include +#include #include #include #include @@ -384,7 +386,8 @@ class CelestiaCore // : public Watchable void setScriptHook(std::unique_ptr &&hook) { m_scriptHook = std::move(hook); } const std::shared_ptr& scriptMaps() const { return m_scriptMaps; } - Image captureImage() const; + void getCaptureInfo(std::array& viewport, celestia::PixelFormat& format) const; + bool captureImage(std::uint8_t* buffer, const std::array& viewport, celestia::PixelFormat format) const; bool saveScreenShot(const fs::path&, ContentType = Content_Unknown) const; void setMeasurementSystem(MeasurementSystem); diff --git a/src/celestia/qt/qtappwin.cpp b/src/celestia/qt/qtappwin.cpp index f809cf9e1..16e056f66 100644 --- a/src/celestia/qt/qtappwin.cpp +++ b/src/celestia/qt/qtappwin.cpp @@ -750,14 +750,16 @@ static QImage::Format toQFormat(PixelFormat format) void CelestiaAppWindow::slotCopyImage() { //glWidget->repaint(); - Image image = m_appCore->captureImage(); - QImage grabbedImage = QImage(image.getPixels(), - image.getWidth(), - image.getHeight(), - image.getPitch(), - toQFormat(image.getFormat())); - QApplication::clipboard()->setImage(grabbedImage); - m_appCore->flash(_("Captured screen shot to clipboard")); + std::array viewport; + celestia::PixelFormat format; + m_appCore->getCaptureInfo(viewport, format); + QImage grabbedImage = QImage(viewport[2], viewport[3], + toQFormat(format)); + if (m_appCore->captureImage(grabbedImage.bits(), viewport, format)) + { + QApplication::clipboard()->setImage(grabbedImage); + m_appCore->flash(_("Captured screen shot to clipboard")); + } }