[libgens] CrazyEffect: Created a private class.
authorDavid Korth <gerbilsoft@gerbilsoft.com>
Sun, 6 Sep 2015 19:34:59 +0000 (15:34 -0400)
committerDavid Korth <gerbilsoft@gerbilsoft.com>
Sun, 6 Sep 2015 19:34:59 +0000 (15:34 -0400)
Moved internal variables and functions into the private class.

The colorMask accessor and mutator functions are no longer inline.
The two-parameter run() function is still inline.

src/libgens/Effects/CrazyEffect.cpp
src/libgens/Effects/CrazyEffect.hpp

index a772227..3f63c53 100644 (file)
 
 namespace LibGens {
 
-// TODO: Private class.
+class CrazyEffectPrivate
+{
+       public:
+               CrazyEffectPrivate();
+
+       private:
+               friend class CrazyEffect;
+       private:
+               // Q_DISABLE_COPY() equivalent.
+               // TODO: Add LibGens-specific version of Q_DISABLE_COPY().
+               CrazyEffectPrivate(const CrazyEffectPrivate &);
+               CrazyEffectPrivate &operator=(const CrazyEffectPrivate &);
+
+       public:
+               // Color mask.
+               CrazyEffect::ColorMask colorMask;
+
+               // Xorshift+ RNG state.
+               union {
+                       uint32_t d[4];
+                       uint64_t q[2];
+               } rng_state;
+
+               /**
+                * Get a random number in the range [0,0x7FFF].
+                * This uses the internal random number
+                * cache if it's available.
+                * @return Random number.
+                */
+               unsigned int getRand(void);
+
+               /**
+                * Adjust a pixel's color.
+                * @param pixel     [in] Type of pixel.
+                * @param add_shift [in] Shift value for the add value.
+                * @param px        [in] Pixel data.
+                * @param mask      [in] Pixel mask.
+                * @return Adjusted pixel color.
+                */
+               template<typename pixel, uint8_t add_shift>
+               inline pixel adj_color(pixel px, pixel mask);
+
+               /**
+                * Do the "Crazy" effect.
+                * @param pixel     [in]  Type of pixel.
+                * @param RBits     [in]  Number of bits for Red.
+                * @param GBits     [in]  Number of bits for Green.
+                * @param BBits     [in]  Number of bits for Blue.
+                * @param outScreen [out] Destination screen.
+                */
+               template<typename pixel, uint8_t RBits, uint8_t GBits, uint8_t BBits>
+               inline void T_doCrazyEffect(pixel *outScreen);
+};
+
+CrazyEffectPrivate::CrazyEffectPrivate()
+       : colorMask(CrazyEffect::CM_WHITE)
+{
+       // Initialize the RNG state.
+       // FIXME: Move this srand() call somewhere else.
+       srand((unsigned int)time(nullptr));
+
+       // RAND_MAX is at least 0x7FFF, so we need to
+       // call rand() multiple times. We'll use xor
+       // instead of simple assignment so systems where
+       // RAND_MAX > 0x7FFF get an extra bit of randomness.
+       for (int i = 0; i < 4; i++) {
+               rng_state.d[i]  =  rand();
+               rng_state.d[i] ^= (rand() << 15);
+               rng_state.d[i] ^= (rand() << 30);
+       }
+}
 
 /**
  * Get a random number in the range [0,0x7FFF].
@@ -44,7 +114,7 @@ namespace LibGens {
  * - https://en.wikipedia.org/wiki/Xorshift#Xorshift.2B
  * @return Random number.
  */
-unsigned int CrazyEffect::getRand(void)
+unsigned int CrazyEffectPrivate::getRand(void)
 {
        uint64_t x = rng_state.q[0];
        uint64_t const y = rng_state.q[1];
@@ -67,7 +137,7 @@ unsigned int CrazyEffect::getRand(void)
  * @return Adjusted pixel color.
  */
 template<typename pixel, uint8_t add_shift>
-inline pixel CrazyEffect::adj_color(pixel px, pixel mask)
+inline pixel CrazyEffectPrivate::adj_color(pixel px, pixel mask)
 {
        pixel add = 1 << add_shift;
        px &= mask;
@@ -96,9 +166,9 @@ inline pixel CrazyEffect::adj_color(pixel px, pixel mask)
  * @param outScreen [out] Destination screen.
  */
 template<typename pixel, uint8_t RBits, uint8_t GBits, uint8_t BBits>
-inline void CrazyEffect::T_doCrazyEffect(pixel *outScreen)
+inline void CrazyEffectPrivate::T_doCrazyEffect(pixel *outScreen)
 {
-       if (m_colorMask == CM_BLACK) {
+       if (colorMask == CrazyEffect::CM_BLACK) {
                // Intro effect color is black.
                // Simply clear the screen.
                memset(outScreen, 0x00, 336*240*sizeof(pixel));
@@ -126,15 +196,15 @@ inline void CrazyEffect::T_doCrazyEffect(pixel *outScreen)
                RB = ((pl & RBmask) + (pp & RBmask)) >> 1;
                G = ((pl & Gmask) + (pp & Gmask)) >> 1;
 
-               if (m_colorMask & CM_RED) {
+               if (colorMask & CrazyEffect::CM_RED) {
                        // Red channel.
                        r = adj_color<pixel, (RBits-5)+GBits+BBits>(RB, Rmask);
                }
-               if (m_colorMask & CM_GREEN) {
+               if (colorMask & CrazyEffect::CM_GREEN) {
                        // Green channel.
                        g = adj_color<pixel, (GBits-5)+BBits>(G, Gmask);
                }
-               if (m_colorMask & CM_BLUE) {
+               if (colorMask & CrazyEffect::CM_BLUE) {
                        // Blue channel.
                        b = adj_color<pixel, (BBits-5)>(RB, Bmask);
                }
@@ -152,21 +222,25 @@ inline void CrazyEffect::T_doCrazyEffect(pixel *outScreen)
 /** CrazyEffect **/
 
 CrazyEffect::CrazyEffect()
-       : m_colorMask(CM_WHITE)
+       : d(new CrazyEffectPrivate())
+{ }
+
+CrazyEffect::~CrazyEffect()
 {
-       // Initialize the RNG state.
-       // FIXME: Move this srand() call somewhere else.
-       srand((unsigned int)time(nullptr));
+       delete d;
+}
 
-       // RAND_MAX is at least 0x7FFF, so we need to
-       // call rand() multiple times. We'll use xor
-       // instead of simple assignment so systems where
-       // RAND_MAX > 0x7FFF get an extra bit of randomness.
-       for (int i = 0; i < 4; i++) {
-               rng_state.d[i]  =  rand();
-               rng_state.d[i] ^= (rand() << 15);
-               rng_state.d[i] ^= (rand() << 30);
-       }
+CrazyEffect::ColorMask CrazyEffect::colorMask(void) const
+{
+       return d->colorMask;
+}
+
+void CrazyEffect::setColorMask(ColorMask colorMask)
+{
+       if (colorMask < CM_BLACK || colorMask > CM_WHITE)
+               return;
+
+       d->colorMask = colorMask;
 }
 
 /**
@@ -178,16 +252,16 @@ void CrazyEffect::run(MdFb *fb)
        // FIXME: Add a bpp value to fb.
        switch (2 /*fb.bpp()*/) {
                case 0: /*VdpPalette::BPP_15:*/
-                       T_doCrazyEffect<uint16_t, 5, 5, 5>(fb->fb16());
+                       d->T_doCrazyEffect<uint16_t, 5, 5, 5>(fb->fb16());
                        break;
 
                case 1: /*VdpPalette::BPP_16:*/
-                       T_doCrazyEffect<uint16_t, 5, 6, 5>(fb->fb16());
+                       d->T_doCrazyEffect<uint16_t, 5, 6, 5>(fb->fb16());
                        break;
 
                case 2: /*VdpPalette::BPP_32:*/
                default:
-                       T_doCrazyEffect<uint32_t, 8, 8, 8>(fb->fb32());
+                       d->T_doCrazyEffect<uint32_t, 8, 8, 8>(fb->fb32());
                        break;
        }
 }
index 37518f3..1601873 100644 (file)
 namespace LibGens {
 
 class MdFb;
+
+class CrazyEffectPrivate;
 class CrazyEffect
 {
        public:
                CrazyEffect();
+               ~CrazyEffect();
+
+       private:
+               friend class CrazyEffectPrivate;
+               CrazyEffectPrivate *const d;
+       private:
+               // Q_DISABLE_COPY() equivalent.
+               // TODO: Add LibGens-specific version of Q_DISABLE_COPY().
+               CrazyEffect(const CrazyEffect &);
+               CrazyEffect &operator=(const CrazyEffect &);
 
+       public:
                enum ColorMask {
                        CM_BLACK        = 0,
                        CM_BLUE         = 1,
@@ -50,74 +63,20 @@ class CrazyEffect
                };
 
                // Color mask property.
-               inline ColorMask colorMask(void) const;
-               inline void setColorMask(ColorMask newColorMask);
+               ColorMask colorMask(void) const;
+               void setColorMask(ColorMask colorMask);
 
                /**
                 * Run the "Crazy Effect" on the MD screen.
                 * @param fb MdFb to apply the effect to. 
                 */
                void run(MdFb *fb);
-               void run(MdFb *fb, ColorMask newColorMask);
-
-       private:
-               /**
-                * Do the "Crazy" effect.
-                * @param pixel     [in]  Type of pixel.
-                * @param RBits     [in]  Number of bits for Red.
-                * @param GBits     [in]  Number of bits for Green.
-                * @param BBits     [in]  Number of bits for Blue.
-                * @param outScreen [out] Destination screen.
-                */
-               template<typename pixel, uint8_t RBits, uint8_t GBits, uint8_t BBits>
-               inline void T_doCrazyEffect(pixel *outScreen);
-
-               // Color mask.
-               ColorMask m_colorMask;
-
-               // TODO: Move this stuff to a private class.
-
-               /**
-                * Get a random number in the range [0,0x7FFF].
-                * This uses the internal random number
-                * cache if it's available.
-                * @return Random number.
-                */
-               unsigned int getRand(void);
-
-               /**
-                * Adjust a pixel's color.
-                * @param pixel     [in] Type of pixel.
-                * @param add_shift [in] Shift value for the add value.
-                * @param px        [in] Pixel data.
-                * @param mask      [in] Pixel mask.
-                * @return Adjusted pixel color.
-                */
-               template<typename pixel, uint8_t add_shift>
-               inline pixel adj_color(pixel px, pixel mask);
-
-               // Xorshift+ RNG state.
-               union {
-                       uint32_t d[4];
-                       uint64_t q[2];
-               } rng_state;
+               inline void run(MdFb *fb, ColorMask colorMask);
 };
 
-inline CrazyEffect::ColorMask CrazyEffect::colorMask(void) const
-       { return m_colorMask; }
-
-inline void CrazyEffect::setColorMask(CrazyEffect::ColorMask newColorMask)
-{
-       if (newColorMask < CM_BLACK || newColorMask > CM_WHITE)
-               return;
-       
-       m_colorMask = newColorMask;
-}
-
-
-inline void CrazyEffect::run(MdFb *fb, ColorMask newColorMask)
+inline void CrazyEffect::run(MdFb *fb, ColorMask colorMask)
 {
-       setColorMask(newColorMask);
+       setColorMask(colorMask);
        run(fb);
 }