| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/nine_image_painter.h" | 5 #include "ui/gfx/nine_image_painter.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "third_party/skia/include/core/SkPaint.h" | 9 #include "third_party/skia/include/core/SkPaint.h" |
| 10 #include "third_party/skia/include/core/SkRect.h" | 10 #include "third_party/skia/include/core/SkRect.h" |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 | 91 |
| 92 void NineImagePainter::Paint(Canvas* canvas, | 92 void NineImagePainter::Paint(Canvas* canvas, |
| 93 const Rect& bounds, | 93 const Rect& bounds, |
| 94 const uint8 alpha) { | 94 const uint8 alpha) { |
| 95 if (IsEmpty()) | 95 if (IsEmpty()) |
| 96 return; | 96 return; |
| 97 | 97 |
| 98 ScopedCanvas scoped_canvas(canvas); | 98 ScopedCanvas scoped_canvas(canvas); |
| 99 canvas->Translate(bounds.OffsetFromOrigin()); | 99 canvas->Translate(bounds.OffsetFromOrigin()); |
| 100 | 100 |
| 101 SkPaint paint; | |
| 102 paint.setAlpha(alpha); | |
| 103 | |
| 104 // Get the current transform from the canvas and apply it to the logical | 101 // Get the current transform from the canvas and apply it to the logical |
| 105 // bounds passed in. This will give us the pixel bounds which can be used | 102 // bounds passed in. This will give us the pixel bounds which can be used |
| 106 // to draw the images at the correct locations. | 103 // to draw the images at the correct locations. |
| 107 // We should not scale the bounds by the canvas->image_scale() as that can be | 104 // We should not scale the bounds by the canvas->image_scale() as that can be |
| 108 // different from the real scale in the canvas transform. | 105 // different from the real scale in the canvas transform. |
| 106 SkRect bounds_in_pixels_f; |
| 107 if (!canvas->sk_canvas()->getTotalMatrix().mapRect( |
| 108 &bounds_in_pixels_f, RectToSkRect(gfx::Rect(bounds.size())))) |
| 109 return; // Invalid transform. |
| 110 |
| 111 SkIRect bounds_in_pixels; |
| 112 bounds_in_pixels_f.dround(&bounds_in_pixels); |
| 113 |
| 109 SkMatrix matrix = canvas->sk_canvas()->getTotalMatrix(); | 114 SkMatrix matrix = canvas->sk_canvas()->getTotalMatrix(); |
| 110 SkRect scaled_rect; | 115 matrix.setTranslateX(SkIntToScalar(bounds_in_pixels.x())); |
| 111 matrix.mapRect(&scaled_rect, RectToSkRect(bounds)); | 116 matrix.setTranslateY(SkIntToScalar(bounds_in_pixels.y())); |
| 117 canvas->sk_canvas()->setMatrix(matrix); |
| 112 | 118 |
| 113 int scaled_width = gfx::ToCeiledInt(SkScalarToFloat(scaled_rect.width())); | 119 const int width_in_pixels = bounds_in_pixels.width(); |
| 114 int scaled_height = gfx::ToCeiledInt(SkScalarToFloat(scaled_rect.height())); | 120 const int height_in_pixels = bounds_in_pixels.height(); |
| 115 | 121 |
| 116 // In case the corners and edges don't all have the same width/height, we draw | 122 // In case the corners and edges don't all have the same width/height, we draw |
| 117 // the center first, and extend it out in all directions to the edges of the | 123 // the center first, and extend it out in all directions to the edges of the |
| 118 // images with the smallest widths/heights. This way there will be no | 124 // images with the smallest widths/heights. This way there will be no |
| 119 // unpainted areas, though some corners or edges might overlap the center. | 125 // unpainted areas, though some corners or edges might overlap the center. |
| 120 int i0w = ImageWidthInPixels(images_[0], canvas); | 126 int i0w = ImageWidthInPixels(images_[0], canvas); |
| 121 int i2w = ImageWidthInPixels(images_[2], canvas); | 127 int i2w = ImageWidthInPixels(images_[2], canvas); |
| 122 int i3w = ImageWidthInPixels(images_[3], canvas); | 128 int i3w = ImageWidthInPixels(images_[3], canvas); |
| 123 int i5w = ImageWidthInPixels(images_[5], canvas); | 129 int i5w = ImageWidthInPixels(images_[5], canvas); |
| 124 int i6w = ImageWidthInPixels(images_[6], canvas); | 130 int i6w = ImageWidthInPixels(images_[6], canvas); |
| 125 int i8w = ImageWidthInPixels(images_[8], canvas); | 131 int i8w = ImageWidthInPixels(images_[8], canvas); |
| 126 | 132 |
| 127 int i4x = std::min(std::min(i0w, i3w), i6w); | 133 int i4x = std::min(std::min(i0w, i3w), i6w); |
| 128 int i4w = scaled_width - i4x - std::min(std::min(i2w, i5w), i8w); | 134 int i4w = width_in_pixels - i4x - std::min(std::min(i2w, i5w), i8w); |
| 129 | 135 |
| 130 int i0h = ImageHeightInPixels(images_[0], canvas); | 136 int i0h = ImageHeightInPixels(images_[0], canvas); |
| 131 int i1h = ImageHeightInPixels(images_[1], canvas); | 137 int i1h = ImageHeightInPixels(images_[1], canvas); |
| 132 int i2h = ImageHeightInPixels(images_[2], canvas); | 138 int i2h = ImageHeightInPixels(images_[2], canvas); |
| 133 int i6h = ImageHeightInPixels(images_[6], canvas); | 139 int i6h = ImageHeightInPixels(images_[6], canvas); |
| 134 int i7h = ImageHeightInPixels(images_[7], canvas); | 140 int i7h = ImageHeightInPixels(images_[7], canvas); |
| 135 int i8h = ImageHeightInPixels(images_[8], canvas); | 141 int i8h = ImageHeightInPixels(images_[8], canvas); |
| 136 | 142 |
| 137 int i4y = std::min(std::min(i0h, i1h), i2h); | 143 int i4y = std::min(std::min(i0h, i1h), i2h); |
| 138 int i4h = scaled_height - i4y - std::min(std::min(i6h, i7h), i8h); | 144 int i4h = height_in_pixels - i4y - std::min(std::min(i6h, i7h), i8h); |
| 145 |
| 146 SkPaint paint; |
| 147 paint.setAlpha(alpha); |
| 148 |
| 139 if (!images_[4].isNull()) | 149 if (!images_[4].isNull()) |
| 140 Fill(canvas, images_[4], i4x, i4y, i4w, i4h, paint); | 150 Fill(canvas, images_[4], i4x, i4y, i4w, i4h, paint); |
| 141 canvas->DrawImageIntInPixel(images_[0], 0, 0, i0w, i0h, | 151 canvas->DrawImageIntInPixel(images_[0], 0, 0, i0w, i0h, |
| 142 0, 0, i0w, i0h, false, paint); | 152 0, 0, i0w, i0h, false, paint); |
| 143 Fill(canvas, images_[1], i0w, 0, scaled_width - i0w - i2w, i1h, paint); | 153 Fill(canvas, images_[1], i0w, 0, width_in_pixels - i0w - i2w, i1h, paint); |
| 144 canvas->DrawImageIntInPixel(images_[2], 0, 0, i2w, i2h, scaled_width - i2w, | 154 canvas->DrawImageIntInPixel(images_[2], 0, 0, i2w, i2h, width_in_pixels - i2w, |
| 145 0, i2w, i2h, false, paint); | 155 0, i2w, i2h, false, paint); |
| 146 Fill(canvas, images_[3], 0, i0h, i3w, scaled_height - i0h - i6h, paint); | 156 Fill(canvas, images_[3], 0, i0h, i3w, height_in_pixels - i0h - i6h, paint); |
| 147 Fill(canvas, images_[5], scaled_width - i5w, i2h, i5w, | 157 Fill(canvas, images_[5], width_in_pixels - i5w, i2h, i5w, |
| 148 scaled_height - i2h - i8h, paint); | 158 height_in_pixels - i2h - i8h, paint); |
| 149 canvas->DrawImageIntInPixel(images_[6], 0, 0, i6w, i6h, 0, | 159 canvas->DrawImageIntInPixel(images_[6], 0, 0, i6w, i6h, 0, |
| 150 scaled_height - i6h, i6w, i6h, false, paint); | 160 height_in_pixels - i6h, i6w, i6h, false, paint); |
| 151 Fill(canvas, images_[7], i6w, scaled_height - i7h, scaled_width - i6w - i8w, | 161 Fill(canvas, images_[7], i6w, height_in_pixels - i7h, |
| 152 i7h, paint); | 162 width_in_pixels - i6w - i8w, i7h, paint); |
| 153 canvas->DrawImageIntInPixel(images_[8], 0, 0, i8w, i8h, scaled_width - i8w, | 163 canvas->DrawImageIntInPixel(images_[8], 0, 0, i8w, i8h, width_in_pixels - i8w, |
| 154 scaled_height - i8h, i8w, i8h, false, paint); | 164 height_in_pixels - i8h, i8w, i8h, false, paint); |
| 155 } | 165 } |
| 156 | 166 |
| 157 } // namespace gfx | 167 } // namespace gfx |
| OLD | NEW |