Index: ui/gfx/image/image_skia.cc |
diff --git a/ui/gfx/image/image_skia.cc b/ui/gfx/image/image_skia.cc |
index df9d99b2a8e79b767825bd43c97a39148e91b91e..ec43a6f0be9bba88726e82ed77d5ef55e9890316 100644 |
--- a/ui/gfx/image/image_skia.cc |
+++ b/ui/gfx/image/image_skia.cc |
@@ -9,6 +9,7 @@ |
#include "base/logging.h" |
#include "ui/gfx/size.h" |
+#include "ui/gfx/skia_util.h" |
namespace gfx { |
@@ -159,10 +160,25 @@ int ImageSkia::height() const { |
bool ImageSkia::extractSubset(ImageSkia* dst, const SkIRect& subset) const { |
if (isNull()) |
return false; |
- SkBitmap dst_bitmap; |
- bool return_value = storage_->bitmaps()[0].extractSubset(&dst_bitmap, |
- subset); |
- *dst = ImageSkia(dst_bitmap); |
+ bool return_value = true; |
+ gfx::ImageSkia image; |
+ int dip_width = width(); |
+ std::vector<SkBitmap> bitmaps = storage_->bitmaps(); |
+ for (std::vector<SkBitmap> ::const_iterator it = bitmaps.begin(); |
+ it != bitmaps.end(); ++it) { |
Robert Sesek
2012/06/05 17:52:09
nit: align under s
kevers
2012/06/05 20:29:34
Done.
|
+ SkBitmap bitmap = *it; |
+ int px_width = it->width(); |
+ float dip_scale = (float) px_width / (float) dip_width; |
Robert Sesek
2012/06/05 17:52:09
C-style casts aren't allowed by the style guide.
kevers
2012/06/05 20:29:34
Changed to static_cast.
|
+ int x = (int) (subset.left() * dip_scale + 0.5); |
+ int y = (int) (subset.top() * dip_scale + 0.5); |
+ int w = (int) (subset.width() * dip_scale + 0.5); |
+ int h = (int) (subset.height() * dip_scale + 0.5); |
+ SkBitmap dst_bitmap; |
+ SkIRect scaled_subset = SkIRect::MakeXYWH(x, y, w, h); |
+ return_value &= bitmap.extractSubset(&dst_bitmap, scaled_subset); |
+ image.AddBitmapForScale(dst_bitmap, dip_scale); |
+ } |
+ *dst = image; |
Robert Sesek
2012/06/05 17:52:09
Should you overwrite dst ven if return_value==fals
kevers
2012/06/05 20:29:34
Changed to store only successfully extracted subse
|
return return_value; |
} |