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

Side by Side Diff: android_webview/native/aw_contents.cc

Issue 11732002: [Android WebView] Update SW rendering to use SkPicture and fix scrolling cases. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: extend to fix sw rendering scroll. Created 7 years, 11 months 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 | Annotate | Revision Log
« no previous file with comments | « android_webview/native/aw_contents.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "android_webview/native/aw_contents.h" 5 #include "android_webview/native/aw_contents.h"
6 6
7 #include <sys/system_properties.h> 7 #include <sys/system_properties.h>
8 8
9 #include "android_webview/browser/aw_browser_main_parts.h" 9 #include "android_webview/browser/aw_browser_main_parts.h"
10 #include "android_webview/browser/net_disk_cache_remover.h" 10 #include "android_webview/browser/net_disk_cache_remover.h"
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 AwContents::AwContents(JNIEnv* env, 153 AwContents::AwContents(JNIEnv* env,
154 jobject obj, 154 jobject obj,
155 jobject web_contents_delegate, 155 jobject web_contents_delegate,
156 bool private_browsing) 156 bool private_browsing)
157 : java_ref_(env, obj), 157 : java_ref_(env, obj),
158 web_contents_delegate_( 158 web_contents_delegate_(
159 new AwWebContentsDelegate(env, web_contents_delegate)), 159 new AwWebContentsDelegate(env, web_contents_delegate)),
160 view_visible_(false), 160 view_visible_(false),
161 compositor_visible_(false), 161 compositor_visible_(false),
162 is_composite_pending_(false), 162 is_composite_pending_(false),
163 last_scroll_x_(0), last_scroll_y_(0),
164 last_frame_context_(NULL) { 163 last_frame_context_(NULL) {
165 RendererPictureMap::CreateInstance(); 164 RendererPictureMap::CreateInstance();
166 android_webview::AwBrowserDependencyFactory* dependency_factory = 165 android_webview::AwBrowserDependencyFactory* dependency_factory =
167 android_webview::AwBrowserDependencyFactory::GetInstance(); 166 android_webview::AwBrowserDependencyFactory::GetInstance();
168 167
169 // TODO(joth): rather than create and set the WebContents here, expose the 168 // TODO(joth): rather than create and set the WebContents here, expose the
170 // factory method to java side and have that orchestrate the construction 169 // factory method to java side and have that orchestrate the construction
171 // order. 170 // order.
172 SetWebContents(dependency_factory->CreateWebContents(private_browsing)); 171 SetWebContents(dependency_factory->CreateWebContents(private_browsing));
173 } 172 }
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 LOG(WARNING) << "No current context attached. Skipping composite."; 305 LOG(WARNING) << "No current context attached. Skipping composite.";
307 return; 306 return;
308 } 307 }
309 308
310 if (last_frame_context_ != current_context) { 309 if (last_frame_context_ != current_context) {
311 if (last_frame_context_) 310 if (last_frame_context_)
312 ResetCompositor(); 311 ResetCompositor();
313 last_frame_context_ = current_context; 312 last_frame_context_ = current_context;
314 } 313 }
315 314
316 gfx::Transform transform;
317 compositor_->SetWindowBounds(gfx::Size(draw_info->width, draw_info->height)); 315 compositor_->SetWindowBounds(gfx::Size(draw_info->width, draw_info->height));
318 316
319 if (draw_info->is_layer) { 317 if (draw_info->is_layer) {
320 // When rendering into a separate layer no view clipping, transform, 318 // When rendering into a separate layer no view clipping, transform,
321 // scissoring or background transparency need to be handled. 319 // scissoring or background transparency need to be handled.
322 // The Android framework will composite us afterwards. 320 // The Android framework will composite us afterwards.
323 compositor_->SetHasTransparentBackground(false); 321 compositor_->SetHasTransparentBackground(false);
324 view_clip_layer_->setMasksToBounds(false); 322 view_clip_layer_->setMasksToBounds(false);
323 transform_layer_->setTransform(gfx::Transform());
325 scissor_clip_layer_->setMasksToBounds(false); 324 scissor_clip_layer_->setMasksToBounds(false);
326 scissor_clip_layer_->setPosition(gfx::PointF()); 325 scissor_clip_layer_->setPosition(gfx::PointF());
327 scissor_clip_layer_->setBounds(gfx::Size()); 326 scissor_clip_layer_->setBounds(gfx::Size());
328 scissor_clip_layer_->setSublayerTransform(gfx::Transform()); 327 scissor_clip_layer_->setSublayerTransform(gfx::Transform());
329 328
330 } else { 329 } else {
331 compositor_->SetHasTransparentBackground(true); 330 compositor_->SetHasTransparentBackground(true);
332 331
333 gfx::Rect clip_rect(draw_info->clip_left, draw_info->clip_top, 332 gfx::Rect clip_rect(draw_info->clip_left, draw_info->clip_top,
334 draw_info->clip_right - draw_info->clip_left, 333 draw_info->clip_right - draw_info->clip_left,
335 draw_info->clip_bottom - draw_info->clip_top); 334 draw_info->clip_bottom - draw_info->clip_top);
336 335
337 scissor_clip_layer_->setPosition(clip_rect.origin()); 336 scissor_clip_layer_->setPosition(clip_rect.origin());
338 scissor_clip_layer_->setBounds(clip_rect.size()); 337 scissor_clip_layer_->setBounds(clip_rect.size());
339 scissor_clip_layer_->setMasksToBounds(true); 338 scissor_clip_layer_->setMasksToBounds(true);
340 339
341 // The compositor clipping architecture enforces us to have the clip layer 340 // The compositor clipping architecture enforces us to have the clip layer
342 // as an ancestor of the area we want to clip, but this makes the transform 341 // as an ancestor of the area we want to clip, but this makes the transform
343 // become relative to the clip area rather than the full surface. The clip 342 // become relative to the clip area rather than the full surface. The clip
344 // position offset needs to be undone before applying the transform. 343 // position offset needs to be undone before applying the transform.
345 gfx::Transform undo_clip_position; 344 gfx::Transform undo_clip_position;
346 undo_clip_position.Translate(-clip_rect.x(), -clip_rect.y()); 345 undo_clip_position.Translate(-clip_rect.x(), -clip_rect.y());
347 scissor_clip_layer_->setSublayerTransform(undo_clip_position); 346 scissor_clip_layer_->setSublayerTransform(undo_clip_position);
348 347
348 gfx::Transform transform;
349 transform.matrix().setColMajorf(draw_info->transform); 349 transform.matrix().setColMajorf(draw_info->transform);
350
351 // The scrolling values of the Android Framework affect the transformation
352 // matrix. This needs to be undone to let the compositor handle scrolling.
353 transform.Translate(hw_rendering_scroll_.x(), hw_rendering_scroll_.y());
354 transform_layer_->setTransform(transform);
355
350 view_clip_layer_->setMasksToBounds(true); 356 view_clip_layer_->setMasksToBounds(true);
351 } 357 }
352 358
353 // The scrolling values of the Android Framework affect the transformation
354 // matrix. This needs to be undone to let the compositor handle scrolling.
355 transform.Translate(last_scroll_x_, last_scroll_y_);
356 transform_layer_->setTransform(transform);
357
358 compositor_->Composite(); 359 compositor_->Composite();
359 is_composite_pending_ = false; 360 is_composite_pending_ = false;
360 361
361 // TODO(leandrogracia): remove when crbug.com/164140 is closed. 362 // TODO(leandrogracia): remove when crbug.com/164140 is closed.
362 // --------------------------------------------------------------------------- 363 // ---------------------------------------------------------------------------
363 char no_gl_restore_prop[PROP_VALUE_MAX]; 364 char no_gl_restore_prop[PROP_VALUE_MAX];
364 __system_property_get("webview.chromium_no_gl_restore", no_gl_restore_prop); 365 __system_property_get("webview.chromium_no_gl_restore", no_gl_restore_prop);
365 if (!strcmp(no_gl_restore_prop, "true")) { 366 if (!strcmp(no_gl_restore_prop, "true")) {
366 LOG(WARNING) << "Android GL functor not restoring the previous GL state."; 367 LOG(WARNING) << "Android GL functor not restoring the previous GL state.";
367 } else { 368 } else {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 glDisable(GL_SCISSOR_TEST); 415 glDisable(GL_SCISSOR_TEST);
415 416
416 glScissor(scissor_box[0], scissor_box[1], scissor_box[2], 417 glScissor(scissor_box[0], scissor_box[1], scissor_box[2],
417 scissor_box[3]); 418 scissor_box[3]);
418 419
419 glUseProgram(current_program); 420 glUseProgram(current_program);
420 } 421 }
421 // --------------------------------------------------------------------------- 422 // ---------------------------------------------------------------------------
422 } 423 }
423 424
424 bool AwContents::DrawSW(JNIEnv* env, jobject obj, jobject java_canvas) { 425 bool AwContents::DrawSW(JNIEnv* env, jobject obj, jobject java_canvas,
426 jint scroll_x, jint scroll_y) {
425 scoped_refptr<cc::PicturePileImpl> picture = 427 scoped_refptr<cc::PicturePileImpl> picture =
426 RendererPictureMap::GetInstance()->GetRendererPicture( 428 RendererPictureMap::GetInstance()->GetRendererPicture(
427 web_contents_->GetRoutingID()); 429 web_contents_->GetRoutingID());
428 if (!picture) 430 if (!picture)
429 return false; 431 return false;
430 432
431 AwPixelInfo* pixels; 433 AwPixelInfo* pixels;
432 if (!g_draw_sw_functions || 434 if (!g_draw_sw_functions ||
433 (pixels = g_draw_sw_functions->access_pixels(env, java_canvas)) == NULL) { 435 (pixels = g_draw_sw_functions->access_pixels(env, java_canvas)) == NULL) {
434 // TODO(joth): Fall back to slow path rendering via temporary bitmap. 436 // TODO(joth): Fall back to slow path rendering via temporary bitmap.
435 return false; 437 return false;
436 } 438 }
437 439
438 { 440 {
439 SkBitmap bitmap; 441 SkBitmap bitmap;
440 bitmap.setConfig(static_cast<SkBitmap::Config>(pixels->config), 442 bitmap.setConfig(static_cast<SkBitmap::Config>(pixels->config),
441 pixels->width, 443 pixels->width,
442 pixels->height, 444 pixels->height,
443 pixels->row_bytes); 445 pixels->row_bytes);
444 bitmap.setPixels(pixels->pixels); 446 bitmap.setPixels(pixels->pixels);
445 SkDevice device(bitmap); 447 SkDevice device(bitmap);
446 SkCanvas canvas(&device); 448 SkCanvas canvas(&device);
447 SkMatrix matrix; 449 SkMatrix matrix;
448 for (int i = 0; i < 9; i++) { 450 for (int i = 0; i < 9; i++) {
449 matrix.set(i, pixels->matrix[i]); 451 matrix.set(i, pixels->matrix[i]);
450 } 452 }
451 canvas.setMatrix(matrix); 453 canvas.setMatrix(matrix);
452 454
455 // Scroll needs to be undone to let the Chrome compositor handle scrolling.
456 canvas.translate(scroll_x, scroll_y);
Leandro GraciĆ” Gil 2013/01/04 21:21:24 As part of the review of https://codereview.chromi
457
453 SkRegion clip; 458 SkRegion clip;
454 if (pixels->clip_region_size) { 459 if (pixels->clip_region_size) {
455 size_t bytes_read = clip.readFromMemory(pixels->clip_region); 460 size_t bytes_read = clip.readFromMemory(pixels->clip_region);
456 DCHECK_EQ(pixels->clip_region_size, bytes_read); 461 DCHECK_EQ(pixels->clip_region_size, bytes_read);
457 canvas.setClipRegion(clip); 462 canvas.setClipRegion(clip);
458 } else { 463 } else {
459 clip.setRect(SkIRect::MakeWH(pixels->width, pixels->height)); 464 clip.setRect(SkIRect::MakeWH(pixels->width, pixels->height));
460 } 465 }
461 466
462 SkIRect sk_clip_rect = clip.getBounds();
463 gfx::Rect clip_rect(sk_clip_rect.x(), sk_clip_rect.y(),
464 sk_clip_rect.width(), sk_clip_rect.height());
465
466 cc::RenderingStats stats; 467 cc::RenderingStats stats;
467 picture->Raster(&canvas, clip_rect, 1.0, &stats); 468 gfx::Rect content_rect(scroll_x, scroll_y, view_size_.width(),
469 view_size_.height());
470 picture->Raster(&canvas, content_rect, 1.0, &stats);
468 } 471 }
469 472
470 g_draw_sw_functions->release_pixels(pixels); 473 g_draw_sw_functions->release_pixels(pixels);
471 return true; 474 return true;
472 } 475 }
473 476
474 jint AwContents::GetWebContents(JNIEnv* env, jobject obj) { 477 jint AwContents::GetWebContents(JNIEnv* env, jobject obj) {
475 return reinterpret_cast<jint>(web_contents_.get()); 478 return reinterpret_cast<jint>(web_contents_.get());
476 } 479 }
477 480
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 856
854 Pickle pickle(reinterpret_cast<const char*>(state_vector.begin()), 857 Pickle pickle(reinterpret_cast<const char*>(state_vector.begin()),
855 state_vector.size()); 858 state_vector.size());
856 PickleIterator iterator(pickle); 859 PickleIterator iterator(pickle);
857 860
858 return RestoreFromPickle(&iterator, web_contents_.get()); 861 return RestoreFromPickle(&iterator, web_contents_.get());
859 } 862 }
860 863
861 void AwContents::SetScrollForHWFrame(JNIEnv* env, jobject obj, 864 void AwContents::SetScrollForHWFrame(JNIEnv* env, jobject obj,
862 int scroll_x, int scroll_y) { 865 int scroll_x, int scroll_y) {
863 last_scroll_x_ = scroll_x; 866 hw_rendering_scroll_ = gfx::Point(scroll_x, scroll_y);
864 last_scroll_y_ = scroll_y;
865 } 867 }
866 868
867 void AwContents::SetPendingWebContentsForPopup( 869 void AwContents::SetPendingWebContentsForPopup(
868 scoped_ptr<content::WebContents> pending) { 870 scoped_ptr<content::WebContents> pending) {
869 if (pending_contents_.get()) { 871 if (pending_contents_.get()) {
870 // TODO(benm): Support holding multiple pop up window requests. 872 // TODO(benm): Support holding multiple pop up window requests.
871 LOG(WARNING) << "Blocking popup window creation as an outstanding " 873 LOG(WARNING) << "Blocking popup window creation as an outstanding "
872 << "popup window is still pending."; 874 << "popup window is still pending.";
873 MessageLoop::current()->DeleteSoon(FROM_HERE, pending.release()); 875 MessageLoop::current()->DeleteSoon(FROM_HERE, pending.release());
874 return; 876 return;
(...skipping 11 matching lines...) Expand all
886 888
887 void AwContents::OnPictureUpdated(int process_id, int render_view_id) { 889 void AwContents::OnPictureUpdated(int process_id, int render_view_id) {
888 CHECK_EQ(web_contents_->GetRenderProcessHost()->GetID(), process_id); 890 CHECK_EQ(web_contents_->GetRenderProcessHost()->GetID(), process_id);
889 if (render_view_id != web_contents_->GetRoutingID()) 891 if (render_view_id != web_contents_->GetRoutingID())
890 return; 892 return;
891 893
892 Invalidate(); 894 Invalidate();
893 } 895 }
894 896
895 } // namespace android_webview 897 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/native/aw_contents.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698