diff options
Diffstat (limited to 'vp8/decoder/xprintf.c')
-rw-r--r-- | vp8/decoder/xprintf.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/vp8/decoder/xprintf.c b/vp8/decoder/xprintf.c new file mode 100644 index 000000000..cb2221c15 --- /dev/null +++ b/vp8/decoder/xprintf.c @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license and patent + * grant that can be found in the LICENSE file in the root of the source + * tree. All contributing project authors may be found in the AUTHORS + * file in the root of the source tree. + */ + + +/**************************************************************************** +* +* Module Title : xprintf.cpp +* +* Description : Display a printf style message on the current video frame. +* +****************************************************************************/ + +/**************************************************************************** +* Header Files +****************************************************************************/ + +#include <stdio.h> +#include <stdarg.h> +#ifdef _WIN32_WCE +#include <windows.h> +#endif +#include "xprintf.h" + +/**************************************************************************** + * + * ROUTINE : xprintf + * + * INPUTS : const PB_INSTANCE *ppbi : Pointer to decoder instance. + * long n_pixel : Offset into buffer to write text. + * const char *format : Format string for print. + * ... : Variable length argument list. + * + * OUTPUTS : None. + * + * RETURNS : int: Size (in bytes) of the formatted text. + * + * FUNCTION : Display a printf style message on the current video frame. + * + * SPECIAL NOTES : None. + * + ****************************************************************************/ +int onyx_xprintf(unsigned char *ppbuffer, long n_pixel, long n_size, long n_stride, const char *format, ...) +{ + BOOL b_rc; + va_list arglist; + HFONT hfont, hfonto; + + int rc = 0; + char sz_formatted[256] = ""; + unsigned char *p_dest = &ppbuffer[n_pixel]; + +#ifdef _WIN32_WCE + // Set up temporary bitmap + HDC hdc_memory = NULL; + HBITMAP hbm_temp = NULL; + HBITMAP hbm_orig = NULL; + + RECT rect; + + // Copy bitmap to video frame + long x; + long y; + + // Format text + va_start(arglist, format); + _vsnprintf(sz_formatted, sizeof(sz_formatted), format, arglist); + va_end(arglist); + + rect.left = 0; + rect.top = 0; + rect.right = 8 * strlen(sz_formatted); + rect.bottom = 8; + + hdc_memory = create_compatible_dc(NULL); + + if (hdc_memory == NULL) + goto Exit; + + hbm_temp = create_bitmap(rect.right, rect.bottom, 1, 1, NULL); + + if (hbm_temp == NULL) + goto Exit; + + hbm_orig = (HBITMAP)(select_object(hdc_memory, hbm_temp)); + + if (!hbm_orig) + goto Exit; + + // Write text into bitmap + // font? + hfont = create_font(8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, VARIABLE_PITCH | FF_SWISS, ""); + + if (hfont == NULL) + goto Exit; + + hfonto = (HFONT)(select_object(hdc_memory, hbm_temp)); + + if (!hfonto) + goto Exit; + + select_object(hdc_memory, hfont); + set_text_color(hdc_memory, 1); + set_bk_color(hdc_memory, 0); + set_bk_mode(hdc_memory, TRANSPARENT); + + b_rc = bit_blt(hdc_memory, rect.left, rect.top, rect.right, rect.bottom, hdc_memory, rect.left, rect.top, BLACKNESS); + + if (!b_rc) + goto Exit; + + b_rc = ext_text_out(hdc_memory, 0, 0, ETO_CLIPPED, &rect, sz_formatted, strlen(sz_formatted), NULL); + + if (!b_rc) + goto Exit; + + for (y = rect.top; y < rect.bottom; ++y) + { + for (x = rect.left; x < rect.right; ++x) + { + if (get_pixel(hdc_memory, x, rect.bottom - 1 - y)) + p_dest[x] = 255; + } + + p_dest += n_stride; + } + + rc = strlen(sz_formatted); + +Exit: + + if (hbm_temp != NULL) + { + if (hbm_orig != NULL) + { + select_object(hdc_memory, hbm_orig); + } + + delete_object(hbm_temp); + } + + if (hfont != NULL) + { + if (hfonto != NULL) + select_object(hdc_memory, hfonto); + + delete_object(hfont); + } + + if (hdc_memory != NULL) + delete_dc(hdc_memory); + + hdc_memory = 0; + +#endif + + return rc; +} |