11 #include "utils/ColorUtils.h"    20 #define XBMC_FORCE_INLINE __attribute__((always_inline))    22 #define XBMC_FORCE_INLINE    34     m[0][0] = 1.0f; m[0][1] = m[0][2] = m[0][3] = 0.0f;
    35     m[1][0] = m[1][2] = m[1][3] = 0.0f; m[1][1] = 1.0f;
    36     m[2][0] = m[2][1] = m[2][3] = 0.0f; m[2][2] = 1.0f;
    37     alpha = red = green = blue = 1.0f;
    40   static TransformMatrix CreateTranslation(
float transX, 
float transY, 
float transZ = 0)
    43     translation.SetTranslation(transX, transY, transZ);
    46   void SetTranslation(
float transX, 
float transY, 
float transZ)
    48     m[0][1] = m[0][2] = 0.0f; m[0][0] = 1.0f; m[0][3] = transX;
    49     m[1][0] = m[1][2] = 0.0f; m[1][1] = 1.0f; m[1][3] = transY;
    50     m[2][0] = m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = transZ;
    51     alpha = red = green = blue = 1.0f;
    52     identity = (transX == 0 && transY == 0 && transZ == 0);
    54   static TransformMatrix CreateScaler(
float scaleX, 
float scaleY, 
float scaleZ = 1.0f)
    57     scaler.m[0][0] = scaleX;
    58     scaler.m[1][1] = scaleY;
    59     scaler.m[2][2] = scaleZ;
    60     scaler.identity = (scaleX == 1 && scaleY == 1 && scaleZ == 1);
    63   void SetScaler(
float scaleX, 
float scaleY, 
float centerX, 
float centerY)
    66     float centerZ = 0.0f, scaleZ = 1.0f;
    67     m[0][0] = scaleX;  m[0][1] = 0.0f;    m[0][2] = 0.0f;    m[0][3] = centerX*(1-scaleX);
    68     m[1][0] = 0.0f;    m[1][1] = scaleY;  m[1][2] = 0.0f;    m[1][3] = centerY*(1-scaleY);
    69     m[2][0] = 0.0f;    m[2][1] = 0.0f;    m[2][2] = scaleZ;  m[2][3] = centerZ*(1-scaleZ);
    70     alpha = red = green = blue = 1.0f;
    71     identity = (scaleX == 1 && scaleY == 1);
    73   void SetXRotation(
float angle, 
float y, 
float z, 
float ar = 1.0f)
    76     float c = cos(angle); 
float s = sin(angle);
    77     m[0][0] = ar;    m[0][1] = 0.0f;  m[0][2] = 0.0f;   m[0][3] = 0.0f;
    78     m[1][0] = 0.0f;  m[1][1] = c/ar;  m[1][2] = -s/ar;  m[1][3] = (-y*c+s*z)/ar + y;
    79     m[2][0] = 0.0f;  m[2][1] = s;     m[2][2] = c;      m[2][3] = (-y*s-c*z) + z;
    80     alpha = red = green = blue = 1.0f;
    81     identity = (angle == 0);
    83   void SetYRotation(
float angle, 
float x, 
float z, 
float ar = 1.0f)
    86     float c = cos(angle); 
float s = sin(angle);
    87     m[0][0] = c;     m[0][1] = 0.0f;  m[0][2] = -s/ar;  m[0][3] = -x*c + s*z/ar + x;
    88     m[1][0] = 0.0f;  m[1][1] = 1.0f;  m[1][2] = 0.0f;   m[1][3] = 0.0f;
    89     m[2][0] = ar*s;  m[2][1] = 0.0f;  m[2][2] = c;      m[2][3] = -ar*x*s - c*z + z;
    90     alpha = red = green = blue = 1.0f;
    91     identity = (angle == 0);
    93   static TransformMatrix CreateZRotation(
float angle, 
float x, 
float y, 
float ar = 1.0f)
    97     rot.SetZRotation(angle, x, y, ar);
   100   void SetZRotation(
float angle, 
float x, 
float y, 
float ar = 1.0f)
   103     float c = cos(angle); 
