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

Side by Side Diff: Source/platform/graphics/BitmapImage.cpp

Issue 1093673002: Removing the dependency on GraphicsContext for drawing images in 2D canvas (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 8 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) 2006 Samuel Weinig (sam.weinig@gmail.com) 2 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
3 * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 bool BitmapImage::hasColorProfile() const 265 bool BitmapImage::hasColorProfile() const
266 { 266 {
267 return m_source.hasColorProfile(); 267 return m_source.hasColorProfile();
268 } 268 }
269 269
270 String BitmapImage::filenameExtension() const 270 String BitmapImage::filenameExtension() const
271 { 271 {
272 return m_source.filenameExtension(); 272 return m_source.filenameExtension();
273 } 273 }
274 274
275 void BitmapImage::draw(GraphicsContext* ctxt, const FloatRect& dstRect, const Fl oatRect& srcRect, SkXfermode::Mode compositeOp, RespectImageOrientationEnum shou ldRespectImageOrientation) 275 bool BitmapImage::isLazyDecodedBitmap()
276 {
277 SkBitmap bitmap;
278 if (!bitmapForCurrentFrame(&bitmap))
279 return false;
280 return DeferredImageDecoder::isLazyDecoded(bitmap);
281 }
282
283 bool BitmapImage::isImmutableBitmap()
284 {
285 SkBitmap bitmap;
286 if (!bitmapForCurrentFrame(&bitmap))
287 return false;
288 return bitmap.isImmutable();
289 }
290
291 void BitmapImage::draw(SkCanvas* canvas, const SkPaint& paint, const FloatRect& dstRect, const FloatRect& srcRect, RespectImageOrientationEnum shouldRespectImag eOrientation)
276 { 292 {
277 TRACE_EVENT0("skia", "BitmapImage::draw"); 293 TRACE_EVENT0("skia", "BitmapImage::draw");
278 SkBitmap bitmap; 294 SkBitmap bitmap;
279 if (!bitmapForCurrentFrame(&bitmap)) 295 if (!bitmapForCurrentFrame(&bitmap))
280 return; // It's too early and we don't have an image yet. 296 return; // It's too early and we don't have an image yet.
281 297
282 FloatRect normDstRect = adjustForNegativeSize(dstRect); 298 FloatRect normDstRect = adjustForNegativeSize(dstRect);
283 FloatRect normSrcRect = adjustForNegativeSize(srcRect); 299 FloatRect normSrcRect = adjustForNegativeSize(srcRect);
284 normSrcRect.intersect(FloatRect(0, 0, bitmap.width(), bitmap.height())); 300 normSrcRect.intersect(FloatRect(0, 0, bitmap.width(), bitmap.height()));
285 301
286 if (normSrcRect.isEmpty() || normDstRect.isEmpty()) 302 if (normSrcRect.isEmpty() || normDstRect.isEmpty())
287 return; // Nothing to draw. 303 return; // Nothing to draw.
288 304
289 ImageOrientation orientation = DefaultImageOrientation; 305 ImageOrientation orientation = DefaultImageOrientation;
290 if (shouldRespectImageOrientation == RespectImageOrientation) 306 if (shouldRespectImageOrientation == RespectImageOrientation)
291 orientation = frameOrientationAtIndex(m_currentFrame); 307 orientation = frameOrientationAtIndex(m_currentFrame);
292 308
293 GraphicsContextStateSaver saveContext(*ctxt, false); 309 int initialSaveCount = canvas->getSaveCount();
294 if (orientation != DefaultImageOrientation) { 310 if (orientation != DefaultImageOrientation) {
295 saveContext.save(); 311 canvas->save();
296 312
297 // ImageOrientation expects the origin to be at (0, 0) 313 // ImageOrientation expects the origin to be at (0, 0)
298 ctxt->translate(normDstRect.x(), normDstRect.y()); 314 canvas->translate(normDstRect.x(), normDstRect.y());
299 normDstRect.setLocation(FloatPoint()); 315 normDstRect.setLocation(FloatPoint());
300 316
301 ctxt->concatCTM(orientation.transformFromDefault(normDstRect.size())); 317 canvas->concat(affineTransformToSkMatrix(orientation.transformFromDefaul t(normDstRect.size())));
302 318
303 if (orientation.usesWidthAsHeight()) { 319 if (orientation.usesWidthAsHeight()) {
304 // The destination rect will have it's width and height already reve rsed for the orientation of 320 // The destination rect will have it's width and height already reve rsed for the orientation of
305 // the image, as it was needed for page layout, so we need to revers e it back here. 321 // the image, as it was needed for page layout, so we need to revers e it back here.
306 normDstRect = FloatRect(normDstRect.x(), normDstRect.y(), normDstRec t.height(), normDstRect.width()); 322 normDstRect = FloatRect(normDstRect.x(), normDstRect.y(), normDstRec t.height(), normDstRect.width());
307 } 323 }
308 } 324 }
309 325
310 bool isLazyDecoded = DeferredImageDecoder::isLazyDecoded(bitmap); 326 SkRect skSrcRect = normSrcRect;
311 bool isOpaque = bitmap.isOpaque(); 327 canvas->drawBitmapRectToRect(bitmap, &skSrcRect, normDstRect, &paint);
328 canvas->restoreToCount(initialSaveCount);
312 329
313 { 330 if (DeferredImageDecoder::isLazyDecoded(bitmap))
314 SkPaint paint;
315 SkRect skSrcRect = normSrcRect;
316 int initialSaveCount = ctxt->preparePaintForDrawRectToRect(&paint, skSrc Rect, normDstRect, compositeOp, !isOpaque, isLazyDecoded, bitmap.isImmutable());
317 // We want to filter it if we decided to do interpolation above, or if
318 // there is something interesting going on with the matrix (like a rotat ion).
319 // Note: for serialization, we will want to subset the bitmap first so w e
320 // don't send extra pixels.
321 ctxt->drawBitmapRect(bitmap, &skSrcRect, normDstRect, &paint);
322 ctxt->canvas()->restoreToCount(initialSaveCount);
323 }
324
325 if (isLazyDecoded)
326 PlatformInstrumentation::didDrawLazyPixelRef(bitmap.getGenerationID()); 331 PlatformInstrumentation::didDrawLazyPixelRef(bitmap.getGenerationID());
327 332
328 if (ImageObserver* observer = imageObserver()) 333 if (ImageObserver* observer = imageObserver())
329 observer->didDraw(this); 334 observer->didDraw(this);
330 335
331 startAnimation(); 336 startAnimation();
332 } 337 }
333 338
334 size_t BitmapImage::frameCount() 339 size_t BitmapImage::frameCount()
335 { 340 {
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 670
666 return m_isSolidColor && !m_currentFrame; 671 return m_isSolidColor && !m_currentFrame;
667 } 672 }
668 673
669 Color BitmapImage::solidColor() const 674 Color BitmapImage::solidColor() const
670 { 675 {
671 return m_solidColor; 676 return m_solidColor;
672 } 677 }
673 678
674 } // namespace blink 679 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698