diff options
| author | Bart Sears <bsears@google.com> | 2011-11-18 11:46:11 -0800 | 
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-11-18 11:46:11 -0800 | 
| commit | 59b140f3e2721433929e11087d0fdb626afb1a72 (patch) | |
| tree | cacf1cc33dcfd2480b1e0db9c5af20e5ab94da60 /Source | |
| parent | e2e7333b68070e867d6d96f46bedd49eb85199a0 (diff) | |
| parent | a5e649bc4d58bf3da959deae077307c487e2a3a6 (diff) | |
| download | external_webkit-59b140f3e2721433929e11087d0fdb626afb1a72.zip external_webkit-59b140f3e2721433929e11087d0fdb626afb1a72.tar.gz external_webkit-59b140f3e2721433929e11087d0fdb626afb1a72.tar.bz2 | |
Merge "Content and viewport rects set in one step." into ics-mr1
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/WebKit/android/nav/WebView.cpp | 159 | 
1 files changed, 71 insertions, 88 deletions
| diff --git a/Source/WebKit/android/nav/WebView.cpp b/Source/WebKit/android/nav/WebView.cpp index ebf416e..c917a6c 100644 --- a/Source/WebKit/android/nav/WebView.cpp +++ b/Source/WebKit/android/nav/WebView.cpp @@ -119,7 +119,6 @@ enum DrawExtras { // keep this in sync with WebView.java  struct JavaGlue {      jweak       m_obj; -    jmethodID   m_calcOurContentVisibleRectF;      jmethodID   m_overrideLoading;      jmethodID   m_scrollBy;      jmethodID   m_sendMoveFocus; @@ -157,7 +156,6 @@ WebView(JNIEnv* env, jobject javaWebView, int viewImpl, WTF::String drawableDir)   //   m_javaGlue = new JavaGlue;      m_javaGlue.m_obj = env->NewWeakGlobalRef(javaWebView);      m_javaGlue.m_scrollBy = GetJMethod(env, clazz, "setContentScrollBy", "(IIZ)Z"); -    m_javaGlue.m_calcOurContentVisibleRectF = GetJMethod(env, clazz, "calcOurContentVisibleRectF", "(Landroid/graphics/RectF;)V");      m_javaGlue.m_overrideLoading = GetJMethod(env, clazz, "overrideLoading", "(Ljava/lang/String;)V");      m_javaGlue.m_sendMoveFocus = GetJMethod(env, clazz, "sendMoveFocus", "(II)V");      m_javaGlue.m_sendMoveMouse = GetJMethod(env, clazz, "sendMoveMouse", "(IIII)V"); @@ -369,50 +367,29 @@ void scrollRectOnScreen(const IntRect& rect)  {      if (rect.isEmpty())          return; -    SkRect visible = SkRect::MakeEmpty(); -    calcOurContentVisibleRect(&visible);      int dx = 0;      int left = rect.x();      int right = rect.maxX(); -    if (left < visible.fLeft) { -        dx = left - visible.fLeft; +    if (left < m_visibleRect.fLeft) +        dx = left - m_visibleRect.fLeft;      // Only scroll right if the entire width can fit on screen. -    } else if (right > visible.fRight && right - left < visible.width()) { -        dx = right - visible.fRight; -    } +    else if (right > m_visibleRect.fRight +            && right - left < m_visibleRect.width()) +        dx = right - m_visibleRect.fRight;      int dy = 0;      int top = rect.y();      int bottom = rect.maxY(); -    if (top < visible.fTop) { -        dy = top - visible.fTop; +    if (top < m_visibleRect.fTop) +        dy = top - m_visibleRect.fTop;      // Only scroll down if the entire height can fit on screen -    } else if (bottom > visible.fBottom && bottom - top < visible.height()) { -        dy = bottom - visible.fBottom; -    } +    else if (bottom > m_visibleRect.fBottom +            && bottom - top < m_visibleRect.height()) +        dy = bottom - m_visibleRect.fBottom;      if ((dx|dy) == 0 || !scrollBy(dx, dy))          return;      viewInvalidate();  } -void calcOurContentVisibleRect(SkRect* r) -{ -    JNIEnv* env = JSC::Bindings::getJNIEnv(); -    AutoJObject javaObject = m_javaGlue.object(env); -    if (!javaObject.get()) -        return; -    jclass rectClass = env->FindClass("android/graphics/RectF"); -    jmethodID init = env->GetMethodID(rectClass, "<init>", "(FFFF)V"); -    jobject jRect = env->NewObject(rectClass, init, 0, 0, 0, 0); -    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_calcOurContentVisibleRectF, jRect); -    r->fLeft = env->GetFloatField(jRect, m_javaGlue.m_rectFLeft); -    r->fTop = env->GetFloatField(jRect, m_javaGlue.m_rectFTop); -    r->fRight = r->fLeft + env->CallFloatMethod(jRect, m_javaGlue.m_rectFWidth); -    r->fBottom = r->fTop + env->CallFloatMethod(jRect, m_javaGlue.m_rectFHeight); -    env->DeleteLocalRef(rectClass); -    env->DeleteLocalRef(jRect); -    checkException(env); -} -  void resetCursorRing()  {      m_ringAnimationEnd = 0; @@ -438,9 +415,7 @@ bool drawCursorPreamble(CachedRoot* root)  #if USE(ACCELERATED_COMPOSITING)      if (node->isInLayer() && root->rootLayer()) {          LayerAndroid* layer = root->rootLayer(); -        SkRect visible; -        calcOurContentVisibleRect(&visible); -        layer->updateFixedLayersPositions(visible); +        layer->updateFixedLayersPositions(m_visibleRect);          layer->updatePositions();      }  #endif @@ -469,8 +444,9 @@ void drawCursorPostamble()      }  } -bool drawGL(WebCore::IntRect& viewRect, WebCore::IntRect* invalRect, WebCore::IntRect& webViewRect, -            int titleBarHeight, WebCore::IntRect& clip, float scale, int extras) +bool drawGL(WebCore::IntRect& viewRect, WebCore::IntRect* invalRect, +        WebCore::IntRect& webViewRect, int titleBarHeight, +        WebCore::IntRect& clip, float scale, int extras)  {  #if USE(ACCELERATED_COMPOSITING)      if (!m_baseLayer || inFullScreenMode()) @@ -521,15 +497,13 @@ bool drawGL(WebCore::IntRect& viewRect, WebCore::IntRect* invalRect, WebCore::In      unsigned int pic = m_glWebViewState->currentPictureCounter();      m_glWebViewState->glExtras()->setDrawExtra(extra); -    SkRect visibleRect; -    calcOurContentVisibleRect(&visibleRect);      // Make sure we have valid coordinates. We might not have valid coords      // if the zoom manager is still initializing. We will be redrawn      // once the correct scale is set -    if (!visibleRect.hasValidCoordinates()) +    if (!m_visibleRect.hasValidCoordinates())          return false;      bool pagesSwapped = false; -    bool ret = m_glWebViewState->drawGL(viewRect, visibleRect, invalRect, +    bool ret = m_glWebViewState->drawGL(viewRect, m_visibleRect, invalRect,                                          webViewRect, titleBarHeight, clip, scale,                                          &pagesSwapped);      if (m_pageSwapCallbackRegistered && pagesSwapped) { @@ -597,11 +571,9 @@ PictureSet* draw(SkCanvas* canvas, SkColor bgColor, int extras, bool split)  #if USE(ACCELERATED_COMPOSITING)      LayerAndroid* compositeLayer = compositeRoot();      if (compositeLayer) { -        SkRect visible; -        calcOurContentVisibleRect(&visible);          // call this to be sure we've adjusted for any scrolling or animations          // before we actually draw -        compositeLayer->updateFixedLayersPositions(visible); +        compositeLayer->updateFixedLayersPositions(m_visibleRect);          compositeLayer->updatePositions();          // We have to set the canvas' matrix on the base layer          // (to have fixed layers work as intended) @@ -743,12 +715,10 @@ CachedRoot* getFrameCache(FrameCachePermission allowNewer)          m_frameCacheUI->setRootLayer(compositeRoot());  #if USE(ACCELERATED_COMPOSITING)      if (layerId >= 0) { -        SkRect visible; -        calcOurContentVisibleRect(&visible);          LayerAndroid* layer = const_cast<LayerAndroid*>(                                                  m_frameCacheUI->rootLayer());          if (layer) { -            layer->updateFixedLayersPositions(visible); +            layer->updateFixedLayersPositions(m_visibleRect);              layer->updatePositions();          }      } @@ -1545,6 +1515,10 @@ BaseLayerAndroid* getBaseLayer() {      return m_baseLayer;  } +void setVisibleRect(SkRect& visibleRect) { +    m_visibleRect = visibleRect; +} +      bool m_isDrawingPaused;  private: // local state for WebView      // private to getFrameCache(); other functions operate in a different thread @@ -1567,6 +1541,7 @@ private: // local state for WebView      bool m_pageSwapCallbackRegistered;  #endif      RenderSkinButton* m_buttonSkin; +    SkRect m_visibleRect;  }; // end of WebView class @@ -1578,7 +1553,9 @@ private: // local state for WebView  class GLDrawFunctor : Functor {      public:      GLDrawFunctor(WebView* _wvInstance, -            bool(WebView::*_funcPtr)(WebCore::IntRect&, WebCore::IntRect*, WebCore::IntRect&, int, WebCore::IntRect&, jfloat, jint), +            bool(WebView::*_funcPtr)(WebCore::IntRect&, WebCore::IntRect*, +                    WebCore::IntRect&, int, WebCore::IntRect&, +                    jfloat, jint),              WebCore::IntRect _viewRect, float _scale, int _extras) {          wvInstance = _wvInstance;          funcPtr = _funcPtr; @@ -1604,7 +1581,8 @@ class GLDrawFunctor : Functor {                                info->clipRight - info->clipLeft,                                info->clipBottom - info->clipTop); -        bool retVal = (*wvInstance.*funcPtr)(localViewRect, &inval, webViewRect, titlebarHeight, clip, scale, extras); +        bool retVal = (*wvInstance.*funcPtr)(localViewRect, &inval, webViewRect, +                titlebarHeight, clip, scale, extras);          if (retVal) {              IntRect finalInval;              if (inval.isEmpty()) { @@ -1632,7 +1610,8 @@ class GLDrawFunctor : Functor {      }      private:      WebView* wvInstance; -    bool (WebView::*funcPtr)(WebCore::IntRect&, WebCore::IntRect*, WebCore::IntRect&, int, WebCore::IntRect&, float, int); +    bool (WebView::*funcPtr)(WebCore::IntRect&, WebCore::IntRect*, +            WebCore::IntRect&, int, WebCore::IntRect&, float, int);      WebCore::IntRect viewRect;      WebCore::IntRect webViewRect;      jfloat scale; @@ -1816,9 +1795,20 @@ static jobject nativeCursorPosition(JNIEnv *env, jobject obj)  static WebCore::IntRect jrect_to_webrect(JNIEnv* env, jobject obj)  { -    int L, T, R, B; -    GraphicsJNI::get_jrect(env, obj, &L, &T, &R, &B); -    return WebCore::IntRect(L, T, R - L, B - T); +    if (obj) { +        int L, T, R, B; +        GraphicsJNI::get_jrect(env, obj, &L, &T, &R, &B); +        return WebCore::IntRect(L, T, R - L, B - T); +    } else +        return WebCore::IntRect(); +} + +static SkRect jrectf_to_rect(JNIEnv* env, jobject obj) +{ +    SkRect rect = SkRect::MakeEmpty(); +    if (obj) +        GraphicsJNI::jrectf_to_rect(env, obj, &rect); +    return rect;  }  static bool nativeCursorIntersects(JNIEnv *env, jobject obj, jobject visRect) @@ -1859,56 +1849,49 @@ static void nativeDebugDump(JNIEnv *env, jobject obj)  #endif  } -static jint nativeDraw(JNIEnv *env, jobject obj, jobject canv, jint color, +static jint nativeDraw(JNIEnv *env, jobject obj, jobject canv, +        jobject visible, jint color,          jint extras, jboolean split) {      SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, canv); -    return reinterpret_cast<jint>(GET_NATIVE_VIEW(env, obj)->draw(canvas, color, extras, split)); +    WebView* webView = GET_NATIVE_VIEW(env, obj); +    SkRect visibleRect = jrectf_to_rect(env, visible); +    webView->setVisibleRect(visibleRect); +    PictureSet* pictureSet = webView->draw(canvas, color, extras, split); +    return reinterpret_cast<jint>(pictureSet);  }  static jint nativeGetDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView,                                      jobject jrect, jobject jviewrect, +                                    jobject jvisiblerect,                                      jfloat scale, jint extras) { -    WebCore::IntRect viewRect; -    if (jrect == NULL) { -        viewRect = WebCore::IntRect(); -    } else { -        viewRect = jrect_to_webrect(env, jrect); -    } +    WebCore::IntRect viewRect = jrect_to_webrect(env, jrect);      WebView *wvInstance = (WebView*) nativeView; -    GLDrawFunctor* functor = new GLDrawFunctor(wvInstance, &android::WebView::drawGL, -            viewRect, scale, extras); +    SkRect visibleRect = jrectf_to_rect(env, jvisiblerect); +    wvInstance->setVisibleRect(visibleRect); + +    GLDrawFunctor* functor = new GLDrawFunctor(wvInstance, +            &android::WebView::drawGL, viewRect, scale, extras);      wvInstance->setFunctor((Functor*) functor); -    WebCore::IntRect webViewRect; -    if (jviewrect == NULL) { -        webViewRect = WebCore::IntRect(); -    } else { -        webViewRect = jrect_to_webrect(env, jviewrect); -    } +    WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect);      functor->updateViewRect(webViewRect);      return (jint)functor;  } -static void nativeUpdateDrawGLFunction(JNIEnv *env, jobject obj, jobject jrect, jobject jviewrect) { +static void nativeUpdateDrawGLFunction(JNIEnv *env, jobject obj, jobject jrect, +        jobject jviewrect, jobject jvisiblerect) {      WebView *wvInstance = GET_NATIVE_VIEW(env, obj); -    if (wvInstance != NULL) { +    if (wvInstance) {          GLDrawFunctor* functor = (GLDrawFunctor*) wvInstance->getFunctor(); -        if (functor != NULL) { -            WebCore::IntRect viewRect; -            if (jrect == NULL) { -                viewRect = WebCore::IntRect(); -            } else { -                viewRect = jrect_to_webrect(env, jrect); -            } +        if (functor) { +            WebCore::IntRect viewRect = jrect_to_webrect(env, jrect);              functor->updateRect(viewRect); -            WebCore::IntRect webViewRect; -            if (jviewrect == NULL) { -                webViewRect = WebCore::IntRect(); -            } else { -                webViewRect = jrect_to_webrect(env, jviewrect); -            } +            SkRect visibleRect = jrectf_to_rect(env, jvisiblerect); +            wvInstance->setVisibleRect(visibleRect); + +            WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect);              functor->updateViewRect(webViewRect);          }      } @@ -2751,11 +2734,11 @@ static JNINativeMethod gJavaWebViewMethods[] = {          (void*) nativeDebugDump },      { "nativeDestroy", "()V",          (void*) nativeDestroy }, -    { "nativeDraw", "(Landroid/graphics/Canvas;IIZ)I", +    { "nativeDraw", "(Landroid/graphics/Canvas;Landroid/graphics/RectF;IIZ)I",          (void*) nativeDraw }, -    { "nativeGetDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;FI)I", +    { "nativeGetDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;FI)I",          (void*) nativeGetDrawGLFunction }, -    { "nativeUpdateDrawGLFunction", "(Landroid/graphics/Rect;Landroid/graphics/Rect;)V", +    { "nativeUpdateDrawGLFunction", "(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;)V",          (void*) nativeUpdateDrawGLFunction },      { "nativeDumpDisplayTree", "(Ljava/lang/String;)V",          (void*) nativeDumpDisplayTree }, | 
