Advertisement
CaveDweller

Pixel Conversion

Sep 1st, 2013
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. |=================================================Pixels.h=================================================|
  2.  
  3. #define RED_3_3_2 0xE0
  4. #define GRN_3_3_2 0x1C
  5. #define BLU_3_3_2 0x03
  6.  
  7. #define RED_5_6_5 0xF800
  8. #define GRN_5_6_5 0x07E0
  9. #define BLU_5_6_5 0x001F
  10.  
  11. #define RED_4_4_4_4 0xF000
  12. #define GRN_4_4_4_4 0x0F00
  13. #define BLU_4_4_4_4 0x00F0
  14. #define ALP_4_4_4_4 0x000F
  15.  
  16. #define RED_8_8_8_8 0xFF000000
  17. #define GRN_8_8_8_8 0x00FF0000
  18. #define BLU_8_8_8_8 0x0000FF00
  19. #define ALP_8_8_8_8 0x000000FF
  20.  
  21. #define RED_8_8_8 RED_8_8_8_8
  22. #define GRN_8_8_8 GRN_8_8_8_8
  23. #define BLU_8_8_8 BLU_8_8_8_8
  24.  
  25. #define RED_10_10_10 0xFFC00000
  26. #define GRN_10_10_10 0x003FF000
  27. #define BLU_10_10_10 0x00000FFC
  28.  
  29. #define RED_16_16_16_16 0xFFFF000000000000 //some people use 64-bit color
  30. #define GRN_16_16_16_16 0x0000FFFF00000000
  31. #define BLU_16_16_16_16 0x00000000FFFF0000
  32. #define ALP_16_16_16_16 0x000000000000FFFF
  33.  
  34. enum class PIXEL_FORMAT : char {
  35.     PALETTE,
  36.     RGB,
  37.     RGBA
  38. };
  39.  
  40. template<unsigned bit_depth, PIXEL_FORMAT fmt> struct Pixel {};
  41.  
  42. template<> struct Pixel<8, PIXEL_FORMAT::RGB> {
  43.     unsigned char color;
  44.     Pixel(unsigned char red, unsigned char green, unsigned char blue) {
  45.         color = 0xFF & (((red << 5) & RED_3_3_2) & ((green << 2) & GRN_3_3_2) & (blue & BLU_3_3_2));
  46.     }
  47.  
  48.     Pixel(unsigned char clr) { color = clr; }
  49.  
  50.     Pixel<16, PIXEL_FORMAT::RGB> convert_to_rgb16() {
  51.         unsigned char red, grn, blu;
  52.         red = ((color & RED_3_3_2) >> 5);
  53.         grn = ((color & GRN_3_3_2) >> 2);
  54.         blu = (color & BLU_3_3_2);
  55.  
  56.         red = ((red/7) * 31); //5
  57.         grn = ((grn/7) * 63); //6
  58.         blu = ((blu/3) * 31); //5
  59.  
  60.         Pixel<16, PIXEL_FORMAT::RGB> _16rgb(red, grn, blu);  //compiler throws an error here
  61.         return _16rgb;
  62.     }
  63. };
  64.  
  65. template<> struct Pixel<16, PIXEL_FORMAT::RGB> {
  66.     unsigned short color;
  67.     Pixel(unsigned char red, unsigned char green, unsigned char blue) {
  68.         color = (0xFFFF & (((red << 11) & RED_5_6_5) & ((green << 5) & GRN_5_6_5) & (blue & BLU_5_6_5)));
  69.     }
  70.     Pixel(short clr) { color = clr; }
  71. };
  72.  
  73.  
  74. |=================================================Canvas.h=================================================|
  75.  
  76. #include "Pixels.h"
  77.  
  78. template< typename PixelType > struct Layer {   //will be a base for Canvas
  79.     unsigned int width, height;
  80.     PixelType** pixels;
  81.  
  82.     Layer(unsigned int width, unsigned int height, unsigned int init_color = 0xFFFFFFFF);
  83.     Layer(PixelType** pixels);
  84.     Layer();
  85.     ~Layer();
  86.     Layer(const Layer& layer);
  87.  
  88.     PixelType pixel_at(unsigned int x, unsigned int y);
  89.     void modify_pixel(unsigned int x, unsigned int y, bool add, PixelType pix);
  90.     void replace_pixel(unsigned int x, unsigned int y, PixelType pix);
  91.     template<unsigned int bit_depth, PIXEL_FORMAT fmt> Layer<Pixel<bit_depth, fmt>> convert_pixels() {
  92.     Pixel<bit_depth, fmt>** new_pixels;
  93.     new_pixels = new Pixel<bit_depth, fmt>*[height];
  94.     for(int y = 0; y < height; y++)
  95.         new_pixels[y] = new Pixel<bit_depth, fmt>[width];
  96.     for(int y = 0; y < height; y++ {
  97.         for(int x = 0; x < width; x++) {
  98.         new_pixels[y][x] = pixels[y][x].convert_to<bit_depth, fmt>(); //make a template wrapper for the conversion methods?
  99.         }
  100.     }
  101.     return Layer(new_pixels);
  102. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement