diff options
Diffstat (limited to 'AVStream/avscamera/sys/Synthesizer.cpp')
| -rw-r--r-- | AVStream/avscamera/sys/Synthesizer.cpp | 1558 |
1 files changed, 1558 insertions, 0 deletions
diff --git a/AVStream/avscamera/sys/Synthesizer.cpp b/AVStream/avscamera/sys/Synthesizer.cpp new file mode 100644 index 00000000..4f591424 --- /dev/null +++ b/AVStream/avscamera/sys/Synthesizer.cpp @@ -0,0 +1,1558 @@ +/************************************************************************** + + A/V Stream Camera Sample + + Copyright (c) 2014, Microsoft Corporation. + + File: + + Synthesizer.cpp + + Abstract: + + This file contains the implementation of CSynthesizer. + + The base image synthesis and overlay class. These classes provide + image synthesis (pixel, color-bar, etc...) onto buffers of various + formats. + + Internally, all CSynthesizer objects represent a pixel as a 32 bit + quantity with 8 bits per sample. The base CSynthesizer implements + all rendering functionality with this assumption in mind. It + simplifies rendering substantially and means we do not need to re- + implement rendering functions for each format. + + Most end formats can be synthesized from this uncompressed format + with overhead that is slightly worse than a copy. Color spaces are + handled by using a rendering palette that is unique for each. + + History: + + created 04/14/2014 + +**************************************************************************/ + +#include "Common.h" + +/************************************************************************** + + PAGED CODE + +**************************************************************************/ + +#ifdef ALLOC_PRAGMA +#pragma code_seg("PAGE") +#endif // ALLOC_PRAGMA + +/************************************************************************** + + Constants + +**************************************************************************/ + +// +// Standard definition of EIA-189-A color bars. The actual color definitions +// are either in CRGB24Synthesizer or CYUVSynthesizer. +// + +const COLOR CSynthesizer::m_ColorBars[8] = +{MAGENTA, BLUE, GREEN, BLACK, WHITE, YELLOW, RED, CYAN }; + + +// +// Corner registration block colors. +// +const COLOR g_TopLeft = GREY; +const COLOR g_TopRight = BLUE; +const COLOR g_BotLeft = RED; +const COLOR g_BotRight = GREEN; + +// +// Persistent stats. +// +LONGLONG CSynthesizer::m_RelPts=0; +LONGLONG CSynthesizer::m_QpcTime=0; +ULONG CSynthesizer::m_Frame=0; + +// +// The following is an 8x8 bitmapped font for use in the text overlay +// code. +// +const UCHAR +CSynthesizer:: +m_FontData [2][256][8] = +{ + { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e}, + {0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e}, + {0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00}, + {0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00}, + {0x38, 0x7c, 0x38, 0xfe, 0xfe, 0x7c, 0x38, 0x7c}, + {0x10, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x7c}, + {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00}, + {0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff}, + {0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00}, + {0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff}, + {0x0f, 0x07, 0x0f, 0x7d, 0xcc, 0xcc, 0xcc, 0x78}, + {0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18}, + {0x3f, 0x33, 0x3f, 0x30, 0x30, 0x70, 0xf0, 0xe0}, + {0x7f, 0x63, 0x7f, 0x63, 0x63, 0x67, 0xe6, 0xc0}, + {0x99, 0x5a, 0x3c, 0xe7, 0xe7, 0x3c, 0x5a, 0x99}, + {0x80, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0x80, 0x00}, + {0x02, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x02, 0x00}, + {0x18, 0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18}, + {0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00}, + {0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00}, + {0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78}, + {0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x00}, + {0x18, 0x3c, 0x7e, 0x18, 0x7e, 0x3c, 0x18, 0xff}, + {0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x00}, + {0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00}, + {0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00}, + {0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00}, + {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00}, + {0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00}, + {0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0x00}, + {0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x30, 0x78, 0x78, 0x30, 0x30, 0x00, 0x30, 0x00}, + {0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00}, + {0x30, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x30, 0x00}, + {0x00, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xc6, 0x00}, + {0x38, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0x76, 0x00}, + {0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00}, + {0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00}, + {0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00}, + {0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60}, + {0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00}, + {0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00}, + {0x7c, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0x7c, 0x00}, + {0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x00}, + {0x78, 0xcc, 0x0c, 0x38, 0x60, 0xcc, 0xfc, 0x00}, + {0x78, 0xcc, 0x0c, 0x38, 0x0c, 0xcc, 0x78, 0x00}, + {0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x1e, 0x00}, + {0xfc, 0xc0, 0xf8, 0x0c, 0x0c, 0xcc, 0x78, 0x00}, + {0x38, 0x60, 0xc0, 0xf8, 0xcc, 0xcc, 0x78, 0x00}, + {0xfc, 0xcc, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x00}, + {0x78, 0xcc, 0xcc, 0x78, 0xcc, 0xcc, 0x78, 0x00}, + {0x78, 0xcc, 0xcc, 0x7c, 0x0c, 0x18, 0x70, 0x00}, + {0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00}, + {0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x60}, + {0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x00}, + {0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00}, + {0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00}, + {0x78, 0xcc, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00}, + {0x7c, 0xc6, 0xde, 0xde, 0xde, 0xc0, 0x78, 0x00}, + {0x30, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0x00}, + {0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x00}, + {0x3c, 0x66, 0xc0, 0xc0, 0xc0, 0x66, 0x3c, 0x00}, + {0xf8, 0x6c, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00}, + {0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00}, + {0xfe, 0x62, 0x68, 0x78, 0x68, 0x60, 0xf0, 0x00}, + {0x3c, 0x66, 0xc0, 0xc0, 0xce, 0x66, 0x3e, 0x00}, + {0xcc, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xcc, 0x00}, + {0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00}, + {0x1e, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00}, + {0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00}, + {0xf0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00}, + {0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x00}, + {0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00}, + {0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00}, + {0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00}, + {0x78, 0xcc, 0xcc, 0xcc, 0xdc, 0x78, 0x1c, 0x00}, + {0xfc, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0xe6, 0x00}, + {0x78, 0xcc, 0xe0, 0x70, 0x1c, 0xcc, 0x78, 0x00}, + {0xfc, 0xb4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00}, + {0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xfc, 0x00}, + {0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00}, + {0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00}, + {0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00}, + {0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x30, 0x78, 0x00}, + {0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x00}, + {0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00}, + {0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 0x00}, + {0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00}, + {0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}, + {0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00}, + {0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0xdc, 0x00}, + {0x00, 0x00, 0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x00}, + {0x1c, 0x0c, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00}, + {0x00, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00}, + {0x38, 0x6c, 0x60, 0xf0, 0x60, 0x60, 0xf0, 0x00}, + {0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8}, + {0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x00}, + {0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00}, + {0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78}, + {0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x00}, + {0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00}, + {0x00, 0x00, 0xcc, 0xfe, 0xfe, 0xd6, 0xc6, 0x00}, + {0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0xcc, 0x00}, + {0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00}, + {0x00, 0x00, 0xdc, 0x66, 0x66, 0x7c, 0x60, 0xf0}, + {0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0x1e}, + {0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0xf0, 0x00}, + {0x00, 0x00, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x00}, + {0x10, 0x30, 0x7c, 0x30, 0x30, 0x34, 0x18, 0x00}, + {0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00}, + {0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00}, + {0x00, 0x00, 0xc6, 0xd6, 0xfe, 0xfe, 0x6c, 0x00}, + {0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00}, + {0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8}, + {0x00, 0x00, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x00}, + {0x1c, 0x30, 0x30, 0xe0, 0x30, 0x30, 0x1c, 0x00}, + {0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, + {0xe0, 0x30, 0x30, 0x1c, 0x30, 0x30, 0xe0, 0x00}, + {0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x00}, + {0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x18, 0x0c, 0x78}, + {0x00, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00}, + {0x1c, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00}, + {0x7e, 0xc3, 0x3c, 0x06, 0x3e, 0x66, 0x3f, 0x00}, + {0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00}, + {0xe0, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00}, + {0x30, 0x30, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00}, + {0x00, 0x00, 0x78, 0xc0, 0xc0, 0x78, 0x0c, 0x38}, + {0x7e, 0xc3, 0x3c, 0x66, 0x7e, 0x60, 0x3c, 0x00}, + {0xcc, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00}, + {0xe0, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00}, + {0xcc, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00}, + {0x7c, 0xc6, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00}, + {0xe0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00}, + {0xc6, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00}, + {0x30, 0x30, 0x00, 0x78, 0xcc, 0xfc, 0xcc, 0x00}, + {0x1c, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00}, + {0x00, 0x00, 0x7f, 0x0c, 0x7f, 0xcc, 0x7f, 0x00}, + {0x3e, 0x6c, 0xcc, 0xfe, 0xcc, 0xcc, 0xce, 0x00}, + {0x78, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00}, + {0x00, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00}, + {0x00, 0xe0, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00}, + {0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00}, + {0x00, 0xe0, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00}, + {0x00, 0xcc, 0x00, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8}, + {0xc3, 0x18, 0x3c, 0x66, 0x66, 0x3c, 0x18, 0x00}, + {0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00}, + {0x18, 0x18, 0x7e, 0xc0, 0xc0, 0x7e, 0x18, 0x18}, + {0x38, 0x6c, 0x64, 0xf0, 0x60, 0xe6, 0xfc, 0x00}, + {0xcc, 0xcc, 0x78, 0xfc, 0x30, 0xfc, 0x30, 0x30}, + {0xf8, 0xcc, 0xcc, 0xfa, 0xc6, 0xcf, 0xc6, 0xc7}, + {0x0e, 0x1b, 0x18, 0x3c, 0x18, 0x18, 0xd8, 0x70}, + {0x1c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00}, + {0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00}, + {0x00, 0x1c, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00}, + {0x00, 0x1c, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00}, + {0x00, 0xf8, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0x00}, + {0xfc, 0x00, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0x00}, + {0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00}, + {0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00}, + {0x30, 0x00, 0x30, 0x60, 0xc0, 0xcc, 0x78, 0x00}, + {0x00, 0x00, 0x00, 0xfc, 0xc0, 0xc0, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0xfc, 0x0c, 0x0c, 0x00, 0x00}, + {0xc3, 0xc6, 0xcc, 0xde, 0x33, 0x66, 0xcc, 0x0f}, + {0xc3, 0xc6, 0xcc, 0xdb, 0x37, 0x6f, 0xcf, 0x03}, + {0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00}, + {0x00, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x00, 0x00}, + {0x00, 0xcc, 0x66, 0x33, 0x66, 0xcc, 0x00, 0x00}, + {0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88}, + {0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa}, + {0xdb, 0x77, 0xdb, 0xee, 0xdb, 0x77, 0xdb, 0xee}, + {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, + {0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18}, + {0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18}, + {0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36}, + {0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36}, + {0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18}, + {0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36}, + {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}, + {0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36}, + {0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00}, + {0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00}, + {0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18}, + {0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00}, + {0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18}, + {0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18}, + {0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00}, + {0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18}, + {0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18}, + {0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36}, + {0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36}, + {0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36}, + {0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36}, + {0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00}, + {0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36}, + {0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00}, + {0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18}, + {0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36}, + {0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00}, + {0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18}, + {0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36}, + {0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36}, + {0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18}, + {0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff}, + {0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0}, + {0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f}, + {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x76, 0xdc, 0xc8, 0xdc, 0x76, 0x00}, + {0x00, 0x78, 0xcc, 0xf8, 0xcc, 0xf8, 0xc0, 0xc0}, + {0x00, 0xfc, 0xcc, 0xc0, 0xc0, 0xc0, 0xc0, 0x00}, + {0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00}, + {0xfc, 0xcc, 0x60, 0x30, 0x60, 0xcc, 0xfc, 0x00}, + {0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0x70, 0x00}, + {0x00, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0xc0}, + {0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x00}, + {0xfc, 0x30, 0x78, 0xcc, 0xcc, 0x78, 0x30, 0xfc}, + {0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x6c, 0x38, 0x00}, + {0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x6c, 0xee, 0x00}, + {0x1c, 0x30, 0x18, 0x7c, 0xcc, 0xcc, 0x78, 0x00}, + {0x00, 0x00, 0x7e, 0xdb, 0xdb, 0x7e, 0x00, 0x00}, + {0x06, 0x0c, 0x7e, 0xdb, 0xdb, 0x7e, 0x60, 0xc0}, + {0x38, 0x60, 0xc0, 0xf8, 0xc0, 0x60, 0x38, 0x00}, + {0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x00}, + {0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00}, + {0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0xfc, 0x00}, + {0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xfc, 0x00}, + {0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xfc, 0x00}, + {0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18}, + {0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0x70}, + {0x30, 0x30, 0x00, 0xfc, 0x00, 0x30, 0x30, 0x00}, + {0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00}, + {0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00}, + {0x0f, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x3c, 0x1c}, + {0x78, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00}, + {0x70, 0x18, 0x30, 0x60, 0x78, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + }, + { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x7e, 0x81, 0xa9, 0x8d, 0x8d, 0xa9, 0x81, 0x7e}, + {0x7e, 0xff, 0xd7, 0xf3, 0xf3, 0xd7, 0xff, 0x7e}, + {0x00, 0x70, 0xf8, 0xfc, 0x7e, 0xfc, 0xf8, 0x70}, + {0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10}, + {0x00, 0x18, 0x5d, 0xff, 0xff, 0xff, 0x5d, 0x18}, + {0x00, 0x08, 0x1d, 0x3f, 0xff, 0x3f, 0x1d, 0x08}, + {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00}, + {0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff}, + {0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00}, + {0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff}, + {0xf0, 0xe0, 0xfe, 0xbf, 0x11, 0x11, 0x1f, 0x0e}, + {0x00, 0x72, 0xfa, 0x8f, 0x8f, 0xfa, 0x72, 0x00}, + {0xe0, 0xe0, 0xa0, 0xa0, 0xfe, 0xff, 0x07, 0x03}, + {0xfc, 0xfe, 0xa6, 0xa0, 0xa0, 0xfe, 0xff, 0x03}, + {0x99, 0x5a, 0x3c, 0xe7, 0xe7, 0x3c, 0x5a, 0x99}, + {0x00, 0x10, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe}, + {0x00, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x10}, + {0x00, 0x24, 0x66, 0xff, 0xff, 0x66, 0x24, 0x00}, + {0x00, 0xfa, 0xfa, 0x00, 0x00, 0xfa, 0xfa, 0x00}, + {0xfe, 0xfe, 0x80, 0xfe, 0xfe, 0x90, 0xf0, 0x60}, + {0x40, 0xc0, 0x9a, 0xbf, 0xa5, 0xfd, 0x5b, 0x02}, + {0x00, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x00}, + {0x01, 0x29, 0x6d, 0xff, 0xff, 0x6d, 0x29, 0x01}, + {0x00, 0x20, 0x60, 0xfe, 0xfe, 0x60, 0x20, 0x00}, + {0x00, 0x08, 0x0c, 0xfe, 0xfe, 0x0c, 0x08, 0x00}, + {0x00, 0x10, 0x38, 0x7c, 0x54, 0x10, 0x10, 0x10}, + {0x00, 0x10, 0x10, 0x10, 0x54, 0x7c, 0x38, 0x10}, + {0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x3c, 0x3c}, + {0x10, 0x38, 0x7c, 0x10, 0x10, 0x7c, 0x38, 0x10}, + {0x0c, 0x1c, 0x3c, 0x7c, 0x7c, 0x3c, 0x1c, 0x0c}, + {0x60, 0x70, 0x78, 0x7c, 0x7c, 0x78, 0x70, 0x60}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x60, 0xfa, 0xfa, 0x60, 0x00}, + {0x00, 0x00, 0xe0, 0xe0, 0x00, 0xe0, 0xe0, 0x00}, + {0x00, 0x28, 0xfe, 0xfe, 0x28, 0xfe, 0xfe, 0x28}, + {0x00, 0x00, 0x48, 0x5c, 0xd6, 0xd6, 0x74, 0x24}, + {0x00, 0x46, 0x66, 0x30, 0x18, 0x0c, 0x66, 0x62}, + {0x00, 0x12, 0x5e, 0xec, 0xba, 0xf2, 0x5e, 0x0c}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0x20}, + {0x00, 0x00, 0x00, 0x82, 0xc6, 0x7c, 0x38, 0x00}, + {0x00, 0x00, 0x00, 0x38, 0x7c, 0xc6, 0x82, 0x00}, + {0x10, 0x54, 0x7c, 0x38, 0x38, 0x7c, 0x54, 0x10}, + {0x00, 0x00, 0x10, 0x10, 0x7c, 0x7c, 0x10, 0x10}, + {0x00, 0x00, 0x00, 0x00, 0x06, 0x07, 0x01, 0x00}, + {0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}, + {0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00}, + {0x00, 0x80, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06}, + {0x00, 0x7c, 0xfe, 0xb2, 0x9a, 0x8e, 0xfe, 0x7c}, + {0x00, 0x00, 0x02, 0x02, 0xfe, 0xfe, 0x42, 0x02}, + {0x00, 0x00, 0x66, 0xf6, 0x92, 0x9a, 0xce, 0x46}, + {0x00, 0x00, 0x6c, 0xfe, 0x92, 0x92, 0xc6, 0x44}, + {0x00, 0x0a, 0xfe, 0xfe, 0xca, 0x68, 0x38, 0x18}, + {0x00, 0x00, 0x9c, 0xbe, 0xa2, 0xa2, 0xe6, 0xe4}, + {0x00, 0x00, 0x0c, 0x9e, 0x92, 0xd2, 0x7e, 0x3c}, + {0x00, 0x00, 0xe0, 0xf0, 0x9e, 0x8e, 0xc0, 0xc0}, + {0x00, 0x00, 0x6c, 0xfe, 0x92, 0x92, 0xfe, 0x6c}, + {0x00, 0x00, 0x78, 0xfc, 0x96, 0x92, 0xf2, 0x60}, + {0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x66, 0x67, 0x01, 0x00}, + {0x00, 0x00, 0x00, 0x82, 0xc6, 0x6c, 0x38, 0x10}, + {0x00, 0x00, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24}, + {0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x82, 0x00}, + {0x00, 0x00, 0x60, 0xf0, 0x9a, 0x8a, 0xc0, 0x40}, + {0x00, 0x78, 0xf8, 0xba, 0xba, 0x82, 0xfe, 0x7c}, + {0x00, 0x00, 0x3e, 0x7e, 0xc8, 0xc8, 0x7e, 0x3e}, + {0x00, 0x6c, 0xfe, 0x92, 0x92, 0xfe, 0xfe, 0x82}, + {0x00, 0x44, 0xc6, 0x82, 0x82, 0xc6, 0x7c, 0x38}, + {0x00, 0x38, 0x7c, 0xc6, 0x82, 0xfe, 0xfe, 0x82}, + {0x00, 0xc6, 0x82, 0xba, 0x92, 0xfe, 0xfe, 0x82}, + {0x00, 0xc0, 0x80, 0xb8, 0x92, 0xfe, 0xfe, 0x82}, + {0x00, 0x4e, 0xce, 0x8a, 0x82, 0xc6, 0x7c, 0x38}, + {0x00, 0x00, 0xfe, 0xfe, 0x10, 0x10, 0xfe, 0xfe}, + {0x00, 0x00, 0x00, 0x82, 0xfe, 0xfe, 0x82, 0x00}, + {0x00, 0x80, 0xfc, 0xfe, 0x82, 0x02, 0x0e, 0x0c}, + {0x00, 0xc6, 0xee, 0x38, 0x10, 0xfe, 0xfe, 0x82}, + {0x00, 0x0e, 0x06, 0x02, 0x82, 0xfe, 0xfe, 0x82}, + {0x00, 0xfe, 0xfe, 0x70, 0x38, 0x70, 0xfe, 0xfe}, + {0x00, 0xfe, 0xfe, 0x18, 0x30, 0x60, 0xfe, 0xfe}, + {0x00, 0x38, 0x7c, 0xc6, 0x82, 0xc6, 0x7c, 0x38}, + {0x00, 0x60, 0xf0, 0x90, 0x92, 0xfe, 0xfe, 0x82}, + {0x00, 0x00, 0x7a, 0xfe, 0x8e, 0x84, 0xfc, 0x78}, + {0x00, 0x66, 0xfe, 0x98, 0x90, 0xfe, 0xfe, 0x82}, + {0x00, 0x00, 0x4c, 0xce, 0x9a, 0xb2, 0xf6, 0x64}, + {0x00, 0x00, 0xc0, 0x82, 0xfe, 0xfe, 0x82, 0xc0}, + {0x00, 0x00, 0xfe, 0xfe, 0x02, 0x02, 0xfe, 0xfe}, + {0x00, 0x00, 0xf8, 0xfc, 0x06, 0x06, 0xfc, 0xf8}, + {0x00, 0xfe, 0xfe, 0x0c, 0x18, 0x0c, 0xfe, 0xfe}, + {0x00, 0xc2, 0xe6, 0x3c, 0x18, 0x3c, 0xe6, 0xc2}, + {0x00, 0x00, 0xe0, 0xf2, 0x1e, 0x1e, 0xf2, 0xe0}, + {0x00, 0xce, 0xe6, 0xb2, 0x9a, 0x8e, 0xc6, 0xe2}, + {0x00, 0x00, 0x00, 0x82, 0x82, 0xfe, 0xfe, 0x00}, + {0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80}, + {0x00, 0x00, 0x00, 0xfe, 0xfe, 0x82, 0x82, 0x00}, + {0x00, 0x10, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x10}, + {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, + {0x00, 0x00, 0x00, 0x20, 0xe0, 0xc0, 0x00, 0x00}, + {0x00, 0x02, 0x1e, 0x3c, 0x2a, 0x2a, 0x2e, 0x04}, + {0x00, 0x0c, 0x1e, 0x12, 0x12, 0xfc, 0xfe, 0x82}, + {0x00, 0x00, 0x14, 0x36, 0x22, 0x22, 0x3e, 0x1c}, + {0x00, 0x02, 0xfe, 0xfc, 0x92, 0x12, 0x1e, 0x0c}, + {0x00, 0x00, 0x18, 0x3a, 0x2a, 0x2a, 0x3e, 0x1c}, + {0x00, 0x00, 0x40, 0xc0, 0x92, 0xfe, 0x7e, 0x12}, + {0x00, 0x20, 0x3e, 0x1f, 0x25, 0x25, 0x3d, 0x19}, + {0x00, 0x1e, 0x3e, 0x20, 0x10, 0xfe, 0xfe, 0x82}, + {0x00, 0x00, 0x00, 0x02, 0xbe, 0xbe, 0x22, 0x00}, + {0x00, 0x00, 0xbe, 0xbf, 0x01, 0x01, 0x07, 0x06}, + {0x00, 0x22, 0x36, 0x1c, 0x08, 0xfe, 0xfe, 0x82}, + {0x00, 0x00, 0x00, 0x02, 0xfe, 0xfe, 0x82, 0x00}, + {0x00, 0x1e, 0x3e, 0x38, 0x1c, 0x18, 0x3e, 0x3e}, + {0x00, 0x00, 0x1e, 0x3e, 0x20, 0x20, 0x3e, 0x3e}, + {0x00, 0x00, 0x1c, 0x3e, 0x22, 0x22, 0x3e, 0x1c}, + {0x00, 0x18, 0x3c, 0x24, 0x25, 0x1f, 0x3f, 0x21}, + {0x00, 0x21, 0x3f, 0x1f, 0x25, 0x24, 0x3c, 0x18}, + {0x00, 0x18, 0x38, 0x20, 0x32, 0x1e, 0x3e, 0x22}, + {0x00, 0x00, 0x24, 0x2e, 0x2a, 0x2a, 0x3a, 0x12}, + {0x00, 0x00, 0x24, 0x22, 0xfe, 0x7c, 0x20, 0x00}, + {0x00, 0x02, 0x3e, 0x3c, 0x02, 0x02, 0x3e, 0x3c}, + {0x00, 0x00, 0x38, 0x3c, 0x06, 0x06, 0x3c, 0x38}, + {0x00, 0x3c, 0x3e, 0x0e, 0x1c, 0x0e, 0x3e, 0x3c}, + {0x00, 0x22, 0x36, 0x1c, 0x08, 0x1c, 0x36, 0x22}, + {0x00, 0x00, 0x3e, 0x3f, 0x05, 0x05, 0x3d, 0x39}, + {0x00, 0x00, 0x26, 0x32, 0x3a, 0x2e, 0x26, 0x32}, + {0x00, 0x00, 0x82, 0x82, 0xee, 0x7c, 0x10, 0x10}, + {0x00, 0x00, 0x00, 0xee, 0xee, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x10, 0x10, 0x7c, 0xee, 0x82, 0x82}, + {0x00, 0x80, 0xc0, 0x40, 0xc0, 0x80, 0xc0, 0x40}, + {0x00, 0x0e, 0x1e, 0x32, 0x62, 0x32, 0x1e, 0x0e}, + {0x00, 0x00, 0x52, 0xdf, 0x8d, 0x89, 0xf9, 0x70}, + {0x00, 0x02, 0x5e, 0x5e, 0x02, 0x02, 0x5e, 0x5c}, + {0x00, 0x00, 0x98, 0xba, 0xaa, 0x2a, 0x3e, 0x1c}, + {0x42, 0xde, 0xbe, 0xaa, 0xaa, 0xae, 0xc4, 0x40}, + {0x00, 0x02, 0x9e, 0xbe, 0x2a, 0x2a, 0xae, 0x84}, + {0x00, 0x02, 0x1e, 0x3e, 0x2a, 0xaa, 0xae, 0x84}, + {0x00, 0x02, 0x1e, 0x3e, 0xea, 0xea, 0x2e, 0x04}, + {0x00, 0x00, 0x02, 0x27, 0x25, 0x25, 0x3c, 0x18}, + {0x40, 0xd8, 0xba, 0xaa, 0xaa, 0xbe, 0xdc, 0x40}, + {0x00, 0x00, 0x98, 0xba, 0x2a, 0x2a, 0xbe, 0x9c}, + {0x00, 0x00, 0x18, 0x3a, 0x2a, 0xaa, 0xbe, 0x9c}, + {0x00, 0x00, 0x80, 0x82, 0x3e, 0x3e, 0xa2, 0x80}, + {0x00, 0x40, 0xc2, 0xbe, 0xbe, 0xa2, 0xc0, 0x40}, + {0x00, 0x00, 0x00, 0x02, 0x3e, 0xbe, 0xa2, 0x80}, + {0x00, 0x9e, 0xbe, 0x68, 0x48, 0x68, 0xbe, 0x9e}, + {0x00, 0x00, 0x0e, 0x1e, 0xd4, 0xd4, 0x1e, 0x0e}, + {0x00, 0x00, 0xa2, 0xaa, 0xaa, 0x3e, 0x3e, 0x22}, + {0x2a, 0x2a, 0x3e, 0x3e, 0x2a, 0x2a, 0x2e, 0x04}, + {0x00, 0x92, 0xfe, 0xfe, 0x90, 0xd0, 0x7e, 0x3e}, + {0x00, 0x00, 0x4c, 0xde, 0x92, 0x92, 0xde, 0x4c}, + {0x00, 0x00, 0x4c, 0x5e, 0x12, 0x12, 0x5e, 0x4c}, + {0x00, 0x00, 0x0c, 0x1e, 0x12, 0x52, 0x5e, 0x4c}, + {0x00, 0x02, 0x5e, 0xde, 0x82, 0x82, 0xde, 0x5c}, + {0x00, 0x02, 0x1e, 0x1e, 0x02, 0x42, 0x5e, 0x5c}, + {0x00, 0x00, 0x5e, 0x5f, 0x05, 0x05, 0x5d, 0x59}, + {0x80, 0x98, 0x3c, 0x66, 0x66, 0x3c, 0x98, 0x80}, + {0x00, 0x00, 0xbc, 0xbe, 0x02, 0x02, 0xbe, 0xbc}, + {0x00, 0x24, 0x24, 0xe7, 0xe7, 0x24, 0x3c, 0x18}, + {0x00, 0x04, 0x66, 0xc2, 0x92, 0xfe, 0x7e, 0x16}, + {0x00, 0x00, 0xd4, 0xf4, 0x3f, 0x3f, 0xf4, 0xd4}, + {0x05, 0x1f, 0x6f, 0xf4, 0x90, 0x90, 0xff, 0xff}, + {0x40, 0xc0, 0x90, 0xfe, 0x7f, 0x11, 0x03, 0x02}, + {0x00, 0x02, 0x9e, 0xbe, 0xaa, 0x2a, 0x2e, 0x04}, + {0x00, 0x00, 0x00, 0x82, 0xbe, 0xbe, 0x22, 0x00}, + {0x00, 0x00, 0x4c, 0x5e, 0x52, 0x12, 0x1e, 0x0c}, + {0x00, 0x02, 0x5e, 0x5e, 0x42, 0x02, 0x1e, 0x1c}, + {0x00, 0x00, 0x0e, 0x5e, 0x50, 0x50, 0x5e, 0x5e}, + {0x00, 0x00, 0xbe, 0xbe, 0x8c, 0x98, 0xbe, 0xbe}, + {0x00, 0x14, 0xf4, 0xf4, 0x94, 0xf4, 0x64, 0x00}, + {0x00, 0x00, 0x64, 0xf4, 0x94, 0xf4, 0x64, 0x00}, + {0x00, 0x00, 0x04, 0x06, 0xa2, 0xb2, 0x1e, 0x0c}, + {0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x1c, 0x1c}, + {0x00, 0x00, 0x1c, 0x1c, 0x10, 0x10, 0x10, 0x10}, + {0x89, 0xdd, 0x77, 0x33, 0x18, 0x0c, 0xf6, 0xf2}, + {0x9f, 0xdf, 0x6e, 0x36, 0x18, 0x0c, 0xf6, 0xf2}, + {0x00, 0x00, 0x00, 0xde, 0xde, 0x00, 0x00, 0x00}, + {0x44, 0x6c, 0x38, 0x10, 0x44, 0x6c, 0x38, 0x10}, + {0x10, 0x38, 0x6c, 0x44, 0x10, 0x38, 0x6c, 0x44}, + {0x00, 0xaa, 0x00, 0x55, 0x00, 0xaa, 0x00, 0x55}, + {0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55}, + {0xee, 0xff, 0x55, 0xbb, 0xee, 0x55, 0xff, 0xbb}, + {0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0xff, 0xff, 0x08, 0x08, 0x08}, + {0x00, 0x00, 0x00, 0xff, 0xff, 0x28, 0x28, 0x28}, + {0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x08, 0x08}, + {0x00, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x08, 0x08}, + {0x00, 0x00, 0x00, 0x3f, 0x3f, 0x28, 0x28, 0x28}, + {0x00, 0xff, 0xff, 0x00, 0xef, 0xef, 0x28, 0x28}, + {0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00}, + {0x00, 0x3f, 0x3f, 0x20, 0x2f, 0x2f, 0x28, 0x28}, + {0x00, 0xf8, 0xf8, 0x08, 0xe8, 0xe8, 0x28, 0x28}, + {0x00, 0xf8, 0xf8, 0x08, 0xf8, 0xf8, 0x08, 0x08}, + {0x00, 0x00, 0x00, 0xf8, 0xf8, 0x28, 0x28, 0x28}, + {0x00, 0x00, 0x00, 0x0f, 0x0f, 0x08, 0x08, 0x08}, + {0x08, 0x08, 0x08, 0xf8, 0xf8, 0x00, 0x00, 0x00}, + {0x08, 0x08, 0x08, 0xf8, 0xf8, 0x08, 0x08, 0x08}, + {0x08, 0x08, 0x08, 0x0f, 0x0f, 0x08, 0x08, 0x08}, + {0x08, 0x08, 0x08, 0xff, 0xff, 0x00, 0x00, 0x00}, + {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, + {0x08, 0x08, 0x08, 0xff, 0xff, 0x08, 0x08, 0x08}, + {0x28, 0x28, 0x28, 0xff, 0xff, 0x00, 0x00, 0x00}, + {0x08, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00}, + {0x28, 0xe8, 0xe8, 0x08, 0xf8, 0xf8, 0x00, 0x00}, + {0x28, 0x2f, 0x2f, 0x20, 0x3f, 0x3f, 0x00, 0x00}, + {0x28, 0xe8, 0xe8, 0x08, 0xe8, 0xe8, 0x28, 0x28}, + {0x28, 0x2f, 0x2f, 0x20, 0x2f, 0x2f, 0x28, 0x28}, + {0x28, 0xef, 0xef, 0x00, 0xff, 0xff, 0x00, 0x00}, + {0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28}, + {0x28, 0xef, 0xef, 0x00, 0xef, 0xef, 0x28, 0x28}, + {0x28, 0x28, 0x28, 0xe8, 0xe8, 0x28, 0x28, 0x28}, + {0x08, 0xf8, 0xf8, 0x08, 0xf8, 0xf8, 0x08, 0x08}, + {0x28, 0x28, 0x28, 0x2f, 0x2f, 0x28, 0x28, 0x28}, + {0x08, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x08, 0x08}, + {0x08, 0xf8, 0xf8, 0x08, 0xf8, 0xf8, 0x00, 0x00}, + {0x28, 0x28, 0x28, 0xf8, 0xf8, 0x00, 0x00, 0x00}, + {0x28, 0x28, 0x28, 0x3f, 0x3f, 0x00, 0x00, 0x00}, + {0x08, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x00, 0x00}, + {0x08, 0xff, 0xff, 0x08, 0xff, 0xff, 0x08, 0x08}, + {0x28, 0x28, 0x28, 0xff, 0xff, 0x28, 0x28, 0x28}, + {0x00, 0x00, 0x00, 0xf8, 0xf8, 0x08, 0x08, 0x08}, + {0x08, 0x08, 0x08, 0x0f, 0x0f, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f}, + {0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}, + {0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0}, + {0x00, 0x22, 0x36, 0x1c, 0x36, 0x22, 0x3e, 0x1c}, + {0x00, 0x00, 0x28, 0x7c, 0x54, 0x54, 0x7f, 0x3f}, + {0x00, 0x00, 0x60, 0x60, 0x40, 0x40, 0x7e, 0x7e}, + {0x00, 0x40, 0x7e, 0x7e, 0x40, 0x7e, 0x7e, 0x40}, + {0x00, 0x00, 0xc6, 0xc6, 0x92, 0xba, 0xee, 0xc6}, + {0x00, 0x20, 0x20, 0x3c, 0x3e, 0x22, 0x3e, 0x1c}, + {0x00, 0x78, 0x7c, 0x04, 0x04, 0x7e, 0x7f, 0x01}, + {0x00, 0x40, 0x60, 0x3e, 0x7e, 0x40, 0x60, 0x20}, + {0x00, 0x00, 0x99, 0xbd, 0xe7, 0xe7, 0xbd, 0x99}, + {0x00, 0x38, 0x7c, 0xd6, 0x92, 0xd6, 0x7c, 0x38}, + {0x00, 0x32, 0x7e, 0xce, 0x80, 0xce, 0x7e, 0x32}, + {0x00, 0x00, 0x9c, 0xbe, 0xf2, 0x52, 0x1e, 0x0c}, + {0x18, 0x3c, 0x24, 0x3c, 0x3c, 0x24, 0x3c, 0x18}, + {0x18, 0xbc, 0xe4, 0x7c, 0x3c, 0x26, 0x3f, 0x19}, + {0x00, 0x00, 0x00, 0x92, 0x92, 0xd6, 0x7c, 0x38}, + {0x00, 0x00, 0x7e, 0xfe, 0x80, 0x80, 0xfe, 0x7e}, + {0x00, 0x00, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54}, + {0x00, 0x00, 0x22, 0x22, 0xfa, 0xfa, 0x22, 0x22}, + {0x00, 0x00, 0x02, 0x22, 0x72, 0xda, 0x8a, 0x02}, + {0x00, 0x00, 0x02, 0x8a, 0xda, 0x72, 0x22, 0x02}, + {0x60, 0xe0, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x07, 0x06}, + {0x00, 0x00, 0x10, 0x10, 0xd6, 0xd6, 0x10, 0x10}, + {0x00, 0x48, 0x6c, 0x24, 0x6c, 0x48, 0x6c, 0x24}, + {0x00, 0x00, 0x60, 0xf0, 0x90, 0xf0, 0x60, 0x00}, + {0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00}, + {0x80, 0x80, 0xff, 0xff, 0x03, 0x0e, 0x0c, 0x08}, + {0x00, 0x00, 0x78, 0xf8, 0x80, 0xf8, 0xf8, 0x00}, + {0x00, 0x00, 0x00, 0x48, 0xe8, 0xb8, 0x98, 0x00}, + {0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + } +}; + +BOOLEAN +CSynthesizer:: +Initialize() +/*++ + +Routine Description: + + Class initialization. + + Set the buffer the synthesizer generates images to. + Override to do any additional processing you think is needed. + +Arguments: + + none + +Return Value: + + TRUE - success. + +--*/ +{ + PAGED_CODE(); + + // Capture the working palette. + // Recast it to a point to an array of primaries. + if( !(m_Colors = GetPalette()) ) + { + return FALSE; + } + + // Clear the globals. This occurs redundantly, but hey ... + // ... test output doesn't make sense if we don't do this. + m_RelPts=0; + m_QpcTime=0; + m_Frame=0; + + // + // Allocate a scratch buffer for the synthesizer. + // + NT_ASSERT(m_Length); + if( !m_Length ) + { + return FALSE; + } + + m_Buffer = new (PagedPool) UCHAR[m_Length]; + NT_ASSERT(m_Buffer); + if( !m_Buffer ) + { + return FALSE; + } + + // + // Allocate a scratch buffer for the Gradient. + // + m_GradientBmp = new (PagedPool) CKsRgbQuad[m_Width * MAX_COLOR]; + NT_ASSERT(m_GradientBmp); + if( !m_GradientBmp ) + { + SAFE_DELETE_ARRAY( m_Buffer ); + return FALSE; + } + + return TRUE; +} + +LONGLONG +ConvertPerfTime( + _In_ LONGLONG Freq, + _In_ LONGLONG Time +) +{ + PAGED_CODE(); + + LARGE_INTEGER tL ; + tL.QuadPart = Time; + return KSCONVERT_PERFORMANCE_TIME( Freq, tL ); +} + +void +CSynthesizer:: +Destroy() +/*++ + +Routine Description: + + Clean up from initialize. + + Note: A good place to generate synthesis stats. + +Arguments: + + none + +Return Value: + + void. + +--*/ +{ + PAGED_CODE(); + + SAFE_DELETE_ARRAY( m_Buffer ); + SAFE_DELETE_ARRAY( m_GradientBmp ); + + // Report rendering times. + DBG_TRACE( "Synthesis Time - Total = %lld", ConvertPerfTime( m_Frequency.QuadPart, m_SynthesisTime ) ); + DBG_TRACE( " Count = %d", m_SynthesisCount ); + DBG_TRACE( " Avg = %lld", ConvertPerfTime( m_Frequency.QuadPart, m_SynthesisCount ? m_SynthesisTime / m_SynthesisCount : 0 ) ); + DBG_TRACE( " Commit Time - Total = %lld", ConvertPerfTime( m_Frequency.QuadPart, m_CommitTime ) ); + DBG_TRACE( " Count = %d", m_CommitCount ); + DBG_TRACE( " Avg = %lld", ConvertPerfTime( m_Frequency.QuadPart, m_CommitCount ? m_CommitTime / m_CommitCount : 0 ) ); +} + +NTSTATUS +CSynthesizer:: +SynthesizeBars() +/*++ + +Routine Description: + + Synthesize EIA-189-A standard color bars onto the Image. The image + in question is the current synthesis buffer. + +Arguments: + + None + +Return Value: + + success / failure + +--*/ +{ + PAGED_CODE(); + + if( !m_Buffer ) + { + return STATUS_INVALID_DEVICE_STATE; + } + + const COLOR *CurColor = m_ColorBars; + ULONG ColorCount = SIZEOF_ARRAY (m_ColorBars); + + // + // Set the default cursor... + // + GetImageLocation (0, 0); + + // + // Synthesize a single line. + // + PUCHAR ImageStart = m_Cursor; + for (ULONG x = 0; x < m_Width; x++) + { + PutPixel (m_ColorBars [((x * ColorCount) / m_Width)]); + } + + PUCHAR ImageEnd = m_Cursor; + + // + // Copy the synthesized line to all subsequent lines. + // + for (ULONG line = 0; line < m_Height; line++) + { + GetImageLocation (0, line); + + RtlCopyMemory ( + m_Cursor, + ImageStart, + ImageEnd - ImageStart + ); + } + + // Paint the top left and top right registrations boxes. + GetImageLocation(0,0); + + ImageStart = m_Cursor; + for(ULONG x =0; x < m_Width; x++) + { + if(x < (m_Height/16)) + { + PutPixel(g_TopLeft); + } + else if(x > (m_Width - (m_Height / 16))) + { + PutPixel(g_TopRight); + } + else + { + PutPixel (m_ColorBars [((x * ColorCount) / m_Width)]); + } + } + + ImageEnd = m_Cursor; + + for (ULONG line = 0; line < m_Height/16; line++) + { + GetImageLocation (0, line); + + RtlCopyMemory ( + m_Cursor, + ImageStart, + ImageEnd - ImageStart + ); + } + + // Paint the bottom left and bottom right registrations boxes. + GetImageLocation(0, (15*m_Height) / 16); + ImageStart = m_Cursor; + for(ULONG x =0; x < m_Width; x++) + { + if(x < (m_Height/16)) + { + PutPixel(g_BotLeft); + } + else if(x > (m_Width - (m_Height / 16))) + { + PutPixel(g_BotRight); + } + else + { + PutPixel (m_ColorBars [((x * ColorCount) / m_Width)]); + } + } + + ImageEnd = m_Cursor; + + for (ULONG line = 0; line < m_Height/16; line++) + { + GetImageLocation (0, line+(15*m_Height) / 16); + + RtlCopyMemory ( + m_Cursor, + ImageStart, + ImageEnd - ImageStart + ); + } + + return STATUS_SUCCESS; +} + +void +CSynthesizer:: +EncodeNumber( + _In_ ULONG LocY, + _In_ UINT32 Number, + _In_ COLOR LowColor, + _In_ COLOR HighColor +) +/* +Routine Description: + + Overlays an encoded number over the synthesized image. The image buffer + used is the set synthesis buffer. The pattern is scaled to fit the image. + +Arguments: + + LocY - + The row on the image to begin the overlay. This must + be inside the image. + + Number - + The number to encode + + LowColor - + The color to represent 0 (a clear bit) + + HighColor - + The color to represent 1 (a set bit) + +Return Value: + + void + +*/ +{ + PAGED_CODE(); + + if( !m_Buffer ) + { + return; + } + + NT_ASSERT(LocY <= m_Height); + + GetImageLocation(0, LocY); + UINT32 mask = 0x1; + + PUCHAR ImageStart = m_Cursor; + for(ULONG i = 0; i < 32; i++) + { + for(ULONG j = 0; j < m_Width/32; j++) + { + if(Number & mask) + { + PutPixel(HighColor); + } + else + { + PutPixel(LowColor); + } + } + mask = mask << 1; + } + PUCHAR ImageEnd = m_Cursor; + + // + // Copy the synthesized line to all subsequent lines. + // + for (ULONG line = 1; line < m_Height/16; line++) + { + RtlCopyMemory ( + GetImageLocation (0, line + LocY), + ImageStart, + ImageEnd - ImageStart + ); + } +} + +void +CSynthesizer:: +OverlayText ( + _In_ ULONG LocX, + _In_ ULONG LocY, + _In_ ULONG Scaling, + _In_ LPSTR Text, + _In_ COLOR BgColor, + _In_ COLOR FgColor +) +/*++ + +Routine Description: + + Overlay text onto the synthesized image. Clip to fit the image + if the overlay does not fit. The image buffer used is the set + synthesis buffer. + +Arguments: + + LocX - + The X location on the image to begin the overlay. This MUST + be inside the image or no text will be rendered. + POSITION_CENTER may be used to indicate horizontal centering. + + LocY - + The Y location on the image to begin the overlay. This MUST + be inside the image or no text will be rendered. + POSITION_CENTER may be used to indicate vertical centering. + + Scaling - + Normally, the overlay is done in an 8x8 font. A scaling of + 2 indicates 16x16, 3 indicates 24x24 and so forth. + + Text - + A null terminated character string containing the information to + overlay + + BgColor - + The background color of the overlay window. For transparency, + indicate TRANSPARENT here. + + FgColor - + The foreground color for the text overlay. + +Return Value: + + None + +--*/ + +{ + PAGED_CODE(); + + // Validate internal state. + if( !m_Buffer ) + { + return; + } + + NT_ASSERT( (LocX <= m_Width || LocX == POSITION_CENTER) && + (LocY <= m_Height || LocY == POSITION_CENTER) && + Text !=nullptr && + (BgColor < MAX_COLOR || BgColor == TRANSPARENT) && + (FgColor < MAX_COLOR || FgColor == TRANSPARENT) + ); + + // Validate parameters. + if( !( (LocX <= m_Width || LocX == POSITION_CENTER) && + (LocY <= m_Height || LocY == POSITION_CENTER) && + Text !=nullptr && + (BgColor < MAX_COLOR || BgColor == TRANSPARENT) && + (FgColor < MAX_COLOR || FgColor == TRANSPARENT) ) ) + { + return; + } + + size_t StrLen = 0; + PUCHAR CurChar; + + // + // Determine the character length of the string. + // + if( !NT_SUCCESS( RtlStringCchLengthA( Text, m_Width, &StrLen ) ) ) + { + // Invalid parameter. + return; + } + + // + // Determine the physical size of the string plus border. There is + // a definable NO_CHARACTER_SEPARATION. If this is defined, there will + // be no added space between font characters. Otherwise, one empty pixel + // column is added between characters. + // +#ifndef NO_CHARACTER_SEPARATION + ULONG LenX = (ULONG) ((StrLen * (((size_t)Scaling) << 3)) + 1 + StrLen); +#else // NO_CHARACTER_SEPARATION + ULONG LenX = (ULONG) ((StrLen * (((size_t_)Scaling) << 3)) + 2); +#endif // NO_CHARACTER_SEPARATION + + ULONG LenY = 2 + (Scaling << 3); + + // + // Adjust for center overlays. + // + // NOTE: If the overlay doesn't fit into the synthesis buffer, this + // merely left aligns the overlay and clips off the right side. + // + if (LocX == POSITION_CENTER) + { + //LocX = min( 0, ((LONG)m_Width - (LONG)LenX) >> 1); + if (LenX >= m_Width) + { + LocX = 0; + } + else + { + LocX = (m_Width - LenX) >> 1; + } + } + + if (LocY == POSITION_CENTER) + { + //LocY = min( 0, ((LONG)m_Width - (LONG)LenY) >> 1); + if (LenY >= m_Height) + { + LocY = 0; + } + else + { + LocY = (m_Height - LenY) >> 1; + } + } + + // + // Determine the amount of space available on the synthesis buffer. + // We will clip anything that finds itself outside the synthesis buffer. + // + ULONG SpaceX = m_Width - LocX; + ULONG SpaceY = m_Height - LocY; + + // + // Set the default cursor position. + // + GetImageLocation (LocX, LocY); + + // + // Overlay a background color row. + // + if( SpaceY ) + { + if( BgColor != TRANSPARENT ) + { + for (ULONG x = 0; x < LenX && x < SpaceX; x++) + { + PutPixel (BgColor); + } + } + SpaceY--; + } + LocY++; + + // + // Loop across each row of the image. + // + for (ULONG row = 0; row < 8 && SpaceY; row++) + { + // + // Generate a line. + // + GetImageLocation (LocX, LocY++); + + PUCHAR ImageStart = m_Cursor; + + ULONG CurSpaceX = SpaceX; + if (CurSpaceX) + { + PutPixel (BgColor); + CurSpaceX--; + } + + // + // Generate the row'th row of the overlay. + // + CurChar = (PUCHAR) Text; + while( *CurChar ) + { + UCHAR CharBase = m_FontData [m_Rotation==AcpiPldRotation90][*CurChar++][row]; + for (ULONG mask = 0x80; mask && CurSpaceX; mask >>= 1) + { + for (ULONG scale = 0; scale < Scaling && CurSpaceX; scale++) + { + if (CharBase & mask) + { + PutPixel (FgColor); + } + else + { + PutPixel (BgColor); + } + CurSpaceX--; + } + } + + // + // Separate each character by one space. Account for the border + // space at the end by placing the separator after the last + // character also. + // +#ifndef NO_CHARACTER_SEPARATION + if (CurSpaceX) + { + PutPixel (BgColor); + CurSpaceX--; + } +#endif // NO_CHARACTER_SEPARATION + } + + // + // If there is no separation character defined, account for the + // border. + // +#ifdef NO_CHARACTER_SEPARATION + if (CurSpaceX) + { + PutPixel (BgColor); + CurSpaceX--; + } +#endif // NO_CHARACTER_SEPARATION + + + PUCHAR ImageEnd = m_Cursor; + // + // Copy the line downward scale times. + // + for (ULONG scale = 1; scale < Scaling && SpaceY; scale++) + { + GetImageLocation (LocX, LocY++); + RtlCopyMemory (m_Cursor, ImageStart, ImageEnd - ImageStart); + SpaceY--; + } + } + + // + // Add the bottom section of the overlay. + // + GetImageLocation (LocX, LocY); + if (BgColor != TRANSPARENT && SpaceY) + { + for (ULONG x = 0; x < LenX && x < SpaceX; x++) + { + PutPixel (BgColor); + } + } +} + +void +CSynthesizer::ApplyGradient( + _In_ ULONG LocY, + _In_ COLOR Gradient +) +/*++ + +Routine Description: + + Synthesize a horizontal gradient bar from a given color + +Arguments: + + LocY - + row + + Gradient - + A starting color + +Return Value: + + void + +--*/ +{ + PAGED_CODE(); + + if( !m_Buffer ) + { + return; + } + + NT_ASSERT(LocY <= m_Height); + + PUCHAR Image = GetImageLocation(0, LocY); + PUCHAR RowBmp = reinterpret_cast<PUCHAR>(&m_GradientBmp[Gradient*m_Width]); + ULONG Stride = m_Width * sizeof(CKsRgbQuad); + + // + // Copy the synthesized line to all lines. + // + for (ULONG line = 0; line < m_Height/16; line++) + { + RtlCopyMemory ( + Image, + RowBmp, + Stride + ); + Image += Stride; + } +} + +// +// Synthesize +// +// Fill the image buffer with some base image. All h/w simulations will +// call this function to generate a base image - even for jpeg. +// +NTSTATUS +CSynthesizer:: +Synthesize() +/*++ + +Routine Description: + + Fill the image buffer with some base image. All h/w simulations will + call this function to generate a base image. + +Arguments: + + None + +Return Value: + + Success / failure + +--*/ +{ + PAGED_CODE(); + + if( !m_Buffer ) + { + return STATUS_INVALID_DEVICE_STATE; + } + + // + // Generate a "time stamp" just to overlay it onto the capture image. + // It makes it more exciting than bars that do nothing. + // + SynthesizeBars(); + + ApplyGradient( (m_Height)/16, RED); + ApplyGradient( (2*m_Height)/16, GREEN); + ApplyGradient( (3*m_Height)/16, BLUE); + ApplyGradient( (4*m_Height)/16, WHITE); + + EncodeNumber((5*m_Height)/16, (UINT32)m_Frame, BLACK, WHITE); + EncodeNumber((6*m_Height)/16, (UINT32)(m_QpcTime), BLACK, WHITE); + + CHAR Text [256]; + RtlStringCbPrintfA(Text, sizeof(Text), "Frame: %ld", m_Frame); + + // + // Overlay the frame # onto the scratch space image. + // + OverlayText ( + POSITION_CENTER, + (m_Height - 28), + 1, + Text, + BLACK, + TEXT_COLOR + ); + + // + // Add a description of the frame type/width/height. + // + RtlStringCbPrintfA(Text, sizeof(Text), "%s (%dx%d)", m_FormatName, m_Width, m_Height); + OverlayText ( + 0, + (m_Height - 28), + 1, + Text, + TRANSPARENT, + TEXT_COLOR + ); + + // + // Add a description of the mounting. + // + RtlStringCbPrintfA(Text, sizeof(Text), "%d\370 Mounting", DbgRotation2Degrees(m_Rotation)); + size_t len = 0; + RtlStringCchLengthA(Text, sizeof(Text), &len); + OverlayText ( + (m_Width - (((ULONG)len*8))), // right-adjust text. + (m_Height - 28), + 1, + Text, + TRANSPARENT, + TEXT_COLOR + ); + + return STATUS_SUCCESS; +} + +void +CSynthesizer::PutPixel ( + COLOR Color +) +/*++ + +Routine Description: + + Place a pixel at the default cursor location. The cursor location + must be set via GetImageLocation(x, y). + +Arguments: + + Color - + The pixel color to render + +Return Value: + + void + +--*/ +{ + PAGED_CODE(); + + PKS_RGBQUAD &pPixel = (PKS_RGBQUAD &) m_Cursor; + + if (Color != TRANSPARENT) + { + *pPixel = CKsRgbQuad( m_Colors[Color][2], m_Colors[Color][1], m_Colors[Color][0] ); + } + + // Next pixel + pPixel++; +} + +// +// PutPixel(): +// +// Place a pixel at the default cursor location. The cursor location +// must be set via GetImageLocation(x, y). +// +void +CSynthesizer::PutPixel ( + UCHAR colorR, + UCHAR colorB, + UCHAR colorG +) +/*++ + +Routine Description: + + Place a pixel at the default cursor location. The cursor location + must be set via GetImageLocation(x, y). + + TODO: Remove. This function appears to be dead code. + +Arguments: + + colorR - + The first color primary of the pixel. + + colorB - + The third color primary of the pixel. + + colorG - + The second color primary of the pixel. + + +Return Value: + + void + +--*/ +{ + PAGED_CODE(); + + PKS_RGBQUAD &pPixel = (PKS_RGBQUAD &) m_Cursor; + + *pPixel++ = CKsRgbQuad( colorR, colorG, colorB ); +} + + +// +// Synthesize +// +// Fill the image buffer with some base image. All h/w simulations will +// call this function to generate a base image - even for jpeg. +// +NTSTATUS +CSynthesizer:: +DoSynthesize() +{ + PAGED_CODE(); + + LARGE_INTEGER StartTime = {0}; + LARGE_INTEGER EndTime = {0}; + + StartTime = KeQueryPerformanceCounter(NULL); + + NTSTATUS Status = Synthesize(); + + m_SynthesisTime += KeQueryPerformanceCounter(NULL).QuadPart - StartTime.QuadPart; + m_SynthesisCount++; + + return Status; +} + +// +// Commit +// +// Copy (and reformat, if necessary) pixels from the internal scratch +// buffer. If the output format decimates chrominance, do it here. +// +_Success_(return > 0) +ULONG +CSynthesizer:: +DoCommit( + _Out_writes_bytes_(Size) + PUCHAR Buffer, + _In_ ULONG Size, + _In_ ULONG Stride +) +{ + PAGED_CODE(); + + LARGE_INTEGER StartTime = KeQueryPerformanceCounter(NULL); + + ULONG n = Commit( Buffer, Size, Stride ); + + m_CommitTime += KeQueryPerformanceCounter(NULL).QuadPart - StartTime.QuadPart; + m_CommitCount++; + + return n; +} + +// +// DoCommit +// +// Note: The stride needs to be a function of the bits per pixel of the +// OUTPUT format - not the format we store it in. The class ctor +// must initialize m_OutputStride to a default stride value. +// +_Success_(return > 0) +ULONG +CSynthesizer:: +DoCommit( + _Out_writes_bytes_(Size) + PUCHAR Buffer, + _In_ ULONG Size +) +{ + PAGED_CODE(); + + LARGE_INTEGER StartTime = KeQueryPerformanceCounter(NULL); + + ULONG n = Commit( Buffer, Size ); + + m_CommitTime += KeQueryPerformanceCounter(NULL).QuadPart - StartTime.QuadPart; + m_CommitCount++; + + return n; +} + +#define CLEAR_HISTOGRAM( H ) \ + if( H ) \ + { \ + RtlZeroMemory( H, 256*sizeof(*H) ); \ + } + +#define BUMP_HISTOGRAM_PRIMARY( H, C ) \ + if( H ) \ + { \ + H[C]++; \ + } + +// +// Histogram +// +// Fill an array with histogram data. +// +void +CSynthesizer:: +Histogram( + _Out_writes_opt_(256) + PULONG HistogramP0, // rgbRed + _Out_writes_opt_(256) + PULONG HistogramP1, // rgbGreen + _Out_writes_opt_(256) + PULONG HistogramP2 // rgbBlue +) +/*++ + +Routine Description: + + Fill array(s) with histogram data. + +Arguments: + + HistogramP0 - + Stats on the first primary. + + HistogramP1 - + Stats on the second primary. + + HistogramP2 - + Stats on the third primary. + +Return Value: + + void + +--*/ +{ + PAGED_CODE(); + + CLEAR_HISTOGRAM( HistogramP0 ); + CLEAR_HISTOGRAM( HistogramP1 ); + CLEAR_HISTOGRAM( HistogramP2 ); + + ULONG row, col; + + for( row=0; row<m_Height; row++ ) + { + PKS_RGBQUAD pPixel = (PKS_RGBQUAD) GetImageLocation(0, row); + + for( col=0; col<m_Width; col++ ) + { + BUMP_HISTOGRAM_PRIMARY( HistogramP0, pPixel->rgbRed ); + BUMP_HISTOGRAM_PRIMARY( HistogramP1, pPixel->rgbGreen ); + BUMP_HISTOGRAM_PRIMARY( HistogramP2, pPixel->rgbBlue ); + } + } +} |
