| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/test/pixel/ash_pixel_differ.h" |
| |
| #include <string> |
| |
| #include "ash/root_window_controller.h" |
| #include "ash/shell.h" |
| #include "base/strings/strcat.h" |
| |
| namespace ash { |
| |
| AshPixelDiffer::AshPixelDiffer(const std::string& screenshot_prefix, |
| const std::optional<std::string>& corpus) |
| : pixel_diff_(screenshot_prefix, corpus) {} |
| |
| AshPixelDiffer::~AshPixelDiffer() = default; |
| |
| bool AshPixelDiffer::CompareScreenshotForRootWindowInRects( |
| aura::Window* root_window, |
| const std::string& screenshot_name, |
| size_t revision_number, |
| const std::vector<gfx::Rect>& rects_in_screen) { |
| // Calculate the full image name incorporating `revision_number`. |
| const std::string full_name = base::StrCat( |
| {screenshot_name, ".rev_", base::NumberToString(revision_number)}); |
| |
| const aura::WindowTreeHost* const host = root_window->GetHost(); |
| |
| // Handle the case that conversion from the root window's coordinates to pixel |
| // coordinates is not needed. |
| if (fabs(host->device_scale_factor() - 1.f) < |
| std::numeric_limits<float>::epsilon()) { |
| return pixel_diff_.CompareNativeWindowScreenshotInRects( |
| full_name, root_window, root_window->bounds(), |
| &positive_if_only_algorithm_, rects_in_screen); |
| } |
| |
| // Convert rects from screen coordinates to pixel coordinates. |
| std::vector<gfx::Rect> rects_in_pixel; |
| for (const gfx::Rect& screen_bounds : rects_in_screen) { |
| gfx::Point top_left = screen_bounds.origin(); |
| gfx::Point bottom_right = screen_bounds.bottom_right(); |
| host->ConvertDIPToPixels(&top_left); |
| host->ConvertDIPToPixels(&bottom_right); |
| rects_in_pixel.emplace_back(top_left, |
| gfx::Size(bottom_right.x() - top_left.x(), |
| bottom_right.y() - top_left.y())); |
| } |
| |
| return pixel_diff_.CompareNativeWindowScreenshotInRects( |
| full_name, root_window, root_window->bounds(), |
| &positive_if_only_algorithm_, rects_in_pixel); |
| } |
| |
| } // namespace ash |