| Index: ui/gfx/nine_image_painter_unittest.cc
|
| diff --git a/ui/gfx/nine_image_painter_unittest.cc b/ui/gfx/nine_image_painter_unittest.cc
|
| index ecfd409f840c5f21a02ff96612dacc1c95edcbc8..759c7f4cc3e667303b204f5f888dabde27bcc955 100644
|
| --- a/ui/gfx/nine_image_painter_unittest.cc
|
| +++ b/ui/gfx/nine_image_painter_unittest.cc
|
| @@ -4,14 +4,47 @@
|
|
|
| #include "ui/gfx/nine_image_painter.h"
|
|
|
| +#include "base/base64.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "ui/gfx/canvas.h"
|
| +#include "ui/gfx/codec/png_codec.h"
|
| #include "ui/gfx/geometry/insets.h"
|
| #include "ui/gfx/geometry/rect.h"
|
| +#include "ui/gfx/geometry/vector2d.h"
|
| +#include "ui/gfx/geometry/vector2d_conversions.h"
|
| #include "ui/gfx/image/image_skia.h"
|
|
|
| namespace gfx {
|
|
|
| +static std::string GetPNGDataUrl(const SkBitmap& bitmap) {
|
| + std::vector<unsigned char> png_data;
|
| + gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &png_data);
|
| + std::string data_url;
|
| + data_url.insert(data_url.end(), png_data.begin(), png_data.end());
|
| + base::Base64Encode(data_url, &data_url);
|
| + data_url.insert(0, "data:image/png;base64,");
|
| +
|
| + return data_url;
|
| +}
|
| +
|
| +void ExpectRedWithGreenRect(const SkBitmap& bitmap,
|
| + const Rect& outer_rect,
|
| + const Rect& green_rect) {
|
| + for (int y = outer_rect.y(); y < outer_rect.bottom(); y++) {
|
| + SCOPED_TRACE(y);
|
| + for (int x = outer_rect.x(); x < outer_rect.right(); x++) {
|
| + SCOPED_TRACE(x);
|
| + if (green_rect.Contains(x, y)) {
|
| + ASSERT_EQ(SK_ColorGREEN, bitmap.getColor(x, y))
|
| + << "Output image:\n" << GetPNGDataUrl(bitmap);
|
| + } else {
|
| + ASSERT_EQ(SK_ColorRED, bitmap.getColor(x, y)) << "Output image:\n"
|
| + << GetPNGDataUrl(bitmap);
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| TEST(NineImagePainterTest, GetSubsetRegions) {
|
| SkBitmap src;
|
| src.allocN32Pixels(40, 50);
|
| @@ -31,22 +64,25 @@ TEST(NineImagePainterTest, GetSubsetRegions) {
|
| EXPECT_EQ(gfx::Rect(36, 47, 4, 3), rects[8]);
|
| }
|
|
|
| -TEST(NineImagePainterTest, PaintScale) {
|
| +TEST(NineImagePainterTest, PaintHighDPI) {
|
| SkBitmap src;
|
| src.allocN32Pixels(100, 100);
|
| src.eraseColor(SK_ColorRED);
|
| src.eraseArea(SkIRect::MakeXYWH(10, 10, 80, 80), SK_ColorGREEN);
|
|
|
| - gfx::ImageSkia image(gfx::ImageSkiaRep(src, 0.0f));
|
| + float image_scale = 2.f;
|
| +
|
| + gfx::ImageSkia image(gfx::ImageSkiaRep(src, image_scale));
|
| gfx::Insets insets(10, 10, 10, 10);
|
| gfx::NineImagePainter painter(image, insets);
|
|
|
| - int image_scale = 2;
|
| bool is_opaque = true;
|
| - gfx::Canvas canvas(gfx::Size(400, 400), image_scale, is_opaque);
|
| - canvas.Scale(2, 1);
|
| + gfx::Canvas canvas(gfx::Size(100, 100), image_scale, is_opaque);
|
| +
|
| + gfx::Vector2d offset(20, 10);
|
| + canvas.Translate(offset);
|
|
|
| - gfx::Rect bounds(0, 0, 100, 100);
|
| + gfx::Rect bounds(0, 0, 50, 50);
|
| painter.Paint(&canvas, bounds);
|
|
|
| SkBitmap result;
|
| @@ -54,16 +90,11 @@ TEST(NineImagePainterTest, PaintScale) {
|
| result.allocN32Pixels(size.width(), size.height());
|
| canvas.sk_canvas()->readPixels(&result, 0, 0);
|
|
|
| - SkIRect green_rect = SkIRect::MakeLTRB(40, 20, 360, 180);
|
| - for (int y = 0; y < 200; y++) {
|
| - for (int x = 0; x < 400; x++) {
|
| - if (green_rect.contains(x, y)) {
|
| - EXPECT_EQ(SK_ColorGREEN, result.getColor(x, y));
|
| - } else {
|
| - EXPECT_EQ(SK_ColorRED, result.getColor(x, y));
|
| - }
|
| - }
|
| - }
|
| + gfx::Vector2d paint_offset =
|
| + gfx::ToFlooredVector2d(gfx::ScaleVector2d(offset, image_scale));
|
| + gfx::Rect green_rect = gfx::Rect(10, 10, 80, 80) + paint_offset;
|
| + gfx::Rect outer_rect = gfx::Rect(100, 100) + paint_offset;
|
| + ExpectRedWithGreenRect(result, outer_rect, green_rect);
|
| }
|
|
|
| TEST(NineImagePainterTest, PaintStaysInBounds) {
|
| @@ -105,4 +136,105 @@ TEST(NineImagePainterTest, PaintStaysInBounds) {
|
| EXPECT_EQ(SK_ColorBLACK, result.getColor(2, 2));
|
| }
|
|
|
| +TEST(NineImagePainterTest, PaintWithBoundOffset) {
|
| + SkBitmap src;
|
| + src.allocN32Pixels(10, 10);
|
| + src.eraseColor(SK_ColorRED);
|
| + src.eraseArea(SkIRect::MakeXYWH(1, 1, 8, 8), SK_ColorGREEN);
|
| +
|
| + gfx::ImageSkia image(gfx::ImageSkiaRep(src, 0.0f));
|
| + gfx::Insets insets(1, 1, 1, 1);
|
| + gfx::NineImagePainter painter(image, insets);
|
| +
|
| + bool is_opaque = true;
|
| + gfx::Canvas canvas(gfx::Size(10, 10), 1, is_opaque);
|
| +
|
| + gfx::Rect bounds(1, 1, 10, 10);
|
| + painter.Paint(&canvas, bounds);
|
| +
|
| + SkBitmap result;
|
| + const SkISize size = canvas.sk_canvas()->getDeviceSize();
|
| + result.allocN32Pixels(size.width(), size.height());
|
| + canvas.sk_canvas()->readPixels(&result, 0, 0);
|
| +
|
| + SkIRect green_rect = SkIRect::MakeLTRB(2, 2, 10, 10);
|
| + for (int y = 1; y < 10; y++) {
|
| + for (int x = 1; x < 10; x++) {
|
| + if (green_rect.contains(x, y)) {
|
| + ASSERT_EQ(SK_ColorGREEN, result.getColor(x, y));
|
| + } else {
|
| + ASSERT_EQ(SK_ColorRED, result.getColor(x, y));
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(NineImagePainterTest, PaintWithScale) {
|
| + SkBitmap src;
|
| + src.allocN32Pixels(100, 100);
|
| + src.eraseColor(SK_ColorRED);
|
| + src.eraseArea(SkIRect::MakeXYWH(10, 10, 80, 80), SK_ColorGREEN);
|
| +
|
| + float image_scale = 2.f;
|
| +
|
| + gfx::ImageSkia image(gfx::ImageSkiaRep(src, image_scale));
|
| + gfx::Insets insets(10, 10, 10, 10);
|
| + gfx::NineImagePainter painter(image, insets);
|
| +
|
| + bool is_opaque = true;
|
| + gfx::Canvas canvas(gfx::Size(400, 400), image_scale, is_opaque);
|
| +
|
| + gfx::Vector2d offset(20, 10);
|
| + canvas.Translate(offset);
|
| + canvas.Scale(2, 1);
|
| +
|
| + gfx::Rect bounds(0, 0, 50, 50);
|
| + painter.Paint(&canvas, bounds);
|
| +
|
| + SkBitmap result;
|
| + const SkISize size = canvas.sk_canvas()->getDeviceSize();
|
| + result.allocN32Pixels(size.width(), size.height());
|
| + canvas.sk_canvas()->readPixels(&result, 0, 0);
|
| +
|
| + gfx::Vector2d paint_offset =
|
| + gfx::ToFlooredVector2d(gfx::ScaleVector2d(offset, image_scale));
|
| + gfx::Rect green_rect = gfx::Rect(20, 10, 160, 80) + paint_offset;
|
| + gfx::Rect outer_rect = gfx::Rect(200, 100) + paint_offset;
|
| + ExpectRedWithGreenRect(result, outer_rect, green_rect);
|
| +}
|
| +
|
| +TEST(NineImagePainterTest, PaintWithNegativeScale) {
|
| + SkBitmap src;
|
| + src.allocN32Pixels(100, 100);
|
| + src.eraseColor(SK_ColorRED);
|
| + src.eraseArea(SkIRect::MakeXYWH(10, 10, 80, 80), SK_ColorGREEN);
|
| +
|
| + float image_scale = 2.f;
|
| +
|
| + gfx::ImageSkia image(gfx::ImageSkiaRep(src, image_scale));
|
| + gfx::Insets insets(10, 10, 10, 10);
|
| + gfx::NineImagePainter painter(image, insets);
|
| +
|
| + bool is_opaque = true;
|
| + gfx::Canvas canvas(gfx::Size(400, 400), image_scale, is_opaque);
|
| + canvas.Translate(gfx::Vector2d(70, 60));
|
| + canvas.Scale(-1, -1);
|
| +
|
| + gfx::Rect bounds(0, 0, 50, 50);
|
| + painter.Paint(&canvas, bounds);
|
| +
|
| + SkBitmap result;
|
| + const SkISize size = canvas.sk_canvas()->getDeviceSize();
|
| + result.allocN32Pixels(size.width(), size.height());
|
| + canvas.sk_canvas()->readPixels(&result, 0, 0);
|
| +
|
| + // The painting space is 50x50 and the scale of -1,-1 means an offset of 50,50
|
| + // would put the output in the top left corner. Since the offset is 70,60 it
|
| + // moves by 20,10. Since the output is 2x DPI it will become offset by 40,20.
|
| + gfx::Vector2d paint_offset(40, 20);
|
| + gfx::Rect green_rect = gfx::Rect(10, 10, 80, 80) + paint_offset;
|
| + gfx::Rect outer_rect = gfx::Rect(100, 100) + paint_offset;
|
| + ExpectRedWithGreenRect(result, outer_rect, green_rect);
|
| +}
|
| +
|
| } // namespace gfx
|
|
|