📄 pixelops.c
字号:
/**************************************************************************
* Name : pixelops.c
* Author : BCB
* Created : 11/02/2004
*
* Copyright : 2003-2004 by Imagination Technologies Limited. All rights reserved.
* : No part of this software, either material or conceptual
* : may be copied or distributed, transmitted, transcribed,
* : stored in a retrieval system or translated into any
* : human or computer language in any form by any means,
* : electronic, mechanical, manual or other-wise, or
* : disclosed to third parties without the express written
* : permission of Imagination Technologies Limited, Unit 8, HomePark
* : Industrial Estate, King's Langley, Hertfordshire,
* : WD4 8LZ, U.K.
*
* Platform : ANSI
*
* $Date: 2004/07/12 16:01:14 $ $Revision: 1.3 $
* $Log: pixelops.c $
**************************************************************************/
#define MODULE_ID MODID_PIXELOPS
#include "context.h"
/***********************************************************************************
Function Name : SpanPackR5G6B5ToBGRX8
Inputs : gc, psSpanInfo
Outputs : psSpanInfo->pvOutData
Returns : -
Description : Converts a span of RGB565 pixels to BGRX8
************************************************************************************/
static IMG_VOID SpanPackR5G6B5ToBGRX8(GLESContext *gc, GLESpixelSpanInfo *psSpanInfo)
{
IMG_UINT32 i;
const IMG_UINT16 *pui16InData = (const IMG_UINT16 *) psSpanInfo->pvInData;
IMG_UINT8 *pui8OutData = (IMG_UINT8 *) psSpanInfo->pvOutData;
IMG_UINT16 ui16Invalue;
IMG_UINT8 ui8Temp;
UNREFERENCED_PARAMETER(gc);
/* InData
* 0xf800 R
* 0x07e0 G
* 0x001f B
* 0xffffffff
* X R G B OutData
*/
for (i=0; i<psSpanInfo->ui32Width; i++, pui8OutData+=4)
{
ui16Invalue = *pui16InData;
ui8Temp = (ui16Invalue & 0xF800) >> 8;
pui8OutData[0] = ui8Temp | ((ui8Temp & 0xE0) >> 5);
ui8Temp = (ui16Invalue & 0x07E0) >> 3;
pui8OutData[1] = ui8Temp | ((ui8Temp & 0xC0) >> 6);
ui8Temp = (ui16Invalue & 0x001F) << 3;
pui8OutData[2] = ui8Temp | ((ui8Temp & 0xE0) >> 5);
pui8OutData[3] = 0xFF;
pui16InData = (IMG_UINT16 *)((IMG_UINT8 *)pui16InData + psSpanInfo->i32SrcGroupIncrement);
}
}
/***********************************************************************************
Function Name : SpanPackRGB565
Inputs : gc, psSpanInfo
Outputs : psSpanInfo->pvOutData
Returns : -
Description : Copies a span of RGB565 pixels.
************************************************************************************/
static IMG_VOID SpanPackRGB565(GLESContext *gc, GLESpixelSpanInfo *psSpanInfo)
{
IMG_UINT32 i;
const IMG_UINT16 *pui16InData = (const IMG_UINT16 *) psSpanInfo->pvInData;
IMG_UINT16 *pui16OutData = (IMG_UINT16 *) psSpanInfo->pvOutData;
UNREFERENCED_PARAMETER(gc);
/* InData=OutData
* 0xf800 R
* 0x07e0 G
* 0x001f B
*/
if(psSpanInfo->i32SrcGroupIncrement == sizeof(IMG_UINT16))
{
HostMemCopy(psSpanInfo->pvOutData, psSpanInfo->pvInData, psSpanInfo->ui32Width * sizeof(IMG_UINT16));
}
else
{
for(i=0; i < psSpanInfo->ui32Width; i++)
{
*pui16OutData = *pui16InData;
pui16OutData++;
pui16InData = (IMG_UINT16 *)((IMG_UINT8 *)pui16InData + psSpanInfo->i32SrcGroupIncrement);
}
}
}
/***********************************************************************************
Function Name : SpanPackARGB8888ToRGBA8888
Inputs : gc, psSpanInfo
Outputs : psSpanInfo->pvOutData
Returns : -
Description : Converts a span of ARGB8888 pixels to RGBA
************************************************************************************/
static IMG_VOID SpanPackARGB8888ToRGBA8888(GLESContext *gc, GLESpixelSpanInfo *psSpanInfo)
{
IMG_UINT32 i;
const IMG_UINT32 *pui32InData = (const IMG_UINT32 *) psSpanInfo->pvInData;
IMG_UINT32 *pui32OutData = (IMG_UINT32 *) psSpanInfo->pvOutData;
IMG_UINT32 ui32Invalue;
UNREFERENCED_PARAMETER(gc);
/* InData
* 0xFF000000 A
* 0x00FF0000 R
* 0x0000FF00 G
* 0x000000FF B
* 0xffffffff
* A B G R OutData
*/
for (i=0; i<psSpanInfo->ui32Width; i++)
{
ui32Invalue = *pui32InData;
*pui32OutData = (ui32Invalue & 0xff00ff00) | ((ui32Invalue & 0xff) << 16) | ((ui32Invalue & 0xff0000) >> 16);
pui32OutData++;
pui32InData = (IMG_UINT32 *)((IMG_UINT8 *)pui32InData + psSpanInfo->i32SrcGroupIncrement);
}
}
/***********************************************************************************
Function Name : CheckReadPixelArgs
Inputs : gc, i32Width, i32Height, format, type
Outputs : pfnReadSpan
Returns : Success
Description : Checks readpixels arguments. Returns relevant readspan
function pointer
************************************************************************************/
static IMG_BOOL CheckReadPixelArgs(GLESContext *gc, IMG_INT32 i32Width, IMG_INT32 i32Height, GLenum format, GLenum type,
IMG_VOID (**ppfnReadSpan)(GLESContext *gc, GLESpixelSpanInfo *psSpanInfo))
{
if ((i32Width < 0) || (i32Height < 0))
{
SetError(gc, GL_INVALID_VALUE);
return IMG_FALSE;
}
switch (format)
{
case GL_RGB:
switch(type)
{
case GL_UNSIGNED_SHORT_5_6_5:
if(gc->psMode->ePixelFormat != PVRSRV_PIXEL_FORMAT_RGB565)
{
bad_enum:
SetError(gc, GL_INVALID_ENUM);
return IMG_FALSE;
}
*ppfnReadSpan = SpanPackRGB565;
break;
default:
goto bad_enum;
}
break;
case GL_RGBA:
switch(type)
{
case GL_UNSIGNED_BYTE:
switch(gc->psMode->ePixelFormat)
{
case PVRSRV_PIXEL_FORMAT_ARGB8888:
*ppfnReadSpan = SpanPackARGB8888ToRGBA8888;
break;
case PVRSRV_PIXEL_FORMAT_RGB565:
default:
*ppfnReadSpan = SpanPackR5G6B5ToBGRX8;
break;
}
break;
default:
goto bad_enum;
}
break;
default:
goto bad_enum;
}
return IMG_TRUE;
}
/***********************************************************************************
Function Name : ClipReadPixels
Inputs : gc, psSpanInfo
Outputs : spanInfo
Returns : Success
Description : This routine clips ReadPixels calls so that only fragments
which are owned by this window will be read and copied into
the user's data. Parts of the ReadPixels rectangle lying
outside of the window will be ignored.
************************************************************************************/
static IMG_BOOL ClipReadPixels(GLESContext *gc, GLESpixelSpanInfo *psSpanInfo, GLESDrawableParams *psReadParams)
{
IMG_INT32 i32ClipLeft, i32ClipRight, i32ClipTop, i32ClipBottom;
IMG_INT32 i32X1,i32Y1,i32X2,i32Y2;
IMG_UINT32 ui32SkipPixels, ui32SkipRows;
IMG_INT32 i32Temp;
IMG_UINT32 ui32Width, ui32Height;
switch(psReadParams->eRotationAngle)
{
case ROTATE_0:
default:
i32ClipLeft = 0;
i32ClipRight = psReadParams->ui32Width;
i32ClipTop = 0;
i32ClipBottom = psReadParams->ui32Height;
break;
case ROTATE_180:
i32ClipLeft = 0;
i32ClipRight = psReadParams->ui32Width;
i32ClipTop = 0;
i32ClipBottom = psReadParams->ui32Height;
break;
case ROTATE_90:
i32ClipLeft = 0;
i32ClipRight = psReadParams->ui32Height;
i32ClipTop = 0;
i32ClipBottom = psReadParams->ui32Width;
break;
case ROTATE_270:
i32ClipLeft = 0;
i32ClipRight = psReadParams->ui32Height;
i32ClipTop = 0;
i32ClipBottom = psReadParams->ui32Width;
break;
}
ui32Width = psSpanInfo->ui32Width;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -