Browse Source

Re-add dirtyOnly to FrameSubscriber and document API change

Heilig Benedek 7 years ago
parent
commit
60ba2013c4

+ 3 - 1
atom/browser/api/atom_api_web_contents.cc

@@ -1637,15 +1637,17 @@ void WebContents::SendInputEvent(v8::Isolate* isolate,
 }
 
 void WebContents::BeginFrameSubscription(mate::Arguments* args) {
+  bool only_dirty = false;
   FrameSubscriber::FrameCaptureCallback callback;
 
+  args->GetNext(&only_dirty);
   if (!args->GetNext(&callback)) {
     args->ThrowError();
     return;
   }
 
   frame_subscriber_.reset(
-      new FrameSubscriber(isolate(), web_contents(), callback));
+      new FrameSubscriber(isolate(), web_contents(), callback, only_dirty));
 }
 
 void WebContents::EndFrameSubscription() {

+ 13 - 3
atom/browser/api/frame_subscriber.cc

@@ -11,6 +11,7 @@
 #include "content/browser/compositor/surface_utils.h"
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "ui/gfx/geometry/rect_conversions.h"
+#include "ui/gfx/skbitmap_operations.h"
 
 namespace atom {
 
@@ -18,10 +19,12 @@ namespace api {
 
 FrameSubscriber::FrameSubscriber(v8::Isolate* isolate,
                                  content::WebContents* web_contents,
-                                 const FrameCaptureCallback& callback)
+                                 const FrameCaptureCallback& callback,
+                                 bool only_dirty)
     : content::WebContentsObserver(web_contents),
       isolate_(isolate),
-      callback_(callback) {}
+      callback_(callback),
+      only_dirty_(only_dirty) {}
 
 FrameSubscriber::~FrameSubscriber() = default;
 
@@ -70,7 +73,14 @@ void FrameSubscriber::Done(const gfx::Rect& damage, const SkBitmap& frame) {
   const_cast<SkBitmap&>(frame).setAlphaType(kPremul_SkAlphaType);
   v8::Local<v8::Value> damage_rect =
       mate::Converter<gfx::Rect>::ToV8(isolate_, damage);
-  callback_.Run(gfx::Image::CreateFrom1xBitmap(frame), damage_rect);
+
+  if (only_dirty_) {
+    const SkBitmap& damageFrame = SkBitmapOperations::CreateTiledBitmap(
+        frame, damage.x(), damage.y(), damage.width(), damage.height());
+    callback_.Run(gfx::Image::CreateFrom1xBitmap(damageFrame), damage_rect);
+  } else {
+    callback_.Run(gfx::Image::CreateFrom1xBitmap(frame), damage_rect);
+  }
 }
 
 }  // namespace api

+ 3 - 1
atom/browser/api/frame_subscriber.h

@@ -26,7 +26,8 @@ class FrameSubscriber : public content::WebContentsObserver {
 
   FrameSubscriber(v8::Isolate* isolate,
                   content::WebContents* web_contents,
-                  const FrameCaptureCallback& callback);
+                  const FrameCaptureCallback& callback,
+                  bool only_dirty);
   ~FrameSubscriber();
 
  private:
@@ -36,6 +37,7 @@ class FrameSubscriber : public content::WebContentsObserver {
 
   v8::Isolate* isolate_;
   FrameCaptureCallback callback_;
+  bool only_dirty_;
 
   DISALLOW_COPY_AND_ASSIGN(FrameSubscriber);
 };

+ 7 - 10
docs/api/web-contents.md

@@ -1322,23 +1322,20 @@ For the `mouseWheel` event, the `event` object also have following properties:
 
 * `onlyDirty` Boolean (optional) - Defaults to `false`.
 * `callback` Function
-  * `frameBuffer` Buffer
+  * `image` [NativeImage](native-image.md)
   * `dirtyRect` [Rectangle](structures/rectangle.md)
 
 Begin subscribing for presentation events and captured frames, the `callback`
-will be called with `callback(frameBuffer, dirtyRect)` when there is a
-presentation event.
+will be called with `callback(image, dirtyRect)` when there is a presentation
+event.
 
-The `frameBuffer` is a `Buffer` that contains raw pixel data. On most machines,
-the pixel data is effectively stored in 32bit BGRA format, but the actual
-representation depends on the endianness of the processor (most modern
-processors are little-endian, on machines with big-endian processors the data
-is in 32bit ARGB format).
+The `image` is an instance of [NativeImage](native-image.md) that stores the
+captured frame.
 
 The `dirtyRect` is an object with `x, y, width, height` properties that
 describes which part of the page was repainted. If `onlyDirty` is set to
-`true`, `frameBuffer` will only contain the repainted area. `onlyDirty`
-defaults to `false`.
+`true`, `image` will only contain the repainted area. `onlyDirty` defaults to
+`false`.
 
 #### `contents.endFrameSubscription()`