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

📄 blit_mips_fix.c

📁 大名鼎鼎的CE下播放软件,TCPPMP的源代码!!!2410下可以流畅的解QVGA的H264,MPEG4等格式.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************
 *
 * This program is free software ; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 * $Id: blit_mips_fix.c 339 2005-11-15 11:22:45Z picard $
 *
 * The Core Pocket Media Player
 * Copyright (c) 2004-2005 Gabor Kovacs
 *
 ****************************************************************************/

#include "../common.h"
#include "../dyncode/dyncode.h"
#include "blit_soft.h"

#if defined(MIPS) 

typedef struct stack
{
	int EndOfRect;
	int DstNext;
	int SrcNext; // SrcPitch for scale
	int UVNext;
	int EndOfLineInc;
	int Y,U,V;

	int StackFrame[7];

	void* This;   //R4
	char* Dst;    //R5
	char* Src;    //R6
	int DstPitch; //R7
	int SrcPitch;
	int Width; 
	int Height;
	int Src2SrcLast;
} stack;

// R10 buffer_u
// R11 buffer_v
// R12 buffer_y1
// R14 buffer_y2

// R20 buffer_u2 (scale)
// R21 buffer_v2 (scale)
// R22 pos (scale)

// R17 radd / pal:accy
// R18 gadd / pal:accu
// R19 badd / pal:accv

// R13 negsat / LookUp_Y / pal:lookup
// R15 possat / LookUp_U / pal:U

// R4  r
// R5  g
// R6  b
// R8  y1/rgb out
// R9  y2/(rgb2 out)

// R16 tmp / LookUp_V / pal:V
// R2  tmp
// R3  tmp

// R7  endofline
// R24 dest
// R25 pitch
// R1  tmp dest

static NOINLINE int ConstAdjust(int v)
{
	if (v>0)
		return (v + 0x1000) >> (16-3);
	return -((-v + 0x1000) >> (16-3));
}

static NOINLINE void Fix_RGB_UV_LoadUV(blit_soft* p,int OfsUV,int OfsUV2)
{
	if (p->DstPalette)
	{
		if (!p->Scale)
		{
			I2C(LBU,R15,R10,0); //u
			I2C(ADDIU,R10,R10,1);
			I2C(LBU,R16,R11,0); //v
			I2C(ADDIU,R11,R11,1);
		}
		else
		{
			reg U = R10;
			reg V = R11;
			reg U2 = R10;
			reg V2 = R11;

			if (p->SwapXY)
			{
				if (p->DirX<0)
				{
					U = R20;
					V = R21;
				}
				else
				{
					U2 = R20;
					V2 = R21;
				}
			}

			I2C(LBU,R2,U2,OfsUV2); //u2
			I2C(LBU,R3,V2,OfsUV2); //v2

			I2C(LBU,R15,U,OfsUV); //u
			I2C(LBU,R16,V,OfsUV); //v
		}
	}
	else
	if (p->ColorLookup)
	{
		//set R4 =           RVMul*v + RAdd
		//set R5 = GUMul*u + GVMul*v + GAdd
		//set R6 = BUMul*u +           BAdd

		I2C(LBU,R2,R10,0); //u
		I2C(LBU,R3,R11,0); //v

		I2C(SLL,R2,R2,3);
		I2C(SLL,R3,R3,3);

		I3(ADDU,R2,R2,R15); //LookUp_U + u
		I3(ADDU,R3,R3,R16); //LookUp_V + v

		I2C(LW,R8,R2,4);
		I2C(ADDIU,R10,R10,1);
		I2C(LW,R9,R3,4);
		I2C(ADDIU,R11,R11,1);
		I2C(LW,R6,R2,0);
		I3(ADDU,R5,R8,R9);
		I2C(LW,R4,R3,0);
	}
	else
	{
		reg v;
		bool_t Neg;

		if (!p->Scale)
		{
			I2C(LBU,R4,R10,0); //u
			I2C(LBU,R5,R11,0); //v

			I2C(ADDIU,R10,R10,1);
			I2C(ADDIU,R11,R11,1);

			I2C(SLL,R2,R4,16);
			I2C(SLL,R3,R5,16);
		}
		else
		{
			reg U = R10;
			reg V = R11;
			reg U2 = R10;
			reg V2 = R11;

			if (p->SwapXY)
			{
				if (p->DirX<0)
				{
					U = R20;
					V = R21;
				}
				else
				{
					U2 = R20;
					V2 = R21;
				}
			}

			I2C(LBU,R2,U2,OfsUV2); //u2
			I2C(LBU,R3,V2,OfsUV2); //v2

			I2C(LBU,R4,U,OfsUV); //u
			I2C(SLL,R2,R2,16);
			I2C(LBU,R5,V,OfsUV); //v
			I2C(SLL,R3,R3,16);
		}

		I3(OR,R2,R4,R2);	// u | u
		I3(OR,R3,R5,R3);	// v | v

		v = IMul(R2,ConstAdjust(p->_GUMul),R16,R4,R6,&Neg);
		I3(Neg?SUBU:ADDU,R5,R18,v);
		v = IMul(R3,ConstAdjust(p->_GVMul),R16,R4,R6,&Neg);
		I3(Neg?SUBU:ADDU,R5,R5,v);
		v = IMul(R3,ConstAdjust(p->_RVMul),R16,R4,R6,&Neg);
		I3(Neg?SUBU:ADDU,R4,R17,v);
		v = IMul(R2,ConstAdjust(p->_BUMul),R16,R3,R6,&Neg);
		I3(Neg?SUBU:ADDU,R6,R19,v);
	}
}

