⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pixelops.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************
 * 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 + -