From 221714e141e208c1257133000a48ea661b2f90ec Mon Sep 17 00:00:00 2001 From: Heilig Benedek Date: Wed, 27 Jul 2016 19:19:53 +0200 Subject: [PATCH] added onpaint to software path --- atom/browser/api/atom_api_web_contents.h | 2 +- atom/browser/osr_output_device.cc | 43 ++- atom/browser/osr_output_device.h | 9 + atom/browser/osr_window.cc | 10 +- atom/browser/osr_window.h | 7 +- default_app/default_app.js | 353 +++++++++++------------ default_app/main.js | 4 +- 7 files changed, 227 insertions(+), 201 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 99637672657..203dd9d4261 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -281,7 +281,7 @@ class WebContents : public mate::TrackableObject, private: AtomBrowserContext* GetBrowserContext() const; - OffScreenWindow::OnPaintCallback paint_callback_; + atom::OnPaintCallback paint_callback_; uint32_t GetNextRequestId() { return ++request_id_; diff --git a/atom/browser/osr_output_device.cc b/atom/browser/osr_output_device.cc index d1c32018073..4c2447594d0 100644 --- a/atom/browser/osr_output_device.cc +++ b/atom/browser/osr_output_device.cc @@ -8,7 +8,7 @@ namespace atom { -OffScreenOutputDevice::OffScreenOutputDevice() { +OffScreenOutputDevice::OffScreenOutputDevice() : callback_(nullptr) { std::cout << "OffScreenOutputDevice" << std::endl; } @@ -16,6 +16,10 @@ OffScreenOutputDevice::~OffScreenOutputDevice() { std::cout << "~OffScreenOutputDevice" << std::endl; } +void OffScreenOutputDevice::SetPaintCallback(const OnPaintCallback* callback) { + callback_.reset(callback); +} + void OffScreenOutputDevice::Resize( const gfx::Size& pixel_size, float scale_factor) { std::cout << "Resize" << std::endl; @@ -43,7 +47,7 @@ void OffScreenOutputDevice::Resize( } SkCanvas* OffScreenOutputDevice::BeginPaint(const gfx::Rect& damage_rect) { - std::cout << "BeginPaint" << std::endl; + // std::cout << "BeginPaint" << std::endl; DCHECK(canvas_.get()); DCHECK(bitmap_.get()); @@ -53,7 +57,7 @@ SkCanvas* OffScreenOutputDevice::BeginPaint(const gfx::Rect& damage_rect) { } void OffScreenOutputDevice::EndPaint() { - std::cout << "EndPaint" << std::endl; + // std::cout << "EndPaint" << std::endl; DCHECK(canvas_.get()); DCHECK(bitmap_.get()); @@ -62,14 +66,35 @@ void OffScreenOutputDevice::EndPaint() { cc::SoftwareOutputDevice::EndPaint(); - SkAutoLockPixels bitmap_pixels_lock(*bitmap_.get()); - //saveSkBitmapToBMPFile(*(bitmap_.get()), "test.bmp"); + OnPaint(damage_rect_); - uint8_t* pixels = reinterpret_cast(bitmap_->getPixels()); - for (int i = 0; i<16; i++) { - int x = static_cast(pixels[i]); - std::cout << std::hex << x << std::dec << std::endl; + // SkAutoLockPixels bitmap_pixels_lock(*bitmap_.get()); + // saveSkBitmapToBMPFile(*(bitmap_.get()), "test.bmp"); + + // uint8_t* pixels = reinterpret_cast(bitmap_->getPixels()); + // for (int i = 0; i<16; i++) { + // int x = static_cast(pixels[i]); + // std::cout << std::hex << x << std::dec << std::endl; + // } +} + + +void OffScreenOutputDevice::OnPaint(const gfx::Rect& damage_rect) { + gfx::Rect rect = damage_rect; + if (!pending_damage_rect_.IsEmpty()) { + rect.Union(pending_damage_rect_); + pending_damage_rect_.SetRect(0, 0, 0, 0); } + + rect.Intersect(gfx::Rect(viewport_pixel_size_)); + if (rect.IsEmpty()) + return; + + SkAutoLockPixels bitmap_pixels_lock(*bitmap_.get()); + // std::cout << "Paint" << std::endl; + if (callback_.get()) + callback_->Run(rect, bitmap_->width(), bitmap_->height(), + bitmap_->getPixels()); } } // namespace atom diff --git a/atom/browser/osr_output_device.h b/atom/browser/osr_output_device.h index 0721f88e8ed..a093b773637 100644 --- a/atom/browser/osr_output_device.h +++ b/atom/browser/osr_output_device.h @@ -8,15 +8,20 @@ #include "cc/output/software_output_device.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkCanvas.h" +#include "base/callback.h" #include "content/browser/web_contents/web_contents_view.h" namespace atom { + +typedef base::Callback OnPaintCallback; class OffScreenOutputDevice : public cc::SoftwareOutputDevice { public: OffScreenOutputDevice(); ~OffScreenOutputDevice(); + + void SetPaintCallback(const OnPaintCallback*); // void saveSkBitmapToBMPFile(const SkBitmap& skBitmap, const char* path); void Resize(const gfx::Size& pixel_size, float scale_factor) override; @@ -24,11 +29,15 @@ public: SkCanvas* BeginPaint(const gfx::Rect& damage_rect) override; void EndPaint() override; + + void OnPaint(const gfx::Rect& damage_rect); private: std::unique_ptr canvas_; std::unique_ptr bitmap_; gfx::Rect pending_damage_rect_; + + std::unique_ptr callback_; DISALLOW_COPY_AND_ASSIGN(OffScreenOutputDevice); }; diff --git a/atom/browser/osr_window.cc b/atom/browser/osr_window.cc index cdcc74fab14..b10886061fb 100644 --- a/atom/browser/osr_window.cc +++ b/atom/browser/osr_window.cc @@ -487,8 +487,10 @@ void OffScreenWindow::SendBeginFrame(base::TimeTicks frame_time, // std::cout << "sent begin frame" << std::endl; } -void OffScreenWindow::SetPaintCallback(const OnPaintCallback *callback) { +void OffScreenWindow::SetPaintCallback(const OnPaintCallback* callback) { paintCallback.reset(callback); + if (software_output_device_) + software_output_device_->SetPaintCallback(paintCallback.get()); } OffScreenWindow::~OffScreenWindow() { @@ -551,13 +553,7 @@ gfx::Vector2dF OffScreenWindow::GetLastScrollOffset() const { gfx::NativeView OffScreenWindow::GetNativeView() const { // std::cout << "GetNativeView" << std::endl; -#if defined(OS_MACOSX) return gfx::NativeView(); -#elif - auto widget = views::Widget::GetWidgetForNativeWindow( - native_window_->GetNativeWindow()); - return widget->GetNativeView(); -#endif } gfx::NativeViewAccessible OffScreenWindow::GetNativeViewAccessible() { diff --git a/atom/browser/osr_window.h b/atom/browser/osr_window.h index 030f1889fab..44a4f607347 100644 --- a/atom/browser/osr_window.h +++ b/atom/browser/osr_window.h @@ -65,9 +65,6 @@ class OffScreenWindow public ui::CompositorDelegate, public content::DelegatedFrameHostClient { public: - typedef base::Callback - OnPaintCallback; - OffScreenWindow(content::RenderWidgetHost*, NativeWindow*); ~OffScreenWindow(); @@ -190,8 +187,8 @@ public: void SendBeginFrame(base::TimeTicks frame_time, base::TimeDelta vsync_period); - std::unique_ptr paintCallback; - void SetPaintCallback(const OnPaintCallback*); + std::unique_ptr paintCallback; + void SetPaintCallback(const atom::OnPaintCallback*); private: void SetFrameRate(); diff --git a/default_app/default_app.js b/default_app/default_app.js index c0b3670b82c..dec319d9738 100644 --- a/default_app/default_app.js +++ b/default_app/default_app.js @@ -46,7 +46,7 @@ exports.load = (appUrl) => { end1 = +new Date(); const d = end1 - start1 - // console.log(`browser #1: ${d < 10 ? ` ${d}` : d} ms`) + console.log(`browser #1: ${d < 10 ? ` ${d}` : d} ms`) start1 = end1 }) @@ -62,7 +62,6 @@ exports.load = (appUrl) => { });*/ mainWindow2 = new BrowserWindow({ - //disableGPU: false, width: 800, height: 600, autoHideMenuBar: true, @@ -72,7 +71,7 @@ exports.load = (appUrl) => { nodeIntegration: false } }) - mainWindow2.loadURL('http://mrdoob.com/lab/javascript/requestanimationframe/') + mainWindow2.loadURL(appUrl) mainWindow2.focus() mainWindow2.webContents.on('dom-ready', () => { mainWindow2.webContents.beginFrameSubscription(() => { @@ -86,183 +85,183 @@ exports.load = (appUrl) => { end2 = +new Date(); const d = end2 - start2 - // console.log(`browser #2: ${d < 10 ? ` ${d}` : d} ms`) + console.log(`browser #2: ${d < 10 ? ` ${d}` : d} ms`) start2 = end2 }) - // - // mainWindow3 = new BrowserWindow({ - // width: 800, - // height: 600, - // autoHideMenuBar: true, - // backgroundColor: '#FFFFFF', - // useContentSize: true, - // webPreferences: { - // nodeIntegration: false - // } - // }) - // mainWindow3.loadURL(appUrl) - // mainWindow3.focus() - // mainWindow3.webContents.on('dom-ready', () => { - // mainWindow3.webContents.beginFrameSubscription(() => { - // console.log("asd") - // }) - // }) - // - // var start3, end3 - // start3 = +new Date(); - // mainWindow3.webContents.on('paint', (e, rect, w, h, data) => { - // end3 = +new Date(); - // - // const d = end3 - start3 - // console.log(`browser #3: ${d < 10 ? ` ${d}` : d} ms`) - // - // start3 = end3 - // }) - // - // mainWindow4 = new BrowserWindow({ - // width: 800, - // height: 600, - // autoHideMenuBar: true, - // backgroundColor: '#FFFFFF', - // useContentSize: true, - // webPreferences: { - // nodeIntegration: false - // } - // }) - // mainWindow4.loadURL(appUrl) - // mainWindow4.focus() - // mainWindow4.webContents.on('dom-ready', () => { - // mainWindow4.webContents.beginFrameSubscription(() => { - // console.log("asd") - // }) - // }) - // - // var start4, end4 - // start4 = +new Date(); - // mainWindow4.webContents.on('paint', (e, rect, w, h, data) => { - // end4 = +new Date(); - // - // const d = end4 - start4 - // console.log(`browser #4: ${d < 10 ? ` ${d}` : d} ms`) - // - // start4 = end4 - // }) + + mainWindow3 = new BrowserWindow({ + width: 800, + height: 600, + autoHideMenuBar: true, + backgroundColor: '#FFFFFF', + useContentSize: true, + webPreferences: { + nodeIntegration: false + } + }) + mainWindow3.loadURL(appUrl) + mainWindow3.focus() + mainWindow3.webContents.on('dom-ready', () => { + mainWindow3.webContents.beginFrameSubscription(() => { + console.log("asd") + }) + }) + + var start3, end3 + start3 = +new Date(); + mainWindow3.webContents.on('paint', (e, rect, w, h, data) => { + end3 = +new Date(); + + const d = end3 - start3 + console.log(`browser #3: ${d < 10 ? ` ${d}` : d} ms`) + + start3 = end3 + }) + + mainWindow4 = new BrowserWindow({ + width: 800, + height: 600, + autoHideMenuBar: true, + backgroundColor: '#FFFFFF', + useContentSize: true, + webPreferences: { + nodeIntegration: false + } + }) + mainWindow4.loadURL(appUrl) + mainWindow4.focus() + mainWindow4.webContents.on('dom-ready', () => { + mainWindow4.webContents.beginFrameSubscription(() => { + console.log("asd") + }) + }) + + var start4, end4 + start4 = +new Date(); + mainWindow4.webContents.on('paint', (e, rect, w, h, data) => { + end4 = +new Date(); + + const d = end4 - start4 + console.log(`browser #4: ${d < 10 ? ` ${d}` : d} ms`) + + start4 = end4 + }) - // mainWindow5 = new BrowserWindow({ - // width: 800, - // height: 600, - // autoHideMenuBar: true, - // backgroundColor: '#FFFFFF', - // useContentSize: true, - // webPreferences: { - // nodeIntegration: false - // } - // }) - // mainWindow5.loadURL(appUrl) - // mainWindow5.focus() - // mainWindow5.webContents.on('dom-ready', () => { - // mainWindow5.webContents.beginFrameSubscription(() => { - // console.log("asd") - // }) - // }) - // - // var start5, end5 - // start5 = +new Date(); - // mainWindow5.webContents.on('paint', (e, rect, w, h, data) => { - // end5 = +new Date(); - // - // const d = end5 - start5 - // console.log(`browser #5: ${d < 10 ? ` ${d}` : d} ms`) - // - // start5 = end5 - // }) - // - // mainWindow6 = new BrowserWindow({ - // width: 800, - // height: 600, - // autoHideMenuBar: true, - // backgroundColor: '#FFFFFF', - // useContentSize: true, - // webPreferences: { - // nodeIntegration: false - // } - // }) - // mainWindow6.loadURL(appUrl) - // mainWindow6.focus() - // mainWindow6.webContents.on('dom-ready', () => { - // mainWindow6.webContents.beginFrameSubscription(() => { - // console.log("asd") - // }) - // }) - // - // var start6, end6 - // start6 = +new Date(); - // mainWindow6.webContents.on('paint', (e, rect, w, h, data) => { - // end6 = +new Date(); - // - // const d = end6 - start6 - // console.log(`browser #6: ${d < 10 ? ` ${d}` : d} ms`) - // - // start6 = end6 - // }) - // - // mainWindow7 = new BrowserWindow({ - // width: 800, - // height: 600, - // autoHideMenuBar: true, - // backgroundColor: '#FFFFFF', - // useContentSize: true, - // webPreferences: { - // nodeIntegration: false - // } - // }) - // mainWindow7.loadURL(appUrl) - // mainWindow7.focus() - // mainWindow7.webContents.on('dom-ready', () => { - // mainWindow7.webContents.beginFrameSubscription(() => { - // console.log("asd") - // }) - // }) - // - // var start7, end7 - // start7 = +new Date(); - // mainWindow7.webContents.on('paint', (e, rect, w, h, data) => { - // end7 = +new Date(); - // - // const d = end7 - start7 - // console.log(`browser #7: ${d < 10 ? ` ${d}` : d} ms`) - // - // start7 = end7 - // }) - // - // mainWindow8 = new BrowserWindow({ - // width: 800, - // height: 600, - // autoHideMenuBar: true, - // backgroundColor: '#FFFFFF', - // useContentSize: true, - // webPreferences: { - // nodeIntegration: false - // } - // }) - // mainWindow8.loadURL(appUrl) - // mainWindow8.focus() - // mainWindow8.webContents.on('dom-ready', () => { - // mainWindow8.webContents.beginFrameSubscription(() => { - // console.log("asd") - // }) - // }) - // - // var start8, end8 - // start8 = +new Date(); - // mainWindow8.webContents.on('paint', (e, rect, w, h, data) => { - // end8 = +new Date(); - // - // const d = end8 - start8 - // console.log(`browser #8: ${d < 10 ? ` ${d}` : d} ms`) - // - // start8 = end8 - // }) + mainWindow5 = new BrowserWindow({ + width: 800, + height: 600, + autoHideMenuBar: true, + backgroundColor: '#FFFFFF', + useContentSize: true, + webPreferences: { + nodeIntegration: false + } + }) + mainWindow5.loadURL(appUrl) + mainWindow5.focus() + mainWindow5.webContents.on('dom-ready', () => { + mainWindow5.webContents.beginFrameSubscription(() => { + console.log("asd") + }) + }) + + var start5, end5 + start5 = +new Date(); + mainWindow5.webContents.on('paint', (e, rect, w, h, data) => { + end5 = +new Date(); + + const d = end5 - start5 + console.log(`browser #5: ${d < 10 ? ` ${d}` : d} ms`) + + start5 = end5 + }) + + mainWindow6 = new BrowserWindow({ + width: 800, + height: 600, + autoHideMenuBar: true, + backgroundColor: '#FFFFFF', + useContentSize: true, + webPreferences: { + nodeIntegration: false + } + }) + mainWindow6.loadURL(appUrl) + mainWindow6.focus() + mainWindow6.webContents.on('dom-ready', () => { + mainWindow6.webContents.beginFrameSubscription(() => { + console.log("asd") + }) + }) + + var start6, end6 + start6 = +new Date(); + mainWindow6.webContents.on('paint', (e, rect, w, h, data) => { + end6 = +new Date(); + + const d = end6 - start6 + console.log(`browser #6: ${d < 10 ? ` ${d}` : d} ms`) + + start6 = end6 + }) + + mainWindow7 = new BrowserWindow({ + width: 800, + height: 600, + autoHideMenuBar: true, + backgroundColor: '#FFFFFF', + useContentSize: true, + webPreferences: { + nodeIntegration: false + } + }) + mainWindow7.loadURL(appUrl) + mainWindow7.focus() + mainWindow7.webContents.on('dom-ready', () => { + mainWindow7.webContents.beginFrameSubscription(() => { + console.log("asd") + }) + }) + + var start7, end7 + start7 = +new Date(); + mainWindow7.webContents.on('paint', (e, rect, w, h, data) => { + end7 = +new Date(); + + const d = end7 - start7 + console.log(`browser #7: ${d < 10 ? ` ${d}` : d} ms`) + + start7 = end7 + }) + + mainWindow8 = new BrowserWindow({ + width: 800, + height: 600, + autoHideMenuBar: true, + backgroundColor: '#FFFFFF', + useContentSize: true, + webPreferences: { + nodeIntegration: false + } + }) + mainWindow8.loadURL(appUrl) + mainWindow8.focus() + mainWindow8.webContents.on('dom-ready', () => { + mainWindow8.webContents.beginFrameSubscription(() => { + console.log("asd") + }) + }) + + var start8, end8 + start8 = +new Date(); + mainWindow8.webContents.on('paint', (e, rect, w, h, data) => { + end8 = +new Date(); + + const d = end8 - start8 + console.log(`browser #8: ${d < 10 ? ` ${d}` : d} ms`) + + start8 = end8 + }) }) } diff --git a/default_app/main.js b/default_app/main.js index 17d4f0e668a..c09b91ca155 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -329,6 +329,6 @@ if (option.file && !option.webdriver) { startRepl() } else { const indexPath = path.join(__dirname, '/index.html') - loadApplicationByUrl(`http://www.e-try.com/black.htm`) - //loadApplicationByUrl(`http://mrdoob.com/lab/javascript/requestanimationframe/`) + //loadApplicationByUrl(`http://www.e-try.com/black.htm`) + loadApplicationByUrl(`http://mrdoob.com/lab/javascript/requestanimationframe/`) }