float s = sin(angle);
   104     m[0][0] = c;     m[0][1] = -s/ar;  m[0][2] = 0.0f;  m[0][3] = -x*c + s*y/ar + x;
   105     m[1][0] = s*ar;  m[1][1] = c;      m[1][2] = 0.0f;  m[1][3] = -ar*x*s - c*y + y;
   106     m[2][0] = 0.0f;  m[2][1] = 0.0f;   m[2][2] = 1.0f;  m[2][3] = 0.0f;
   107     alpha = red = green = blue = 1.0f;
   108     identity = (angle == 0);
   119     fader.SetFader(a, r, g, b);
   122   void SetFader(
float a)
   124     m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f;
   125     m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f;
   126     m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f;
   128     red = green = blue = 1.0f;
   129     identity = (a == 1.0f);
   132   void SetFader(
float a, 
float r, 
float g, 
float b)
   134     m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f;
   135     m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f;
   136     m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f;
   141     identity = ((a == 1.0f) && (r == 1.0f) && (g == 1.0f) && (b == 1.0f));
   154     float t00 = m[0][0] * right.m[0][0] + m[0][1] * right.m[1][0] + m[0][2] * right.m[2][0];
   155     float t01 = m[0][0] * right.m[0][1] + m[0][1] * right.m[1][1] + m[0][2] * right.m[2][1];
   156     float t02 = m[0][0] * right.m[0][2] + m[0][1] * right.m[1][2] + m[0][2] * right.m[2][2];
   157     m[0][3] = m[0][0] * right.m[0][3] + m[0][1] * right.m[1][3] + m[0][2] * right.m[2][3] + m[0][3];
   158     m[0][0] = t00; m[0][1] = t01; m[0][2] = t02;
   159     t00 = m[1][0] * right.m[0][0] + m[1][1] * right.m[1][0] + m[1][2] * right.m[2][0];
   160     t01 = m[1][0] * right.m[0][1] + m[1][1] * right.m[1][1] + m[1][2] * right.m[2][1];
   161     t02 = m[1][0] * right.m[0][2] + m[1][1] * right.m[1][2] + m[1][2] * right.m[2][2];
   162     m[1][3] = m[1][0] * right.m[0][3] + m[1][1] * right.m[1][3] + m[1][2] * right.m[2][3] + m[1][3];
   163     m[1][0] = t00; m[1][1] = t01; m[1][2] = t02;
   164     t00 = m[2][0] * right.m[0][0] + m[2][1] * right.m[1][0] + m[2][2] * right.m[2][0];
   165     t01 = m[2][0] * right.m[0][1] + m[2][1] * right.m[1][1] + m[2][2] * right.m[2][1];
   166     t02 = m[2][0] * right.m[0][2] + m[2][1] * right.m[1][2] + m[2][2] * right.m[2][2];
   167     m[2][3] = m[2][0] * right.m[0][3] + m[2][1] * right.m[1][3] + m[2][2] * right.m[2][3] + m[2][3];
   168     m[2][0] = t00; m[2][1] = t01; m[2][2] = t02;
   169     alpha *= right.alpha;
   171     green *= right.green;
   184     result.m[0][0] = m[0][0] * right.m[0][0] + m[0][1] * right.m[1][0] + m[0][2] * right.m[2][0];
   185     result.m[0][1] = m[0][0] * right.m[0][1] + m[0][1] * right.m[1][1] + m[0][2] * right.m[2][1];
   186     result.m[0][2] = m[0][0] * right.m[0][2] + m[0][1] * right.m[1][2] + m[0][2] * right.m[2][2];
   187     result.m[0][3] = m[0][0] * right.m[0][3] + m[0][1] * right.m[1][3] + m[0][2] * right.m[2][3] + m[0][3];
   188     result.m[1][0] = m[1][0] * right.m[0][0] + m[1][1] * right.m[1][0] + m[1][2] * right.m[2][0];
   189     result.m[1][1] = m[1][0] * right.m[0][1] + m[1][1] * right.m[1][1] + m[1][2] * right.m[2][1];
   190     result.m[1][2] = m[1][0] * right.m[0][2] + m[1][1] * right.m[1][2] + m[1][2] * right.m[2][2];
   191     result.m[1][3] = m[1][0] * right.m[0][3] + m[1][1] * right.m[1][3] + m[1][2] * right.m[2][3] + m[1][3];
   192     result.m[2][0] = m[2][0] * right.m[0][0] + m[2][1] * right.m[1][0] + m[2][2] * right.m[2][0];
   193     result.m[2][1] = m[2][0] * right.m[0][1] + m[2][1] * right.m[1][1] + m[2][2] * right.m[2][1];
   194     result.m[2][2] = m[2][0] * right.m[0][2] + m[2][1] * right.m[1][2] + m[2][2] * right.m[2][2];
   195     result.m[2][3] = m[2][0] * right.m[0][3] + m[2][1] * right.m[1][3] + m[2][2] * right.m[2][3] + m[2][3];
   196     result.alpha = alpha * right.alpha;
   197     result.red = red * right.red;
   198     result.green = green * right.green;
   199     result.blue = blue * right.blue;
   200     result.identity = 
