duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

display.h (3472B)


      1 /*
      2  * Copyright (c) 2014 Vittorio Giovara <vittorio.giovara@gmail.com>
      3  *
      4  * This file is part of FFmpeg.
      5  *
      6  * FFmpeg is free software; you can redistribute it and/or
      7  * modify it under the terms of the GNU Lesser General Public
      8  * License as published by the Free Software Foundation; either
      9  * version 2.1 of the License, or (at your option) any later version.
     10  *
     11  * FFmpeg is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  * Lesser General Public License for more details.
     15  *
     16  * You should have received a copy of the GNU Lesser General Public
     17  * License along with FFmpeg; if not, write to the Free Software
     18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     19  */
     20 
     21 /**
     22  * @file
     23  * @ingroup lavu_video_display
     24  * Display matrix
     25  */
     26 
     27 #ifndef AVUTIL_DISPLAY_H
     28 #define AVUTIL_DISPLAY_H
     29 
     30 #include <stdint.h>
     31 
     32 /**
     33  * @defgroup lavu_video_display Display transformation matrix functions
     34  * @ingroup lavu_video
     35  *
     36  * The display transformation matrix specifies an affine transformation that
     37  * should be applied to video frames for correct presentation. It is compatible
     38  * with the matrices stored in the ISO/IEC 14496-12 container format.
     39  *
     40  * The data is a 3x3 matrix represented as a 9-element array:
     41  *
     42  * @code{.unparsed}
     43  *                                  | a b u |
     44  *   (a, b, u, c, d, v, x, y, w) -> | c d v |
     45  *                                  | x y w |
     46  * @endcode
     47  *
     48  * All numbers are stored in native endianness, as 16.16 fixed-point values,
     49  * except for u, v and w, which are stored as 2.30 fixed-point values.
     50  *
     51  * The transformation maps a point (p, q) in the source (pre-transformation)
     52  * frame to the point (p', q') in the destination (post-transformation) frame as
     53  * follows:
     54  *
     55  * @code{.unparsed}
     56  *               | a b u |
     57  *   (p, q, 1) . | c d v | = z * (p', q', 1)
     58  *               | x y w |
     59  * @endcode
     60  *
     61  * The transformation can also be more explicitly written in components as
     62  * follows:
     63  *
     64  * @code{.unparsed}
     65  *   p' = (a * p + c * q + x) / z;
     66  *   q' = (b * p + d * q + y) / z;
     67  *   z  =  u * p + v * q + w
     68  * @endcode
     69  *
     70  * @{
     71  */
     72 
     73 /**
     74  * Extract the rotation component of the transformation matrix.
     75  *
     76  * @param matrix the transformation matrix
     77  * @return the angle (in degrees) by which the transformation rotates the frame
     78  *         counterclockwise. The angle will be in range [-180.0, 180.0],
     79  *         or NaN if the matrix is singular.
     80  *
     81  * @note floating point numbers are inherently inexact, so callers are
     82  *       recommended to round the return value to nearest integer before use.
     83  */
     84 double av_display_rotation_get(const int32_t matrix[9]);
     85 
     86 /**
     87  * Initialize a transformation matrix describing a pure clockwise
     88  * rotation by the specified angle (in degrees).
     89  *
     90  * @param[out] matrix a transformation matrix (will be fully overwritten
     91  *                    by this function)
     92  * @param angle rotation angle in degrees.
     93  */
     94 void av_display_rotation_set(int32_t matrix[9], double angle);
     95 
     96 /**
     97  * Flip the input matrix horizontally and/or vertically.
     98  *
     99  * @param[in,out] matrix a transformation matrix
    100  * @param hflip whether the matrix should be flipped horizontally
    101  * @param vflip whether the matrix should be flipped vertically
    102  */
    103 void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip);
    104 
    105 /**
    106  * @}
    107  */
    108 
    109 #endif /* AVUTIL_DISPLAY_H */