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

Side by Side 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies)
4 * Copyright (C) 2007 Alp Toker <alp@atoker.com> 4 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
6 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org> 6 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org>
7 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. 7 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
8 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved. 8 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved.
9 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. 9 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
10 * 10 *
(...skipping 19 matching lines...) Expand all
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */ 31 */
32 32
33 #include "config.h" 33 #include "config.h"
34 #include "core/html/canvas/CanvasRenderingContext2D.h" 34 #include "core/html/canvas/CanvasRenderingContext2D.h"
35 35
36 #include "CSSPropertyNames.h" 36 #include "CSSPropertyNames.h"
37 #include "bindings/v8/ExceptionMessages.h" 37 #include "bindings/v8/ExceptionMessages.h"
38 #include "bindings/v8/ExceptionState.h" 38 #include "bindings/v8/ExceptionState.h"
39 #include "bindings/v8/ExceptionStatePlaceholder.h" 39 #include "bindings/v8/ExceptionStatePlaceholder.h"
40 #include "core/accessibility/AXObjectCache.h"
41 #include "core/css/CSSFontSelector.h" 40 #include "core/css/CSSFontSelector.h"
42 #include "core/css/parser/BisonCSSParser.h" 41 #include "core/css/parser/BisonCSSParser.h"
43 #include "core/css/StylePropertySet.h" 42 #include "core/css/StylePropertySet.h"
44 #include "core/css/resolver/StyleResolver.h" 43 #include "core/css/resolver/StyleResolver.h"
45 #include "core/dom/ExceptionCode.h" 44 #include "core/dom/ExceptionCode.h"
46 #include "core/fetch/ImageResource.h" 45 #include "core/fetch/ImageResource.h"
47 #include "core/frame/ImageBitmap.h" 46 #include "core/frame/ImageBitmap.h"
48 #include "core/html/HTMLCanvasElement.h" 47 #include "core/html/HTMLCanvasElement.h"
49 #include "core/html/HTMLImageElement.h" 48 #include "core/html/HTMLImageElement.h"
50 #include "core/html/HTMLMediaElement.h" 49 #include "core/html/HTMLMediaElement.h"
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 m_isContextLost = false; 160 m_isContextLost = false;
162 } 161 }
163 } 162 }
164 } 163 }
165 164
166 void CanvasRenderingContext2D::trace(Visitor* visitor) 165 void CanvasRenderingContext2D::trace(Visitor* visitor)
167 { 166 {
168 #if ENABLE(OILPAN) 167 #if ENABLE(OILPAN)
169 visitor->trace(m_stateStack); 168 visitor->trace(m_stateStack);
170 visitor->trace(m_fetchedFonts); 169 visitor->trace(m_fetchedFonts);
170 visitor->trace(m_hitRegionManager);
171 #endif 171 #endif
172 CanvasRenderingContext::trace(visitor); 172 CanvasRenderingContext::trace(visitor);
173 } 173 }
174 174
175 void CanvasRenderingContext2D::dispatchContextLostEvent(Timer<CanvasRenderingCon text2D>*) 175 void CanvasRenderingContext2D::dispatchContextLostEvent(Timer<CanvasRenderingCon text2D>*)
176 { 176 {
177 if (contextLostRestoredEventsEnabled()) { 177 if (contextLostRestoredEventsEnabled()) {
178 RefPtrWillBeRawPtr<Event> event = Event::createCancelable(EventTypeNames ::contextlost); 178 RefPtrWillBeRawPtr<Event> event = Event::createCancelable(EventTypeNames ::contextlost);
179 canvas()->dispatchEvent(event); 179 canvas()->dispatchEvent(event);
180 if (event->defaultPrevented()) { 180 if (event->defaultPrevented()) {
(...skipping 1056 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 context->setAlphaAsFloat(1); 1237 context->setAlphaAsFloat(1);
1238 } 1238 }
1239 if (state().m_globalComposite != CompositeSourceOver) { 1239 if (state().m_globalComposite != CompositeSourceOver) {
1240 if (!saved) { 1240 if (!saved) {
1241 context->save(); 1241 context->save();
1242 saved = true; 1242 saved = true;
1243 } 1243 }
1244 context->setCompositeOperation(CompositeSourceOver); 1244 context->setCompositeOperation(CompositeSourceOver);
1245 } 1245 }
1246 context->clearRect(rect); 1246 context->clearRect(rect);
1247 if (m_hitRegionManager)
1248 m_hitRegionManager->removeHitRegionsInRect(rect, state().m_transform);
1247 if (saved) 1249 if (saved)
1248 context->restore(); 1250 context->restore();
1249 1251
1250 validateStateStack(); 1252 validateStateStack();
1251 didDraw(dirtyRect); 1253 didDraw(dirtyRect);
1252 } 1254 }
1253 1255
1254 void CanvasRenderingContext2D::fillRect(float x, float y, float width, float hei ght) 1256 void CanvasRenderingContext2D::fillRect(float x, float y, float width, float hei ght)
1255 { 1257 {
1256 if (!validateRectForCanvas(x, y, width, height)) 1258 if (!validateRectForCanvas(x, y, width, height))
(...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after
2349 c->save(); 2351 c->save();
2350 c->setAlphaAsFloat(1.0); 2352 c->setAlphaAsFloat(1.0);
2351 c->clearShadow(); 2353 c->clearShadow();
2352 c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal); 2354 c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal);
2353 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); 2355 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor);
2354 c->restore(); 2356 c->restore();
2355 validateStateStack(); 2357 validateStateStack();
2356 didDraw(dirtyRect); 2358 didDraw(dirtyRect);
2357 } 2359 }
2358 2360
2361 void CanvasRenderingContext2D::addHitRegion(ExceptionState& exceptionState)
2362 {
2363 addHitRegion(Dictionary(), exceptionState);
2364 }
2365
2366 void CanvasRenderingContext2D::addHitRegion(const Dictionary& options, Exception State& exceptionState)
2367 {
2368 HitRegionOptions passOptions;
2369
2370 bool hasId = options.getWithUndefinedOrNullCheck("id", passOptions.id) && !p assOptions.id.isEmpty();
2371 bool hasControl = options.getWithUndefinedOrNullCheck("control", passOptions .control) && passOptions.control;
2372
2373 if (!(hasId || hasControl)) {
2374 exceptionState.throwDOMException(NotSupportedError, "Both id and control are null.");
2375 return;
2376 }
2377
2378 FloatRect clipBounds;
2379 GraphicsContext* context = drawingContext();
2380
2381 if (m_path.isEmpty() || !context || !state().m_invertibleCTM
2382 || !context->getTransformedClipBounds(&clipBounds)) {
2383 exceptionState.throwDOMException(NotSupportedError, "The specified path has no pixels.");
2384 return;
2385 }
2386
2387 Path specifiedPath = m_path;
2388 specifiedPath.transform(state().m_transform);
2389
2390 passOptions.path = context->getCurrentClipPath(specifiedPath);
2391
2392 if (passOptions.path.isEmpty())
2393 exceptionState.throwDOMException(NotSupportedError, "The specified path has no pixels.");
2394 else
2395 addHitRegionInternal(passOptions, exceptionState);
2396 }
2397
2398 void CanvasRenderingContext2D::addHitRegionInternal(const HitRegionOptions& opti ons, ExceptionState& exceptionState)
2399 {
2400 if (!m_hitRegionManager)
2401 m_hitRegionManager = HitRegionManager::create();
2402
2403 // Remove previous region (with id or control)
2404 m_hitRegionManager->removeHitRegionById(options.id);
2405 m_hitRegionManager->removeHitRegionByControl(options.control.get());
2406
2407 RefPtrWillBeRawPtr<HitRegion> hitRegion = HitRegion::create(options);
2408 hitRegion->updateAccessibility(canvas());
2409 m_hitRegionManager->addHitRegion(hitRegion.release());
2410 }
2411
2412 void CanvasRenderingContext2D::removeHitRegion(const String& id)
2413 {
2414 if (m_hitRegionManager)
2415 m_hitRegionManager->removeHitRegionById(id);
2416 }
2417
2418 void CanvasRenderingContext2D::clearHitRegions()
2419 {
2420 if (m_hitRegionManager)
2421 m_hitRegionManager->removeAllHitRegions();
2422 }
2423
2424 HitRegion* CanvasRenderingContext2D::hitRegionAtPoint(const LayoutPoint& point)
2425 {
2426 if (m_hitRegionManager)
2427 return m_hitRegionManager->getHitRegionAtPoint(point);
2428
2429 return 0;
2430 }
2431
2432 unsigned CanvasRenderingContext2D::hitRegionsCount() const
2433 {
2434 if (m_hitRegionManager)
2435 return m_hitRegionManager->getHitRegionsCount();
2436
2437 return 0;
2438 }
2439
2359 } // namespace WebCore 2440 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698