Home | History | Annotate | Download | only in jni
      1 /*
      2  * Copyright 2008, The Android Open Source Project
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *  * Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  *  * Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #define LOG_TAG "webcoreglue"
     27 
     28 #include <config.h>
     29 #include "WebFrameView.h"
     30 
     31 #include "android_graphics.h"
     32 #include "GraphicsContext.h"
     33 #include "Frame.h"
     34 #include "FrameTree.h"
     35 #include "FrameView.h"
     36 #include "HostWindow.h"
     37 #include "PlatformGraphicsContext.h"
     38 #include "WebViewCore.h"
     39 
     40 #include <SkCanvas.h>
     41 
     42 namespace android {
     43 
     44 WebFrameView::WebFrameView(WebCore::FrameView* frameView, WebViewCore* webViewCore)
     45     : WebCoreViewBridge()
     46     , mFrameView(frameView)
     47     , mWebViewCore(webViewCore) {
     48     // attach itself to mFrameView
     49     mFrameView->setPlatformWidget(this);
     50     Retain(mWebViewCore);
     51 }
     52 
     53 WebFrameView::~WebFrameView() {
     54     Release(mWebViewCore);
     55 }
     56 
     57 void WebFrameView::draw(WebCore::GraphicsContext* ctx, const WebCore::IntRect& rect) {
     58     WebCore::Frame* frame = mFrameView->frame();
     59 
     60     if (NULL == frame->contentRenderer()) {
     61         // We only do this if there is nothing else to draw.
     62         // If there is a renderer, it will fill the bg itself, so we don't want to
     63         // double-draw (slow)
     64         SkCanvas* canvas = ctx->platformContext()->mCanvas;
     65         canvas->drawColor(SK_ColorWHITE);
     66     } else if (frame->tree()->parent()) {
     67         // Note: this code was moved from FrameLoaderClientAndroid
     68         //
     69         // For subframe, create a new translated rect from the given rectangle.
     70         WebCore::IntRect transRect(rect);
     71         // In Frame::markAllMatchesForText(), it does a fake paint.  So we need
     72         // to handle the case where platformContext() is null.  However, we still
     73         // want to call paint, since WebKit must have called the paint for a reason.
     74         SkCanvas* canvas = ctx->platformContext() ? ctx->platformContext()->mCanvas : NULL;
     75         if (canvas) {
     76             const WebCore::IntRect& bounds = getBounds();
     77 
     78             // Grab the intersection of transRect and the frame's bounds.
     79             transRect.intersect(bounds);
     80             if (transRect.isEmpty())
     81                 return;
     82 
     83             // Move the transRect into the frame's local coordinates.
     84             transRect.move(-bounds.x(), -bounds.y());
     85 
     86             // Translate the canvas, add a clip.
     87             canvas->save();
     88             canvas->translate(SkIntToScalar(bounds.x()), SkIntToScalar(bounds.y()));
     89             canvas->clipRect(transRect);
     90         }
     91         mFrameView->paintContents(ctx, transRect);
     92         if (canvas)
     93             canvas->restore();
     94     } else {
     95         mFrameView->paintContents(ctx, rect);
     96     }
     97 }
     98 
     99 void WebFrameView::setView(WebCore::FrameView* frameView) {
    100     mFrameView = frameView;
    101     mFrameView->setPlatformWidget(this);
    102 }
    103 
    104 }   // namespace android
    105