Support YUV decoding for JPEG
[platform/core/uifw/dali-adaptor.git] / dali / internal / imaging / common / pixel-manipulation.cpp
index e37c88e..357df28 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,8 +18,8 @@
 #include <dali/internal/imaging/common/pixel-manipulation.h>
 
 // INTERNAL HEADERS
-#include <dali/public-api/images/pixel.h>
 #include <dali/integration-api/debug.h>
+#include <dali/public-api/images/pixel.h>
 
 namespace Dali
 {
@@ -27,12 +27,266 @@ namespace Internal
 {
 namespace Adaptor
 {
+namespace
+{
+// clang-format off
+/**
+ * @brief Pre-defined offset tables for each Channel.
+ * If invalid channel, return -1. else, return the offset bytes.
+ */
+//                                                                           | LUMINANCE | RED | GREEN | BLUE | ALPHA | DEPTH | STENCIL |
+constexpr std::int8_t ALPHA_ONLY_OFFSET_TABLE[MAX_NUMBER_OF_CHANNELS]      = {        -1 ,  -1 ,    -1 ,   -1 ,     0 ,    -1 ,      -1 };
+constexpr std::int8_t LUMINANCE_ONLY_OFFSET_TABLE[MAX_NUMBER_OF_CHANNELS]  = {         0 ,  -1 ,    -1 ,   -1 ,    -1 ,    -1 ,      -1 };
+constexpr std::int8_t LUMINANCE_ALPHA_OFFSET_TABLE[MAX_NUMBER_OF_CHANNELS] = {         0 ,  -1 ,    -1 ,   -1 ,     1 ,    -1 ,      -1 };
+constexpr std::int8_t RGB_OFFSET_TABLE[MAX_NUMBER_OF_CHANNELS]             = {        -1 ,   0 ,     1 ,    2 ,    -1 ,    -1 ,      -1 };
+constexpr std::int8_t BGR_OFFSET_TABLE[MAX_NUMBER_OF_CHANNELS]             = {        -1 ,   2 ,     1 ,    0 ,    -1 ,    -1 ,      -1 };
+constexpr std::int8_t RGBA_OFFSET_TABLE[MAX_NUMBER_OF_CHANNELS]            = {        -1 ,   0 ,     1 ,    2 ,     3 ,    -1 ,      -1 };
+constexpr std::int8_t BGRA_OFFSET_TABLE[MAX_NUMBER_OF_CHANNELS]            = {        -1 ,   2 ,     1 ,    0 ,     3 ,    -1 ,      -1 };
+// clang-format on
+
+/**
+ * @brief Template to Read from a buffer with pixel formats that have one byte per channel.
+ *
+ * @tparam NumberOfChannels The number of channels to check
+ * @param pixelData The pixel data to retrieve the value from
+ * @param channel The channel we're after
+ * @param offsetTable The array of offset bytes for each channels in the pixel format
+ * @return The value of the required channel
+ */
+unsigned int ReadChannelTable(unsigned char* pixelData, Channel channel, const std::int8_t (&offsetTable)[MAX_NUMBER_OF_CHANNELS])
+{
+  auto retVal = 0u;
+  if(offsetTable[channel] >= 0)
+  {
+    retVal = static_cast<unsigned int>(*(pixelData + offsetTable[channel]));
+  }
+  return retVal;
+}
+
+/**
+ * @brief Template to Write to a buffer with pixel formats that have one byte per channel.
+ *
+ * @tparam NumberOfChannels The number of channels to check
+ * @param pixelData The pixel data to write the value to
+ * @param channel The channel we're after
+ * @param channelValue The value of the channel to set
+ * @param offsetTable The array of offset bytes for each channels in the pixel format
+ */
+void WriteChannelTable(unsigned char* pixelData, Channel channel, unsigned int channelValue, const std::int8_t (&offsetTable)[MAX_NUMBER_OF_CHANNELS])
+{
+  if(offsetTable[channel] >= 0)
+  {
+    *(pixelData + offsetTable[channel]) = static_cast<unsigned char>(channelValue & 0xFF);
+  }
+}
+
+/**
+ * @brief Reads from buffers with a pixel format of 565.
+ *
+ * @param pixelData The pixel data to read from
+ * @param channel The channel we're after
+ * @param one The first channel of the pixel format
+ * @param two The second channel of the pixel format
+ * @param three The third channel of the pixel format
+ * @return The value of the required channel
+ */
+unsigned int ReadChannel565(unsigned char* pixelData, Channel channel, Channel one, Channel two, Channel three)
+{
+  if(channel == one)
+  {
+    return (static_cast<unsigned int>(*pixelData) & 0xF8) >> 3;
+  }
+  else if(channel == two)
+  {
+    return ((static_cast<unsigned int>(*pixelData) & 0x07) << 3) |
+           ((static_cast<unsigned int>(*(pixelData + 1)) & 0xE0) >> 5);
+  }
+  else if(channel == three)
+  {
+    return static_cast<unsigned int>(*(pixelData + 1)) & 0x1F;
+  }
+  return 0u;
+}
+
+/**
+ * @brief Writes to the buffer with a pixel format of 565.
+ *
+ * @param pixelData The pixel data to write to
+ * @param channel The channel we're after
+ * @param channelValue The value to write
+ * @param one The first channel of the pixel format
+ * @param two The second channel of the pixel format
+ * @param three The third channel of the pixel format
+ */
+void WriteChannel565(unsigned char* pixelData, Channel channel, unsigned int channelValue, Channel one, Channel two, Channel three)
+{
+  if(channel == one)
+  {
+    *pixelData &= static_cast<unsigned char>(~0xF8);
+    *pixelData |= static_cast<unsigned char>((channelValue << 3) & 0xF8);
+  }
+  else if(channel == two)
+  {
+    *pixelData &= static_cast<unsigned char>(~0x07);
+    *pixelData |= static_cast<unsigned char>((channelValue >> 3) & 0x07);
+
+    *(pixelData + 1) &= static_cast<unsigned char>(~0xE0);
+    *(pixelData + 1) |= static_cast<unsigned char>((channelValue << 5) & 0xE0);
+  }
+  else if(channel == three)
+  {
+    *(pixelData + 1) &= static_cast<unsigned char>(~0x1F);
+    *(pixelData + 1) |= static_cast<unsigned char>(channelValue & 0x1F);
+  }
+}
+
+/**
+ * @brief Reads from buffers with a pixel format of 4444.
+ *
+ * @param pixelData The pixel data to read from
+ * @param channel The channel we're after
+ * @param one The first channel of the pixel format
+ * @param two The second channel of the pixel format
+ * @param three The third channel of the pixel format
+ * @param four The fourth channel of the pixel format
+ * @return
+ */
+unsigned int ReadChannel4444(unsigned char* pixelData, Channel channel, Channel one, Channel two, Channel three, Channel four)
+{
+  if(channel == one)
+  {
+    return (static_cast<unsigned int>(*pixelData) & 0xF0) >> 4;
+  }
+  else if(channel == two)
+  {
+    return (static_cast<unsigned int>(*pixelData) & 0x0F);
+  }
+  else if(channel == three)
+  {
+    return (static_cast<unsigned int>(*(pixelData + 1)) & 0xF0) >> 4;
+  }
+  else if(channel == four)
+  {
+    return (static_cast<unsigned int>(*(pixelData + 1)) & 0x0F);
+  }
+  return 0u;
+}
+
+/**
+ * @brief Writes to the buffer with a pixel format of 565.
+ *
+ * @param pixelData The pixel data to write to
+ * @param channel The channel we're after
+ * @param channelValue The value to write
+ * @param one The first channel of the pixel format
+ * @param two The second channel of the pixel format
+ * @param three The third channel of the pixel format
+ * @param four The fourth channel of the pixel format
+ */
+void WriteChannel4444(unsigned char* pixelData, Channel channel, unsigned int channelValue, Channel one, Channel two, Channel three, Channel four)
+{
+  if(channel == one)
+  {
+    *pixelData &= static_cast<unsigned char>(~0xF0);
+    *pixelData |= static_cast<unsigned char>((channelValue << 4) & 0xF0);
+  }
+  else if(channel == two)
+  {
+    *pixelData &= static_cast<unsigned char>(~0x0F);
+    *pixelData |= static_cast<unsigned char>(channelValue & 0x0F);
+  }
+  else if(channel == three)
+  {
+    *(pixelData + 1) &= static_cast<unsigned char>(~0xF0);
+    *(pixelData + 1) |= static_cast<unsigned char>((channelValue << 4) & 0xF0);
+  }
+  else if(channel == four)
+  {
+    *(pixelData + 1) &= static_cast<unsigned char>(~0x0F);
+    *(pixelData + 1) |= static_cast<unsigned char>(channelValue & 0x0F);
+  }
+}
+
+/**
+ * @brief Reads from buffers with a pixel format of 5551.
+ *
+ * @param pixelData The pixel data to read from
+ * @param channel The channel we're after
+ * @param one The first channel of the pixel format
+ * @param two The second channel of the pixel format
+ * @param three The third channel of the pixel format
+ * @param four The fourth channel of the pixel format
+ * @return
+ */
+unsigned int ReadChannel5551(unsigned char* pixelData, Channel channel, Channel one, Channel two, Channel three, Channel four)
+{
+  if(channel == one)
+  {
+    return (static_cast<unsigned int>(*pixelData) & 0xF8) >> 3;
+  }
+  else if(channel == two)
+  {
+    return ((static_cast<unsigned int>(*pixelData) & 0x07) << 2) |
+           ((static_cast<unsigned int>(*(pixelData + 1)) & 0xC0) >> 6);
+  }
+  else if(channel == three)
+  {
+    return (static_cast<unsigned int>(*(pixelData + 1)) & 0x3E) >> 1;
+  }
+  else if(channel == four)
+  {
+    return static_cast<unsigned int>(*(pixelData + 1)) & 0x01;
+  }
+  return 0u;
+}
+
+/**
+ * @brief Writes to the buffer with a pixel format of 5551.
+ *
+ * @param pixelData The pixel data to write to
+ * @param channel The channel we're after
+ * @param channelValue The value to write
+ * @param one The first channel of the pixel format
+ * @param two The second channel of the pixel format
+ * @param three The third channel of the pixel format
+ * @param four The fourth channel of the pixel format
+ */
+void WriteChannel5551(unsigned char* pixelData, Channel channel, unsigned int channelValue, Channel one, Channel two, Channel three, Channel four)
+{
+  // 11111222 22333334
+  //    F8  7 C0  3E 1
+  if(channel == one)
+  {
+    *pixelData &= static_cast<unsigned char>(~0xF8);
+    *pixelData |= static_cast<unsigned char>((channelValue << 3) & 0xF8);
+  }
+  else if(channel == two)
+  {
+    *pixelData &= static_cast<unsigned char>(~0x07);
+    *pixelData |= static_cast<unsigned char>((channelValue >> 2) & 0x07);
+
+    *(pixelData + 1) &= static_cast<unsigned char>(~0xC0);
+    *(pixelData + 1) |= static_cast<unsigned char>((channelValue << 6) & 0xC0);
+  }
+  else if(channel == three)
+  {
+    *(pixelData + 1) &= static_cast<unsigned char>(~0x3E);
+    *(pixelData + 1) |= static_cast<unsigned char>((channelValue << 1) & 0x3E);
+  }
+  else if(channel == four)
+  {
+    *(pixelData + 1) &= static_cast<unsigned char>(~0x01);
+    *(pixelData + 1) |= static_cast<unsigned char>(channelValue & 0x01);
+  }
+}
+
+} // unnamed namespace
 
 struct Location
 {
   unsigned int bitShift;
   unsigned int bitMask;
-  bool available;
+  bool         available;
 };
 
 struct Locations
@@ -44,10 +298,9 @@ struct Locations
   Location blue;
 };
 
-
-bool HasChannel( Dali::Pixel::Format pixelFormat, Channel channel )
+bool HasChannel(Dali::Pixel::Format pixelFormat, Channel channel)
 {
-  switch (pixelFormat)
+  switch(pixelFormat)
   {
     case Dali::Pixel::A8:
     {
@@ -59,7 +312,7 @@ bool HasChannel( Dali::Pixel::Format pixelFormat, Channel channel )
     }
     case Dali::Pixel::LA88:
     {
-      return ( channel == LUMINANCE || channel == ALPHA );
+      return (channel == LUMINANCE || channel == ALPHA);
     }
     case Dali::Pixel::RGB565:
     case Dali::Pixel::BGR565:
@@ -68,8 +321,9 @@ bool HasChannel( Dali::Pixel::Format pixelFormat, Channel channel )
     case Dali::Pixel::BGR8888:
     case Dali::Pixel::RGB16F:
     case Dali::Pixel::RGB32F:
+    case Dali::Pixel::R11G11B10F:
     {
-      return ( channel == RED || channel == GREEN || channel == BLUE );
+      return (channel == RED || channel == GREEN || channel == BLUE);
     }
 
     case Dali::Pixel::RGBA8888:
@@ -79,7 +333,18 @@ bool HasChannel( Dali::Pixel::Format pixelFormat, Channel channel )
     case Dali::Pixel::RGBA5551:
     case Dali::Pixel::BGRA5551:
     {
-      return ( channel == RED || channel == GREEN || channel == BLUE || channel == ALPHA );
+      return (channel == RED || channel == GREEN || channel == BLUE || channel == ALPHA);
+    }
+
+    case Dali::Pixel::DEPTH_UNSIGNED_INT:
+    case Dali::Pixel::DEPTH_FLOAT:
+    {
+      return (channel == DEPTH);
+    }
+
+    case Dali::Pixel::DEPTH_STENCIL:
+    {
+      return (channel == DEPTH || channel == STENCIL);
     }
 
     case Dali::Pixel::INVALID:
@@ -127,244 +392,92 @@ bool HasChannel( Dali::Pixel::Format pixelFormat, Channel channel )
       DALI_LOG_ERROR("Pixel formats for compressed images are not compatible with simple channels.\n");
       break;
     }
+
+    case Dali::Pixel::CHROMINANCE_U:
+    case Dali::Pixel::CHROMINANCE_V:
+    {
+      DALI_LOG_ERROR("Pixel formats for chrominance are not compatible with simple channels.\n");
+      break;
+    }
   }
 
   return false;
 }
 
-unsigned int ReadChannel( unsigned char* pixelData,
-                          Dali::Pixel::Format pixelFormat,
-                          Channel channel )
+unsigned int ReadChannel(unsigned char*      pixelData,
+                         Dali::Pixel::Format pixelFormat,
+                         Channel             channel)
 {
-  switch (pixelFormat)
+  switch(pixelFormat)
   {
     case Dali::Pixel::A8:
     {
-      if( channel == ALPHA )
-      {
-        return static_cast<unsigned int>(*pixelData);
-      }
-      else return 0u;
+      return ReadChannelTable(pixelData, channel, ALPHA_ONLY_OFFSET_TABLE);
     }
     case Dali::Pixel::L8:
     {
-      if( channel == LUMINANCE )
-      {
-        return static_cast<unsigned int>(*pixelData);
-      }
-      else return 0u;
+      return ReadChannelTable(pixelData, channel, LUMINANCE_ONLY_OFFSET_TABLE);
     }
     case Dali::Pixel::LA88:
     {
-      if( channel == LUMINANCE )
-      {
-        return static_cast<unsigned int>(*pixelData);
-      }
-      else if( channel == ALPHA )
-      {
-        return static_cast<unsigned int>(*(pixelData+1));
-      }
-      else return 0u;
+      return ReadChannelTable(pixelData, channel, LUMINANCE_ALPHA_OFFSET_TABLE);
     }
     case Dali::Pixel::RGB565:
     {
-      if( channel == RED )
-      {
-        return (static_cast<unsigned int>(*pixelData) & 0xF8) >> 3;
-      }
-      else if( channel == GREEN )
-      {
-        return ((static_cast<unsigned int>(*pixelData) & 0x07) << 3) |
-          ((static_cast<unsigned int>(*(pixelData+1)) & 0xE0) >> 5);
-      }
-      else if( channel == BLUE )
-      {
-        return static_cast<unsigned int>(*(pixelData+1)) & 0x1F;
-      }
-      else return 0u;
+      return ReadChannel565(pixelData, channel, RED, GREEN, BLUE);
     }
 
     case Dali::Pixel::BGR565:
     {
-      if( channel == BLUE )
-      {
-        return (static_cast<unsigned int>(*pixelData) & 0xF8) >> 3;
-      }
-      else if( channel == GREEN )
-      {
-        return ((static_cast<unsigned int>(*pixelData) & 0x07) << 3) |
-          ((static_cast<unsigned int>(*(pixelData+1)) & 0xE0) >> 5);
-      }
-      else if( channel == RED )
-      {
-        return (static_cast<unsigned int>(*(pixelData+1) & 0x1F) );
-      }
-      else return 0u;
+      return ReadChannel565(pixelData, channel, BLUE, GREEN, RED);
     }
 
     case Dali::Pixel::RGB888:
     case Dali::Pixel::RGB8888:
     {
-      if( channel == RED )
-      {
-        return static_cast<unsigned int>(*pixelData);
-      }
-      else if( channel == GREEN )
-      {
-        return static_cast<unsigned int>(*(pixelData+1));
-      }
-      else if( channel == BLUE )
-      {
-        return static_cast<unsigned int>(*(pixelData+2));
-      }
-      else return 0u;
+      return ReadChannelTable(pixelData, channel, RGB_OFFSET_TABLE);
     }
 
     case Dali::Pixel::BGR8888:
     {
-      if( channel == BLUE )
-      {
-        return static_cast<unsigned int>(*pixelData);
-      }
-      else if( channel == GREEN )
-      {
-        return static_cast<unsigned int>(*(pixelData+1));
-      }
-      else if( channel == RED )
-      {
-        return static_cast<unsigned int>(*(pixelData+2));
-      }
-      else return 0u;
+      return ReadChannelTable(pixelData, channel, BGR_OFFSET_TABLE);
     }
 
     case Dali::Pixel::RGBA8888:
     {
-      if( channel == RED )
-      {
-        return static_cast<unsigned int>(*pixelData);
-      }
-      else if( channel == GREEN )
-      {
-        return static_cast<unsigned int>(*(pixelData+1));
-      }
-      else if( channel == BLUE )
-      {
-        return static_cast<unsigned int>(*(pixelData+2));
-      }
-      else if( channel == ALPHA )
-      {
-        return static_cast<unsigned int>(*(pixelData+3));
-      }
-      else return 0u;
+      return ReadChannelTable(pixelData, channel, RGBA_OFFSET_TABLE);
     }
 
     case Dali::Pixel::BGRA8888:
     {
-      if( channel == BLUE )
-      {
-        return static_cast<unsigned int>(*pixelData);
-      }
-      else if( channel == GREEN )
-      {
-        return static_cast<unsigned int>(*(pixelData+1));
-      }
-      else if( channel == RED )
-      {
-        return static_cast<unsigned int>(*(pixelData+2));
-      }
-      else if( channel == ALPHA )
-      {
-        return static_cast<unsigned int>(*(pixelData+3));
-      }
-      else return 0u;
+      return ReadChannelTable(pixelData, channel, BGRA_OFFSET_TABLE);
     }
 
     case Dali::Pixel::RGBA4444:
     {
-      if( channel == RED )
-      {
-        return (static_cast<unsigned int>(*pixelData) & 0xF0) >> 4;
-      }
-      else if( channel == GREEN )
-      {
-        return (static_cast<unsigned int>(*pixelData) & 0x0F);
-      }
-      else if( channel == BLUE )
-      {
-        return (static_cast<unsigned int>(*(pixelData+1)) & 0xF0) >> 4;
-      }
-      else if( channel == ALPHA )
-      {
-        return (static_cast<unsigned int>(*(pixelData+1)) & 0x0F);
-      }
-      else return 0u;
+      return ReadChannel4444(pixelData, channel, RED, GREEN, BLUE, ALPHA);
     }
 
     case Dali::Pixel::BGRA4444:
     {
-      if( channel == BLUE )
-      {
-        return (static_cast<unsigned int>(*pixelData) & 0xF0) >> 4;
-      }
-      else if( channel == GREEN )
-      {
-        return (static_cast<unsigned int>(*pixelData) & 0x0F);
-      }
-      else if( channel == RED )
-      {
-        return (static_cast<unsigned int>(*(pixelData+1)) & 0xF0) >> 4;
-      }
-      else if( channel == ALPHA )
-      {
-        return (static_cast<unsigned int>(*(pixelData+1)) & 0x0F);
-      }
-      else return 0u;
+      return ReadChannel4444(pixelData, channel, BLUE, GREEN, RED, ALPHA);
     }
 
     case Dali::Pixel::RGBA5551:
     {
-      if( channel == RED )
-      {
-        return (static_cast<unsigned int>(*pixelData) & 0xF8) >> 3;
-      }
-      else if( channel == GREEN )
-      {
-        return ((static_cast<unsigned int>(*pixelData) & 0x07) << 2) |
-          ((static_cast<unsigned int>(*(pixelData+1)) & 0xC0) >> 6);
-      }
-      else if( channel == BLUE )
-      {
-        return (static_cast<unsigned int>(*(pixelData+1)) & 0x3E) >> 1;
-      }
-      else if( channel == ALPHA )
-      {
-        return static_cast<unsigned int>(*(pixelData+1)) & 0x01;
-      }
-
-      else return 0u;
+      return ReadChannel5551(pixelData, channel, RED, GREEN, BLUE, ALPHA);
     }
 
     case Dali::Pixel::BGRA5551:
     {
-      if( channel == BLUE )
-      {
-        return (static_cast<unsigned int>(*pixelData) & 0xF8) >> 3;
-      }
-      else if( channel == GREEN )
-      {
-        return ((static_cast<unsigned int>(*pixelData) & 0x07) << 2) |
-          ((static_cast<unsigned int>(*(pixelData+1)) & 0xC0) >> 6);
-      }
-      else if( channel == RED )
-      {
-        return ( static_cast<unsigned int>(*(pixelData+1)) & 0x3E) >> 1;
-      }
-      else if( channel == ALPHA )
-      {
-        return static_cast<unsigned int>(*(pixelData+1)) & 0x01;
-      }
-
-      else return 0u;
+      return ReadChannel5551(pixelData, channel, BLUE, GREEN, RED, ALPHA);
+    }
+
+    case Dali::Pixel::DEPTH_UNSIGNED_INT:
+    case Dali::Pixel::DEPTH_FLOAT:
+    case Dali::Pixel::DEPTH_STENCIL:
+    {
+      return 0u;
     }
 
     default:
@@ -374,269 +487,93 @@ unsigned int ReadChannel( unsigned char* pixelData,
   }
 }
 
-void WriteChannel( unsigned char* pixelData,
-                   Dali::Pixel::Format pixelFormat,
-                   Channel channel,
-                   unsigned int channelValue )
+void WriteChannel(unsigned char*      pixelData,
+                  Dali::Pixel::Format pixelFormat,
+                  Channel             channel,
+                  unsigned int        channelValue)
 {
-  switch (pixelFormat)
+  switch(pixelFormat)
   {
     case Dali::Pixel::A8:
     {
-      if( channel == ALPHA )
-      {
-        *pixelData = static_cast<unsigned char>( channelValue & 0xFF );
-      }
+      WriteChannelTable(pixelData, channel, channelValue, ALPHA_ONLY_OFFSET_TABLE);
       break;
     }
     case Dali::Pixel::L8:
     {
-      if( channel == LUMINANCE )
-      {
-        *pixelData = static_cast<unsigned char>( channelValue & 0xFF );
-      }
+      WriteChannelTable(pixelData, channel, channelValue, LUMINANCE_ONLY_OFFSET_TABLE);
       break;
     }
     case Dali::Pixel::LA88:
     {
-      if( channel == LUMINANCE )
-      {
-        *pixelData = static_cast<unsigned char>( channelValue & 0xFF );
-      }
-      else if( channel == ALPHA )
-      {
-        *(pixelData+1) = static_cast<unsigned char>( channelValue & 0xFF );
-      }
+      WriteChannelTable(pixelData, channel, channelValue, LUMINANCE_ALPHA_OFFSET_TABLE);
       break;
     }
     case Dali::Pixel::RGB565:
     {
-      if( channel == RED )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0xF8 );
-        *pixelData |= static_cast<unsigned char>( (channelValue << 3) & 0xF8 );
-      }
-      else if( channel == GREEN )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0x07 );
-        *pixelData |= static_cast<unsigned char>( (channelValue >> 3) & 0x07 );
-
-        *(pixelData+1) &= static_cast<unsigned char>( ~0xE0 );
-        *(pixelData+1) |= static_cast<unsigned char>( (channelValue << 5) & 0xE0 );
-      }
-      else if( channel == BLUE )
-      {
-        *(pixelData+1) &= static_cast<unsigned char>( ~0x1F );
-        *(pixelData+1) |= static_cast<unsigned char>( channelValue & 0x1F );
-      }
+      WriteChannel565(pixelData, channel, channelValue, RED, GREEN, BLUE);
       break;
     }
 
     case Dali::Pixel::BGR565:
     {
-      if( channel == BLUE )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0xF8 );
-        *pixelData |= static_cast<unsigned char>( (channelValue << 3) & 0xF8 );
-      }
-      else if( channel == GREEN )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0x07 );
-        *pixelData |= static_cast<unsigned char>( (channelValue >> 3) & 0x07 );
-
-        *(pixelData+1) &= static_cast<unsigned char>( ~0xE0 );
-        *(pixelData+1) |= static_cast<unsigned char>( (channelValue << 5) & 0xE0 );
-      }
-      else if( channel == RED )
-      {
-        *(pixelData+1) &= static_cast<unsigned char>( ~0x1F );
-        *(pixelData+1) |= static_cast<unsigned char>( channelValue & 0x1F );
-      }
+      WriteChannel565(pixelData, channel, channelValue, BLUE, GREEN, RED);
       break;
     }
 
     case Dali::Pixel::RGB888:
     case Dali::Pixel::RGB8888:
     {
-      if( channel == RED )
-      {
-        *pixelData = static_cast<unsigned char>( channelValue & 0xFF );
-      }
-      else if( channel == GREEN )
-      {
-        *(pixelData+1) = static_cast<unsigned char>( channelValue & 0xFF );
-      }
-      else if( channel == BLUE )
-      {
-        *(pixelData+2) = static_cast<unsigned char>( channelValue & 0xFF );
-      }
+      WriteChannelTable(pixelData, channel, channelValue, RGB_OFFSET_TABLE);
       break;
     }
 
     case Dali::Pixel::BGR8888:
     {
-      if( channel == BLUE )
-      {
-        *pixelData = static_cast<unsigned char>( channelValue & 0xFF );
-      }
-      else if( channel == GREEN )
-      {
-        *(pixelData+1) = static_cast<unsigned char>( channelValue & 0xFF );
-      }
-      else if( channel == RED )
-      {
-        *(pixelData+2) = static_cast<unsigned char>( channelValue & 0xFF );
-      }
+      WriteChannelTable(pixelData, channel, channelValue, BGR_OFFSET_TABLE);
       break;
     }
 
     case Dali::Pixel::RGBA8888:
     {
-      if( channel == RED )
-      {
-        *pixelData = static_cast<unsigned char>( channelValue & 0xFF );
-      }
-      else if( channel == GREEN )
-      {
-        *(pixelData+1) = static_cast<unsigned char>( channelValue & 0xFF );
-      }
-      else if( channel == BLUE )
-      {
-        *(pixelData+2) = static_cast<unsigned char>( channelValue & 0xFF );
-      }
-      else if( channel == ALPHA )
-      {
-        *(pixelData+3) = static_cast<unsigned char>( channelValue & 0xFF );
-      }
+      WriteChannelTable(pixelData, channel, channelValue, RGBA_OFFSET_TABLE);
       break;
     }
 
     case Dali::Pixel::BGRA8888:
     {
-      if( channel == BLUE )
-      {
-        *pixelData = static_cast<unsigned char>( channelValue & 0xFF );
-      }
-      else if( channel == GREEN )
-      {
-        *(pixelData+1) = static_cast<unsigned char>( channelValue & 0xFF );
-      }
-      else if( channel == RED )
-      {
-        *(pixelData+2) = static_cast<unsigned char>( channelValue & 0xFF );
-      }
-      else if( channel == ALPHA )
-      {
-        *(pixelData+3) = static_cast<unsigned char>( channelValue & 0xFF );
-      }
+      WriteChannelTable(pixelData, channel, channelValue, BGRA_OFFSET_TABLE);
       break;
     }
 
     case Dali::Pixel::RGBA4444:
     {
-      if( channel == RED )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0xF0 );
-        *pixelData |= static_cast<unsigned char>( (channelValue << 4) & 0xF0 );
-      }
-      else if( channel == GREEN )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0x0F );
-        *pixelData |= static_cast<unsigned char>( channelValue & 0x0F );
-      }
-      else if( channel == BLUE )
-      {
-        *(pixelData+1) &= static_cast<unsigned char>( ~0xF0 );
-        *(pixelData+1) |= static_cast<unsigned char>( (channelValue << 4) & 0xF0 );
-      }
-      else if( channel == ALPHA )
-      {
-        *(pixelData+1) &= static_cast<unsigned char>( ~0x0F );
-        *(pixelData+1) |= static_cast<unsigned char>( channelValue & 0x0F );
-      }
+      WriteChannel4444(pixelData, channel, channelValue, RED, GREEN, BLUE, ALPHA);
       break;
     }
 
     case Dali::Pixel::BGRA4444:
     {
-      if( channel == BLUE )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0xF0 );
-        *pixelData |= static_cast<unsigned char>( (channelValue << 4) & 0xF0 );
-      }
-      else if( channel == GREEN )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0x0F );
-        *pixelData |= static_cast<unsigned char>( channelValue & 0x0F );
-      }
-      else if( channel == RED )
-      {
-        *(pixelData+1) &= static_cast<unsigned char>( ~0xF0 );
-        *(pixelData+1) |= static_cast<unsigned char>( (channelValue << 4) & 0xF0 );
-      }
-      else if( channel == ALPHA )
-      {
-        *(pixelData+1) &= static_cast<unsigned char>( ~0x0F );
-        *(pixelData+1) |= static_cast<unsigned char>( channelValue & 0x0F );
-      }
+      WriteChannel4444(pixelData, channel, channelValue, BLUE, GREEN, RED, ALPHA);
       break;
     }
 
     case Dali::Pixel::RGBA5551:
     {
-      // rrrrrggg ggbbbbba
-      //    F8  7 C0  3E 1
-      if( channel == RED )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0xF8 );
-        *pixelData |= static_cast<unsigned char>( (channelValue << 3) & 0xF8 );
-      }
-      else if( channel == GREEN )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0x07 );
-        *pixelData |= static_cast<unsigned char>( (channelValue >> 2) & 0x07 );
-
-        *(pixelData+1) &= static_cast<unsigned char>( ~0xC0 );
-        *(pixelData+1) |= static_cast<unsigned char>( (channelValue << 6) & 0xC0 );
-      }
-      else if( channel == BLUE )
-      {
-        *(pixelData+1) &= static_cast<unsigned char>( ~0x3E );
-        *(pixelData+1) |= static_cast<unsigned char>( (channelValue << 1) & 0x3E );
-      }
-      else if( channel == ALPHA )
-      {
-        *(pixelData+1) &= static_cast<unsigned char>( ~0x01 );
-        *(pixelData+1) |= static_cast<unsigned char>( channelValue & 0x01 );
-      }
+      WriteChannel5551(pixelData, channel, channelValue, RED, GREEN, BLUE, ALPHA);
       break;
     }
 
     case Dali::Pixel::BGRA5551:
     {
-      if( channel == BLUE )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0xF8 );
-        *pixelData |= static_cast<unsigned char>( (channelValue << 3) & 0xF8 );
-      }
-      else if( channel == GREEN )
-      {
-        *pixelData &= static_cast<unsigned char>( ~0x07 );
-        *pixelData |= static_cast<unsigned char>( (channelValue >> 2) & 0x07 );
-
-        *(pixelData+1) &= static_cast<unsigned char>( ~0xC0 );
-        *(pixelData+1) |= static_cast<unsigned char>( (channelValue << 6) & 0xC0 );
-      }
-      else if( channel == RED )
-      {
-        *(pixelData+1) &= static_cast<unsigned char>( ~0x3E );
-        *(pixelData+1) |= static_cast<unsigned char>( (channelValue << 1 ) & 0x3E );
-      }
-      else if( channel == ALPHA )
-      {
-        *(pixelData+1) &= static_cast<unsigned char>( ~0x01 );
-        *(pixelData+1) |= static_cast<unsigned char>( channelValue & 0x01 );
-      }
+      WriteChannel5551(pixelData, channel, channelValue, BLUE, GREEN, RED, ALPHA);
+      break;
+    }
+
+    case Dali::Pixel::DEPTH_UNSIGNED_INT:
+    case Dali::Pixel::DEPTH_FLOAT:
+    case Dali::Pixel::DEPTH_STENCIL:
+    {
       break;
     }
 
