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

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

Issue 287163007: WIP: <canvas> hit regions (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 7 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 8456aba1db2b4de549857a809bf166dec4e1618a..19a827eaa1f77788a8b4b23128a3d546d2f060b3 100644
--- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp
+++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
@@ -52,6 +52,7 @@
#include "core/html/ImageData.h"
#include "core/html/TextMetrics.h"
#include "core/html/canvas/CanvasGradient.h"
+#include "core/html/canvas/CanvasHitRegion.h"
#include "core/html/canvas/CanvasPattern.h"
#include "core/html/canvas/CanvasStyle.h"
#include "core/html/canvas/Path2D.h"
@@ -86,6 +87,7 @@ static bool contextLostRestoredEventsEnabled()
CanvasRenderingContext2D::CanvasRenderingContext2D(HTMLCanvasElement* canvas, const Canvas2DContextAttributes* attrs, bool usesCSSCompatibilityParseMode)
: CanvasRenderingContext(canvas)
+ , m_hitRegionManager(CanvasHitRegionManager::create())
, m_usesCSSCompatibilityParseMode(usesCSSCompatibilityParseMode)
, m_hasAlpha(!attrs || attrs->alpha())
, m_isContextLost(false)
@@ -166,6 +168,7 @@ void CanvasRenderingContext2D::trace(Visitor* visitor)
{
#if ENABLE(OILPAN)
visitor->trace(m_stateStack);
+ visitor->trace(m_hitRegionManager);
visitor->trace(m_fetchedFonts);
#endif
CanvasRenderingContext::trace(visitor);
@@ -230,6 +233,7 @@ void CanvasRenderingContext2D::reset()
m_stateStack.resize(1);
m_stateStack.first() = adoptPtrWillBeNoop(new State());
m_path.clear();
+ m_hitRegionManager->clear();
}
// Important: Several of these properties are also stored in GraphicsContext's
@@ -1216,6 +1220,8 @@ void CanvasRenderingContext2D::clearRect(float x, float y, float width, float he
if (!computeDirtyRect(rect, &dirtyRect))
return;
+ m_hitRegionManager->removeEnclosed(rect, state().m_transform);
+
bool saved = false;
if (shouldDrawShadows()) {
context->save();
@@ -2266,6 +2272,45 @@ PassRefPtr<Canvas2DContextAttributes> CanvasRenderingContext2D::getContextAttrib
return attributes.release();
}
+void CanvasRenderingContext2D::addHitRegion(ExceptionState& exceptionState)
+{
+ DecodedHitRegionOptions decodedOptions;
+ decodedOptions.resolvePath(m_path, state().m_transform);
+ // parentId / id will be null here, so no need to resolve them.
+
+ addHitRegionInternal(decodedOptions, exceptionState);
+}
+
+void CanvasRenderingContext2D::addHitRegion(const Dictionary& options, ExceptionState& exceptionState)
+{
+ DecodedHitRegionOptions decodedOptions(options);
+ decodedOptions.resolvePath(m_path, state().m_transform);
+ decodedOptions.resolveIds(m_hitRegionManager.get());
+
+ addHitRegionInternal(decodedOptions, exceptionState);
+}
+
+void CanvasRenderingContext2D::removeHitRegion(const String& id)
+{
+ if (CanvasHitRegion* hitRegion = m_hitRegionManager->getHitRegionById(id))
+ m_hitRegionManager->remove(hitRegion);
+}
+
+CanvasHitRegion* CanvasRenderingContext2D::hitRegionAtPoint(const LayoutPoint& point)
+{
+ return m_hitRegionManager->getHitRegionAtPoint(point);
+}
+
+void CanvasRenderingContext2D::addHitRegionInternal(const DecodedHitRegionOptions& options, ExceptionState& exceptionState)
+{
+ if (!options.validate(exceptionState))
+ return;
+
+ RefPtrWillBeRawPtr<CanvasHitRegion> hitRegion = CanvasHitRegion::create(options);
+ m_hitRegionManager->remove(options.previousHitRegion.get());
+ m_hitRegionManager->add(hitRegion.release());
+}
+
void CanvasRenderingContext2D::drawFocusIfNeeded(Element* element)
{
drawFocusIfNeededInternal(m_path, element);
« no previous file with comments | « Source/core/html/canvas/CanvasRenderingContext2D.h ('k') | Source/core/html/canvas/CanvasRenderingContext2D.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698