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

Side by Side Diff: ui/gfx/image/image_skia_operations.cc

Issue 10704199: Implement remaining SkBitmapOperations as ImageSkiaOperations (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 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 | « ui/gfx/image/image_skia_operations.h ('k') | ui/views/controls/button/image_button.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 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_skia_operations.h" 5 #include "ui/gfx/image/image_skia_operations.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "skia/ext/image_operations.h" 9 #include "skia/ext/image_operations.h"
10 #include "skia/ext/platform_canvas.h" 10 #include "skia/ext/platform_canvas.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 class BlendingImageSource : public gfx::ImageSkiaSource { 61 class BlendingImageSource : public gfx::ImageSkiaSource {
62 public: 62 public:
63 BlendingImageSource(const ImageSkia& first, 63 BlendingImageSource(const ImageSkia& first,
64 const ImageSkia& second, 64 const ImageSkia& second,
65 double alpha) 65 double alpha)
66 : first_(first), 66 : first_(first),
67 second_(second), 67 second_(second),
68 alpha_(alpha) { 68 alpha_(alpha) {
69 } 69 }
70 70
71 virtual ~BlendingImageSource() {
72 }
73
71 // gfx::ImageSkiaSource overrides: 74 // gfx::ImageSkiaSource overrides:
72 virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE { 75 virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE {
73 ImageSkiaRep first_rep = first_.GetRepresentation(scale_factor); 76 ImageSkiaRep first_rep = first_.GetRepresentation(scale_factor);
74 ImageSkiaRep second_rep = second_.GetRepresentation(scale_factor); 77 ImageSkiaRep second_rep = second_.GetRepresentation(scale_factor);
75 MatchScale(&first_rep, &second_rep); 78 MatchScale(&first_rep, &second_rep);
76 SkBitmap blended = SkBitmapOperations::CreateBlendedBitmap( 79 SkBitmap blended = SkBitmapOperations::CreateBlendedBitmap(
77 first_rep.sk_bitmap(), second_rep.sk_bitmap(), alpha_); 80 first_rep.sk_bitmap(), second_rep.sk_bitmap(), alpha_);
78 return ImageSkiaRep(blended, first_rep.scale_factor()); 81 return ImageSkiaRep(blended, first_rep.scale_factor());
79 } 82 }
80 83
81 private: 84 private:
82 const ImageSkia first_; 85 const ImageSkia first_;
83 const ImageSkia second_; 86 const ImageSkia second_;
84 double alpha_; 87 double alpha_;
85 88
86 DISALLOW_COPY_AND_ASSIGN(BlendingImageSource); 89 DISALLOW_COPY_AND_ASSIGN(BlendingImageSource);
87 }; 90 };
88 91
89 class MaskedImageSource : public gfx::ImageSkiaSource { 92 class MaskedImageSource : public gfx::ImageSkiaSource {
90 public: 93 public:
91 MaskedImageSource(const ImageSkia& rgb, const ImageSkia& alpha) 94 MaskedImageSource(const ImageSkia& rgb, const ImageSkia& alpha)
92 : rgb_(rgb), 95 : rgb_(rgb),
93 alpha_(alpha) { 96 alpha_(alpha) {
94 } 97 }
95 98
99 virtual ~MaskedImageSource() {
100 }
101
96 // gfx::ImageSkiaSource overrides: 102 // gfx::ImageSkiaSource overrides:
97 virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE { 103 virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE {
98 ImageSkiaRep rgb_rep = rgb_.GetRepresentation(scale_factor); 104 ImageSkiaRep rgb_rep = rgb_.GetRepresentation(scale_factor);
99 ImageSkiaRep alpha_rep = alpha_.GetRepresentation(scale_factor); 105 ImageSkiaRep alpha_rep = alpha_.GetRepresentation(scale_factor);
100 MatchScale(&rgb_rep, &alpha_rep); 106 MatchScale(&rgb_rep, &alpha_rep);
101 return ImageSkiaRep(SkBitmapOperations::CreateMaskedBitmap( 107 return ImageSkiaRep(SkBitmapOperations::CreateMaskedBitmap(
102 rgb_rep.sk_bitmap(), alpha_rep.sk_bitmap()), 108 rgb_rep.sk_bitmap(), alpha_rep.sk_bitmap()),
103 rgb_rep.scale_factor()); 109 rgb_rep.scale_factor());
104 } 110 }
105 111
106 private: 112 private:
107 const ImageSkia rgb_; 113 const ImageSkia rgb_;
108 const ImageSkia alpha_; 114 const ImageSkia alpha_;
109 115
110 DISALLOW_COPY_AND_ASSIGN(MaskedImageSource); 116 DISALLOW_COPY_AND_ASSIGN(MaskedImageSource);
111 }; 117 };
112 118
113 class TiledImageSource : public gfx::ImageSkiaSource { 119 class TiledImageSource : public gfx::ImageSkiaSource {
114 public: 120 public:
115 TiledImageSource(const ImageSkia& source, 121 TiledImageSource(const ImageSkia& source,
116 int src_x, int src_y, 122 int src_x, int src_y,
117 int dst_w, int dst_h) 123 int dst_w, int dst_h)
118 : source_(source), 124 : source_(source),
119 src_x_(src_x), 125 src_x_(src_x),
120 src_y_(src_y), 126 src_y_(src_y),
121 dst_w_(dst_w), 127 dst_w_(dst_w),
122 dst_h_(dst_h) { 128 dst_h_(dst_h) {
123 } 129 }
124 130
131 virtual ~TiledImageSource() {
132 }
133
125 // gfx::ImageSkiaSource overrides: 134 // gfx::ImageSkiaSource overrides:
126 virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE { 135 virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE {
127 ImageSkiaRep source_rep = source_.GetRepresentation(scale_factor); 136 ImageSkiaRep source_rep = source_.GetRepresentation(scale_factor);
128 float scale = ui::GetScaleFactorScale(source_rep.scale_factor()); 137 float scale = ui::GetScaleFactorScale(source_rep.scale_factor());
129 return ImageSkiaRep( 138 return ImageSkiaRep(
130 SkBitmapOperations::CreateTiledBitmap( 139 SkBitmapOperations::CreateTiledBitmap(
131 source_rep.sk_bitmap(), 140 source_rep.sk_bitmap(),
132 src_x_ * scale, src_y_ * scale, dst_w_ * scale, dst_h_ * scale), 141 src_x_ * scale, src_y_ * scale, dst_w_ * scale, dst_h_ * scale),
133 source_rep.scale_factor()); 142 source_rep.scale_factor());
134 } 143 }
135 144
136 private: 145 private:
137 const ImageSkia& source_; 146 const ImageSkia& source_;
138 const int src_x_; 147 const int src_x_;
139 const int src_y_; 148 const int src_y_;
140 const int dst_w_; 149 const int dst_w_;
141 const int dst_h_; 150 const int dst_h_;
142 151
143 DISALLOW_COPY_AND_ASSIGN(TiledImageSource); 152 DISALLOW_COPY_AND_ASSIGN(TiledImageSource);
144 }; 153 };
145 154
155 // ImageSkiaSource which uses SkBitmapOperations::CreateButtonBackground
156 // to generate image reps for the target image.
157 class ButtonImageSource: public gfx::ImageSkiaSource {
158 public:
159 ButtonImageSource(SkColor color,
160 const ImageSkia& image,
161 const ImageSkia& mask)
162 : color_(color),
163 image_(image),
164 mask_(mask) {
165 }
166
167 virtual ~ButtonImageSource() {
168 }
169
170 // gfx::ImageSkiaSource overrides:
171 virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE {
172 ImageSkiaRep image_rep = image_.GetRepresentation(scale_factor);
173 ImageSkiaRep mask_rep = mask_.GetRepresentation(scale_factor);
174 MatchScale(&image_rep, &mask_rep);
175 return ImageSkiaRep(
176 SkBitmapOperations::CreateButtonBackground(color_,
177 image_rep.sk_bitmap(), mask_rep.sk_bitmap()),
178 image_rep.scale_factor());
179 }
180
181 private:
182 const SkColor color_;
183 const ImageSkia image_;
184 const ImageSkia mask_;
185
186 DISALLOW_COPY_AND_ASSIGN(ButtonImageSource);
187 };
188
189 // ImageSkiaSource which uses SkBitmap::extractSubset to generate image reps
190 // for the target image.
191 class ExtractSubsetImageSource: public gfx::ImageSkiaSource {
192 public:
193 ExtractSubsetImageSource(const gfx::ImageSkia& image,
194 const gfx::Rect& subset_bounds)
195 : image_(image),
196 subset_bounds_(subset_bounds) {
197 }
198
199 ~ExtractSubsetImageSource() {
200 }
201
202 // gfx::ImageSkiaSource overrides:
203 virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE {
204 ImageSkiaRep image_rep = image_.GetRepresentation(scale_factor);
205 SkIRect subset_bounds_in_pixel = RectToSkIRect(subset_bounds_.Scale(
206 ui::GetScaleFactorScale(image_rep.scale_factor())));
207 SkBitmap dst;
208 bool success = image_rep.sk_bitmap().extractSubset(&dst,
209 subset_bounds_in_pixel);
210 DCHECK(success);
211 return gfx::ImageSkiaRep(dst, image_rep.scale_factor());
212 }
213
214 private:
215 const gfx::ImageSkia image_;
216 const gfx::Rect subset_bounds_;
217
218 DISALLOW_COPY_AND_ASSIGN(ExtractSubsetImageSource);
219 };
220
146 // ResizeSource resizes relevant image reps in |source| to |target_dip_size| 221 // ResizeSource resizes relevant image reps in |source| to |target_dip_size|
147 // for requested scale factors. 222 // for requested scale factors.
148 class ResizeSource : public ImageSkiaSource { 223 class ResizeSource : public ImageSkiaSource {
149 public: 224 public:
150 ResizeSource(const ImageSkia& source, 225 ResizeSource(const ImageSkia& source,
151 const Size& target_dip_size) 226 const Size& target_dip_size)
152 : source_(source), 227 : source_(source),
153 target_dip_size_(target_dip_size) { 228 target_dip_size_(target_dip_size) {
154 } 229 }
155 virtual ~ResizeSource() {} 230 virtual ~ResizeSource() {}
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 303
229 // static 304 // static
230 ImageSkia ImageSkiaOperations::CreateTiledImage(const ImageSkia& source, 305 ImageSkia ImageSkiaOperations::CreateTiledImage(const ImageSkia& source,
231 int src_x, int src_y, 306 int src_x, int src_y,
232 int dst_w, int dst_h) { 307 int dst_w, int dst_h) {
233 return ImageSkia(new TiledImageSource(source, src_x, src_y, dst_w, dst_h), 308 return ImageSkia(new TiledImageSource(source, src_x, src_y, dst_w, dst_h),
234 gfx::Size(dst_w, dst_h)); 309 gfx::Size(dst_w, dst_h));
235 } 310 }
236 311
237 // static 312 // static
313 ImageSkia ImageSkiaOperations::CreateButtonBackground(SkColor color,
314 const ImageSkia& image,
315 const ImageSkia& mask) {
316 return ImageSkia(new ButtonImageSource(color, image, mask), mask.size());
317 }
318
319 // static
320 ImageSkia ImageSkiaOperations::ExtractSubset(const ImageSkia& image,
321 const Rect& subset_bounds) {
322 gfx::Rect clipped_bounds = subset_bounds.Intersect(gfx::Rect(image.size()));
323 if (image.isNull() || clipped_bounds.IsEmpty()) {
324 return ImageSkia();
325 }
326
327 return ImageSkia(new ExtractSubsetImageSource(image, clipped_bounds),
328 clipped_bounds.size());
329 }
330
331 // static
238 ImageSkia ImageSkiaOperations::CreateResizedImage(const ImageSkia& source, 332 ImageSkia ImageSkiaOperations::CreateResizedImage(const ImageSkia& source,
239 const Size& target_dip_size) { 333 const Size& target_dip_size) {
240 return ImageSkia(new ResizeSource(source, target_dip_size), target_dip_size); 334 return ImageSkia(new ResizeSource(source, target_dip_size), target_dip_size);
241 } 335 }
242 336
243 // static 337 // static
244 ImageSkia ImageSkiaOperations::CreateImageWithDropShadow( 338 ImageSkia ImageSkiaOperations::CreateImageWithDropShadow(
245 const ImageSkia& source, 339 const ImageSkia& source,
246 const ShadowValues& shadows) { 340 const ShadowValues& shadows) {
247 const gfx::Insets shadow_padding = -gfx::ShadowValue::GetMargin(shadows); 341 const gfx::Insets shadow_padding = -gfx::ShadowValue::GetMargin(shadows);
248 gfx::Size shadow_image_size = source.size(); 342 gfx::Size shadow_image_size = source.size();
249 shadow_image_size.Enlarge(shadow_padding.width(), 343 shadow_image_size.Enlarge(shadow_padding.width(),
250 shadow_padding.height()); 344 shadow_padding.height());
251 return ImageSkia(new DropShadowSource(source, shadows), shadow_image_size); 345 return ImageSkia(new DropShadowSource(source, shadows), shadow_image_size);
252 } 346 }
253 347
254 } // namespace gfx 348 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/image/image_skia_operations.h ('k') | ui/views/controls/button/image_button.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698