From 6fc819dae1cbe3f2845ff53ca2ff01ec4087c342 Mon Sep 17 00:00:00 2001 From: Nitish Sakhawalkar Date: Tue, 10 Apr 2018 03:07:15 -0700 Subject: [PATCH] Fix transparency in capturePage (#12561) * Fix transparent window capture. Transparency is preserved and not converted to black pixels anymore * Add test to make sure aplha channel exists in captured image --- atom/browser/api/atom_api_web_contents.cc | 3 +++ spec/api-browser-window-spec.js | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index dd3e1e2499b7..1be932a0b558 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -276,6 +276,9 @@ content::ServiceWorkerContext* GetServiceWorkerContext( void OnCapturePageDone(const base::Callback& callback, const SkBitmap& bitmap, content::ReadbackResponse response) { + // Hack to enable transparency in captured image + // TODO(nitsakh) Remove hack once fixed in chromium + const_cast(bitmap).setAlphaType(kPremul_SkAlphaType); callback.Run(gfx::Image::CreateFrom1xBitmap(bitmap)); } diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index d272203a874b..4a3853fc0bb7 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -442,6 +442,29 @@ describe('BrowserWindow module', () => { done() }) }) + + it('preserves transparency', (done) => { + w.close() + const width = 400 + const height = 400 + w = new BrowserWindow({ + show: false, + width: width, + height: height, + transparent: true + }) + w.loadURL('data:text/html,') + w.once('ready-to-show', () => { + w.show() + w.capturePage((image) => { + let imgBuffer = image.toPNG() + // Check 25th byte in the PNG + // Values can be 0,2,3,4, or 6. We want 6, which is RGB + Alpha + assert.equal(imgBuffer[25], 6) + done() + }) + }) + }) }) describe('BrowserWindow.setSize(width, height)', () => {