blob: 072134a2de002ec8ea2be4377745a27348d66c85 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "pdf/pdfium/pdfium_searchify.h"
#include <algorithm>
#include <ostream>
#include "base/numerics/angle_conversions.h"
#include "base/strings/stringprintf.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/rect.h"
namespace {
constexpr float kFloatTolerance = 0.00001f;
bool FloatNear(float a, float b, float abs_error) {
return std::abs(a - b) <= abs_error;
}
} // namespace
// Lets EXPECT_EQ() compare FS_MATRIX.
constexpr bool operator==(const FS_MATRIX& lhs, const FS_MATRIX& rhs) {
return FloatNear(lhs.a, rhs.a, kFloatTolerance) &&
FloatNear(lhs.b, rhs.b, kFloatTolerance) &&
FloatNear(lhs.c, rhs.c, kFloatTolerance) &&
FloatNear(lhs.d, rhs.d, kFloatTolerance) &&
FloatNear(lhs.e, rhs.e, kFloatTolerance) &&
FloatNear(lhs.f, rhs.f, kFloatTolerance);
}
// Lets EXPECT_EQ() automatically print out FS_MATRIX on failure. Similar to
// other PrintTo() functions in //ui/gfx/geometry.
void PrintTo(const FS_MATRIX& matrix, ::std::ostream* os) {
*os << base::StringPrintf("%f,%f,%f,%f,%f,%f", matrix.a, matrix.b, matrix.c,
matrix.d, matrix.e, matrix.f);
}
namespace chrome_pdf {
TEST(PdfiumSearchifyTest, ConvertToPdfOrigin) {
constexpr gfx::Rect kRect(100, 50, 20, 30);
{
SearchifyBoundingBoxOrigin result = ConvertToPdfOriginForTesting(
/*rect=*/kRect,
/*angle=*/0,
/*coordinate_system_height=*/792);
EXPECT_EQ(gfx::PointF(100, 712), result.point);
EXPECT_FLOAT_EQ(0, result.theta);
}
{
SearchifyBoundingBoxOrigin result = ConvertToPdfOriginForTesting(
/*rect=*/kRect,
/*angle=*/45,
/*coordinate_system_height=*/792);
EXPECT_EQ(gfx::PointF(78.786796f, 720.786796f), result.point);
EXPECT_FLOAT_EQ(base::DegToRad<float>(-45), result.theta);
}
{
SearchifyBoundingBoxOrigin result = ConvertToPdfOriginForTesting(
/*rect=*/kRect,
/*angle=*/90,
/*coordinate_system_height=*/792);
EXPECT_EQ(gfx::PointF(70, 742), result.point);
EXPECT_FLOAT_EQ(base::DegToRad<float>(-90), result.theta);
}
{
SearchifyBoundingBoxOrigin result = ConvertToPdfOriginForTesting(
/*rect=*/kRect,
/*angle=*/180,
/*coordinate_system_height=*/792);
EXPECT_EQ(gfx::PointF(100, 772), result.point);
EXPECT_FLOAT_EQ(base::DegToRad<float>(-180), result.theta);
}
{
SearchifyBoundingBoxOrigin result = ConvertToPdfOriginForTesting(
/*rect=*/kRect,
/*angle=*/-90,
/*coordinate_system_height=*/792);
EXPECT_EQ(gfx::PointF(130, 742), result.point);
EXPECT_FLOAT_EQ(base::DegToRad<float>(90), result.theta);
}
}
TEST(PdfiumSearchifyTest, CalculateWordMoveMatrix) {
constexpr gfx::Rect kRect(100, 50, 20, 30);
{
// 0 degree case.
const SearchifyBoundingBoxOrigin origin(gfx::PointF(100, 712), 0);
FS_MATRIX matrix = CalculateWordMoveMatrixForTesting(origin, kRect.width(),
/*word_is_rtl=*/false);
EXPECT_EQ(FS_MATRIX(1, 0, 0, 1, 100, 712), matrix);
FS_MATRIX matrix_rtl =
CalculateWordMoveMatrixForTesting(origin, kRect.width(),
/*word_is_rtl=*/true);
EXPECT_EQ(FS_MATRIX(-1, 0, 0, 1, 120, 712), matrix_rtl);
}
{
// 45 degree case.
const SearchifyBoundingBoxOrigin origin(
gfx::PointF(78.786796f, 720.786796f), base::DegToRad<float>(-45));
FS_MATRIX matrix = CalculateWordMoveMatrixForTesting(origin, kRect.width(),
/*word_is_rtl=*/false);
EXPECT_EQ(FS_MATRIX(0.707107f, -0.707107f, 0.707107f, 0.707107f, 78.786797f,
720.786804f),
matrix);
FS_MATRIX matrix_rtl =
CalculateWordMoveMatrixForTesting(origin, kRect.width(),
/*word_is_rtl=*/true);
EXPECT_EQ(FS_MATRIX(-0.707107f, 0.707107f, 0.707107f, 0.707107f, 92.928932f,
706.644653f),
matrix_rtl);
}
{
// 90 degree case.
const SearchifyBoundingBoxOrigin origin(gfx::PointF(70, 742),
base::DegToRad<float>(-90));
FS_MATRIX matrix = CalculateWordMoveMatrixForTesting(origin, kRect.width(),
/*word_is_rtl=*/false);
EXPECT_EQ(FS_MATRIX(0, -1, 1, 0, 70, 742), matrix);
FS_MATRIX matrix_rtl =
CalculateWordMoveMatrixForTesting(origin, kRect.width(),
/*word_is_rtl=*/true);
EXPECT_EQ(FS_MATRIX(0, 1, 1, 0, 70, 722), matrix_rtl);
}
{
// -90 degree case.
const SearchifyBoundingBoxOrigin origin(gfx::PointF(130, 742),
base::DegToRad<float>(90));
FS_MATRIX matrix = CalculateWordMoveMatrixForTesting(origin, kRect.width(),
/*word_is_rtl=*/false);
EXPECT_EQ(FS_MATRIX(0, 1, -1, 0, 130, 742), matrix);
FS_MATRIX matrix_rtl =
CalculateWordMoveMatrixForTesting(origin, kRect.width(),
/*word_is_rtl=*/true);
EXPECT_EQ(FS_MATRIX(0, -1, -1, 0, 130, 762), matrix_rtl);
}
}
} // namespace chrome_pdf