blob: cacc90f8f5a46eb65761f7387096530ed52c117c [file]
//==========================================================================
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (c) 1999 - 2001 On2 Technologies Inc. All Rights Reserved.
//
//--------------------------------------------------------------------------
#include <stdio.h>
#include "vpxblit.h"
typedef unsigned int RGBColorComponent;
#ifndef ON2_NO_GLOBALS
extern RGBColorComponent *WK_ClampOriginR;
extern RGBColorComponent *WK_ClampOriginG;
extern RGBColorComponent *WK_ClampOriginB;
extern unsigned char WK_YforY[];
extern unsigned char WK_VforRG[];
extern unsigned char WK_UforBG[];
#else
# include "on2_global_handling.h"
# define WK_ClampOriginR ((RGBColorComponent *)ON2GLOBALm(vpxblit, WK_ClampOriginR))
# define WK_ClampOriginG ((RGBColorComponent *)ON2GLOBALm(vpxblit, WK_ClampOriginG))
# define WK_ClampOriginB ((RGBColorComponent *)ON2GLOBALm(vpxblit, WK_ClampOriginB))
# define WK_YforY_ptr ((unsigned char *)ON2GLOBALm(vpxblit, WK_YforY))
# define WK_VforRG_ptr ((unsigned char *)ON2GLOBALm(vpxblit, WK_VforRG))
# define WK_UforBG_ptr ((unsigned char *)ON2GLOBALm(vpxblit, WK_UforBG))
#endif
void
bct00_c(unsigned char *_ptrScreen, int thisPitch, VPX_BLIT_CONFIG *src)
{
unsigned char *ptrScrn = (unsigned char *)_ptrScreen;
unsigned char *YBuffer = (unsigned char *)src->YBuffer;
unsigned char *UBuffer = (unsigned char *)src->UBuffer;
unsigned char *VBuffer = (unsigned char *)src->VBuffer;
unsigned int yTemp;
unsigned short uTemp, vTemp;
int i, j;
int R, G, B;
int R1, G1, B1;
int RP,GP,BP;
unsigned int Y0, Y1, CbforB, CbforG, CrforR, CrforG;
typedef unsigned int tempColor;
tempColor *tR = (tempColor *) WK_ClampOriginR;
tempColor *tG = (tempColor *) WK_ClampOriginG;
tempColor *tB = (tempColor *) WK_ClampOriginB;
#ifdef ON2_NO_GLOBALS
unsigned char *WK_YforY = WK_YforY_ptr;
unsigned char *WK_VforRG = WK_VforRG_ptr;
unsigned char *WK_UforBG = WK_UforBG_ptr;
#endif
for(i = 0; i < src->YHeight; i += 1)
{
int x;
for(j = 0, x = 0; j < src->YWidth/4; j += 1, x += 4)
{
/* get 4 y's */
yTemp = ((unsigned int *) YBuffer)[j*1];
/* get 2 uv's */
uTemp = ((unsigned short *) UBuffer)[j*1];
vTemp = ((unsigned short *) VBuffer)[j*1];
Y0 = REREFERENCE(WK_YforY[BYTE_ZERO(yTemp)]);
Y1 = REREFERENCE(WK_YforY[BYTE_ONE(yTemp)]);
CbforB = REREFERENCE(WK_UforBG[BYTE_ZERO_UV(uTemp)<<1]);
CbforG = REREFERENCE(WK_UforBG[(BYTE_ZERO_UV(uTemp)<<1)+4]);
CrforR = REREFERENCE(WK_VforRG[BYTE_ZERO_UV(vTemp)<<1]);
CrforG = REREFERENCE(WK_VforRG[(BYTE_ZERO_UV(vTemp)<<1)+4]);
R = Y0 + CrforR;
B = Y0 + CbforB;
G = Y0 - CbforG - CrforG;
RP = tR[R];
GP = tG[G];
BP = tB[B];
/* reuse Y0 */
#if CONFIG_BIG_ENDIAN
Y0 = (((RP>>8) | (GP<<8) | (BP<<24)));
#else
Y0 = ((RP | GP | BP));
#endif
R1 = Y1 + CrforR;
B1 = Y1 + CbforB;
G1 = Y1 - CbforG - CrforG;
RP = tR[R1];
GP = tG[G1];
BP = tB[B1];
#if CONFIG_BIG_ENDIAN
Y1 = (((RP>>8) | (GP<<8) | (BP<<24)));
#else
Y1 = ((RP | GP | BP));
#endif
((unsigned int *) ptrScrn)[x] = (unsigned int)(Y0);
((unsigned int *) ptrScrn)[x+1] = (unsigned int)(Y1);
Y0 = REREFERENCE(WK_YforY[BYTE_TWO(yTemp)]);
Y1 = REREFERENCE(WK_YforY[BYTE_THREE(yTemp)]);
CbforB = REREFERENCE(WK_UforBG[BYTE_ONE_UV(uTemp)<<1]);
CbforG = REREFERENCE(WK_UforBG[(BYTE_ONE_UV(uTemp)<<1)+4]);
CrforR = REREFERENCE(WK_VforRG[BYTE_ONE_UV(vTemp)<<1]);
CrforG = REREFERENCE(WK_VforRG[(BYTE_ONE_UV(vTemp)<<1)+4]);
R = Y0 + CrforR;
B = Y0 + CbforB;
G = Y0 - CbforG - CrforG;
R1 = Y1 + CrforR;
B1 = Y1 + CbforB;
G1 = Y1 - CbforG - CrforG;
RP = tR[R];
GP = tG[G];
BP = tB[B];
/* reuse Y0 */
#if CONFIG_BIG_ENDIAN
Y0 = (((RP>>8) | (GP<<8) | (BP<<24)));
#else
Y0 = ((RP | GP | BP));
#endif
RP = tR[R1];
GP = tG[G1];
BP = tB[B1];
#if CONFIG_BIG_ENDIAN
Y1 = (((RP>>8) | (GP<<8) | (BP<<24)));
#else
Y1 = ((RP | GP | BP));
#endif
((unsigned int *) ptrScrn)[x+2] = (unsigned int)(Y0);
((unsigned int *) ptrScrn)[x+3] = (unsigned int)(Y1);
} /* inner for */
ptrScrn += thisPitch;
YBuffer -= src->YStride;
/* see mmx asm code on how to remove this branch */
if(i & 1)
{
UBuffer -= src->UVStride;
VBuffer -= src->UVStride;
}
} /* outer for */
}