View difference between Paste ID: GLCs4Rw7 and BSpQ7wya
SHOW: | | - or go back to the newest paste.
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<bit_depth, fmt> convert_pixels() {
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
};