@@ -646,63 +583,61 @@ void WriteChannel( unsigned char* pixelData,
 }
 
 void ConvertColorChannelsToRGBA8888(
-  unsigned char* srcPixel,  int srcOffset,  Dali::Pixel::Format srcFormat,
-  unsigned char* destPixel, int destOffset )
+  unsigned char* srcPixel, int srcOffset, Dali::Pixel::Format srcFormat, unsigned char* destPixel, int destOffset)
 {
-  int red   = ReadChannel(srcPixel+srcOffset, srcFormat, RED );
-  int green = ReadChannel(srcPixel+srcOffset, srcFormat, GREEN );
-  int blue  = ReadChannel(srcPixel+srcOffset, srcFormat, BLUE );
-  switch( srcFormat )
+  int red   = ReadChannel(srcPixel + srcOffset, srcFormat, RED);
+  int green = ReadChannel(srcPixel + srcOffset, srcFormat, GREEN);
+  int blue  = ReadChannel(srcPixel + srcOffset, srcFormat, BLUE);
+  switch(srcFormat)
   {
     case Dali::Pixel::RGB565:
     case Dali::Pixel::BGR565:
     {
-      red = (red<<3) | (red & 0x07);
+      red   = (red << 3) | (red & 0x07);
       green = (green << 2) | (green & 0x03);
-      blue = (blue<<3) | (blue & 0x07);
+      blue  = (blue << 3) | (blue & 0x07);
       break;
     }
     case Dali::Pixel::RGBA4444:
     case Dali::Pixel::BGRA4444:
     {
-      red = (red<<4) | (red&0x0F);
-      green = (green<<4) | (green&0x0F);
-      blue = (blue<<4) | (blue&0x0F);
+      red   = (red << 4) | (red & 0x0F);
+      green = (green << 4) | (green & 0x0F);
+      blue  = (blue << 4) | (blue & 0x0F);
       break;
     }
     case Dali::Pixel::RGBA5551:
     case Dali::Pixel::BGRA5551:
     {
-      red = (red<<3) | (red&0x07);
-      green = (green<<3) | (green&0x07);
-      blue = (blue<<3) | (blue&0x07);
+      red   = (red << 3) | (red & 0x07);
+      green = (green << 3) | (green & 0x07);
+      blue  = (blue << 3) | (blue & 0x07);
       break;
     }
     default:
       break;
   }
-  WriteChannel(destPixel+destOffset, Dali::Pixel::RGBA8888, RED, red);
-  WriteChannel(destPixel+destOffset, Dali::Pixel::RGBA8888, GREEN, green);
-  WriteChannel(destPixel+destOffset, Dali::Pixel::RGBA8888, BLUE, blue);
+  WriteChannel(destPixel + destOffset, Dali::Pixel::RGBA8888, RED, red);
+  WriteChannel(destPixel + destOffset, Dali::Pixel::RGBA8888, GREEN, green);
+  WriteChannel(destPixel + destOffset, Dali::Pixel::RGBA8888, BLUE, blue);
 }
 
