blob: e3b953ef31e6a100ecf0a5ce8b1d290a80094263 [file] [log] [blame]
/*
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. 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;
}