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

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: add clip tests 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 1c92df5400c91c95558a8266871c7923bbed128c..66118414553c264f36ba5d6d5da9b2a0e2e1eb43 100644
--- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp
+++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
@@ -37,7 +37,6 @@
#include "bindings/v8/ExceptionMessages.h"
#include "bindings/v8/ExceptionState.h"
#include "bindings/v8/ExceptionStatePlaceholder.h"
-#include "core/accessibility/AXObjectCache.h"
#include "core/css/CSSFontSelector.h"
#include "core/css/parser/BisonCSSParser.h"
#include "core/css/StylePropertySet.h"
@@ -168,6 +167,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);
}
@@ -1244,6 +1244,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();
@@ -2356,4 +2358,83 @@ 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;
+
+ bool hasId = options.getWithUndefinedOrNullCheck("id", passOptions.id) && !passOptions.id.isEmpty();
+ bool hasControl = options.getWithUndefinedOrNullCheck("control", passOptions.control) && passOptions.control;
+
+ if (!(hasId || hasControl)) {
+ 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);
+
+ passOptions.path = context->getCurrentClipPath(specifiedPath);
+
+ if (passOptions.path.isEmpty())
+ exceptionState.throwDOMException(NotSupportedError, "The specified path has no pixels.");
+ else
+ 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