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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 #include "core/dom/ExceptionCode.h" 45 #include "core/dom/ExceptionCode.h"
46 #include "core/fetch/ImageResource.h" 46 #include "core/fetch/ImageResource.h"
47 #include "core/frame/ImageBitmap.h" 47 #include "core/frame/ImageBitmap.h"
48 #include "core/html/HTMLCanvasElement.h" 48 #include "core/html/HTMLCanvasElement.h"
49 #include "core/html/HTMLImageElement.h" 49 #include "core/html/HTMLImageElement.h"
50 #include "core/html/HTMLMediaElement.h" 50 #include "core/html/HTMLMediaElement.h"
51 #include "core/html/HTMLVideoElement.h" 51 #include "core/html/HTMLVideoElement.h"
52 #include "core/html/ImageData.h" 52 #include "core/html/ImageData.h"
53 #include "core/html/TextMetrics.h" 53 #include "core/html/TextMetrics.h"
54 #include "core/html/canvas/CanvasGradient.h" 54 #include "core/html/canvas/CanvasGradient.h"
55 #include "core/html/canvas/CanvasHitRegion.h"
55 #include "core/html/canvas/CanvasPattern.h" 56 #include "core/html/canvas/CanvasPattern.h"
56 #include "core/html/canvas/CanvasStyle.h" 57 #include "core/html/canvas/CanvasStyle.h"
57 #include "core/html/canvas/Path2D.h" 58 #include "core/html/canvas/Path2D.h"
58 #include "core/rendering/RenderImage.h" 59 #include "core/rendering/RenderImage.h"
59 #include "core/rendering/RenderLayer.h" 60 #include "core/rendering/RenderLayer.h"
60 #include "core/rendering/RenderTheme.h" 61 #include "core/rendering/RenderTheme.h"
61 #include "platform/fonts/FontCache.h" 62 #include "platform/fonts/FontCache.h"
62 #include "platform/geometry/FloatQuad.h" 63 #include "platform/geometry/FloatQuad.h"
63 #include "platform/graphics/DrawLooperBuilder.h" 64 #include "platform/graphics/DrawLooperBuilder.h"
64 #include "platform/graphics/GraphicsContextStateSaver.h" 65 #include "platform/graphics/GraphicsContextStateSaver.h"
(...skipping 14 matching lines...) Expand all
79 static const double TryRestoreContextInterval = 0.5; 80 static const double TryRestoreContextInterval = 0.5;
80 static const unsigned MaxTryRestoreContextAttempts = 4; 81 static const unsigned MaxTryRestoreContextAttempts = 4;
81 82
82 static bool contextLostRestoredEventsEnabled() 83 static bool contextLostRestoredEventsEnabled()
83 { 84 {
84 return RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled(); 85 return RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled();
85 } 86 }
86 87
87 CanvasRenderingContext2D::CanvasRenderingContext2D(HTMLCanvasElement* canvas, co nst Canvas2DContextAttributes* attrs, bool usesCSSCompatibilityParseMode) 88 CanvasRenderingContext2D::CanvasRenderingContext2D(HTMLCanvasElement* canvas, co nst Canvas2DContextAttributes* attrs, bool usesCSSCompatibilityParseMode)
88 : CanvasRenderingContext(canvas) 89 : CanvasRenderingContext(canvas)
90 , m_hitRegionManager(CanvasHitRegionManager::create())
89 , m_usesCSSCompatibilityParseMode(usesCSSCompatibilityParseMode) 91 , m_usesCSSCompatibilityParseMode(usesCSSCompatibilityParseMode)
90 , m_hasAlpha(!attrs || attrs->alpha()) 92 , m_hasAlpha(!attrs || attrs->alpha())
91 , m_isContextLost(false) 93 , m_isContextLost(false)
92 , m_contextRestorable(true) 94 , m_contextRestorable(true)
93 , m_storageMode(!attrs ? PersistentStorage : attrs->parsedStorage()) 95 , m_storageMode(!attrs ? PersistentStorage : attrs->parsedStorage())
94 , m_tryRestoreContextAttemptCount(0) 96 , m_tryRestoreContextAttemptCount(0)
95 , m_dispatchContextLostEventTimer(this, &CanvasRenderingContext2D::dispatchC ontextLostEvent) 97 , m_dispatchContextLostEventTimer(this, &CanvasRenderingContext2D::dispatchC ontextLostEvent)
96 , m_dispatchContextRestoredEventTimer(this, &CanvasRenderingContext2D::dispa tchContextRestoredEvent) 98 , m_dispatchContextRestoredEventTimer(this, &CanvasRenderingContext2D::dispa tchContextRestoredEvent)
97 , m_tryRestoreContextEventTimer(this, &CanvasRenderingContext2D::tryRestoreC ontextEvent) 99 , m_tryRestoreContextEventTimer(this, &CanvasRenderingContext2D::tryRestoreC ontextEvent)
98 { 100 {
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 reset(); 161 reset();
160 m_isContextLost = false; 162 m_isContextLost = false;
161 } 163 }
162 } 164 }
163 } 165 }
164 166
165 void CanvasRenderingContext2D::trace(Visitor* visitor) 167 void CanvasRenderingContext2D::trace(Visitor* visitor)
166 { 168 {
167 #if ENABLE(OILPAN) 169 #if ENABLE(OILPAN)
168 visitor->trace(m_stateStack); 170 visitor->trace(m_stateStack);
171 visitor->trace(m_hitRegionManager);
169 visitor->trace(m_fetchedFonts); 172 visitor->trace(m_fetchedFonts);
170 #endif 173 #endif
171 CanvasRenderingContext::trace(visitor); 174 CanvasRenderingContext::trace(visitor);
172 } 175 }
173 176
174 void CanvasRenderingContext2D::dispatchContextLostEvent(Timer<CanvasRenderingCon text2D>*) 177 void CanvasRenderingContext2D::dispatchContextLostEvent(Timer<CanvasRenderingCon text2D>*)
175 { 178 {
176 if (contextLostRestoredEventsEnabled()) { 179 if (contextLostRestoredEventsEnabled()) {
177 RefPtrWillBeRawPtr<Event> event = Event::createCancelable(EventTypeNames ::contextlost); 180 RefPtrWillBeRawPtr<Event> event = Event::createCancelable(EventTypeNames ::contextlost);
178 canvas()->dispatchEvent(event); 181 canvas()->dispatchEvent(event);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 canvas()->dispatchEvent(event); 226 canvas()->dispatchEvent(event);
224 } 227 }
225 } 228 }
226 229
227 void CanvasRenderingContext2D::reset() 230 void CanvasRenderingContext2D::reset()
228 { 231 {
229 unwindStateStack(); 232 unwindStateStack();
230 m_stateStack.resize(1); 233 m_stateStack.resize(1);
231 m_stateStack.first() = adoptPtrWillBeNoop(new State()); 234 m_stateStack.first() = adoptPtrWillBeNoop(new State());
232 m_path.clear(); 235 m_path.clear();
236 m_hitRegionManager->clear();
233 } 237 }
234 238
235 // Important: Several of these properties are also stored in GraphicsContext's 239 // Important: Several of these properties are also stored in GraphicsContext's
236 // StrokeData. The default values that StrokeData uses may not the same values 240 // StrokeData. The default values that StrokeData uses may not the same values
237 // that the canvas 2d spec specifies. Make sure to sync the initial state of the 241 // that the canvas 2d spec specifies. Make sure to sync the initial state of the
238 // GraphicsContext in HTMLCanvasElement::createImageBuffer()! 242 // GraphicsContext in HTMLCanvasElement::createImageBuffer()!
239 CanvasRenderingContext2D::State::State() 243 CanvasRenderingContext2D::State::State()
240 : m_unrealizedSaveCount(0) 244 : m_unrealizedSaveCount(0)
241 , m_strokeStyle(CanvasStyle::createFromRGBA(Color::black)) 245 , m_strokeStyle(CanvasStyle::createFromRGBA(Color::black))
242 , m_fillStyle(CanvasStyle::createFromRGBA(Color::black)) 246 , m_fillStyle(CanvasStyle::createFromRGBA(Color::black))
(...skipping 966 matching lines...) Expand 10 before | Expand all | Expand 10 after
1209 if (!context) 1213 if (!context)
1210 return; 1214 return;
1211 if (!state().m_invertibleCTM) 1215 if (!state().m_invertibleCTM)
1212 return; 1216 return;
1213 FloatRect rect(x, y, width, height); 1217 FloatRect rect(x, y, width, height);
1214 1218
1215 FloatRect dirtyRect; 1219 FloatRect dirtyRect;
1216 if (!computeDirtyRect(rect, &dirtyRect)) 1220 if (!computeDirtyRect(rect, &dirtyRect))
1217 return; 1221 return;
1218 1222
1223 m_hitRegionManager->removeEnclosed(rect, state().m_transform);
1224
1219 bool saved = false; 1225 bool saved = false;
1220 if (shouldDrawShadows()) { 1226 if (shouldDrawShadows()) {
1221 context->save(); 1227 context->save();
1222 saved = true; 1228 saved = true;
1223 context->clearShadow(); 1229 context->clearShadow();
1224 } 1230 }
1225 if (state().m_globalAlpha != 1) { 1231 if (state().m_globalAlpha != 1) {
1226 if (!saved) { 1232 if (!saved) {
1227 context->save(); 1233 context->save();
1228 saved = true; 1234 saved = true;
(...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after
2259 c->setImageInterpolationQuality(enabled ? CanvasDefaultInterpolationQual ity : InterpolationNone); 2265 c->setImageInterpolationQuality(enabled ? CanvasDefaultInterpolationQual ity : InterpolationNone);
2260 } 2266 }
2261 2267
2262 PassRefPtr<Canvas2DContextAttributes> CanvasRenderingContext2D::getContextAttrib utes() const 2268 PassRefPtr<Canvas2DContextAttributes> CanvasRenderingContext2D::getContextAttrib utes() const
2263 { 2269 {
2264 RefPtr<Canvas2DContextAttributes> attributes = Canvas2DContextAttributes::cr eate(); 2270 RefPtr<Canvas2DContextAttributes> attributes = Canvas2DContextAttributes::cr eate();
2265 attributes->setAlpha(m_hasAlpha); 2271 attributes->setAlpha(m_hasAlpha);
2266 return attributes.release(); 2272 return attributes.release();
2267 } 2273 }
2268 2274
2275 void CanvasRenderingContext2D::addHitRegion(ExceptionState& exceptionState)
2276 {
2277 DecodedHitRegionOptions decodedOptions;
2278 decodedOptions.resolvePath(m_path, state().m_transform);
2279 // parentId / id will be null here, so no need to resolve them.
2280
2281 addHitRegionInternal(decodedOptions, exceptionState);
2282 }
2283
2284 void CanvasRenderingContext2D::addHitRegion(const Dictionary& options, Exception State& exceptionState)
2285 {
2286 DecodedHitRegionOptions decodedOptions(options);
2287 decodedOptions.resolvePath(m_path, state().m_transform);
2288 decodedOptions.resolveIds(m_hitRegionManager.get());
2289
2290 addHitRegionInternal(decodedOptions, exceptionState);
2291 }
2292
2293 void CanvasRenderingContext2D::removeHitRegion(const String& id)
2294 {
2295 if (CanvasHitRegion* hitRegion = m_hitRegionManager->getHitRegionById(id))
2296 m_hitRegionManager->remove(hitRegion);
2297 }
2298
2299 CanvasHitRegion* CanvasRenderingContext2D::hitRegionAtPoint(const LayoutPoint& p oint)
2300 {
2301 return m_hitRegionManager->getHitRegionAtPoint(point);
2302 }
2303
2304 void CanvasRenderingContext2D::addHitRegionInternal(const DecodedHitRegionOption s& options, ExceptionState& exceptionState)
2305 {
2306 if (!options.validate(exceptionState))
2307 return;
2308
2309 RefPtrWillBeRawPtr<CanvasHitRegion> hitRegion = CanvasHitRegion::create(opti ons);
2310 m_hitRegionManager->remove(options.previousHitRegion.get());
2311 m_hitRegionManager->add(hitRegion.release());
2312 }
2313
2269 void CanvasRenderingContext2D::drawFocusIfNeeded(Element* element) 2314 void CanvasRenderingContext2D::drawFocusIfNeeded(Element* element)
2270 { 2315 {
2271 drawFocusIfNeededInternal(m_path, element); 2316 drawFocusIfNeededInternal(m_path, element);
2272 } 2317 }
2273 2318
2274 void CanvasRenderingContext2D::drawFocusIfNeeded(Path2D* path2d, Element* elemen t) 2319 void CanvasRenderingContext2D::drawFocusIfNeeded(Path2D* path2d, Element* elemen t)
2275 { 2320 {
2276 drawFocusIfNeededInternal(path2d->path(), element); 2321 drawFocusIfNeededInternal(path2d->path(), element);
2277 } 2322 }
2278 2323
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
2370 c->setAlphaAsFloat(1.0); 2415 c->setAlphaAsFloat(1.0);
2371 c->clearShadow(); 2416 c->clearShadow();
2372 c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal); 2417 c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal);
2373 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); 2418 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor);
2374 c->restore(); 2419 c->restore();
2375 2420
2376 didDraw(dirtyRect); 2421 didDraw(dirtyRect);
2377 } 2422 }
2378 2423
2379 } // namespace WebCore 2424 } // namespace WebCore
OLDNEW
« 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