tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

RendererScreenshotGrabber.cpp (3185B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "RendererScreenshotGrabber.h"
      8 
      9 #include "RendererOGL.h"
     10 
     11 #include "mozilla/gfx/2D.h"
     12 
     13 using mozilla::layers::ProfilerScreenshots;
     14 
     15 namespace mozilla {
     16 namespace wr {
     17 
     18 RendererScreenshotGrabber::RendererScreenshotGrabber() {
     19  mMaxScreenshotSize = ProfilerScreenshots::ScreenshotSize();
     20 }
     21 
     22 void RendererScreenshotGrabber::MaybeGrabScreenshot(
     23    RendererOGL* aRendererOGL, const gfx::IntSize& aWindowSize) {
     24  bool isEnabled =
     25      ProfilerScreenshots::IsEnabled() && aRendererOGL->EnsureAsyncScreenshot();
     26 
     27  if (isEnabled) {
     28    if (!mProfilerScreenshots) {
     29      mProfilerScreenshots = new ProfilerScreenshots();
     30    }
     31 
     32    GrabScreenshot(aRendererOGL->GetRenderer(), aWindowSize);
     33  } else if (mProfilerScreenshots) {
     34    Destroy(aRendererOGL->GetRenderer());
     35  }
     36 }
     37 
     38 void RendererScreenshotGrabber::MaybeProcessQueue(RendererOGL* aRendererOGL) {
     39  bool isEnabled =
     40      ProfilerScreenshots::IsEnabled() && aRendererOGL->EnsureAsyncScreenshot();
     41 
     42  if (isEnabled) {
     43    if (!mProfilerScreenshots) {
     44      mProfilerScreenshots = new ProfilerScreenshots();
     45    }
     46 
     47    ProcessQueue(aRendererOGL->GetRenderer());
     48  } else if (mProfilerScreenshots) {
     49    Destroy(aRendererOGL->GetRenderer());
     50  }
     51 }
     52 
     53 void RendererScreenshotGrabber::Destroy(Renderer* aRenderer) {
     54  mQueue.Clear();
     55  mCurrentFrameQueueItem = Nothing();
     56  mProfilerScreenshots = nullptr;
     57 
     58  wr_renderer_release_profiler_structures(aRenderer);
     59 }
     60 
     61 void RendererScreenshotGrabber::GrabScreenshot(
     62    Renderer* aRenderer, const gfx::IntSize& aWindowSize) {
     63  gfx::IntSize screenshotSize;
     64 
     65  AsyncScreenshotHandle handle = wr_renderer_get_screenshot_async(
     66      aRenderer, 0, 0, aWindowSize.width, aWindowSize.height,
     67      mMaxScreenshotSize.width, mMaxScreenshotSize.height, ImageFormat::BGRA8,
     68      &screenshotSize.width, &screenshotSize.height);
     69 
     70  mCurrentFrameQueueItem = Some(QueueItem{
     71      TimeStamp::Now(),
     72      handle,
     73      screenshotSize,
     74      aWindowSize,
     75  });
     76 }
     77 
     78 void RendererScreenshotGrabber::ProcessQueue(Renderer* aRenderer) {
     79  for (const auto& item : mQueue) {
     80    mProfilerScreenshots->SubmitScreenshot(
     81        item.mWindowSize, item.mScreenshotSize, item.mTimeStamp,
     82        [&item, aRenderer](gfx::DataSourceSurface* aTargetSurface) {
     83          gfx::DataSourceSurface::ScopedMap map(aTargetSurface,
     84                                                gfx::DataSourceSurface::WRITE);
     85          int32_t destStride = map.GetStride();
     86 
     87          bool success = wr_renderer_map_and_recycle_screenshot(
     88              aRenderer, item.mHandle, map.GetData(),
     89              destStride * aTargetSurface->GetSize().height, destStride);
     90 
     91          return success;
     92        });
     93  }
     94 
     95  mQueue.Clear();
     96 
     97  if (mCurrentFrameQueueItem) {
     98    mQueue.AppendElement(*mCurrentFrameQueueItem);
     99    mCurrentFrameQueueItem = Nothing();
    100  }
    101 }
    102 
    103 }  // namespace wr
    104 }  // namespace mozilla