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

Side by Side Diff: Source/core/html/canvas/CanvasRenderingContext2D.cpp

Issue 19393004: Allow eviction of ImageBitmaps that are created from ImageElements. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix for assertion failure. Created 7 years, 4 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
« no previous file with comments | « Source/core/html/HTMLImageElement.h ('k') | Source/core/loader/ImageLoader.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 Intel Corporation. All rights reserved. 8 * Copyright (C) 2012 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 1237 matching lines...) Expand 10 before | Expand all | Expand 10 after
1248 drawImage(bitmap, x, y, bitmap->width(), bitmap->height(), es); 1248 drawImage(bitmap, x, y, bitmap->width(), bitmap->height(), es);
1249 } 1249 }
1250 1250
1251 void CanvasRenderingContext2D::drawImage(ImageBitmap* bitmap, 1251 void CanvasRenderingContext2D::drawImage(ImageBitmap* bitmap,
1252 float x, float y, float width, float height, ExceptionState& es) 1252 float x, float y, float width, float height, ExceptionState& es)
1253 { 1253 {
1254 if (!bitmap) { 1254 if (!bitmap) {
1255 es.throwDOMException(TypeMismatchError); 1255 es.throwDOMException(TypeMismatchError);
1256 return; 1256 return;
1257 } 1257 }
1258 if (!bitmap->bitmapWidth() || !bitmap->bitmapHeight()) 1258 if (!bitmap->bitmapRect().width() || !bitmap->bitmapRect().height())
1259 return; 1259 return;
1260 1260
1261 drawImage(bitmap, 0, 0, bitmap->bitmapWidth(), bitmap->bitmapHeight(), x, y, width, height, es); 1261 drawImage(bitmap, 0, 0, bitmap->width(), bitmap->height(), x, y, width, heig ht, es);
1262 } 1262 }
1263 1263
1264 void CanvasRenderingContext2D::drawImage(ImageBitmap* bitmap, 1264 void CanvasRenderingContext2D::drawImage(ImageBitmap* bitmap,
1265 float sx, float sy, float sw, float sh, 1265 float sx, float sy, float sw, float sh,
1266 float dx, float dy, float dw, float dh, ExceptionState& es) 1266 float dx, float dy, float dw, float dh, ExceptionState& es)
1267 { 1267 {
1268 if (!bitmap) { 1268 if (!bitmap) {
1269 es.throwDOMException(TypeMismatchError); 1269 es.throwDOMException(TypeMismatchError);
1270 return; 1270 return;
1271 } 1271 }
1272 1272
1273 FloatRect srcRect(sx, sy, sw, sh); 1273 FloatRect srcRect(sx, sy, sw, sh);
1274 FloatRect dstRect(dx, dy, dw, dh); 1274 FloatRect dstRect(dx, dy, dw, dh);
1275 FloatRect bitmapRect = bitmap->bitmapRect();
1275 1276
1276 if (!std::isfinite(dstRect.x()) || !std::isfinite(dstRect.y()) || !std::isfi nite(dstRect.width()) || !std::isfinite(dstRect.height()) 1277 if (!std::isfinite(dstRect.x()) || !std::isfinite(dstRect.y()) || !std::isfi nite(dstRect.width()) || !std::isfinite(dstRect.height())
1277 || !std::isfinite(srcRect.x()) || !std::isfinite(srcRect.y()) || !std::i sfinite(srcRect.width()) || !std::isfinite(srcRect.height())) 1278 || !std::isfinite(srcRect.x()) || !std::isfinite(srcRect.y()) || !std::i sfinite(srcRect.width()) || !std::isfinite(srcRect.height()))
1278 return; 1279 return;
1279 1280
1280 if (!dstRect.width() || !dstRect.height()) 1281 if (!dstRect.width() || !dstRect.height())
1281 return; 1282 return;
1282
1283 ASSERT(bitmap->height() && bitmap->width());
1284
1285 FloatRect normalizedSrcRect = normalizeRect(srcRect);
1286 FloatRect normalizedDstRect = normalizeRect(dstRect);
1287 FloatRect actualDstRect(FloatPoint(bitmap->bitmapOffset()), bitmap->bitmapSi ze());
1288 actualDstRect.scale(normalizedDstRect.width() / bitmap->width(), normalizedD stRect.height() / bitmap->height());
1289 actualDstRect.moveBy(normalizedDstRect.location());
1290
1291 FloatRect imageRect = FloatRect(FloatPoint(), bitmap->bitmapSize());
1292 if (!srcRect.width() || !srcRect.height()) { 1283 if (!srcRect.width() || !srcRect.height()) {
1293 es.throwDOMException(IndexSizeError); 1284 es.throwDOMException(IndexSizeError);
1294 return; 1285 return;
1295 } 1286 }
1296 if (!imageRect.intersects(normalizedSrcRect)) 1287
1288 ASSERT(bitmap->height() && bitmap->width());
1289 FloatRect normalizedSrcRect = normalizeRect(srcRect);
1290 FloatRect normalizedDstRect = normalizeRect(dstRect);
1291
1292 // Clip the rects to where the user thinks that the image is situated.
1293 clipRectsToImageRect(IntRect(IntPoint(), bitmap->size()), &normalizedSrcRect , &normalizedDstRect);
1294
1295 FloatRect intersectRect = intersection(bitmapRect, normalizedSrcRect);
1296 FloatRect actualSrcRect(intersectRect);
1297 actualSrcRect.move(-bitmapRect.x(), -bitmapRect.y());
1298
1299 FloatRect imageRect = FloatRect(FloatPoint(), bitmapRect.size());
1300
1301 FloatRect actualDstRect(FloatPoint(intersectRect.location() - normalizedSrcR ect.location()), bitmapRect.size());
1302 actualDstRect.scale(normalizedDstRect.width() / normalizedSrcRect.width() * intersectRect.width() / bitmapRect.width(),
1303 normalizedDstRect.height() / normalizedSrcRect.height() * intersectRect. height() / bitmapRect.height());
1304 actualDstRect.moveBy(normalizedDstRect.location());
1305
1306 if (!imageRect.intersects(actualSrcRect))
1297 return; 1307 return;
1298 1308
1299 clipRectsToImageRect(imageRect, &normalizedSrcRect, &actualDstRect); 1309 RefPtr<Image> imageForRendering = bitmap->bitmapImage();
1300 1310 drawImageInternal(imageForRendering.get(), actualSrcRect, actualDstRect, sta te().m_globalComposite, state().m_globalBlend);
1301 Image* imageForRendering = bitmap->bitmapImage();
1302
1303 drawImageInternal(imageForRendering, normalizedSrcRect, actualDstRect, state ().m_globalComposite, state().m_globalBlend);
1304 } 1311 }
1305 1312
1306 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, float x, float y, ExceptionState& es) 1313 void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, float x, float y, ExceptionState& es)
1307 { 1314 {
1308 if (!image) { 1315 if (!image) {
1309 es.throwDOMException(TypeMismatchError); 1316 es.throwDOMException(TypeMismatchError);
1310 return; 1317 return;
1311 } 1318 }
1312 LayoutSize s = size(image); 1319 LayoutSize s = size(image);
1313 drawImage(image, x, y, s.width(), s.height(), es); 1320 drawImage(image, x, y, s.width(), s.height(), es);
(...skipping 1087 matching lines...) Expand 10 before | Expand all | Expand 10 after
2401 2408
2402 RefPtr<RenderStyle> style(RenderStyle::createDefaultStyle()); 2409 RefPtr<RenderStyle> style(RenderStyle::createDefaultStyle());
2403 Color focusRingColor = RenderTheme::focusRingColor(); 2410 Color focusRingColor = RenderTheme::focusRingColor();
2404 c->drawFocusRing(path, style->outlineWidth(), style->outlineOffset(), focusR ingColor); 2411 c->drawFocusRing(path, style->outlineWidth(), style->outlineOffset(), focusR ingColor);
2405 didDraw(path.boundingRect()); 2412 didDraw(path.boundingRect());
2406 2413
2407 c->restore(); 2414 c->restore();
2408 } 2415 }
2409 2416
2410 } // namespace WebCore 2417 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/html/HTMLImageElement.h ('k') | Source/core/loader/ImageLoader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698