This file is indexed.

/usr/include/libwildmagic/Wm5HMatrix.h is in libwildmagic-dev 5.13-1+b2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// Geometric Tools, LLC
// Copyright (c) 1998-2014
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
//
// File Version: 5.0.2 (2011/03/27)

#ifndef WM5HMATRIX_H
#define WM5HMATRIX_H

#include "Wm5MathematicsLIB.h"
#include "Wm5APoint.h"
#include "Wm5Matrix3.h"

namespace Wm5
{

class WM5_MATHEMATICS_ITEM HMatrix
{
public:
    // Construction and destruction.
    HMatrix ();  // uninitialized
    HMatrix (const HMatrix& mat);
    HMatrix (const Matrix3f& mat);

    // If makeZero is 'true', create the zero matrix; otherwise, create the
    // identity matrix.
    HMatrix (bool makeZero);

    // Input mrc is in row r, column c.
    HMatrix (
        float m00, float m01, float m02, float m03,
        float m10, float m11, float m12, float m13,
        float m20, float m21, float m22, float m23,
        float m30, float m31, float m32, float m33);

    // Create a matrix from an array of numbers.  The input array is
    // interpreted based on the bool input as
    //   true:  entry[0..15]={m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,
    //                        m23,m30,m31,m32,m33} [row major]
    //   false: entry[0..15]={m00,m10,m20,m30,m01,m11,m21,m31,m02,m12,m22,
    //                        m32,m03,m13,m23,m33} [col major]
    HMatrix (const float* entry, bool rowMajor);

    // Create matrices based on point and vector input.  The bool is
    // interpreted as
    //   true: inputs are columns of the matrix
    //   false: inputs are rows of the matrix
    HMatrix (const float* tuple0, const float* tuple1, const float* tuple2,
        const float* tuple3, bool columns);

    // Create a diagonal matrix.
    HMatrix (float m00, float m11, float m22);

    // Create a rotation matrix (positive angle -> counterclockwise).  The
    // angle must be in radians, not degrees.
    HMatrix (const AVector& axis, float angle);

    ~HMatrix ();

    // Implicit conversions.  The upper 3x3 block of HMatrix is copied to
    // the Matrix3f object.
    operator Matrix3f () const;

    // Coordinate access.
    inline operator const float* () const;
    inline operator float* ();
    inline const float* operator[] (int row) const;
    inline float* operator[] (int row);
    inline const float& operator() (int row, int column) const;
    inline float& operator() (int row, int column);
    void SetRow (int row, const HPoint& hpnt);
    void GetRow (int row, HPoint& hpnt) const;
    void SetColumn (int column, const HPoint& hpnt);
    void GetColumn (int column, HPoint& hpnt) const;

    // The matrix is stored in row-major order.  Store these in column-major
    // order in the specified array, which must have at least 16 slots.
    void GetColumnMajor (float* columnMajor) const;

    // Assignment.
    HMatrix& operator= (const HMatrix& mat);
    HMatrix& operator= (const Matrix3f& mat);

    // Comparison (for use by STL containers).
    bool operator== (const HMatrix& mat) const;
    bool operator!= (const HMatrix& mat) const;
    bool operator<  (const HMatrix& mat) const;
    bool operator<= (const HMatrix& mat) const;
    bool operator>  (const HMatrix& mat) const;
    bool operator>= (const HMatrix& mat) const;

    // Arithmetic operations.
    HMatrix operator+ (const HMatrix& mat) const;
    HMatrix operator- (const HMatrix& mat) const;
    HMatrix operator* (float scalar) const;
    HMatrix operator/ (float scalar) const;
    HMatrix operator- () const;

    WM5_MATHEMATICS_ITEM
    friend HMatrix operator* (float scalar, const HMatrix& mat);

    // Arithmetic updates.
    HMatrix& operator+= (const HMatrix& mat);
    HMatrix& operator-= (const HMatrix& mat);
    HMatrix& operator*= (float scalar);
    HMatrix& operator/= (float scalar);

    // Operations on matrices.
    void MakeZero ();  // Z
    void MakeIdentity ();  // I
    void MakeDiagonal (float m00, float m11, float m22);  // D
    void MakeRotation (const AVector& axis, float angle);  // R
    HMatrix Transpose () const;  // M^T
    HMatrix Inverse (const float epsilon = 0.0f) const;  // M^{-1}
    HMatrix Adjoint () const;  // M^{adj}
    float Determinant () const;  // det(M)
    HMatrix operator* (const HMatrix& mat) const;  // M*mat
    HMatrix TransposeTimes (const HMatrix& mat) const;  // M^T*mat
    HMatrix TimesTranspose (const HMatrix& mat) const;  // M*mat^T
    HMatrix TransposeTimesTranspose (const HMatrix& mat) const;  // M^T*mat^T
    HMatrix TimesDiagonal (const APoint& diag) const;  // M*D
    HMatrix DiagonalTimes (const APoint& diag) const;  // D*M
    void Orthonormalize (); // applies to 3x3 upper-left block of M

    // Operations between matrices and homogeneous points.  Both M and p
    // are general homogeneous objects (M not required to be affine, p
    // not required to have w = 1).
    HPoint operator* (const HPoint& p) const;  // M*p
    
    WM5_MATHEMATICS_ITEM
    friend HPoint operator* (const HPoint& p, const HMatrix& mat);  // p*M

    void BatchMultiply (int numPoints, const HPoint* input,
        HPoint* output) const;  // M*p[0], ..., M*p[n-1]

    // Operations between affine matrices and affine points.
    APoint operator* (const APoint& p) const;  // M*p
    void BatchMultiply (int numPoints, const APoint* input,
        APoint* output) const;  // M*p[0], ..., M*p[n-1]

    // Operations between affine matrices and affine vectors.
    AVector operator* (const AVector& p) const;  // M*v
    void BatchMultiply (int numPoints, const AVector* input,
        AVector* output) const;  // M*v[0], ..., M*v[n-1]

    // Compute a quadratic forms.
    float QForm (const HPoint& p0, const HPoint& p1) const;  // p0^T*M*p1

    // Set the transformation to an oblique projection matrix onto a
    // specified plane.  The plane has an 'origin' point and a unit-length
    // 'normal'.
    void MakeObliqueProjection (const APoint& origin, const AVector& normal,
        const AVector& direction);

    // Set the transformation to a perspective projection matrix onto a
    // specified plane.  The plane has an 'origin' point and a unit-length
    // 'normal'.  The 'eye' is the origin of projection.
    void MakePerspectiveProjection (const APoint& origin,
        const AVector& normal, const APoint& eye);

    // Set the transformation to a reflection matrix through a specified
    // plane.  The plane has an 'origin' point and a unit-length 'normal'.
    void MakeReflection (const APoint& origin, const AVector& normal);

    // Special matrices.
    static const HMatrix ZERO;
    static const HMatrix IDENTITY;

private:
    // The matrix is stored in row-major order.
    float mEntry[16];
};

#include "Wm5HMatrix.inl"

}

#endif