Some tweaks to Lua docs
[lsnes.git] / src / library / framebuffer-pixfmt-rgb15.cpp
blob293bc805333ef05ab46b0e91cb394577c6aa9e5a
1 #include "framebuffer-pixfmt-rgb15.hpp"
3 namespace framebuffer
5 template<bool uvswap>
6 _pixfmt_rgb15<uvswap>::~_pixfmt_rgb15() throw()
10 template<bool uvswap>
11 void _pixfmt_rgb15<uvswap>::decode(uint32_t* target, const uint8_t* src, size_t width)
12 throw()
14 const uint16_t* _src = reinterpret_cast<const uint16_t*>(src);
15 for(size_t i = 0; i < width; i++) {
16 uint32_t word = _src[i];
17 uint64_t r = ((word >> (uvswap ? 10 : 0)) & 0x1F);
18 uint64_t g = ((word >> 5) & 0x1F);
19 uint64_t b = ((word >> (uvswap ? 0 : 10)) & 0x1F);
20 target[i] = (((r << 8) - r + 15) / 31) << 16;
21 target[i] |= (((g << 8) - g + 15) / 31) << 8;
22 target[i] |= (((b << 8) - b + 15) / 31);
26 template<bool uvswap>
27 void _pixfmt_rgb15<uvswap>::decode(uint32_t* target, const uint8_t* src, size_t width,
28 const auxpalette<false>& auxp) throw()
30 const uint16_t* _src = reinterpret_cast<const uint16_t*>(src);
31 for(size_t i = 0; i < width; i++)
32 target[i] = auxp.pcache[_src[i] & 0x7FFF];
35 template<bool uvswap>
36 void _pixfmt_rgb15<uvswap>::decode(uint64_t* target, const uint8_t* src, size_t width,
37 const auxpalette<true>& auxp) throw()
39 const uint16_t* _src = reinterpret_cast<const uint16_t*>(src);
40 for(size_t i = 0; i < width; i++)
41 target[i] = auxp.pcache[_src[i] & 0x7FFF];
44 template<bool uvswap>
45 void _pixfmt_rgb15<uvswap>::set_palette(auxpalette<false>& auxp, uint8_t rshift, uint8_t gshift,
46 uint8_t bshift) throw(std::bad_alloc)
48 auxp.pcache.resize(0x8000);
49 for(size_t i = 0; i < 0x8000; i++) {
50 uint32_t r = ((i >> (uvswap ? 10 : 0)) & 0x1F);
51 uint32_t g = ((i >> 5) & 0x1F);
52 uint32_t b = ((i >> (uvswap ? 0 : 10)) & 0x1F);
53 auxp.pcache[i] = (((r << 8) - r + 15) / 31) << rshift;
54 auxp.pcache[i] += (((g << 8) - g + 15) / 31) << gshift;
55 auxp.pcache[i] += (((b << 8) - b + 15) / 31) << bshift;
57 auxp.rshift = rshift;
58 auxp.gshift = gshift;
59 auxp.bshift = bshift;
62 template<bool uvswap>
63 void _pixfmt_rgb15<uvswap>::set_palette(auxpalette<true>& auxp, uint8_t rshift, uint8_t gshift,
64 uint8_t bshift) throw(std::bad_alloc)
66 auxp.pcache.resize(0x8000);
67 for(size_t i = 0; i < 0x8000; i++) {
68 uint64_t r = ((i >> (uvswap ? 10 : 0)) & 0x1F);
69 uint64_t g = ((i >> 5) & 0x1F);
70 uint64_t b = ((i >> (uvswap ? 0 : 10)) & 0x1F);
71 auxp.pcache[i] = (((r << 16) - r + 15) / 31) << rshift;
72 auxp.pcache[i] += (((g << 16) - g + 15) / 31) << gshift;
73 auxp.pcache[i] += (((b << 16) - b + 15) / 31) << bshift;
75 auxp.rshift = rshift;
76 auxp.gshift = gshift;
77 auxp.bshift = bshift;
80 template<bool uvswap>
81 uint8_t _pixfmt_rgb15<uvswap>::get_bpp() throw()
83 return 2;
86 template<bool uvswap>
87 uint8_t _pixfmt_rgb15<uvswap>::get_ss_bpp() throw()
89 return 2;
92 template<bool uvswap>
93 uint32_t _pixfmt_rgb15<uvswap>::get_magic() throw()
95 if(uvswap)
96 return 0x16326322;
97 else
98 return 0x74324563;
101 _pixfmt_rgb15<false> pixfmt_rgb15;
102 _pixfmt_rgb15<true> pixfmt_bgr15;