Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "ui/gfx/image/image_skia.h" | |
| 6 | |
| 7 #include <limits> | |
| 8 #include <cmath> | |
| 9 | |
| 10 #include "base/logging.h" | |
| 11 #include "base/stl_util.h" | |
| 12 | |
| 13 namespace gfx { | |
| 14 | |
| 15 ImageSkia::ImageSkia(const SkBitmap* bitmap) | |
| 16 : size_(bitmap->width(), bitmap->height()) { | |
| 17 DCHECK(bitmap); | |
|
sky
2012/04/20 19:31:54
Is this DCHECK useful? Seems like this would crash
| |
| 18 DCHECK(!bitmap->isNull()); | |
| 19 bitmaps_.push_back(bitmap); | |
| 20 } | |
| 21 | |
| 22 ImageSkia::ImageSkia(const std::vector<const SkBitmap*>& bitmaps) | |
| 23 : bitmaps_(bitmaps) { | |
| 24 // Assume that the smallest bitmap represents 1x scale factor. | |
| 25 for (size_t i = 0; i < bitmaps_.size(); ++i) { | |
| 26 DCHECK(!bitmaps[i]->isNull()); | |
| 27 gfx::Size bitmap_size(bitmaps_[i]->width(), bitmaps_[i]->height()); | |
| 28 if (size_.IsEmpty() || bitmap_size.GetArea() < size_.GetArea()) | |
| 29 size_ = bitmap_size; | |
| 30 } | |
| 31 } | |
| 32 | |
| 33 ImageSkia::~ImageSkia() { | |
| 34 } | |
| 35 | |
| 36 void ImageSkia::BuildMipMap() { | |
| 37 mip_map_build_pending_ = true; | |
| 38 } | |
| 39 | |
| 40 void ImageSkia::DrawToCanvasInt(gfx::Canvas* canvas, int x, int y) { | |
| 41 SkPaint p; | |
| 42 DrawToCanvasInt(canvas, x, y, p); | |
| 43 } | |
| 44 | |
| 45 void ImageSkia::DrawToCanvasInt(gfx::Canvas* canvas, int x, int y, | |
|
sky
2012/04/20 19:31:54
nit: each param on its own line (x/y can be groupe
| |
| 46 const SkPaint& paint) { | |
| 47 | |
| 48 if (IsEmpty() || size_.IsEmpty()) | |
| 49 return; | |
| 50 | |
| 51 SkMatrix m = canvas->sk_canvas()->getTotalMatrix(); | |
| 52 float scale_x = std::abs(SkScalarToFloat(m.getScaleX())); | |
| 53 float scale_y = std::abs(SkScalarToFloat(m.getScaleY())); | |
| 54 | |
| 55 SkBitmap* bitmap = const_cast<SkBitmap*>(GetBitmapForScale(scale_x, scale_y)); | |
| 56 | |
| 57 if (mip_map_build_pending_) { | |
| 58 bitmap->buildMipMap(); | |
| 59 mip_map_build_pending_ = false; | |
| 60 } | |
| 61 | |
| 62 float bitmap_scale_x = static_cast<float>(bitmap->width()) / width(); | |
| 63 float bitmap_scale_y = static_cast<float>(bitmap->height()) / height(); | |
| 64 | |
| 65 canvas->Save(); | |
| 66 canvas->sk_canvas()->scale(1.0f / bitmap_scale_x, | |
| 67 1.0f / bitmap_scale_y); | |
| 68 canvas->sk_canvas()->drawBitmap(*bitmap, SkFloatToScalar(x * bitmap_scale_x), | |
| 69 SkFloatToScalar(y * bitmap_scale_y)); | |
| 70 canvas->Restore(); | |
| 71 } | |
| 72 | |
| 73 void ImageSkia::DrawToCanvasInt(gfx::Canvas* canvas, | |
| 74 int src_x, int src_y, int src_w, int src_h, | |
| 75 int dest_x, int dest_y, int dest_w, int dest_h, | |
| 76 bool filter) { | |
| 77 SkPaint p; | |
| 78 DrawToCanvasInt(canvas, src_x, src_y, src_w, src_h, dest_x, dest_y, | |
| 79 dest_w, dest_h, filter, p); | |
| 80 } | |
| 81 | |
| 82 void ImageSkia::DrawToCanvasInt(gfx::Canvas* canvas, | |
| 83 int src_x, int src_y, int src_w, int src_h, | |
| 84 int dest_x, int dest_y, int dest_w, int dest_h, | |
| 85 bool filter, | |
| 86 const SkPaint& paint) { | |
| 87 if (IsEmpty() || size_.IsEmpty()) | |
| 88 return; | |
| 89 | |
| 90 SkMatrix m = canvas->sk_canvas()->getTotalMatrix(); | |
| 91 float scale_x = std::abs(SkScalarToFloat(m.getScaleX())); | |
| 92 float scale_y = std::abs(SkScalarToFloat(m.getScaleY())); | |
| 93 | |
| 94 SkBitmap* bitmap = const_cast<SkBitmap*>(GetBitmapForScale(scale_x, scale_y)); | |
| 95 | |
| 96 if (mip_map_build_pending_) { | |
| 97 bitmap->buildMipMap(); | |
| 98 mip_map_build_pending_ = false; | |
| 99 } | |
| 100 | |
| 101 float bitmap_scale_x = static_cast<float>(bitmap->width()) / width(); | |
| 102 float bitmap_scale_y = static_cast<float>(bitmap->height()) / height(); | |
| 103 | |
| 104 canvas->Save(); | |
| 105 canvas->sk_canvas()->scale(1.0f / bitmap_scale_x, | |
| 106 1.0f / bitmap_scale_y); | |
| 107 canvas->DrawBitmapFloat(*bitmap, | |
| 108 src_x * bitmap_scale_x, src_y * bitmap_scale_x, | |
| 109 src_w * bitmap_scale_x, src_h * bitmap_scale_y, | |
| 110 dest_x * bitmap_scale_x, dest_y * bitmap_scale_y, | |
| 111 dest_w * bitmap_scale_x, dest_h * bitmap_scale_y, | |
| 112 filter, paint); | |
| 113 | |
| 114 canvas->Restore(); | |
| 115 } | |
| 116 | |
| 117 bool ImageSkia::IsEmpty() const { | |
| 118 return bitmaps_.empty(); | |
| 119 } | |
| 120 | |
| 121 const SkBitmap* ImageSkia::GetBitmapForScale(float x_scale_factor, | |
| 122 float y_scale_factor) const { | |
|
sky
2012/04/20 19:31:54
Why did you make this return a const SkBitmap when
pkotwicz
2012/04/20 20:39:55
To address your issue, I am casting the constness
| |
| 123 // Get the desired bitmap width and height given |x_scale_factor|, | |
| 124 // |y_scale_factor| and |size_| at 1x density. | |
| 125 float desired_width = size_.width() * x_scale_factor; | |
| 126 float desired_height = size_.height() * y_scale_factor; | |
| 127 | |
| 128 size_t closest_index; | |
| 129 float smallest_diff = std::numeric_limits<float>::max(); | |
| 130 for (size_t i = 0; i < bitmaps_.size(); ++i) { | |
| 131 float diff = std::abs(bitmaps_[i]->width() - desired_width) + | |
| 132 std::abs(bitmaps_[i]->height() - desired_height); | |
| 133 if (diff < smallest_diff) { | |
| 134 closest_index = i; | |
| 135 smallest_diff = diff; | |
| 136 } | |
| 137 } | |
| 138 return bitmaps_[closest_index]; | |
| 139 } | |
| 140 | |
| 141 } // namespace gfx | |
| OLD | NEW |