diff options
Diffstat (limited to 'Source/WebKit/android')
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.cpp | 14 | ||||
-rw-r--r-- | Source/WebKit/android/nav/DrawExtra.cpp | 95 | ||||
-rw-r--r-- | Source/WebKit/android/nav/DrawExtra.h | 33 | ||||
-rw-r--r-- | Source/WebKit/android/nav/SelectText.cpp | 34 | ||||
-rw-r--r-- | Source/WebKit/android/nav/SelectText.h | 24 |
5 files changed, 130 insertions, 70 deletions
diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp index 43b0f1d..fd1a833 100644 --- a/Source/WebKit/android/jni/WebViewCore.cpp +++ b/Source/WebKit/android/jni/WebViewCore.cpp @@ -1811,20 +1811,10 @@ SelectText* WebViewCore::createSelectText(const VisibleSelection& selection) int startOffset = node == startContainer ? range->startOffset() : 0; int endOffset = node == endContainer ? range->endOffset() : numeric_limits<int>::max(); LayerAndroid* layer = 0; - int layerId = platformLayerIdFromNode(node, &layer); - SkRegion* region = selectTextContainer->getHightlightRegionsForLayer(layerId); - bool needsSet = false; - if (!region) - selectTextContainer->setHighlightRegionsForLayer(layerId, region = new SkRegion()); + platformLayerIdFromNode(node, &layer); Vector<IntRect> rects; renderText->absoluteRectsForRange(rects, startOffset, endOffset, true); - IntPoint offset; - layerToAbsoluteOffset(layer, offset); - for (size_t i = 0; i < rects.size(); i++) { - IntRect& r = rects.at(i); - r.move(-offset.x(), -offset.y()); - region->op(r.x(), r.y(), r.maxX(), r.maxY(), SkRegion::kUnion_Op); - } + selectTextContainer->addHighlightRegion(layer, rects); } IntRect caretRect; diff --git a/Source/WebKit/android/nav/DrawExtra.cpp b/Source/WebKit/android/nav/DrawExtra.cpp new file mode 100644 index 0000000..aa8feba --- /dev/null +++ b/Source/WebKit/android/nav/DrawExtra.cpp @@ -0,0 +1,95 @@ +/* + * Copyright 2012, The Android Open Source Project + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "DrawExtra.h" +#include "GLExtras.h" +#include "LayerAndroid.h" +#include "SkCanvas.h" +#include "SkRegion.h" +#include "WebViewCore.h" + +RegionLayerDrawExtra::RegionLayerDrawExtra() + : m_highlightColor(COLOR_HOLO_LIGHT) +{} + +RegionLayerDrawExtra::~RegionLayerDrawExtra() +{ + HighlightRegionMap::iterator end = m_highlightRegions.end(); + for (HighlightRegionMap::iterator it = m_highlightRegions.begin(); it != end; ++it) { + delete it->second; + it->second = 0; + } +} + +SkRegion* RegionLayerDrawExtra::getHightlightRegionsForLayer(const LayerAndroid* layer) +{ + int layerId = layer ? layer->uniqueId() : 0; + return m_highlightRegions.get(layerId); +} + +void RegionLayerDrawExtra::addHighlightRegion(const LayerAndroid* layer, const Vector<IntRect>& rects) +{ + if (rects.isEmpty()) + return; + int layerId = layer ? layer->uniqueId() : 0; + SkRegion* region = m_highlightRegions.get(layerId); + if (!region) { + region = new SkRegion(); + m_highlightRegions.set(layerId, region); + } + IntPoint offset; + WebViewCore::layerToAbsoluteOffset(layer, offset); + for (size_t i = 0; i < rects.size(); i++) { + IntRect r = rects.at(i); + r.move(-offset.x(), -offset.y()); + region->op(r.x(), r.y(), r.maxX(), r.maxY(), SkRegion::kUnion_Op); + } +} + +void RegionLayerDrawExtra::draw(SkCanvas* canvas, LayerAndroid* layer) +{ + SkRegion* region = getHightlightRegionsForLayer(layer); + if (!region || region->isEmpty()) + return; + SkRegion::Iterator rgnIter(*region); + SkPaint paint; + paint.setColor(m_highlightColor.rgb()); + while (!rgnIter.done()) { + const SkIRect& rect = rgnIter.rect(); + canvas->drawIRect(rect, paint); + rgnIter.next(); + } +} + +void RegionLayerDrawExtra::drawGL(GLExtras* glExtras, const LayerAndroid* layer) +{ + SkRegion* region = getHightlightRegionsForLayer(layer); + if (!region || region->isEmpty()) + return; + const TransformationMatrix* transform = layer ? layer->drawTransform() : 0; + glExtras->drawRegion(*region, true, false, transform, m_highlightColor); +} diff --git a/Source/WebKit/android/nav/DrawExtra.h b/Source/WebKit/android/nav/DrawExtra.h index 27a6598..563e6ac 100644 --- a/Source/WebKit/android/nav/DrawExtra.h +++ b/Source/WebKit/android/nav/DrawExtra.h @@ -26,10 +26,23 @@ #ifndef DrawExtra_h #define DrawExtra_h +#include "config.h" + +#include "Color.h" +#include "IntPoint.h" +#include "IntRect.h" +#include "wtf/HashMap.h" +#include "wtf/Vector.h" + +// Color of the ring copied from framework's holo_light +#define COLOR_HOLO_LIGHT 0x6633B5E5 +// Color of the ring copied from framework's holo_dark +#define COLOR_HOLO_DARK 0x660099CC + class SkCanvas; +class SkRegion; namespace WebCore { - class IntRect; class LayerAndroid; class GLExtras; } @@ -46,6 +59,24 @@ public: virtual void drawGL(GLExtras*, const LayerAndroid*) {} }; +// A helper extra that has a SkRegion per LayerAndroid +class RegionLayerDrawExtra : public DrawExtra { +public: + RegionLayerDrawExtra(); + virtual ~RegionLayerDrawExtra(); + + void addHighlightRegion(const LayerAndroid* layer, const Vector<IntRect>& rects); + virtual void draw(SkCanvas*, LayerAndroid*); + virtual void drawGL(GLExtras*, const LayerAndroid*); + +private: + SkRegion* getHightlightRegionsForLayer(const LayerAndroid* layer); + + typedef HashMap<int, SkRegion* > HighlightRegionMap; + HighlightRegionMap m_highlightRegions; + Color m_highlightColor; +}; + } #endif diff --git a/Source/WebKit/android/nav/SelectText.cpp b/Source/WebKit/android/nav/SelectText.cpp index b043406..22c67bc 100644 --- a/Source/WebKit/android/nav/SelectText.cpp +++ b/Source/WebKit/android/nav/SelectText.cpp @@ -146,40 +146,6 @@ void ReverseBidi(UChar* chars, int len) { namespace android { -SelectText::~SelectText() -{ - HighlightRegionMap::iterator end = m_highlightRegions.end(); - for (HighlightRegionMap::iterator it = m_highlightRegions.begin(); it != end; ++it) { - delete it->second; - it->second = 0; - } -} - -void SelectText::drawGL(GLExtras* extras, const LayerAndroid* layer) -{ - SkRegion* region = getHightlightRegionsForLayer(layer ? layer->uniqueId() : -1); - if (!region || region->isEmpty()) - return; - extras->drawRegion(*region, true, false, layer ? layer->drawTransform() : 0, false); -} - -void SelectText::draw(SkCanvas* canvas, LayerAndroid* layer) -{ - SkRegion* region = getHightlightRegionsForLayer(layer ? layer->uniqueId() : -1); - if (!region || region->isEmpty()) - return; - SkRegion::Iterator rgnIter(*region); - SkPaint paint; - paint.setARGB(0x66, 0x33, 0xb5, 0xe5); - while (!rgnIter.done()) { - const SkIRect& ir = rgnIter.rect(); - SkRect r; - r.set(ir.fLeft, ir.fTop, ir.fRight, ir.fBottom); - canvas->drawRect(r, paint); - rgnIter.next(); - } -} - SelectText::HandleId SelectText::mapId(HandleId id) { if (id == StartHandle || id == EndHandle) diff --git a/Source/WebKit/android/nav/SelectText.h b/Source/WebKit/android/nav/SelectText.h index 33d9f3f..904b2b9 100644 --- a/Source/WebKit/android/nav/SelectText.h +++ b/Source/WebKit/android/nav/SelectText.h @@ -27,18 +27,12 @@ #define SelectText_h #include "DrawExtra.h" -#include "IntPoint.h" #include "IntRect.h" #include "PlatformString.h" -#include "SkPath.h" -#include "SkPicture.h" -#include "SkRect.h" -#include "SkRegion.h" -#include "wtf/Vector.h" namespace android { -class SelectText : public DrawExtra { +class SelectText : public RegionLayerDrawExtra { public: enum HandleId { StartHandle = 0, @@ -47,20 +41,6 @@ public: ExtentHandle = 3, }; - SelectText() {} - virtual ~SelectText(); - - SkRegion* getHightlightRegionsForLayer(int layerId) { - return m_highlightRegions.get(layerId); - } - - void setHighlightRegionsForLayer(int layerId, SkRegion* region) { - m_highlightRegions.set(layerId, region); - } - - virtual void draw(SkCanvas*, LayerAndroid*); - virtual void drawGL(GLExtras*, const LayerAndroid*); - IntRect& caretRect(HandleId id) { return m_caretRects[mapId(id)]; } void setCaretRect(HandleId id, const IntRect& rect) { m_caretRects[mapId(id)] = rect; } int caretLayerId(HandleId id) { return m_caretLayerId[mapId(id)]; } @@ -75,8 +55,6 @@ public: private: HandleId mapId(HandleId id); - typedef HashMap<int, SkRegion* > HighlightRegionMap; - HighlightRegionMap m_highlightRegions; IntRect m_caretRects[2]; int m_caretLayerId[2]; bool m_baseIsFirst; |