blob: 5effcddb6002d55eff9ee659c8368b988850c7c3 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/headless/test/bitmap_utils.h"
#include "base/logging.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
namespace headless {
bool CheckColoredRect(const SkBitmap& bitmap,
SkColor rect_color,
SkColor bkgr_color,
int margins) {
gfx::Rect body(bitmap.width(), bitmap.height());
if (margins) {
body.Inset(margins);
}
// Build color rectangle by including every pixel with the specified
// rectangle color into a rectangle.
gfx::Rect rect;
for (int y = body.y(); y < body.bottom(); y++) {
for (int x = body.x(); x < body.right(); x++) {
SkColor color = bitmap.getColor(x, y);
if (color == rect_color) {
gfx::Rect pixel_rect(x, y, 1, 1);
if (rect.IsEmpty()) {
rect = pixel_rect;
} else {
rect.Union(pixel_rect);
}
}
}
}
// Verify that all pixels outside the found color rectangle are of
// the specified background color, and the ones that are inside
// the found rectangle are all of the rectangle color.
for (int y = body.y(); y < body.bottom(); y++) {
for (int x = body.x(); x < body.right(); x++) {
SkColor color = bitmap.getColor(x, y);
gfx::Point pt(x, y);
if (rect.Contains(pt)) {
if (color != rect_color) {
LOG(ERROR) << "pt=" << pt.ToString() << " color=" << color
<< ", expected rect color=" << rect_color;
return false;
}
} else {
if (color != bkgr_color) {
LOG(ERROR) << "pt=" << pt.ToString() << " color=" << color
<< ", expected bkgr color=" << bkgr_color;
return false;
}
}
}
}
return !rect.IsEmpty();
}
bool CheckColoredRect(const SkBitmap& bitmap,
SkColor rect_color,
SkColor bkgr_color) {
return CheckColoredRect(bitmap, rect_color, bkgr_color, /*margins=*/0);
}
} // namespace headless