Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(401)

Unified Diff: Source/core/html/canvas/CanvasRenderingContext2D.cpp

Issue 300223009: Implement basic parts of hit regions on canvas2d. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: exclude clipping region part Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/html/canvas/CanvasRenderingContext2D.cpp
diff --git a/Source/core/html/canvas/CanvasRenderingContext2D.cpp b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
index ccca4ddd03fc0da373af9092d78ca687cfec0e49..cd7f394e5630712f0eab380d60b08f94502d7204 100644
--- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp
+++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
@@ -37,7 +37,6 @@
#include "bindings/v8/ExceptionState.h"
#include "bindings/v8/ExceptionStatePlaceholder.h"
#include "core/CSSPropertyNames.h"
-#include "core/accessibility/AXObjectCache.h"
#include "core/css/CSSFontSelector.h"
#include "core/css/parser/BisonCSSParser.h"
#include "core/css/StylePropertySet.h"
@@ -166,6 +165,7 @@ void CanvasRenderingContext2D::trace(Visitor* visitor)
#if ENABLE(OILPAN)
visitor->trace(m_stateStack);
visitor->trace(m_fetchedFonts);
+ visitor->trace(m_hitRegionManager);
#endif
CanvasRenderingContext::trace(visitor);
}
@@ -1242,6 +1242,8 @@ void CanvasRenderingContext2D::clearRect(float x, float y, float width, float he
context->setCompositeOperation(CompositeSourceOver);
}
context->clearRect(rect);
+ if (m_hitRegionManager)
+ m_hitRegionManager->removeHitRegionsInRect(rect, state().m_transform);
if (saved)
context->restore();
@@ -2357,4 +2359,85 @@ void CanvasRenderingContext2D::drawFocusRing(const Path& path)
didDraw(dirtyRect);
}
+void CanvasRenderingContext2D::addHitRegion(ExceptionState& exceptionState)
+{
+ addHitRegion(Dictionary(), exceptionState);
+}
+
+void CanvasRenderingContext2D::addHitRegion(const Dictionary& options, ExceptionState& exceptionState)
+{
+ HitRegionOptions passOptions;
+
+ options.getWithUndefinedOrNullCheck("id", passOptions.id);
+ options.getWithUndefinedOrNullCheck("control", passOptions.control);
+ if (passOptions.id.isEmpty() && !passOptions.control) {
+ exceptionState.throwDOMException(NotSupportedError, "Both id and control are null.");
+ return;
+ }
+
+ FloatRect clipBounds;
+ GraphicsContext* context = drawingContext();
+
+ if (m_path.isEmpty() || !context || !state().m_invertibleCTM
+ || !context->getTransformedClipBounds(&clipBounds)) {
+ exceptionState.throwDOMException(NotSupportedError, "The specified path has no pixels.");
+ return;
+ }
+
+ Path specifiedPath = m_path;
+ specifiedPath.transform(state().m_transform);
+
+ if (context->isClipMode()) {
+ // FIXME: The hit regions should take clipping region into account.
zino 2014/06/20 15:31:36 Remove clipping region part and leave comments.
+ // However, we have no way to get the region from canvas state stack by now.
+ // See http://crbug.com/387057
+ exceptionState.throwDOMException(NotSupportedError, "The specified path has no pixels.");
+ }
+
+ passOptions.path = specifiedPath;
+ addHitRegionInternal(passOptions, exceptionState);
+}
+
+void CanvasRenderingContext2D::addHitRegionInternal(const HitRegionOptions& options, ExceptionState& exceptionState)
+{
+ if (!m_hitRegionManager)
+ m_hitRegionManager = HitRegionManager::create();
+
+ // Remove previous region (with id or control)
+ m_hitRegionManager->removeHitRegionById(options.id);
+ m_hitRegionManager->removeHitRegionByControl(options.control.get());
+
+ RefPtrWillBeRawPtr<HitRegion> hitRegion = HitRegion::create(options);
+ hitRegion->updateAccessibility(canvas());
+ m_hitRegionManager->addHitRegion(hitRegion.release());
+}
+
+void CanvasRenderingContext2D::removeHitRegion(const String& id)
+{
+ if (m_hitRegionManager)
+ m_hitRegionManager->removeHitRegionById(id);
+}
+
+void CanvasRenderingContext2D::clearHitRegions()
+{
+ if (m_hitRegionManager)
+ m_hitRegionManager->removeAllHitRegions();
+}
+
+HitRegion* CanvasRenderingContext2D::hitRegionAtPoint(const LayoutPoint& point)
+{
+ if (m_hitRegionManager)
+ return m_hitRegionManager->getHitRegionAtPoint(point);
+
+ return 0;
+}
+
+unsigned CanvasRenderingContext2D::hitRegionsCount() const
+{
+ if (m_hitRegionManager)
+ return m_hitRegionManager->getHitRegionsCount();
+
+ return 0;
+}
+
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698