diff options
author | John Reck <jreck@google.com> | 2012-01-31 13:52:20 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-01-31 13:52:20 -0800 |
commit | 14fbfc39bce36536e4d7a08303c10a58081f0b87 (patch) | |
tree | 160aef6ca9ef805074e4ed235a7879adb2aa4638 /Source/WebKit/android/nav/DrawExtra.cpp | |
parent | 6978cfc9ce9dcd4b7c83d9f8b3ecca9cc52474c1 (diff) | |
parent | 4b742e0b2c2d5e79a987688fd7d2cce5b0b24842 (diff) | |
download | external_webkit-14fbfc39bce36536e4d7a08303c10a58081f0b87.zip external_webkit-14fbfc39bce36536e4d7a08303c10a58081f0b87.tar.gz external_webkit-14fbfc39bce36536e4d7a08303c10a58081f0b87.tar.bz2 |
Merge "Minor draw extras cleanup and refactor"
Diffstat (limited to 'Source/WebKit/android/nav/DrawExtra.cpp')
-rw-r--r-- | Source/WebKit/android/nav/DrawExtra.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
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); +} |