lsnes rr2-β24
[lsnes.git] / src / library / framebuffer-pixfmt-rgb15.cpp
blob91ac3e2bc4a5d226f274e05f499f3fc38f9bf755
1 #include "framebuffer-pixfmt-rgb15.hpp"
2 #include "framebuffer.hpp"
4 namespace framebuffer
6 template<bool uvswap>
7 _pixfmt_rgb15<uvswap>::~_pixfmt_rgb15() throw()
11 template<bool uvswap>
12 void _pixfmt_rgb15<uvswap>::decode(uint32_t* target, const uint8_t* src, size_t width)
13 throw()
15 const uint16_t* _src = reinterpret_cast<const uint16_t*>(src);
16 for(size_t i = 0; i < width; i++) {
17 uint32_t word = _src[i];
18 uint64_t r = ((word >> (uvswap ? 10 : 0)) & 0x1F);
19 uint64_t g = ((word >> 5) & 0x1F);
20 uint64_t b = ((word >> (uvswap ? 0 : 10)) & 0x1F);
21 target[i] = (((r << 8) - r + 15) / 31) << 16;
22 target[i] |= (((g << 8) - g + 15) / 31) << 8;
23 target[i] |= (((b << 8) - b + 15) / 31);
27 template<bool uvswap>
28 void _pixfmt_rgb15<uvswap>::decode(uint32_t* target, const uint8_t* src, size_t width,
29 const auxpalette<false>& auxp) throw()
31 const uint16_t* _src = reinterpret_cast<const uint16_t*>(src);
32 for(size_t i = 0; i < width; i++)
33 target[i] = auxp.pcache[_src[i] & 0x7FFF];
36 template<bool uvswap>
37 void _pixfmt_rgb15<uvswap>::decode(uint64_t* target, const uint8_t* src, size_t width,
38 const auxpalette<true>& auxp) throw()
40 const uint16_t* _src = reinterpret_cast<const uint16_t*>(src);
41 for(size_t i = 0; i < width; i++)
42 target[i] = auxp.pcache[_src[i] & 0x7FFF];
45 template<bool uvswap>
46 void _pixfmt_rgb15<uvswap>::set_palette(auxpalette<false>& auxp, uint8_t rshift, uint8_t gshift,
47 uint8_t bshift) throw(std::bad_alloc)
49 auxp.pcache.resize(0x8000);
50 for(size_t i = 0; i < 0x8000; i++) {
51 uint32_t r = ((i >> (uvswap ? 10 : 0)) & 0x1F);
52 uint32_t g = ((i >> 5) & 0x1F);
53 uint32_t b = ((i >> (uvswap ? 0 : 10)) & 0x1F);
54 auxp.pcache[i] = (((r << 8) - r + 15) / 31) << rshift;
55 auxp.pcache[i] += (((g << 8) - g + 15) / 31) << gshift;
56 auxp.pcache[i] += (((b << 8) - b + 15) / 31) << bshift;
58 auxp.rshift = rshift;
59 auxp.gshift = gshift;
60 auxp.bshift = bshift;
63 template<bool uvswap>
64 void _pixfmt_rgb15<uvswap>::set_palette(auxpalette<true>& auxp, uint8_t rshift, uint8_t gshift,
65 uint8_t bshift) throw(std::bad_alloc)
67 auxp.pcache.resize(0x8000);
68 for(size_t i = 0; i < 0x8000; i++) {
69 uint64_t r = ((i >> (uvswap ? 10 : 0)) & 0x1F);
70 uint64_t g = ((i >> 5) & 0x1F);
71 uint64_t b = ((i >> (uvswap ? 0 : 10)) & 0x1F);
72 auxp.pcache[i] = (((r << 16) - r + 15) / 31) << rshift;
73 auxp.pcache[i] += (((g << 16) - g + 15) / 31) << gshift;
74 auxp.pcache[i] += (((b << 16) - b + 15) / 31) << bshift;
76 auxp.rshift = rshift;
77 auxp.gshift = gshift;
78 auxp.bshift = bshift;
81 template<bool uvswap>
82 uint8_t _pixfmt_rgb15<uvswap>::get_bpp() throw()
84 return 2;
87 template<bool uvswap>
88 uint8_t _pixfmt_rgb15<uvswap>::get_ss_bpp() throw()
90 return 2;
93 template<bool uvswap>
94 uint32_t _pixfmt_rgb15<uvswap>::get_magic() throw()
96 if(uvswap)
97 return 0x16326322;
98 else
99 return 0x74324563;
102 _pixfmt_rgb15<false> pixfmt_rgb15;
103 _pixfmt_rgb15<true> pixfmt_bgr15;