false;
   204   inline void TransformPosition(
float &x, 
float &y, 
float &z) 
const XBMC_FORCE_INLINE
   206     float newX = m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3];
   207     float newY = m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3];
   208     z = m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3];
   213   inline void TransformPositionUnscaled(
float &x, 
float &y, 
float &z) 
const XBMC_FORCE_INLINE
   217     n = sqrt(m[0][0]*m[0][0] + m[0][1]*m[0][1] + m[0][2]*m[0][2]);
   218     float newX = (m[0][0] * x + m[0][1] * y + m[0][2] * z)/n + m[0][3];
   219     n = sqrt(m[1][0]*m[1][0] + m[1][1]*m[1][1] + m[1][2]*m[1][2]);
   220     float newY = (m[1][0] * x + m[1][1] * y + m[1][2] * z)/n + m[1][3];
   221     n = sqrt(m[2][0]*m[2][0] + m[2][1]*m[2][1] + m[2][2]*m[2][2]);
   222     float newZ = (m[2][0] * x + m[2][1] * y + m[2][2] * z)/n + m[2][3];
   228   inline void InverseTransformPosition(
float &x, 
float &y) 
const XBMC_FORCE_INLINE
   230     x -= m[0][3]; y -= m[1][3];
   231     float detM = m[0][0]*m[1][1] - m[0][1]*m[1][0];
   232     float newX = (m[1][1] * x - m[0][1] * y)/detM;
   233     y = (-m[1][0] * x + m[0][0] * y)/detM;
   237   inline float TransformXCoord(
float x, 
float y, 
float z) 
const XBMC_FORCE_INLINE
   239     return m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3];
   242   inline float TransformYCoord(
float x, 
float y, 
float z) 
const XBMC_FORCE_INLINE
   244     return m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3];
   247   inline float TransformZCoord(
float x, 
float y, 
float z) 
const XBMC_FORCE_INLINE
   249     return m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3];
   252   inline UTILS::COLOR::Color TransformAlpha(UTILS::COLOR::Color color) 
const XBMC_FORCE_INLINE
   254     return static_cast<UTILS::COLOR::Color
>(color * alpha);
   257   inline UTILS::COLOR::Color TransformColor(UTILS::COLOR::Color color) 
const XBMC_FORCE_INLINE
   259     UTILS::COLOR::Color a = 
static_cast<UTILS::COLOR::Color
>(((color >> 24) & 0xff) * alpha);
   260     UTILS::COLOR::Color r = 
static_cast<UTILS::COLOR::Color
>(((color >> 16) & 0xff) * red);
   261     UTILS::COLOR::Color g = 
static_cast<UTILS::COLOR::Color
>(((color >> 8) & 0xff) * green);
   262     UTILS::COLOR::Color b = 
static_cast<UTILS::COLOR::Color
>(((color)&0xff) * blue);
   272     return ((a << 24) & 0xff000000) | ((r << 16) & 0xff0000) | ((g << 8) & 0xff00) | (b & 0xff);
   286       a.alpha == b.alpha && a.red == b.red && a.green == b.green && a.blue == b.blue &&
   287       ((a.identity && b.identity) ||
   288        (!a.identity && !b.identity &&
   289         std::equal(&a.m[0][0], &a.m[0][0] + 
sizeof(a.m) / 
sizeof(a.m[0][0]), &b.m[0][0])));
   295   return !operator==(a, b);