blob: 469b3352967f7dea756ec0a19d9f6eee5c07bb89 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "pdf/ppapi_migration/graphics.h"
#include <utility>
#include "cc/test/pixel_comparator.h"
#include "cc/test/pixel_test_utils.h"
#include "pdf/ppapi_migration/image.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/skia_util.h"
namespace chrome_pdf {
namespace {
SkBitmap CreateN32PremulSkBitmap(const SkISize& size) {
SkBitmap bitmap;
bitmap.allocPixels(SkImageInfo::MakeN32Premul(size));
return bitmap;
}
Image CreateSourceImage(const SkISize& src_size) {
SkBitmap bitmap = CreateN32PremulSkBitmap(src_size);
bitmap.eraseColor(SK_ColorRED);
return Image(bitmap);
}
SkBitmap GenerateExpectedBitmap(const SkISize& graphics_size,
const SkIRect& rect) {
SkBitmap bitmap = CreateN32PremulSkBitmap(graphics_size);
bitmap.erase(SK_ColorRED, rect);
return bitmap;
}
void TestPaintImageResult(const SkISize& graphics_size,
const SkISize& src_size,
const gfx::Rect& paint_rect,
const SkIRect& overlapped_rect) {
auto graphics = SkiaGraphics::Create(gfx::SkISizeToSize(graphics_size));
ASSERT_TRUE(graphics);
// Create snapshots as SkImage and SkBitmap after painting.
graphics->PaintImage(CreateSourceImage(src_size), paint_rect);
sk_sp<SkImage> snapshot = graphics->CreateSnapshot();
SkBitmap snapshot_bitmap;
ASSERT_TRUE(snapshot->asLegacyBitmap(&snapshot_bitmap));
// Verify snapshot dimensions.
EXPECT_EQ(snapshot->dimensions(), graphics_size)
<< snapshot->width() << " x " << snapshot->height()
<< " != " << graphics_size.width() << " x " << graphics_size.height();
// Verify the snapshot matches the expected result.
const SkBitmap expected_bitmap =
GenerateExpectedBitmap(graphics_size, overlapped_rect);
EXPECT_TRUE(
cc::MatchesBitmap(snapshot_bitmap, expected_bitmap,
cc::ExactPixelComparator(/*discard_alpha=*/false)))
<< "SkBitmap comparison failed for graphics size of "
<< graphics_size.width() << " x " << graphics_size.height();
}
TEST(SkiaGraphicsTest, PaintImage) {
struct PaintImageParams {
// Size of the graphics to be painted on.
SkISize graphics_size;
// Size of the source image.
SkISize src_size;
// Painting area.
gfx::Rect paint_rect;
// Common area of the graphics, the source image and the painting area.
SkIRect overlapped_rect;
};
static constexpr PaintImageParams kPaintImageTestParams[] = {
// Paint area is within the graphics and the source image.
{{20, 20}, {15, 15}, gfx::Rect(0, 0, 10, 10), {0, 0, 10, 10}},
// Paint area is not completely within the graphics, or the source
// image.
{{50, 30}, {30, 50}, gfx::Rect(10, 10, 30, 30), {10, 10, 30, 30}},
// Paint area is outside the graphics.
{{10, 10}, {30, 30}, gfx::Rect(10, 10, 10, 10), {0, 0, 0, 0}},
// Paint area is outside the source image.
{{15, 15}, {5, 5}, gfx::Rect(10, 10, 5, 5), {0, 0, 0, 0}},
};
for (const auto& params : kPaintImageTestParams)
TestPaintImageResult(params.graphics_size, params.src_size,
params.paint_rect, params.overlapped_rect);
}
} // namespace
} // namespace chrome_pdf