Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/browser/in_process_view_renderer.h" | 5 #include "android_webview/browser/in_process_view_renderer.h" |
| 6 | 6 |
| 7 #include <android/bitmap.h> | 7 #include <android/bitmap.h> |
| 8 | 8 |
| 9 #include "android_webview/browser/aw_gl_surface.h" | 9 #include "android_webview/browser/aw_gl_surface.h" |
| 10 #include "android_webview/browser/scoped_app_gl_state_restore.h" | 10 #include "android_webview/browser/scoped_app_gl_state_restore.h" |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 561 TRACE_EVENT0("android_webview", "InProcessViewRenderer::CapturePicture"); | 561 TRACE_EVENT0("android_webview", "InProcessViewRenderer::CapturePicture"); |
| 562 | 562 |
| 563 // Return empty Picture objects for empty SkPictures. | 563 // Return empty Picture objects for empty SkPictures. |
| 564 skia::RefPtr<SkPicture> picture = skia::AdoptRef(new SkPicture); | 564 skia::RefPtr<SkPicture> picture = skia::AdoptRef(new SkPicture); |
| 565 if (width <= 0 || height <= 0) { | 565 if (width <= 0 || height <= 0) { |
| 566 return picture; | 566 return picture; |
| 567 } | 567 } |
| 568 | 568 |
| 569 // Reset scroll back to the origin, will go back to the old | 569 // Reset scroll back to the origin, will go back to the old |
| 570 // value when scroll_reset is out of scope. | 570 // value when scroll_reset is out of scope. |
| 571 base::AutoReset<gfx::Vector2dF> scroll_reset(&scroll_offset_css_, | 571 base::AutoReset<gfx::Vector2dF> scroll_reset(&scroll_offset_dip_, |
| 572 gfx::Vector2d()); | 572 gfx::Vector2d()); |
| 573 | 573 |
| 574 SkCanvas* rec_canvas = picture->beginRecording(width, height, 0); | 574 SkCanvas* rec_canvas = picture->beginRecording(width, height, 0); |
| 575 if (compositor_) | 575 if (compositor_) |
| 576 CompositeSW(rec_canvas); | 576 CompositeSW(rec_canvas); |
| 577 picture->endRecording(); | 577 picture->endRecording(); |
| 578 return picture; | 578 return picture; |
| 579 } | 579 } |
| 580 | 580 |
| 581 void InProcessViewRenderer::EnableOnNewPicture(bool enabled) { | 581 void InProcessViewRenderer::EnableOnNewPicture(bool enabled) { |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 708 void InProcessViewRenderer::SetDipScale(float dip_scale) { | 708 void InProcessViewRenderer::SetDipScale(float dip_scale) { |
| 709 dip_scale_ = dip_scale; | 709 dip_scale_ = dip_scale; |
| 710 CHECK(dip_scale_ > 0); | 710 CHECK(dip_scale_ > 0); |
| 711 } | 711 } |
| 712 | 712 |
| 713 void InProcessViewRenderer::SetPageScaleFactor(float page_scale_factor) { | 713 void InProcessViewRenderer::SetPageScaleFactor(float page_scale_factor) { |
| 714 page_scale_factor_ = page_scale_factor; | 714 page_scale_factor_ = page_scale_factor; |
| 715 CHECK(page_scale_factor_ > 0); | 715 CHECK(page_scale_factor_ > 0); |
| 716 } | 716 } |
| 717 | 717 |
| 718 void InProcessViewRenderer::ScrollTo(gfx::Vector2d new_value) { | 718 gfx::Vector2d InProcessViewRenderer::max_scroll_offset() const { |
| 719 DCHECK(dip_scale_ > 0); | 719 DCHECK(dip_scale_ > 0); |
| 720 // In general we don't guarantee that the scroll offset transforms are | 720 return gfx::ToRoundedVector2d(gfx::ScaleVector2d( |
|
aelias_OOO_until_Jul13
2013/09/24 22:03:19
Is there a reason why you're using Rounded and not
mkosiba (inactive)
2013/09/24 23:18:53
no, there was no particular reason. I assumed the
| |
| 721 // symmetrical. That is if scrolling from JS to offset1 results in a native | 721 max_scroll_offset_dip_, dip_scale_ * page_scale_factor_)); |
| 722 // offset2 then scrolling from UI to offset2 results in JS being scrolled to | 722 } |
| 723 // offset1 again. | |
| 724 // The reason we explicitly do rounding here is that it seems to yeld the | |
| 725 // most stabile transformation. | |
| 726 gfx::Vector2dF new_value_css = gfx::ToRoundedVector2d( | |
| 727 gfx::ScaleVector2d(new_value, 1.0f / (dip_scale_ * page_scale_factor_))); | |
| 728 | 723 |
| 729 // It's possible that more than one set of unique physical coordinates maps | 724 void InProcessViewRenderer::ScrollTo(gfx::Vector2d scroll_offset) { |
| 730 // to the same set of CSS coordinates which means we can't reliably early-out | 725 gfx::Vector2d max_offset = max_scroll_offset(); |
| 731 // earlier in the call stack. | 726 gfx::Vector2dF scroll_offset_dip; |
| 732 if (scroll_offset_css_ == new_value_css) | 727 if (max_offset.x()) { |
| 728 scroll_offset_dip.set_x((scroll_offset.x() * max_scroll_offset_dip_.x()) / | |
| 729 max_offset.x()); | |
| 730 } | |
| 731 if (max_offset.y()) { | |
| 732 scroll_offset_dip.set_y((scroll_offset.y() * max_scroll_offset_dip_.y()) / | |
| 733 max_offset.y()); | |
|
mkosiba (inactive)
2013/09/24 18:43:05
I could alternatively write these as
gfx::Vecto
aelias_OOO_until_Jul13
2013/09/24 22:03:19
The current way is fine. Could you add a comment
| |
| 734 } | |
| 735 | |
| 736 DCHECK(0 <= scroll_offset_dip.x()); | |
|
aelias_OOO_until_Jul13
2013/09/24 22:03:19
Use DCHECK_LE instead. That gives more informativ
mkosiba (inactive)
2013/09/25 14:23:49
Done.
| |
| 737 DCHECK(0 <= scroll_offset_dip.y()); | |
| 738 DCHECK(scroll_offset_dip.x() <= max_scroll_offset_dip_.x()); | |
| 739 DCHECK(scroll_offset_dip.y() <= max_scroll_offset_dip_.y()); | |
| 740 | |
| 741 if (scroll_offset_dip_ == scroll_offset_dip) | |
| 733 return; | 742 return; |
| 734 | 743 |
| 735 scroll_offset_css_ = new_value_css; | 744 scroll_offset_dip_ = scroll_offset_dip; |
| 736 | 745 |
| 737 if (compositor_) | 746 if (compositor_) |
| 738 compositor_->DidChangeRootLayerScrollOffset(); | 747 compositor_->DidChangeRootLayerScrollOffset(); |
| 739 } | 748 } |
| 740 | 749 |
| 741 void InProcessViewRenderer::DidUpdateContent() { | 750 void InProcessViewRenderer::DidUpdateContent() { |
| 742 if (on_new_picture_enable_) | 751 if (on_new_picture_enable_) |
| 743 client_->OnNewPicture(); | 752 client_->OnNewPicture(); |
| 744 } | 753 } |
| 745 | 754 |
| 755 void InProcessViewRenderer::SetMaxRootLayerScrollOffset( | |
| 756 gfx::Vector2dF new_value_dip) { | |
| 757 DCHECK(dip_scale_ > 0); | |
| 758 | |
| 759 max_scroll_offset_dip_ = new_value_dip; | |
| 760 DCHECK(max_scroll_offset_dip_.x() >= 0); | |
| 761 DCHECK(max_scroll_offset_dip_.y() >= 0); | |
| 762 | |
| 763 client_->SetMaxContainerViewScrollOffset(max_scroll_offset()); | |
| 764 } | |
| 765 | |
| 746 void InProcessViewRenderer::SetTotalRootLayerScrollOffset( | 766 void InProcessViewRenderer::SetTotalRootLayerScrollOffset( |
| 747 gfx::Vector2dF new_value_css) { | 767 gfx::Vector2dF scroll_offset_dip) { |
| 748 // TOOD(mkosiba): Add a DCHECK to say that this does _not_ get called during | 768 // TOOD(mkosiba): Add a DCHECK to say that this does _not_ get called during |
| 749 // DrawGl when http://crbug.com/249972 is fixed. | 769 // DrawGl when http://crbug.com/249972 is fixed. |
| 750 if (scroll_offset_css_ == new_value_css) | 770 if (scroll_offset_dip_ == scroll_offset_dip) |
| 751 return; | 771 return; |
| 752 | 772 |
| 753 scroll_offset_css_ = new_value_css; | 773 scroll_offset_dip_ = scroll_offset_dip; |
| 754 | 774 |
| 755 DCHECK(dip_scale_ > 0); | 775 gfx::Vector2d max_offset = max_scroll_offset(); |
| 756 DCHECK(page_scale_factor_ > 0); | 776 gfx::Vector2d scroll_offset; |
| 777 if (max_scroll_offset_dip_.x()) { | |
| 778 scroll_offset.set_x((scroll_offset_dip.x() * max_offset.x()) / | |
| 779 max_scroll_offset_dip_.x()); | |
| 780 } | |
| 757 | 781 |
| 758 gfx::Vector2d scroll_offset = gfx::ToRoundedVector2d( | 782 if (max_scroll_offset_dip_.y()) { |
| 759 gfx::ScaleVector2d(new_value_css, dip_scale_ * page_scale_factor_)); | 783 scroll_offset.set_y((scroll_offset_dip.y() * max_offset.y()) / |
| 784 max_scroll_offset_dip_.y()); | |
| 785 } | |
| 786 | |
| 787 DCHECK(0 <= scroll_offset.x()); | |
| 788 DCHECK(0 <= scroll_offset.y()); | |
| 789 DCHECK(scroll_offset.x() <= max_offset.x()); | |
| 790 DCHECK(scroll_offset.y() <= max_offset.y()); | |
| 760 | 791 |
| 761 client_->ScrollContainerViewTo(scroll_offset); | 792 client_->ScrollContainerViewTo(scroll_offset); |
| 762 } | 793 } |
| 763 | 794 |
| 764 gfx::Vector2dF InProcessViewRenderer::GetTotalRootLayerScrollOffset() { | 795 gfx::Vector2dF InProcessViewRenderer::GetTotalRootLayerScrollOffset() { |
| 765 return scroll_offset_css_; | 796 return scroll_offset_dip_; |
| 766 } | 797 } |
| 767 | 798 |
| 768 void InProcessViewRenderer::DidOverscroll( | 799 void InProcessViewRenderer::DidOverscroll( |
| 769 gfx::Vector2dF accumulated_overscroll, | 800 gfx::Vector2dF accumulated_overscroll, |
| 770 gfx::Vector2dF latest_overscroll_delta, | 801 gfx::Vector2dF latest_overscroll_delta, |
| 771 gfx::Vector2dF current_fling_velocity) { | 802 gfx::Vector2dF current_fling_velocity) { |
| 772 DCHECK(current_fling_velocity.IsZero()); | 803 DCHECK(current_fling_velocity.IsZero()); |
| 773 const float physical_pixel_scale = dip_scale_ * page_scale_factor_; | 804 const float physical_pixel_scale = dip_scale_ * page_scale_factor_; |
| 774 if (accumulated_overscroll == latest_overscroll_delta) | 805 if (accumulated_overscroll == latest_overscroll_delta) |
| 775 overscroll_rounding_error_ = gfx::Vector2dF(); | 806 overscroll_rounding_error_ = gfx::Vector2dF(); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 861 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); | 892 base::StringAppendF(&str, "attached_to_window: %d ", attached_to_window_); |
| 862 base::StringAppendF(&str, "hardware_initialized: %d ", hardware_initialized_); | 893 base::StringAppendF(&str, "hardware_initialized: %d ", hardware_initialized_); |
| 863 base::StringAppendF(&str, "hardware_failed: %d ", hardware_failed_); | 894 base::StringAppendF(&str, "hardware_failed: %d ", hardware_failed_); |
| 864 base::StringAppendF(&str, | 895 base::StringAppendF(&str, |
| 865 "global visible rect: %s ", | 896 "global visible rect: %s ", |
| 866 cached_global_visible_rect_.ToString().c_str()); | 897 cached_global_visible_rect_.ToString().c_str()); |
| 867 base::StringAppendF(&str, | 898 base::StringAppendF(&str, |
| 868 "scroll_at_start_of_frame: %s ", | 899 "scroll_at_start_of_frame: %s ", |
| 869 scroll_at_start_of_frame_.ToString().c_str()); | 900 scroll_at_start_of_frame_.ToString().c_str()); |
| 870 base::StringAppendF( | 901 base::StringAppendF( |
| 871 &str, "scroll_offset_css: %s ", scroll_offset_css_.ToString().c_str()); | 902 &str, "scroll_offset_dip: %s ", scroll_offset_dip_.ToString().c_str()); |
| 872 base::StringAppendF(&str, | 903 base::StringAppendF(&str, |
| 873 "overscroll_rounding_error_: %s ", | 904 "overscroll_rounding_error_: %s ", |
| 874 overscroll_rounding_error_.ToString().c_str()); | 905 overscroll_rounding_error_.ToString().c_str()); |
| 875 if (draw_info) { | 906 if (draw_info) { |
| 876 base::StringAppendF(&str, | 907 base::StringAppendF(&str, |
| 877 "clip left top right bottom: [%d %d %d %d] ", | 908 "clip left top right bottom: [%d %d %d %d] ", |
| 878 draw_info->clip_left, | 909 draw_info->clip_left, |
| 879 draw_info->clip_top, | 910 draw_info->clip_top, |
| 880 draw_info->clip_right, | 911 draw_info->clip_right, |
| 881 draw_info->clip_bottom); | 912 draw_info->clip_bottom); |
| 882 base::StringAppendF(&str, | 913 base::StringAppendF(&str, |
| 883 "surface width height: [%d %d] ", | 914 "surface width height: [%d %d] ", |
| 884 draw_info->width, | 915 draw_info->width, |
| 885 draw_info->height); | 916 draw_info->height); |
| 886 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer); | 917 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer); |
| 887 } | 918 } |
| 888 return str; | 919 return str; |
| 889 } | 920 } |
| 890 | 921 |
| 891 } // namespace android_webview | 922 } // namespace android_webview |
| OLD | NEW |