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

Side by Side Diff: ui/gfx/canvas.cc

Issue 10086023: Expose array of bitmaps contained by gfx::Image similar to NSImage (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Nicer diff Created 8 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
« no previous file with comments | « ui/gfx/canvas.h ('k') | ui/gfx/image/image.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/canvas.h" 5 #include "ui/gfx/canvas.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/i18n/rtl.h" 9 #include "base/i18n/rtl.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 SkPaint p; 271 SkPaint p;
272 DrawBitmapInt(bitmap, src_x, src_y, src_w, src_h, dest_x, dest_y, 272 DrawBitmapInt(bitmap, src_x, src_y, src_w, src_h, dest_x, dest_y,
273 dest_w, dest_h, filter, p); 273 dest_w, dest_h, filter, p);
274 } 274 }
275 275
276 void Canvas::DrawBitmapInt(const SkBitmap& bitmap, 276 void Canvas::DrawBitmapInt(const SkBitmap& bitmap,
277 int src_x, int src_y, int src_w, int src_h, 277 int src_x, int src_y, int src_w, int src_h,
278 int dest_x, int dest_y, int dest_w, int dest_h, 278 int dest_x, int dest_y, int dest_w, int dest_h,
279 bool filter, 279 bool filter,
280 const SkPaint& paint) { 280 const SkPaint& paint) {
281 DrawBitmapFloat(bitmap, static_cast<float>(src_x), static_cast<float>(src_y),
282 static_cast<float>(src_w), static_cast<float>(src_h),
283 static_cast<float>(dest_x), static_cast<float>(dest_y),
284 static_cast<float>(dest_w), static_cast<float>(dest_h),
285 filter, paint);
286 }
287
288 void Canvas::DrawBitmapFloat(const SkBitmap& bitmap,
289 float src_x, float src_y, float src_w, float src_h,
290 float dest_x, float dest_y, float dest_w, float dest_h,
291 bool filter,
292 const SkPaint& paint) {
281 DLOG_ASSERT(src_x + src_w < std::numeric_limits<int16_t>::max() && 293 DLOG_ASSERT(src_x + src_w < std::numeric_limits<int16_t>::max() &&
282 src_y + src_h < std::numeric_limits<int16_t>::max()); 294 src_y + src_h < std::numeric_limits<int16_t>::max());
283 if (src_w <= 0 || src_h <= 0) { 295 if (src_w <= 0 || src_h <= 0) {
284 NOTREACHED() << "Attempting to draw bitmap from an empty rect!"; 296 NOTREACHED() << "Attempting to draw bitmap from an empty rect!";
285 return; 297 return;
286 } 298 }
287 299
288 if (!IntersectsClipRectInt(dest_x, dest_y, dest_w, dest_h)) 300 if (!IntersectsClipRectInt(dest_x, dest_y, dest_w, dest_h))
289 return; 301 return;
290 302
291 SkRect dest_rect = { SkIntToScalar(dest_x), 303 SkRect dest_rect = { SkFloatToScalar(dest_x),
292 SkIntToScalar(dest_y), 304 SkFloatToScalar(dest_y),
293 SkIntToScalar(dest_x + dest_w), 305 SkFloatToScalar(dest_x + dest_w),
294 SkIntToScalar(dest_y + dest_h) }; 306 SkFloatToScalar(dest_y + dest_h) };
295 307
296 if (src_w == dest_w && src_h == dest_h) { 308 if (src_w == dest_w && src_h == dest_h) {
297 // Workaround for apparent bug in Skia that causes image to occasionally 309 // Workaround for apparent bug in Skia that causes image to occasionally
298 // shift. 310 // shift.
299 SkIRect src_rect = { src_x, src_y, src_x + src_w, src_y + src_h }; 311 SkIRect src_rect = { src_x, src_y, src_x + src_w, src_y + src_h };
300 canvas_->drawBitmapRect(bitmap, &src_rect, dest_rect, &paint); 312 canvas_->drawBitmapRect(bitmap, &src_rect, dest_rect, &paint);
301 return; 313 return;
302 } 314 }
303 315
304 // Make a bitmap shader that contains the bitmap we want to draw. This is 316 // Make a bitmap shader that contains the bitmap we want to draw. This is
305 // basically what SkCanvas.drawBitmap does internally, but it gives us 317 // basically what SkCanvas.drawBitmap does internally, but it gives us
306 // more control over quality and will use the mipmap in the source image if 318 // more control over quality and will use the mipmap in the source image if
307 // it has one, whereas drawBitmap won't. 319 // it has one, whereas drawBitmap won't.
308 SkShader* shader = SkShader::CreateBitmapShader(bitmap, 320 SkShader* shader = SkShader::CreateBitmapShader(bitmap,
309 SkShader::kRepeat_TileMode, 321 SkShader::kRepeat_TileMode,
310 SkShader::kRepeat_TileMode); 322 SkShader::kRepeat_TileMode);
311 SkMatrix shader_scale; 323 SkMatrix shader_scale;
312 shader_scale.setScale(SkFloatToScalar(static_cast<float>(dest_w) / src_w), 324 shader_scale.setScale(SkFloatToScalar(dest_w / src_w),
313 SkFloatToScalar(static_cast<float>(dest_h) / src_h)); 325 SkFloatToScalar(dest_h / src_h));
314 shader_scale.preTranslate(SkIntToScalar(-src_x), SkIntToScalar(-src_y)); 326 shader_scale.preTranslate(SkFloatToScalar(-src_x), SkFloatToScalar(-src_y));
315 shader_scale.postTranslate(SkIntToScalar(dest_x), SkIntToScalar(dest_y)); 327 shader_scale.postTranslate(SkFloatToScalar(dest_x), SkFloatToScalar(dest_y));
316 shader->setLocalMatrix(shader_scale); 328 shader->setLocalMatrix(shader_scale);
317 329
318 // Set up our paint to use the shader & release our reference (now just owned 330 // Set up our paint to use the shader & release our reference (now just owned
319 // by the paint). 331 // by the paint).
320 SkPaint p(paint); 332 SkPaint p(paint);
321 p.setFilterBitmap(filter); 333 p.setFilterBitmap(filter);
322 p.setShader(shader); 334 p.setShader(shader);
323 shader->unref(); 335 shader->unref();
324 336
325 // The rect will be filled by the bitmap. 337 // The rect will be filled by the bitmap.
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 clip.intersect(SkIntToScalar(x), SkIntToScalar(y), SkIntToScalar(x + w), 414 clip.intersect(SkIntToScalar(x), SkIntToScalar(y), SkIntToScalar(x + w),
403 SkIntToScalar(y + h)); 415 SkIntToScalar(y + h));
404 } 416 }
405 417
406 bool Canvas::IntersectsClipRect(const gfx::Rect& rect) { 418 bool Canvas::IntersectsClipRect(const gfx::Rect& rect) {
407 return IntersectsClipRectInt(rect.x(), rect.y(), 419 return IntersectsClipRectInt(rect.x(), rect.y(),
408 rect.width(), rect.height()); 420 rect.width(), rect.height());
409 } 421 }
410 422
411 } // namespace gfx 423 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/canvas.h ('k') | ui/gfx/image/image.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698