blob: ac05c09fcaa2b5e8c7ac2ded5d46f438323e548d [file] [log] [blame] [edit]
// Copyright 2020 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/fxge/dib/cfx_dibbase.h"
#include "core/fxcrt/fx_coordinates.h"
#include "core/fxge/dib/cfx_dibitmap.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
struct Input {
CFX_Point src_top_left;
CFX_Size src_size;
CFX_Point dest_top_left;
CFX_Size overlap_size;
};
struct Output {
CFX_Point src_top_left;
CFX_Point dest_top_left;
CFX_Size overlap_size;
};
void RunOverlapRectTest(const CFX_DIBitmap* bitmap,
const Input& input,
const Output* expected_output) {
// Initialize in-out parameters.
int src_left = input.src_top_left.x;
int src_top = input.src_top_left.y;
int dest_left = input.dest_top_left.x;
int dest_top = input.dest_top_left.y;
int overlap_width = input.overlap_size.width;
int overlap_height = input.overlap_size.height;
bool success = bitmap->GetOverlapRect(
dest_left, dest_top, overlap_width, overlap_height, input.src_size.width,
input.src_size.height, src_left, src_top,
/*pClipRgn=*/nullptr);
if (success == !expected_output) {
ADD_FAILURE();
return;
}
if (expected_output) {
EXPECT_EQ(expected_output->src_top_left.x, src_left);
EXPECT_EQ(expected_output->src_top_left.y, src_top);
EXPECT_EQ(expected_output->dest_top_left.x, dest_left);
EXPECT_EQ(expected_output->dest_top_left.y, dest_top);
EXPECT_EQ(expected_output->overlap_size.width, overlap_width);
EXPECT_EQ(expected_output->overlap_size.height, overlap_height);
}
}
} // namespace
TEST(CFX_DIBBaseTest, GetOverlapRectTrivialOverlap) {
auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
EXPECT_TRUE(bitmap->Create(400, 300, FXDIB_Format::k1bppRgb));
const Input kInput = {/*src_top_left=*/{0, 0}, /*src_size=*/{400, 300},
/*dest_top_left=*/{0, 0},
/*overlap_size=*/{400, 300}};
const Output kExpectedOutput = {/*src_top_left=*/{0, 0},
/*dest_top_left=*/{0, 0},
/*overlap_size=*/{400, 300}};
RunOverlapRectTest(bitmap.Get(), kInput, &kExpectedOutput);
}
TEST(CFX_DIBBaseTest, GetOverlapRectOverlapNoLimit) {
auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
EXPECT_TRUE(bitmap->Create(400, 300, FXDIB_Format::k1bppRgb));
const Input kInput = {/*src_top_left=*/{35, 41}, /*src_size=*/{400, 300},
/*dest_top_left=*/{123, 137},
/*overlap_size=*/{200, 100}};
const Output kExpectedOutput = {/*src_top_left=*/{35, 41},
/*dest_top_left=*/{123, 137},
/*overlap_size=*/{200, 100}};
RunOverlapRectTest(bitmap.Get(), kInput, &kExpectedOutput);
}
TEST(CFX_DIBBaseTest, GetOverlapRectOverlapLimitedBySource) {
auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
EXPECT_TRUE(bitmap->Create(400, 300, FXDIB_Format::k1bppRgb));
const Input kInput = {/*src_top_left=*/{141, 154}, /*src_size=*/{400, 300},
/*dest_top_left=*/{35, 41},
/*overlap_size=*/{270, 160}};
const Output kExpectedOutput = {/*src_top_left=*/{141, 154},
/*dest_top_left=*/{35, 41},
/*overlap_size=*/{259, 146}};
RunOverlapRectTest(bitmap.Get(), kInput, &kExpectedOutput);
}
TEST(CFX_DIBBaseTest, GetOverlapRectOverlapLimitedByDestination) {
auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
EXPECT_TRUE(bitmap->Create(400, 300, FXDIB_Format::k1bppRgb));
const Input kInput = {/*src_top_left=*/{35, 41}, /*src_size=*/{400, 300},
/*dest_top_left=*/{123, 137},
/*overlap_size=*/{280, 170}};
const Output kExpectedOutput = {/*src_top_left=*/{35, 41},
/*dest_top_left=*/{123, 137},
/*overlap_size=*/{277, 163}};
RunOverlapRectTest(bitmap.Get(), kInput, &kExpectedOutput);
}
TEST(CFX_DIBBaseTest, GetOverlapRectBadInputs) {
auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
EXPECT_TRUE(bitmap->Create(400, 300, FXDIB_Format::k1bppRgb));
const Input kEmptyInputs[] = {
// Empty source rect.
{/*src_top_left=*/{0, 0}, /*src_size=*/{0, 0},
/*dest_top_left=*/{0, 0},
/*overlap_size=*/{400, 300}},
// Empty overlap size.
{/*src_top_left=*/{0, 0}, /*src_size=*/{400, 300},
/*dest_top_left=*/{0, 0},
/*overlap_size=*/{0, 0}},
// Source out of bounds on x-axis.
{/*src_top_left=*/{-400, 0}, /*src_size=*/{400, 300},
/*dest_top_left=*/{0, 0},
/*overlap_size=*/{400, 300}},
};
for (const Input& input : kEmptyInputs)
RunOverlapRectTest(bitmap.Get(), input, /*expected_output=*/nullptr);
const Input kOutOfBoundInputs[] = {
// Source out of bounds on x-axis.
{/*src_top_left=*/{400, 0}, /*src_size=*/{400, 300},
/*dest_top_left=*/{0, 0},
/*overlap_size=*/{400, 300}},
// Source out of bounds on y-axis.
{/*src_top_left=*/{0, 300}, /*src_size=*/{400, 300},
/*dest_top_left=*/{0, 0},
/*overlap_size=*/{400, 300}},
// Source out of bounds on y-axis.
{/*src_top_left=*/{0, -300}, /*src_size=*/{400, 300},
/*dest_top_left=*/{0, 0},
/*overlap_size=*/{400, 300}},
// Destination out of bounds on x-axis.
{/*src_top_left=*/{0, 0}, /*src_size=*/{400, 300},
/*dest_top_left=*/{-400, 0},
/*overlap_size=*/{400, 300}},
// Destination out of bounds on x-axis.
{/*src_top_left=*/{0, 0}, /*src_size=*/{400, 300},
/*dest_top_left=*/{400, 0},
/*overlap_size=*/{400, 300}},
// Destination out of bounds on y-axis.
{/*src_top_left=*/{0, 0}, /*src_size=*/{400, 300},
/*dest_top_left=*/{0, -300},
/*overlap_size=*/{400, 300}},
// Destination out of bounds on y-axis.
{/*src_top_left=*/{0, 0}, /*src_size=*/{400, 300},
/*dest_top_left=*/{0, 300},
/*overlap_size=*/{400, 300}},
};
for (const Input& input : kOutOfBoundInputs)
RunOverlapRectTest(bitmap.Get(), input, /*expected_output=*/nullptr);
}