@@ -586,13 +586,15 @@ namespace lgfx
586586 template <> LGFX_INLINE uint32_t color_convert<bgra8888_t , bgr666_t >(uint32_t c) { c<<=2 ; return (c << 8 ) + ((c & 0xC0C0C0 ) << 2 ) + 0xFF ; }
587587 template <> LGFX_INLINE uint32_t color_convert<bgra8888_t , bgr888_t >(uint32_t c) { return (c << 8 ) + 0xFF ; }
588588 template <> LGFX_INLINE uint32_t color_convert<bgra8888_t , grayscale_t >(uint32_t c) { return (((c << 8 ) + c) << 16 ) + (c << 8 ) + 0xFF ; }
589- template <> LGFX_INLINE uint32_t color_convert<grayscale_t , rgb332_t >(uint32_t c) { uint_fast16_t t = ((c>>5 )*0x49 ); t += ((c>>2 )&7 )*0x92 ; t += (c&3 ) * 0xAA ; return t >> 3 ; }
590- template <> LGFX_INLINE uint32_t color_convert<grayscale_t , rgb565_t >(uint32_t c) { uint_fast16_t g = ( c & 0x07E0 ); g |= g >> 6 ; uint_fast16_t rb = ((c>>11 )+(c&0x1F ))*0x21 ; return (rb+g)>>4 ; }
591- template <> LGFX_INLINE uint32_t color_convert<grayscale_t , rgb888_t >(uint32_t c) { uint_fast16_t g = ( c >> 8 ) & 0xFF ; g = (g << 1 ) + (g >> 7 ); return (g + ((c>>16 )&0xFF )+(c&0xFF ))>>2 ; }
592- template <> LGFX_INLINE uint32_t color_convert<grayscale_t , argb8888_t >(uint32_t c) { uint_fast16_t g = ( c >> 8 ) & 0xFF ; g = (g << 1 ) + (g >> 7 ); return (g + ((c>>16 )&0xFF )+(c&0xFF ))>>2 ; }
593- template <> LGFX_INLINE uint32_t color_convert<grayscale_t , swap565_t >(uint32_t c) { uint_fast16_t rb = ((((c>>3 )&0x1F ) + ((c>>8 )&0x1F )) * 0x21 ) >> 2 ; uint_fast16_t g = (c & 7 ); g = (((g << 3 ) + (c >> 13 )) << 3 ) + g; return (rb+g) >> 2 ; }
594- template <> LGFX_INLINE uint32_t color_convert<grayscale_t , bgr666_t >(uint32_t c) { uint_fast16_t g = ((c >> 8 ) & 0x3F )*0x82 ; uint_fast16_t rb = ((c>>16 ) + (c&0x3F ))*0x41 ; return (rb+g)>>6 ; }
595- template <> LGFX_INLINE uint32_t color_convert<grayscale_t , bgr888_t >(uint32_t c) { uint_fast16_t g = ( c >> 8 ) & 0xFF ; g = (g << 1 ) + (g >> 7 ); return (g + ((c>>16 )&0xFF )+(c&0xFF ))>>2 ; }
589+
590+ // ITU-R BT.601 RGB to Y convert R 0.299 + G 0.587 + B 0.114
591+ template <> LGFX_INLINE uint32_t color_convert<grayscale_t , rgb332_t >(uint32_t c) { return (((c >> 5 ) & 0x07 ) * 43 + ((c >> 2 ) & 0x07 ) * 86 + (c & 0x03 ) * 39 ) >> 2 ; }
592+ template <> LGFX_INLINE uint32_t color_convert<grayscale_t , rgb565_t >(uint32_t c) { return (((c >> 11 ) & 0x1F ) * 79 + ((c >> 5 ) & 0x3F ) * 76 + (c & 0x1F ) * 30 ) >> 5 ; }
593+ template <> LGFX_INLINE uint32_t color_convert<grayscale_t , rgb888_t >(uint32_t c) { return (((c >> 16 ) & 0xFF ) * 77 + ((c >> 8 ) & 0xFF ) * 151 + (c & 0xFF ) * 29 ) >> 8 ; }
594+ template <> LGFX_INLINE uint32_t color_convert<grayscale_t , argb8888_t >(uint32_t c) { return (((c >> 24 ) & 0xFF ) * 77 + ((c >> 16 ) & 0xFF ) * 151 + ((c >> 8 ) & 0xFF ) * 29 ) >> 8 ; }
595+ template <> LGFX_INLINE uint32_t color_convert<grayscale_t , swap565_t >(uint32_t c) { return (((c >> 3 ) & 0x1F ) * 79 +(((c<<3 )+(c>>13 ))&0x3F )*76 + ((c >> 8 ) & 0x1F ) * 30 ) >> 5 ; }
596+ template <> LGFX_INLINE uint32_t color_convert<grayscale_t , bgr666_t >(uint32_t c) { return (( c & 0x3F ) * 39 + ((c >> 8 ) & 0x3F ) * 76 + ((c >> 16 ) & 0x3F ) * 15 ) >> 5 ; }
597+ template <> LGFX_INLINE uint32_t color_convert<grayscale_t , bgr888_t >(uint32_t c) { return (( c & 0xFF ) * 77 + ((c >> 8 ) & 0xFF ) * 151 + ((c >> 16 ) & 0xFF ) * 29 ) >> 8 ; }
596598 template <> LGFX_INLINE uint32_t color_convert<grayscale_t , bgra8888_t >(uint32_t c) { return color_convert<grayscale_t , bgr888_t >(c>>8 ); }
597599
598600 LGFX_INLINE rgb332_t & rgb332_t ::operator =(const rgb565_t & c) { set (color_convert<rgb332_t , rgb565_t >(c.get ())); return *this ; }
@@ -708,6 +710,7 @@ namespace lgfx
708710 case rgb666_3Byte : return color_convert<bgr666_t , rgb332_t >;
709711 case rgb565_2Byte : return color_convert<swap565_t , rgb332_t >;
710712 case rgb332_1Byte : return no_convert;
713+ case grayscale_8bit: return color_convert<grayscale_t , rgb332_t >;
711714 default : break ;
712715 }
713716 } else if (std::is_same<TSrc, rgb888_t >::value || std::is_same<TSrc, uint32_t >::value) {
@@ -717,6 +720,7 @@ namespace lgfx
717720 case rgb666_3Byte : return color_convert<bgr666_t , rgb888_t >;
718721 case rgb565_2Byte : return color_convert<swap565_t , rgb888_t >;
719722 case rgb332_1Byte : return color_convert<rgb332_t , rgb888_t >;
723+ case grayscale_8bit: return color_convert<grayscale_t ,rgb888_t >;
720724 default : break ;
721725 }
722726 } else if (std::is_same<TSrc, argb8888_t >::value) {
@@ -726,6 +730,7 @@ namespace lgfx
726730 case rgb666_3Byte : return color_convert<bgr666_t , rgb888_t >;
727731 case rgb565_2Byte : return color_convert<swap565_t , rgb888_t >;
728732 case rgb332_1Byte : return color_convert<rgb332_t , rgb888_t >;
733+ case grayscale_8bit: return color_convert<grayscale_t ,rgb888_t >;
729734 default : break ;
730735 }
731736 } else if (std::is_same<TSrc, bgr888_t >::value) {
@@ -735,6 +740,7 @@ namespace lgfx
735740 case rgb666_3Byte : return color_convert<bgr666_t , bgr888_t >;
736741 case rgb565_2Byte : return color_convert<swap565_t , bgr888_t >;
737742 case rgb332_1Byte : return color_convert<rgb332_t , bgr888_t >;
743+ case grayscale_8bit: return color_convert<grayscale_t ,bgr888_t >;
738744 default : break ;
739745 }
740746 } else { // if (std::is_same<TSrc, rgb565_t>::value || std::is_same<TSrc, uint16_t>::value || std::is_same<TSrc, int>::value)
@@ -744,6 +750,7 @@ namespace lgfx
744750 case rgb666_3Byte : return color_convert<bgr666_t , rgb565_t >;
745751 case rgb565_2Byte : return getSwap16;
746752 case rgb332_1Byte : return color_convert<rgb332_t , rgb565_t >;
753+ case grayscale_8bit: return color_convert<grayscale_t ,rgb565_t >;
747754 default : break ;
748755 }
749756 }
@@ -822,11 +829,12 @@ namespace lgfx
822829 convert_bgr888 = get_fp_convert_src<bgr888_t >(depth_);
823830
824831 switch (depth_) {
825- case argb8888_4Byte: revert_rgb888 = color_convert<rgb888_t , bgra8888_t >; break ;
826- case rgb888_3Byte: revert_rgb888 = color_convert<rgb888_t , bgr888_t >; break ;
827- case rgb666_3Byte: revert_rgb888 = color_convert<rgb888_t , bgr666_t >; break ;
828- case rgb565_2Byte: revert_rgb888 = color_convert<rgb888_t , swap565_t >; break ;
829- case rgb332_1Byte: revert_rgb888 = color_convert<rgb888_t , rgb332_t >; break ;
832+ case argb8888_4Byte: revert_rgb888 = color_convert<rgb888_t , bgra8888_t >; break ;
833+ case rgb888_3Byte: revert_rgb888 = color_convert<rgb888_t , bgr888_t >; break ;
834+ case rgb666_3Byte: revert_rgb888 = color_convert<rgb888_t , bgr666_t >; break ;
835+ case rgb565_2Byte: revert_rgb888 = color_convert<rgb888_t , swap565_t >; break ;
836+ case rgb332_1Byte: revert_rgb888 = color_convert<rgb888_t , rgb332_t >; break ;
837+ case grayscale_8bit: revert_rgb888 = color_convert<rgb888_t , grayscale_t >; break ;
830838 default : revert_rgb888 = no_convert;
831839 }
832840 }
0 commit comments