-
-int ConvertAlphaChannelToA8( unsigned char* srcPixel, int srcOffset, Dali::Pixel::Format srcFormat )
+int ConvertAlphaChannelToA8(unsigned char* srcPixel, int srcOffset, Dali::Pixel::Format srcFormat)
 {
-  int alpha = ReadChannel(srcPixel+srcOffset, srcFormat, ALPHA );
+  int alpha     = ReadChannel(srcPixel + srcOffset, srcFormat, ALPHA);
   int destAlpha = alpha;
-  switch( srcFormat )
+  switch(srcFormat)
   {
     case Pixel::RGBA5551:
     case Pixel::BGRA5551:
     {
-      destAlpha = (alpha==0)?0:255;
+      destAlpha = (alpha == 0) ? 0 : 255;
       break;
     }
     case Pixel::RGBA4444:
     case Pixel::BGRA4444:
     {
-      destAlpha = (alpha<<4) | (alpha&0x0F);
+      destAlpha = (alpha << 4) | (alpha & 0x0F);
       break;
     }
     default:
@@ -711,6 +646,6 @@ int ConvertAlphaChannelToA8( unsigned char* srcPixel, int srcOffset, Dali::Pixel
   return destAlpha;
 }
 
-} // Adaptor
-} // Internal
-} // Dali
+} // namespace Adaptor
+} // namespace Internal
+} // namespace Dali