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

📄 2xsai.cpp

📁 著名SFC模拟器Snes9x的源代码。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//                                       M|N O|P		colorI = *(bP - Nextline - 1);		colorE = *(bP - Nextline);		colorF = *(bP - Nextline + 1);		colorJ = *(bP - Nextline + 2);		colorG = *(bP - 1);		colorA = *(bP);		colorB = *(bP + 1);		colorK = *(bP + 2);		colorH = *(bP + Nextline - 1);		colorC = *(bP + Nextline);		colorD = *(bP + Nextline + 1);		colorL = *(bP + Nextline + 2);		colorM = *(bP + Nextline + Nextline - 1);		colorN = *(bP + Nextline + Nextline);		colorO = *(bP + Nextline + Nextline + 1);		colorP = *(bP + Nextline + Nextline + 2);		if ((colorA == colorD) && (colorB != colorC))		{		    if (((colorA == colorE) && (colorB == colorL)) ||			    ((colorA == colorC) && (colorA == colorF)			     && (colorB != colorE) && (colorB == colorJ)))		    {			product = colorA;		    }		    else		    {			product = INTERPOLATE (colorA, colorB);		    }		    if (((colorA == colorG) && (colorC == colorO)) ||			    ((colorA == colorB) && (colorA == colorH)			     && (colorG != colorC) && (colorC == colorM)))		    {			product1 = colorA;		    }		    else		    {			product1 = INTERPOLATE (colorA, colorC);		    }		    product2 = colorA;		}		else if ((colorB == colorC) && (colorA != colorD))		{		    if (((colorB == colorF) && (colorA == colorH)) ||			    ((colorB == colorE) && (colorB == colorD)			     && (colorA != colorF) && (colorA == colorI)))		    {			product = colorB;		    }		    else		    {			product = INTERPOLATE (colorA, colorB);		    }		    if (((colorC == colorH) && (colorA == colorF)) ||			    ((colorC == colorG) && (colorC == colorD)			     && (colorA != colorH) && (colorA == colorI)))		    {			product1 = colorC;		    }		    else		    {			product1 = INTERPOLATE (colorA, colorC);		    }		    product2 = colorB;		}		else if ((colorA == colorD) && (colorB == colorC))		{		    if (colorA == colorB)		    {			product = colorA;			product1 = colorA;			product2 = colorA;		    }		    else		    {			register int r = 0;			product1 = INTERPOLATE (colorA, colorC);			product = INTERPOLATE (colorA, colorB);			r +=			    GetResult1 (colorA, colorB, colorG, colorE,					colorI);			r +=			    GetResult2 (colorB, colorA, colorK, colorF,					colorJ);			r +=			    GetResult2 (colorB, colorA, colorH, colorN,					colorM);			r +=			    GetResult1 (colorA, colorB, colorL, colorO,					colorP);			if (r > 0)			    product2 = colorA;			else if (r < 0)			    product2 = colorB;			else			{			    product2 =				Q_INTERPOLATE (colorA, colorB, colorC,					       colorD);			}		    }		}		else		{		    product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD);		    if ((colorA == colorC) && (colorA == colorF)			    && (colorB != colorE) && (colorB == colorJ))		    {			product = colorA;		    }		    else			if ((colorB == colorE) && (colorB == colorD)			    && (colorA != colorF) && (colorA == colorI))		    {			product = colorB;		    }		    else		    {			product = INTERPOLATE (colorA, colorB);		    }		    if ((colorA == colorB) && (colorA == colorH)			    && (colorG != colorC) && (colorC == colorM))		    {			product1 = colorA;		    }		    else			if ((colorC == colorG) && (colorC == colorD)			    && (colorA != colorH) && (colorA == colorI))		    {			product1 = colorC;		    }		    else		    {			product1 = INTERPOLATE (colorA, colorC);		    }		}		product = colorA | (product << 16);		product1 = product1 | (product2 << 16);		*((int32 *) dP) = product;		*((uint32 *) (dP + dstPitch)) = product1;		bP += inc_bP;		dP += sizeof (uint32);	    }			// end of for ( finish= width etc..)	    srcPtr += srcPitch;	    dstPtr += dstPitch * 2;	    deltaPtr += srcPitch;	}			// endof: for (height; height; height--)    }}#ifdef MMXvoid Scale_2xSaI (uint8 *srcPtr, uint32 srcPitch, uint8 * /* deltaPtr */,		  uint8 *dstPtr, uint32 dstPitch, 		  uint32 dstWidth, uint32 dstHeight, int width, int height){    uint8  *dP;    uint16 *bP;    uint32 w;    uint32 h;    uint32 dw;    uint32 dh;    uint32 hfinish;    uint32 wfinish;    uint32 Nextline;    uint16 colorA[4];    uint16 colorB[4];    uint16 colorC[4];    uint16 colorD[4];    uint16 dx[4];    uint16 dy[4];    Nextline = srcPitch >> 1;    wfinish = (width - 1) << 16;	// convert to fixed point    hfinish = (height - 1) << 16;	// convert to fixed point    dw = wfinish / (dstWidth - 1);    dh = hfinish / (dstHeight - 1);    for (h = 0; h < hfinish; h += dh)    {	uint32 y1, y2;	y1 = h & 0xffff;	// fraction part of fixed point	y2 = 0x10000 - y1;	bP = (uint16 *) (srcPtr + ((h >> 16) * srcPitch));	dP = dstPtr;	for (w = 0; w < wfinish;)	{	    uint32 A, B, C, D;	    uint32 E, F, G, H;	    uint32 I, J, K, L;	    uint32 x1, x2, a1, f1, f2;	    uint32 position;	    for (int c = 0; c < 4; c++)	    {		position = w >> 16;		A = bP[position];	// current pixel		B = bP[position + 1];	// next pixel		C = bP[position + Nextline];		D = bP[position + Nextline + 1];		E = bP[position - Nextline];		F = bP[position - Nextline + 1];		G = bP[position - 1];		H = bP[position + Nextline - 1];		I = bP[position + 2];		J = bP[position + Nextline + 2];		K = bP[position + Nextline + Nextline];		L = bP[position + Nextline + Nextline + 1];		x1 = w & 0xffff;	// fraction part of fixed point		x2 = 0x10000 - x1;		/*1*/ 		if (A == D && B != C)		{		    f1 = (x1 >> 1) + (0x10000 >> 2);		    f2 = (y1 >> 1) + (0x10000 >> 2);		    if (y1 <= f1 && A == J && A != E)	// close to B		    {			a1 = f1 - y1;			colorA[c] = A;			colorB[c] = B;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		    else if (y1 >= f1 && A == G && A != L)	// close to C		    {			a1 = y1 - f1;			colorA[c] = A;			colorB[c] = C;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		    else if (x1 >= f2 && A == E && A != J)	// close to B		    {			a1 = x1 - f2;			colorA[c] = A;			colorB[c] = B;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		    else if (x1 <= f2 && A == L && A != G)	// close to C		    {			a1 = f2 - x1;			colorA[c] = A;			colorB[c] = C;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		    else if (y1 >= x1)	// close to C		    {			a1 = y1 - x1;			colorA[c] = A;			colorB[c] = C;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		    else if (y1 <= x1)	// close to B		    {			a1 = x1 - y1;			colorA[c] = A;			colorB[c] = B;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		}		else		/*2*/ 		if (B == C && A != D)		{		    f1 = (x1 >> 1) + (0x10000 >> 2);		    f2 = (y1 >> 1) + (0x10000 >> 2);		    if (y2 >= f1 && B == H && B != F)	// close to A		    {			a1 = y2 - f1;			colorA[c] = B;			colorB[c] = A;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		    else if (y2 <= f1 && B == I && B != K)	// close to D		    {			a1 = f1 - y2;			colorA[c] = B;			colorB[c] = D;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		    else if (x2 >= f2 && B == F && B != H)	// close to A		    {			a1 = x2 - f2;			colorA[c] = B;			colorB[c] = A;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		    else if (x2 <= f2 && B == K && B != I)	// close to D		    {			a1 = f2 - x2;			colorA[c] = B;			colorB[c] = D;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		    else if (y2 >= x1)	// close to A		    {			a1 = y2 - x1;			colorA[c] = B;			colorB[c] = A;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		    else if (y2 <= x1)	// close to D		    {			a1 = x1 - y2;			colorA[c] = B;			colorB[c] = D;			colorC[c] = 0;			colorD[c] = 0;			dx[c] = a1;			dy[c] = 0;		    }		}		/*3*/		else		{		    colorA[c] = A;		    colorB[c] = B;		    colorC[c] = C;		    colorD[c] = D;		    dx[c] = x1;		    dy[c] = y1;		}		w += dw;	    }	    BilinearMMX (colorA, colorB, colorC, colorD, dx, dy, dP);	    dP += 8;	}	dstPtr += dstPitch;    };    EndMMX ();}#elsestatic uint32 Bilinear (uint32 A, uint32 B, uint32 x){    unsigned long areaA, areaB;    unsigned long result;    if (A == B)	return A;    areaB = (x >> 11) & 0x1f;	// reduce 16 bit fraction to 5 bits    areaA = 0x20 - areaB;    A = (A & redblueMask) | ((A & greenMask) << 16);    B = (B & redblueMask) | ((B & greenMask) << 16);    result = ((areaA * A) + (areaB * B)) >> 5;    return (result & redblueMask) | ((result >> 16) & greenMask);}static uint32 Bilinear4 (uint32 A, uint32 B, uint32 C, uint32 D, uint32 x,			 uint32 y){    unsigned long areaA, areaB, areaC, areaD;    unsigned long result, xy;    x = (x >> 11) & 0x1f;    y = (y >> 11) & 0x1f;    xy = (x * y) >> 5;    A = (A & redblueMask) | ((A & greenMask) << 16);    B = (B & redblueMask) | ((B & greenMask) << 16);    C = (C & redblueMask) | ((C & greenMask) << 16);    D = (D & redblueMask) | ((D & greenMask) << 16);    areaA = 0x20 + xy - x - y;    areaB = x - xy;    areaC = y - xy;    areaD = xy;    result = ((areaA * A) + (areaB * B) + (areaC * C) + (areaD * D)) >> 5;    return (result & redblueMask) | ((result >> 16) & greenMask);}void Scale_2xSaI (uint8 *srcPtr, uint32 srcPitch, uint8 * /* deltaPtr */,		  uint8 *dstPtr, uint32 dstPitch, 		  uint32 dstWidth, uint32 dstHeight, int width, int height){    uint8  *dP;    uint16 *bP;    uint32 w;    uint32 h;    uint32 dw;    uint32 dh;    uint32 hfinish;    uint32 wfinish;    uint32 Nextline = srcPitch >> 1;    wfinish = (width - 1) << 16;	// convert to fixed point    dw = wfinish / (dstWidth - 1);    hfinish = (height - 1) << 16;	// convert to fixed point    dh = hfinish / (dstHeight - 1);    for (h = 0; h < hfinish; h += dh)    {	uint32 y1, y2;	y1 = h & 0xffff;	// fraction part of fixed point	bP = (uint16 *) (srcPtr + ((h >> 16) * srcPitch));	dP = dstPtr;	y2 = 0x10000 - y1;	w = 0;	for (; w < wfinish;)	{	    uint32 A, B, C, D;	    uint32 E, F, G, H;	    uint32 I, J, K, L;	    uint32 x1, x2, a1, f1, f2;	    uint32 position, product1;	    position = w >> 16;	    A = bP[position];	// current pixel	    B = bP[position + 1];	// next pixel	    C = bP[position + Nextline];	    D = bP[position + Nextline + 1];	    E = bP[position - Nextline];	    F = bP[position - Nextline + 1];	    G = bP[position - 1];	    H = bP[position + Nextline - 1];	    I = bP[position + 2];	    J = bP[position + Nextline + 2];	    K = bP[position + Nextline + Nextline];	    L = bP[position + Nextline + Nextline + 1];	    x1 = w & 0xffff;	// fraction part of fixed point	    x2 = 0x10000 - x1;	    /*0*/ 	    if (A == B && C == D && A == C)		product1 = A;	    else	    /*1*/ 	    if (A == D && B != C)	    {		f1 = (x1 >> 1) + (0x10000 >> 2);		f2 = (y1 >> 1) + (0x10000 >> 2);		if (y1 <= f1 && A == J && A != E)	// close to B		{		    a1 = f1 - y1;		    product1 = Bilinear (A, B, a1);		}		else if (y1 >= f1 && A == G && A != L)	// close to C		{		    a1 = y1 - f1;		    product1 = Bilinear (A, C, a1);		}		else if (x1 >= f2 && A == E && A != J)	// close to B		{		    a1 = x1 - f2;		    product1 = Bilinear (A, B, a1);		}		else if (x1 <= f2 && A == L && A != G)	// close to C		{		    a1 = f2 - x1;		    product1 = Bilinear (A, C, a1);		}		else if (y1 >= x1)	// close to C		{		    a1 = y1 - x1;		    product1 = Bilinear (A, C, a1);		}		else if (y1 <= x1)	// close to B		{		    a1 = x1 - y1;		    product1 = Bilinear (A, B, a1);		}	    }	    else	    /*2*/ 	    if (B == C && A != D)	    {		f1 = (x1 >> 1) + (0x10000 >> 2);		f2 = (y1 >> 1) + (0x10000 >> 2);		if (y2 >= f1 && B == H && B != F)	// close to A		{		    a1 = y2 - f1;		    product1 = Bilinear (B, A, a1);		}		else if (y2 <= f1 && B == I && B != K)	// close to D		{		    a1 = f1 - y2;		    product1 = Bilinear (B, D, a1);		}		else if (x2 >= f2 && B == F && B != H)	// close to A		{		    a1 = x2 - f2;		    product1 = Bilinear (B, A, a1);		}		else if (x2 <= f2 && B == K && B != I)	// close to D		{		    a1 = f2 - x2;		    product1 = Bilinear (B, D, a1);		}		else if (y2 >= x1)	// close to A		{		    a1 = y2 - x1;		    product1 = Bilinear (B, A, a1);		}		else if (y2 <= x1)	// close to D		{		    a1 = x1 - y2;		    product1 = Bilinear (B, D, a1);		}	    }	    /*3*/	    else	    {		product1 = Bilinear4 (A, B, C, D, x1, y1);	    }//end First Pixel	    *(uint32 *) dP = product1;	    dP += 2;	    w += dw;	}	dstPtr += dstPitch;    }}#endif

⌨️ 快捷键说明

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