static NOINLINE void Fix_RGB_UV_Pixel(blit_soft* p, int Row, int Col)
{
	int Shift;
	reg v;
	reg Y1,Y2;
	bool_t Neg;
	int OfsY;
	int OfsUV;
	int OfsY2;
	int OfsUV2;

	if (p->Scale)
	{
		OfsY = (Col * p->RScaleX) >> 4;
		OfsUV = (Col * p->RScaleX) >> (4+p->SrcUVX2);

		if (!p->SwapXY)
		{
			OfsY2 = ((Col+1) * p->RScaleX) >> 4;
			OfsUV2 = ((Col+1) * p->RScaleX) >> (4+p->SrcUVX2);
		}
		else
		{
			OfsY2 = OfsY;
			OfsUV2 = OfsUV;
		}
	
		Fix_RGB_UV_LoadUV(p,OfsUV,OfsUV2);
	}
	else
	{
		if (p->SwapXY)
		{
			OfsY = Row;
			OfsY2 = Row;
		}
		else
		{
			OfsY = 0;
			OfsY2 = 1;
		}
	}

	if (p->SwapXY)
	{
		Y1 = R12;
		Y2 = R14;
	}
	else
		Y1 = Y2 = (reg)(Row==0?R12:R14);

	//load Y
	if (p->DirX>0)
	{
		I2C(LBU,R9,Y2,OfsY2); //y2
		I2C(LBU,R8,Y1,OfsY);  //y1
	}
	else
	{
		I2C(LBU,R9,Y1,OfsY);  //y2
		I2C(LBU,R8,Y2,OfsY2); //y1
	}

	if (p->DstPalette)
	{
		I3(ADDU,R17,R17,R8);
		I3(ADDU,R18,R18,R15);
		I3(ADDU,R19,R19,R16);

		I2C(ANDI,R4,R17,0x1E0); 
		I2C(ANDI,R5,R18,0x1E0); 
		I2C(ANDI,R6,R19,0x1E0); 

		I2C(SLL,R4,R4,5); 
		I2C(SLL,R5,R5,1);
		I2C(SRL,R6,R6,3);

		I3(ADDU,R4,R4,R13);
		I3(ADDU,R4,R4,R5);
		I3(ADDU,R4,R4,R6);
		
		I2C(LBU,R8,R4,0);
		I2C(LBU,R6,R4,1);
		I2C(LBU,R5,R4,2);
		I2C(LBU,R4,R4,3);

		I3(SUBU,R17,R17,R6);
		I3(SUBU,R18,R18,R5);
		I3(SUBU,R19,R19,R4);

		I3(ADDU,R17,R17,R9);
		I3(ADDU,R18,R18,(reg)(p->Scale ? R2:R15));
		I3(ADDU,R19,R19,(reg)(p->Scale ? R3:R16));

		I2C(ANDI,R4,R17,0x1E0); 
		I2C(ANDI,R5,R18,0x1E0); 
		I2C(ANDI,R6,R19,0x1E0); 

		I2C(SLL,R4,R4,5); 
		I2C(SLL,R5,R5,1);
		I2C(SRL,R6,R6,3);

		I3(ADDU,R4,R4,R13);
		I3(ADDU,R4,R4,R5);
		I3(ADDU,R4,R4,R6);
		
		I2C(LBU,R9,R4,0);
		I2C(LBU,R6,R4,1);
		I2C(LBU,R5,R4,2);
		I2C(LBU,R4,R4,3);

		I3(SUBU,R17,R17,R6);
		I3(SUBU,R18,R18,R5);
		I3(SUBU,R19,R19,R4);
	}
	else
	if (p->ColorLookup)
	{
		I3(ADDU,R8,R8,R13); //LookUp_Y + y1
		I2C(LBU,R8,R8,0);
		
		I3(ADDU,R9,R9,R13); //LookUp_Y + y2
		I2C(LBU,R9,R9,0);

		I3(ADDU,R2,R4,R8);
		I2C(LBU,R2,R2,0);
		
		I3(ADDU,R3,R5,R8);
		I2C(LBU,R3,R3,0);
		
		I3(ADDU,R8,R6,R8);
		I2C(LBU,R8,R8,0);

		I2C(SLL,R2,R2,p->DstPos[0]);
		I2C(SLL,R3,R3,p->DstPos[1]);
		if (p->DstPos[2]) I2C(SLL,R8,R8,p->DstPos[2]);

		I3(OR,R8,R8,R2);
		I3(OR,R8,R8,R3);

		I3(ADDU,R2,R4,R9);
		I2C(LBU,R2,R2,0);
		
		I3(ADDU,R3,R5,R9);
		I2C(LBU,R3,R3,0);
		
		I3(ADDU,R9,R6,R9);
		I2C(LBU,R9,R9,0);

		if (p->DstDoubleX || p->DstBPP > 16)
		{
			I2C(SLL,R2,R2,p->DstPos[0]);
			I2C(SLL,R3,R3,p->DstPos[1]);
			if (p->DstPos[2]) I2C(SLL,R9,R9,p->DstPos[2]);

			I3(OR,R9,R9,R2);
			I3(OR,R9,R9,R3);
		}
		else
		{
			I2C(SLL,R2,R2,p->DstPos[0]+16);
			I2C(SLL,R3,R3,p->DstPos[1]+16);
			I2C(SLL,R9,R9,p->DstPos[2]+16);

			I3(OR,R8,R8,R2);
			I3(OR,R8,R8,R3);
			I3(OR,R8,R8,R9);
		}
	}
	else
	{
		I2C(SLL,R9,R9,16);
		I3(OR,R8,R8,R9);		// y1 | y2

		v = IMul(R8,ConstAdjust(p->_YMul),R16,R3,R2,&Neg);

		I3(Neg?SUBU:ADDU,R8,R4,v);
		I3(Neg?SUBU:ADDU,R9,R5,v);
		I3(Neg?SUBU:ADDU,R16,R6,v);

		// negative sat and mask final rbg
		I3(NOR,R2,R8,R13);
		I2C(SRL,R3,R2,4+p->DstSize[0]);
		I3(SUBU,R2,R2,R3);
		I3(AND,R8,R8,R2);

		I3(NOR,R2,R9,R13);
		I2C(SRL,R3,R2,4+p->DstSize[1]);
		I3(SUBU,R2,R2,R3);
		I3(AND,R9,R9,R2);

		I3(NOR,R2,R16,R13);
		I2C(SRL,R3,R2,4+p->DstSize[2]);
		I3(SUBU,R2,R2,R3);
		I3(AND,R16,R16,R2);

		// positive sat
		I3(AND,R2,R8,R15);
		I2C(SRL,R3,R2,p->DstSize[0]);
		I3(SUBU,R2,R2,R3);
		I3(OR,R8,R8,R2);

		I3(AND,R2,R9,R15);
		I2C(SRL,R3,R2,p->DstSize[1]);
		I3(SUBU,R2,R2,R3);
		I3(OR,R9,R9,R2);

		I3(AND,R2,R16,R15);
		I2C(SRL,R3,R2,p->DstSize[2]);
		I3(SUBU,R2,R2,R3);
		I3(OR,R16,R16,R2);

		Shift = p->DstPos[0] + p->DstSize[0] - (8+3);
		if (Shift) I2C(SLL,R8,R8,Shift);
		Shift = p->DstPos[1] + p->DstSize[1] - (8+3);
		if (Shift) I2C(SLL,R9,R9,Shift);
		Shift = p->DstPos[2] + p->DstSize[2] - (8+3);
		if (Shift) I2C(SLL,R16,R16,Shift);

		I3(OR,R8,R8,R9);
		I3(OR,R8,R8,R16);
	}
}

// R3,R2 for temp
static NOINLINE void Write(blit_soft* p,reg Dst,reg A,reg B,bool_t Prepare)
{
	switch (p->DstBPP)
	{
	case 8:
		if (p->DstDoubleX)
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -