Coverage Report

Created: 2025-12-05 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/qpdf/libqpdf/QPDFMatrix.cc
Line
Count
Source
1
#include <qpdf/QPDFMatrix.hh>
2
3
#include <qpdf/QUtil.hh>
4
#include <algorithm>
5
6
QPDFMatrix::QPDFMatrix() :
7
28.2k
    a(1.0),
8
28.2k
    b(0.0),
9
28.2k
    c(0.0),
10
28.2k
    d(1.0),
11
28.2k
    e(0.0),
12
28.2k
    f(0.0)
13
28.2k
{
14
28.2k
}
15
16
QPDFMatrix::QPDFMatrix(double a, double b, double c, double d, double e, double f) :
17
42.3k
    a(a),
18
42.3k
    b(b),
19
42.3k
    c(c),
20
42.3k
    d(d),
21
42.3k
    e(e),
22
42.3k
    f(f)
23
42.3k
{
24
42.3k
}
25
26
QPDFMatrix::QPDFMatrix(QPDFObjectHandle::Matrix const& m) :
27
697
    a(m.a),
28
697
    b(m.b),
29
697
    c(m.c),
30
697
    d(m.d),
31
697
    e(m.e),
32
697
    f(m.f)
33
697
{
34
697
}
35
36
static double
37
fix_rounding(double d)
38
84.4k
{
39
84.4k
    if ((d > -0.00001) && (d < 0.00001)) {
40
28.3k
        d = 0.0;
41
28.3k
    }
42
84.4k
    return d;
43
84.4k
}
44
45
std::string
46
QPDFMatrix::unparse() const
47
14.0k
{
48
14.0k
    return (
49
14.0k
        QUtil::double_to_string(fix_rounding(a), 5) + " " +
50
14.0k
        QUtil::double_to_string(fix_rounding(b), 5) + " " +
51
14.0k
        QUtil::double_to_string(fix_rounding(c), 5) + " " +
52
14.0k
        QUtil::double_to_string(fix_rounding(d), 5) + " " +
53
14.0k
        QUtil::double_to_string(fix_rounding(e), 5) + " " +
54
14.0k
        QUtil::double_to_string(fix_rounding(f), 5));
55
14.0k
}
56
57
QPDFObjectHandle::Matrix
58
QPDFMatrix::getAsMatrix() const
59
0
{
60
0
    return {a, b, c, d, e, f};
61
0
}
62
63
void
64
QPDFMatrix::concat(QPDFMatrix const& other)
65
42.3k
{
66
42.3k
    double ap = (this->a * other.a) + (this->c * other.b);
67
42.3k
    double bp = (this->b * other.a) + (this->d * other.b);
68
42.3k
    double cp = (this->a * other.c) + (this->c * other.d);
69
42.3k
    double dp = (this->b * other.c) + (this->d * other.d);
70
42.3k
    double ep = (this->a * other.e) + (this->c * other.f) + this->e;
71
42.3k
    double fp = (this->b * other.e) + (this->d * other.f) + this->f;
72
42.3k
    this->a = ap;
73
42.3k
    this->b = bp;
74
42.3k
    this->c = cp;
75
42.3k
    this->d = dp;
76
42.3k
    this->e = ep;
77
42.3k
    this->f = fp;
78
42.3k
}
79
80
void
81
QPDFMatrix::scale(double sx, double sy)
82
14.0k
{
83
14.0k
    concat(QPDFMatrix(sx, 0, 0, sy, 0, 0));
84
14.0k
}
85
86
void
87
QPDFMatrix::translate(double tx, double ty)
88
28.1k
{
89
28.1k
    concat(QPDFMatrix(1, 0, 0, 1, tx, ty));
90
28.1k
}
91
92
void
93
QPDFMatrix::rotatex90(int angle)
94
112
{
95
112
    switch (angle) {
96
0
    case 90:
97
0
        concat(QPDFMatrix(0, 1, -1, 0, 0, 0));
98
0
        break;
99
0
    case 180:
100
0
        concat(QPDFMatrix(-1, 0, 0, -1, 0, 0));
101
0
        break;
102
78
    case 270:
103
78
        concat(QPDFMatrix(0, -1, 1, 0, 0, 0));
104
78
        break;
105
34
    default:
106
        // ignore
107
34
        break;
108
112
    }
109
112
}
110
111
void
112
QPDFMatrix::transform(double x, double y, double& xp, double& yp) const
113
56.5k
{
114
56.5k
    xp = (this->a * x) + (this->c * y) + this->e;
115
56.5k
    yp = (this->b * x) + (this->d * y) + this->f;
116
56.5k
}
117
118
QPDFObjectHandle::Rectangle
119
QPDFMatrix::transformRectangle(QPDFObjectHandle::Rectangle r) const
120
14.1k
{
121
14.1k
    std::vector<double> tx(4);
122
14.1k
    std::vector<double> ty(4);
123
14.1k
    transform(r.llx, r.lly, tx.at(0), ty.at(0));
124
14.1k
    transform(r.llx, r.ury, tx.at(1), ty.at(1));
125
14.1k
    transform(r.urx, r.lly, tx.at(2), ty.at(2));
126
14.1k
    transform(r.urx, r.ury, tx.at(3), ty.at(3));
127
14.1k
    return {
128
14.1k
        *std::min_element(tx.begin(), tx.end()),
129
14.1k
        *std::min_element(ty.begin(), ty.end()),
130
14.1k
        *std::max_element(tx.begin(), tx.end()),
131
14.1k
        *std::max_element(ty.begin(), ty.end())};
132
14.1k
}
133
134
bool
135
QPDFMatrix::operator==(QPDFMatrix const& rhs) const
136
0
{
137
0
    return (
138
0
        (this->a == rhs.a) && (this->b == rhs.b) && (this->c == rhs.c) && (this->d == rhs.d) &&
139
0
        (this->e == rhs.e) && (this->f == rhs.f));
140
0
}
141
142
bool
143
QPDFMatrix::operator!=(QPDFMatrix const& rhs) const
144
0
{
145
0
    return !operator==(rhs);
146
0
}