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..f70edd3255104a9bd85cb52f8ac6d3937467999c 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,11 +160,29 @@ 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); |
- return return_value; |
+ gfx::ImageSkia image; |
+ int dip_width = width(); |
+ std::vector<SkBitmap> bitmaps = storage_->bitmaps(); |
sky
2012/06/07 17:42:19
const std::vector<SkBitmap>&
kevers
2012/06/07 18:12:00
Done.
|
+ for (std::vector<SkBitmap>::const_iterator it = bitmaps.begin(); |
+ it != bitmaps.end(); ++it) { |
+ SkBitmap bitmap = *it; |
sky
2012/06/07 17:42:19
const SkBitmap&
kevers
2012/06/07 18:12:00
Done.
|
+ int px_width = it->width(); |
+ float dip_scale = static_cast<float>(px_width) / |
+ static_cast<float>(dip_width); |
+ int x = static_cast<int>(subset.left() * dip_scale + 0.5); |
sky
2012/06/07 17:42:19
Add a comment as to why the + .5
kevers
2012/06/07 18:12:00
Done.
|
+ int y = static_cast<int>(subset.top() * dip_scale + 0.5); |
+ int w = static_cast<int>(subset.width() * dip_scale + 0.5); |
+ int h = static_cast<int>(subset.height() * dip_scale + 0.5); |
+ SkBitmap dst_bitmap; |
+ SkIRect scaled_subset = SkIRect::MakeXYWH(x, y, w, h); |
+ if (bitmap.extractSubset(&dst_bitmap, scaled_subset)) |
+ image.AddBitmapForScale(dst_bitmap, dip_scale); |
+ } |
+ if (image.empty()) |
+ return false; |
+ |
+ *dst = image; |
+ return true; |
} |
const std::vector<SkBitmap> ImageSkia::bitmaps() const { |