summaryrefslogtreecommitdiffstats
path: root/Source/WebKit/android
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit/android')
-rw-r--r--Source/WebKit/android/jni/WebViewCore.cpp14
-rw-r--r--Source/WebKit/android/nav/DrawExtra.cpp95
-rw-r--r--Source/WebKit/android/nav/DrawExtra.h33
-rw-r--r--Source/WebKit/android/nav/SelectText.cpp34
-rw-r--r--Source/WebKit/android/nav/SelectText.h24
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;