| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/gfx/image/image_family.h" | 5 #include "ui/gfx/image/image_family.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "skia/ext/image_operations.h" |
| 9 #include "ui/gfx/geometry/size.h" | 10 #include "ui/gfx/geometry/size.h" |
| 10 #include "ui/gfx/image/image.h" | 11 #include "ui/gfx/image/image.h" |
| 11 #include "ui/gfx/image/image_skia.h" | 12 #include "ui/gfx/image/image_skia.h" |
| 12 | 13 |
| 13 namespace gfx { | 14 namespace gfx { |
| 14 | 15 |
| 15 ImageFamily::const_iterator::const_iterator() {} | 16 ImageFamily::const_iterator::const_iterator() {} |
| 16 | 17 |
| 17 ImageFamily::const_iterator::const_iterator(const const_iterator& other) | 18 ImageFamily::const_iterator::const_iterator(const const_iterator& other) |
| 18 : map_iterator_(other.map_iterator_) {} | 19 : map_iterator_(other.map_iterator_) {} |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 float wider_aspect = greater_or_equal->first.aspect(); | 101 float wider_aspect = greater_or_equal->first.aspect(); |
| 101 DCHECK_GT(wider_aspect, desired_aspect); | 102 DCHECK_GT(wider_aspect, desired_aspect); |
| 102 return wider_aspect; | 103 return wider_aspect; |
| 103 } | 104 } |
| 104 } | 105 } |
| 105 | 106 |
| 106 const gfx::Image* ImageFamily::GetBest(const gfx::Size& size) const { | 107 const gfx::Image* ImageFamily::GetBest(const gfx::Size& size) const { |
| 107 return GetBest(size.width(), size.height()); | 108 return GetBest(size.width(), size.height()); |
| 108 } | 109 } |
| 109 | 110 |
| 111 gfx::Image ImageFamily::CreateExact(int width, int height) const { |
| 112 // Resize crashes if width or height is 0, so just return an empty image. |
| 113 if (width == 0 || height == 0) |
| 114 return gfx::Image(); |
| 115 |
| 116 const gfx::Image* image = GetBest(width, height); |
| 117 if (!image) |
| 118 return gfx::Image(); |
| 119 |
| 120 if (image->Width() == width && image->Height() == height) |
| 121 return gfx::Image(*image); |
| 122 |
| 123 SkBitmap bitmap = image->AsBitmap(); |
| 124 SkBitmap resized_bitmap = skia::ImageOperations::Resize( |
| 125 bitmap, skia::ImageOperations::RESIZE_LANCZOS3, width, height); |
| 126 return gfx::Image::CreateFrom1xBitmap(resized_bitmap); |
| 127 } |
| 128 |
| 129 gfx::Image ImageFamily::CreateExact(const gfx::Size& size) const { |
| 130 return CreateExact(size.width(), size.height()); |
| 131 } |
| 132 |
| 110 const gfx::Image* ImageFamily::GetWithExactAspect(float aspect, | 133 const gfx::Image* ImageFamily::GetWithExactAspect(float aspect, |
| 111 int width) const { | 134 int width) const { |
| 112 // Find the two images of given aspect ratio on either side of |width|. | 135 // Find the two images of given aspect ratio on either side of |width|. |
| 113 std::map<MapKey, gfx::Image>::const_iterator greater_or_equal = | 136 std::map<MapKey, gfx::Image>::const_iterator greater_or_equal = |
| 114 map_.lower_bound(MapKey(aspect, width)); | 137 map_.lower_bound(MapKey(aspect, width)); |
| 115 if (greater_or_equal != map_.end() && | 138 if (greater_or_equal != map_.end() && |
| 116 greater_or_equal->first.aspect() == aspect) { | 139 greater_or_equal->first.aspect() == aspect) { |
| 117 // We have found the smallest image of the same size or greater. | 140 // We have found the smallest image of the same size or greater. |
| 118 return &greater_or_equal->second; | 141 return &greater_or_equal->second; |
| 119 } | 142 } |
| 120 | 143 |
| 121 DCHECK(greater_or_equal != map_.begin()); | 144 DCHECK(greater_or_equal != map_.begin()); |
| 122 std::map<MapKey, gfx::Image>::const_iterator less_than = greater_or_equal; | 145 std::map<MapKey, gfx::Image>::const_iterator less_than = greater_or_equal; |
| 123 --less_than; | 146 --less_than; |
| 124 // This must be true because there must be at least one image with |aspect|. | 147 // This must be true because there must be at least one image with |aspect|. |
| 125 DCHECK_EQ(less_than->first.aspect(), aspect); | 148 DCHECK_EQ(less_than->first.aspect(), aspect); |
| 126 // We have found the largest image smaller than desired. | 149 // We have found the largest image smaller than desired. |
| 127 return &less_than->second; | 150 return &less_than->second; |
| 128 } | 151 } |
| 129 | 152 |
| 130 } // namespace gfx | 153 } // namespace gfx |
| OLD | NEW |