Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(276)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 88033002: Add RGB565 Texture readback support in gl_helper (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Patch for RGB565 format texture readback in gl_helper Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/render_widget_host_view_android.h" 5 #include "content/browser/renderer_host/render_widget_host_view_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 } 567 }
568 568
569 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( 569 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface(
570 const gfx::Rect& src_subrect, 570 const gfx::Rect& src_subrect,
571 const gfx::Size& dst_size, 571 const gfx::Size& dst_size,
572 const base::Callback<void(bool, const SkBitmap&)>& callback) { 572 const base::Callback<void(bool, const SkBitmap&)>& callback) {
573 if (!using_synchronous_compositor_ && !IsSurfaceAvailableForCopy()) { 573 if (!using_synchronous_compositor_ && !IsSurfaceAvailableForCopy()) {
574 callback.Run(false, SkBitmap()); 574 callback.Run(false, SkBitmap());
575 return; 575 return;
576 } 576 }
577
578 const gfx::Display& display = 577 const gfx::Display& display =
579 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); 578 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
580 float device_scale_factor = display.device_scale_factor(); 579 float device_scale_factor = display.device_scale_factor();
581 580
582 DCHECK_EQ(device_scale_factor, 581 DCHECK_EQ(device_scale_factor,
583 ui::GetImageScale(GetScaleFactorForView(this))); 582 ui::GetImageScale(GetScaleFactorForView(this)));
584 583
585 const gfx::Size& dst_size_in_pixel = ConvertViewSizeToPixel(this, dst_size); 584 const gfx::Size& dst_size_in_pixel = ConvertViewSizeToPixel(this, dst_size);
586 gfx::Rect src_subrect_in_pixel = 585 gfx::Rect src_subrect_in_pixel =
587 ConvertRectToPixel(device_scale_factor, src_subrect); 586 ConvertRectToPixel(device_scale_factor, src_subrect);
588 587
589 if (using_synchronous_compositor_) { 588 if (using_synchronous_compositor_) {
590 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback); 589 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback);
591 return; 590 return;
592 } 591 }
593 592 //Support format either for ARGB8888 and RGB565.
593 bool readback_config_rgb565 = content_view_core_->IsReadBackConfig565();
594 scoped_ptr<cc::CopyOutputRequest> request; 594 scoped_ptr<cc::CopyOutputRequest> request;
595 if (src_subrect_in_pixel.size() == dst_size_in_pixel) { 595 if (src_subrect_in_pixel.size() == dst_size_in_pixel) {
596 request = cc::CopyOutputRequest::CreateBitmapRequest(base::Bind( 596 request = cc::CopyOutputRequest::CreateBitmapRequest(base::Bind(
597 &RenderWidgetHostViewAndroid::PrepareBitmapCopyOutputResult, 597 &RenderWidgetHostViewAndroid::PrepareBitmapCopyOutputResult,
598 dst_size_in_pixel, 598 dst_size_in_pixel,
599 callback)); 599 callback));
600 } else { 600 } else {
601 request = cc::CopyOutputRequest::CreateRequest(base::Bind( 601 request = cc::CopyOutputRequest::CreateRequest(base::Bind(
602 &RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult, 602 &RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult,
603 dst_size_in_pixel, 603 dst_size_in_pixel,
604 readback_config_rgb565,
604 callback)); 605 callback));
605 } 606 }
606 request->set_area(src_subrect_in_pixel); 607 request->set_area(src_subrect_in_pixel);
607 layer_->RequestCopyOfOutput(request.Pass()); 608 layer_->RequestCopyOfOutput(request.Pass());
608 } 609 }
609 610
610 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( 611 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame(
611 const gfx::Rect& src_subrect, 612 const gfx::Rect& src_subrect,
612 const scoped_refptr<media::VideoFrame>& target, 613 const scoped_refptr<media::VideoFrame>& target,
613 const base::Callback<void(bool)>& callback) { 614 const base::Callback<void(bool)>& callback) {
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 texture_layer_->SetIsDrawable(false); 1289 texture_layer_->SetIsDrawable(false);
1289 if (delegated_renderer_layer_.get()) 1290 if (delegated_renderer_layer_.get())
1290 DestroyDelegatedContent(); 1291 DestroyDelegatedContent();
1291 texture_id_in_layer_ = 0; 1292 texture_id_in_layer_ = 0;
1292 RunAckCallbacks(); 1293 RunAckCallbacks();
1293 } 1294 }
1294 1295
1295 // static 1296 // static
1296 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( 1297 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
1297 const gfx::Size& dst_size_in_pixel, 1298 const gfx::Size& dst_size_in_pixel,
1299 bool readback_config_rgb565,
1298 const base::Callback<void(bool, const SkBitmap&)>& callback, 1300 const base::Callback<void(bool, const SkBitmap&)>& callback,
1299 scoped_ptr<cc::CopyOutputResult> result) { 1301 scoped_ptr<cc::CopyOutputResult> result) {
1300 DCHECK(result->HasTexture()); 1302 DCHECK(result->HasTexture());
1301 base::ScopedClosureRunner scoped_callback_runner( 1303 base::ScopedClosureRunner scoped_callback_runner(
1302 base::Bind(callback, false, SkBitmap())); 1304 base::Bind(callback, false, SkBitmap()));
1303 1305
1304 if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty()) 1306 if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty())
1305 return; 1307 return;
1306 1308
1307 scoped_ptr<SkBitmap> bitmap(new SkBitmap); 1309 scoped_ptr<SkBitmap> bitmap(new SkBitmap);
1308 bitmap->setConfig(SkBitmap::kARGB_8888_Config, 1310 if(readback_config_rgb565){
1311 bitmap->setConfig(SkBitmap::kRGB_565_Config,
1309 dst_size_in_pixel.width(), dst_size_in_pixel.height(), 1312 dst_size_in_pixel.width(), dst_size_in_pixel.height(),
1310 0, kOpaque_SkAlphaType); 1313 0, kOpaque_SkAlphaType);
1314 }
1315 else{
1316 bitmap->setConfig(SkBitmap::kARGB_8888_Config,
1317 dst_size_in_pixel.width(), dst_size_in_pixel.height(),
1318 0, kOpaque_SkAlphaType);
1319 }
1311 if (!bitmap->allocPixels()) 1320 if (!bitmap->allocPixels())
1312 return; 1321 return;
1313 1322
1314 ImageTransportFactoryAndroid* factory = 1323 ImageTransportFactoryAndroid* factory =
1315 ImageTransportFactoryAndroid::GetInstance(); 1324 ImageTransportFactoryAndroid::GetInstance();
1316 GLHelper* gl_helper = factory->GetGLHelper(); 1325 GLHelper* gl_helper = factory->GetGLHelper();
1317 if (!gl_helper) 1326 if (!gl_helper)
1318 return; 1327 return;
1319 1328
1320 scoped_ptr<SkAutoLockPixels> bitmap_pixels_lock( 1329 scoped_ptr<SkAutoLockPixels> bitmap_pixels_lock(
1321 new SkAutoLockPixels(*bitmap)); 1330 new SkAutoLockPixels(*bitmap));
1322 uint8* pixels = static_cast<uint8*>(bitmap->getPixels()); 1331 uint8* pixels = static_cast<uint8*>(bitmap->getPixels());
1323 1332
1324 cc::TextureMailbox texture_mailbox; 1333 cc::TextureMailbox texture_mailbox;
1325 scoped_ptr<cc::SingleReleaseCallback> release_callback; 1334 scoped_ptr<cc::SingleReleaseCallback> release_callback;
1326 result->TakeTexture(&texture_mailbox, &release_callback); 1335 result->TakeTexture(&texture_mailbox, &release_callback);
1327 DCHECK(texture_mailbox.IsTexture()); 1336 DCHECK(texture_mailbox.IsTexture());
1328 if (!texture_mailbox.IsTexture()) 1337 if (!texture_mailbox.IsTexture())
1329 return; 1338 return;
1330 1339
1331 ignore_result(scoped_callback_runner.Release()); 1340 ignore_result(scoped_callback_runner.Release());
1332 1341
1333 gl_helper->CropScaleReadbackAndCleanMailbox( 1342 gl_helper->CropScaleReadbackAndCleanMailbox(
1334 texture_mailbox.name(), 1343 texture_mailbox.name(),
1335 texture_mailbox.sync_point(), 1344 texture_mailbox.sync_point(),
1336 result->size(), 1345 result->size(),
1337 gfx::Rect(result->size()), 1346 gfx::Rect(result->size()),
1338 dst_size_in_pixel, 1347 dst_size_in_pixel,
1339 pixels, 1348 pixels,
1349 readback_config_rgb565,
1340 base::Bind(&CopyFromCompositingSurfaceFinished, 1350 base::Bind(&CopyFromCompositingSurfaceFinished,
1341 callback, 1351 callback,
1342 base::Passed(&release_callback), 1352 base::Passed(&release_callback),
1343 base::Passed(&bitmap), 1353 base::Passed(&bitmap),
1344 base::Passed(&bitmap_pixels_lock))); 1354 base::Passed(&bitmap_pixels_lock)));
1345 } 1355 }
1346 1356
1347 // static 1357 // static
1348 void RenderWidgetHostViewAndroid::PrepareBitmapCopyOutputResult( 1358 void RenderWidgetHostViewAndroid::PrepareBitmapCopyOutputResult(
1349 const gfx::Size& dst_size_in_pixel, 1359 const gfx::Size& dst_size_in_pixel,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1387 // RenderWidgetHostView, public: 1397 // RenderWidgetHostView, public:
1388 1398
1389 // static 1399 // static
1390 RenderWidgetHostView* 1400 RenderWidgetHostView*
1391 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1401 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
1392 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1402 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
1393 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1403 return new RenderWidgetHostViewAndroid(rwhi, NULL);
1394 } 1404 }
1395 1405
1396 } // namespace content 1406 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698