+class TargaDecodeGrayPixelRLE
+{
+TargaPacketSize m_packetSize;
+RGBAPixel m_pixel;
+TargaPacket m_packet;
+public:
+TargaDecodeGrayPixelRLE() : m_packetSize( 0 ){
+}
+void operator()( PointerInputStream& istream, RGBAPixel& pixel ){
+ if ( m_packetSize == 0 ) {
+ targa_packet_read_istream( m_packet, istream );
+ m_packetSize = targa_packet_size( m_packet );
+
+ if ( targa_packet_is_rle( m_packet ) ) {
+ istream_read_gray( istream, m_pixel );
+ }
+ }
+
+ if ( targa_packet_is_rle( m_packet ) ) {
+ pixel = m_pixel;
+ }
+ else
+ {
+ istream_read_gray( istream, pixel );
+ }
+
+ --m_packetSize;
+}
+};
+
+template<typename Flip>
+void targa_decode_rle_grayscale( PointerInputStream& istream, RGBAImage& image, const Flip& flip ){
+ TargaDecodeGrayPixelRLE decode;
+ image_decode( istream, decode, image, flip );
+}
+