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

📄 drvstrok.cpp

📁 windows ce 3.00 嵌入式操作系统源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				}
				else
				{
					ptfxLast = pd.pptfx[pd.count-1];

					if( ! ( pd.flags & PD_CLOSEFIGURE ) )
						break;
					fx0 = ptfxLast.x;
					fy0 = ptfxLast.y;
					fx1 = ptfxStartFigure.x;
					fy1 = ptfxStartFigure.y;

				}

				DEBUGMSG(GPE_ZONE_LINE,(TEXT("Line Seg %d.%d,%d.%d - %d.%d,%d.%d\r\n"),
					fx0>>4, fx0&0x000f,
					fy0>>4, fy0&0x000f,
					fx1>>4, fx1&0x000f,
					fy1>>4, fy1&0x000f ));

				// Rotate/Flip the line segment into octant 0  ( dX>=0, dY>=0, dX>=dY )
				fl = 0;

//				if( fx1 < fx0 )
//				{
//					// Reverse direction of line to make dX>0
//					SWAP(fx0,fx1,FIX)
//					SWAP(fy0,fy1,FIX)
//					fl |= FL_FLIP_H;
//				}

				if( fx1 < fx0 )
				{
					// Reflect across x=0 to make dX>0
					fx0 = -fx0;
					fx1 = -fx1;
					fl |= FL_FLIP_H;
				}
				
				if( fy1 < fy0 )
				{
					// Reflect across y=0 to make dY>0
					fy0 = -fy0;
					fy1 = -fy1;
					fl |= FL_FLIP_V;
				}

				if( ( fy1 - fy0 ) > ( fx1 - fx0 ) )
				{
					// Reflect across y=x to make dX>=dY
					SWAP(fx0,fy0,FIX)
					SWAP(fx1,fy1,FIX)
					fl |= FL_FLIP_D;
				}

				dM = fx1 - fx0;
				dN = fy1 - fy0;
				
				if( dM == dN )
					fl |= FL_FLIP_SLOPE_ONE;	// take note of 1:1 slope

				// Based on the flips, set FL_H_ROUND_DOWN &/or FL_V_ROUND_DOWN
				fl |= gaflRound[ (fl & FL_ROUND_MASK) >>FL_ROUND_SHIFT];

				x = fx0>>4;
				y = fy0>>4;
				M0 = fx0 & 0x000f;
				N0 = fy0 & 0x000f;

				// Calculate remainder term  [ dM * ( N0 + F/2 ) - M0 * dN ]

				llGamma = (dM * ( N0 + 8 ) - dN * M0 - ((fl&FL_V_ROUND_DOWN)?1:0)) >> 4;
				llBeta = ~llGamma;
				//.... N0,M0 are 0..15 so this is ok if dM,dN < about 8 million pixels

				// Calculate N1,M1 - the fractional part of the line ends
				M1 = ( M0 + dM ) & 0x000f;
				N1 = ( N0 + dN ) & 0x000f;

				// x0,y0..x1,y1 are the integer parts of the line ends where the origin
				// of the line is at 0.M0,0.N0
				// Thus x0, and y0 start off as 0 but may become 1 or 2 based on the exact
				// starting point of the line to be rendered (and whether the last point
				// is excluded)
				
				x1 = ( M0 + dM ) >> 4;
				

//				if( fl & FL_FLIP_H )
//				{
//					// Unflipped line goes right to left so x1,y1 is start
//					x0 = 1;
//					if( N1 == 0 )
//					{
//						if( M1 > ((fl & FL_H_ROUND_DOWN) ? 8 : 7 ) )
//							x1++;
//					}
//					else if ( ((N1<8)?(8-N1):(N1-8)) + M1 > 16 )
//						x1++;
//					if((fl & (FL_FLIP_SLOPE_ONE | FL_H_ROUND_DOWN)) == FL_FLIP_SLOPE_ONE)
//					{
//						if(( N1 > 0 ) && ( M1 == N1+8 ))
//							x1++;
//						if(( N0 > 0 ) && ( M0 == N0+8 ))
//							x0 = 2;
//					}
//					if( x0 != 2 )
//					{
//						if( N0 == 0 )
//						{
//							if( M0 > ((fl & FL_H_ROUND_DOWN) ? 8 : 7 ) )
//								x0 = 2;
//						}
//						else if ( ((N0<8)?(8-N0):(N0-8)) + M0 > 16 )
//							x0 = 2;
//					}
//					ulDelta = ( x0 == 2 ) ? dN : 0;
//
//					ll = llGamma + ulDelta;
//
//					if( ll >= (long)( 2 * dM - dN ) )
//					{
//						y0 = 2;
//					}
//					else if( ll >= (long)( dM - dN ) )
//					{
//						y0 = 1;
//					}
//					else
//					{
//						y0 = 0;
//					}
//					errorTerm=ll;
//					while(errorTerm>0)
//						errorTerm -= dM;
//
//				}
//				else
				{
					// Line is left to right ( x0,y0 is start )

					x1--;

					if( M1 > 0 )
					{
						if( N1 == 0 )
						{
							if( M1 > ((fl & FL_H_ROUND_DOWN) ? 8 : 7 ) )
								x1++;
						}
						else if ( ((N1<8)?(8-N1):(N1-8)) <= M1 )
							x1++;
					}
					x0 = 0;
					if((fl & (FL_FLIP_SLOPE_ONE|FL_H_ROUND_DOWN))
						== (FL_FLIP_SLOPE_ONE|FL_H_ROUND_DOWN))
					{
						if(( M1 > 0 ) && ( N1 == M1+8 ))
							x1--;
						if(( M0 > 0 ) && ( N0 == M0+8 ))
							goto left_to_right_compute_y0;
					}
					if( M0 > 0 )
					{
						if( N0 == 0 )
						{
							if( M0 > ((fl & FL_H_ROUND_DOWN) ? 8 : 7 ) )
								x0 = 1;
						}
						else if ( ((N0<8)?(8-N0):(N0-8)) <= M0 )
							x0 = 1;
					}
					
					left_to_right_compute_y0:

					if( llGamma >= (long)(dM-(dN&(-(long)x0))) )
					{
						errorTerm = llGamma + ( dN & ~(x0-1) ) - 2 * dM;
						y0 = 1;
					}
					else
					{
						errorTerm = llGamma + ( dN & ~(x0-1) ) - dM;
						y0 = 0;
					}

				}


				llGamma = errorTerm;
				llBeta = ~llGamma;

				//  if( ( fl & FL_FLIP_H ) || ( fl & FL_FLIP_D ) || ( fl & FL_FLIP_SLOPE_ONE ) || ( fl & FL_FLIP_V ) )
				// if( ( fl & FL_FLIP_H ) )
				//	continue;

				// Calculate length of unclipped line in pixels for style tracking
				cStylePels = x1 - x0 + 1;
				if( cStylePels <= 0 )
					continue;		// This line segment was too short to be visible!
	

				
				// Normalize cliprect to origin

				prclFlipped = &arclClip[(fl&FL_RECTLCLIP_MASK) >> FL_RECTLCLIP_SHIFT];
				if( fl & FL_FLIP_H )
					prclFlipped += 4;
				xRight = prclFlipped->right - x;
				xLeft = prclFlipped->left - x;
				yTop = prclFlipped->top - y;
				yBottom = prclFlipped->bottom - y;

				// Clip line to cliprect

				DEBUGMSG(GPE_ZONE_LINE,(TEXT("x0,y0=%d,%d x1=%d. Clip: %d,%d - %d,%d.  llGamma = %d, llBeta = %d\r\n"),
					x0,y0,x1, xLeft,yTop,xRight,yBottom, llGamma, llBeta ));

				if( (long)y0 >= yBottom || (long)x0 >= xRight || (long)x1 < xLeft )
					continue;  // totally clipped  ( note, we don't know y1 yet )

				if( (long)x1 >= xRight )
					x1 = xRight - 1;

				if( dM == 0 || dN == 0 )
				{
					DEBUGMSG(GPE_ZONE_LINE,(TEXT("Horizontal or Vertical\r\n")));
					if( (long)x0 < xLeft )
						x0 = (unsigned long)xLeft;
					if( (long)y0 < yTop )
						continue;
					y1 = y0;
				}
				else
				{
#if DEBUGTEMP
					orig_x0 = (int)x0;
					orig_x1 = (int)x1;
					orig_y0 = (int)y0;
#endif

					if( (long)x0 < xLeft )
					{
						y0 = y0 + (unsigned long)( ( xLeft - (long)x0 ) * dN + llGamma + dM ) / dM;
						x0 = (unsigned long)xLeft;
						DEBUGMSG(GPE_ZONE_LINE,(TEXT("new y0 = %d\r\n"),y0));
						if( (long)y0 >= yBottom )
							continue;
					}
#if DEBUGTEMP
					x0_v1 = (int)x0;
					y0_v1 = (int)y0;
#endif


					if( (long)y0 < yTop )
					{
						x0 = 1 + x0 + (unsigned long)( (yTop-(long)y0-1) * dM - llGamma - 1 ) / dN;
						y0 = (unsigned long)yTop;
						DEBUGMSG(GPE_ZONE_LINE,(TEXT("new x0 = %d\r\n"),x0));
						if( (long)x0 >= xRight )
							continue;
					}
#if DEBUGTEMP
					x0_v2 = (int)x0;
					y0_v2 = (int)y0;
#endif


					y1 = y0 + (unsigned long)(((long)( (x1-x0) * dN ) + llGamma + dM ) / dM);

				
#if DEBUGTEMP
					orig_y1 = (int) y1;
#endif

					if( (long)y1 < yTop )
						continue;

					DEBUGMSG(GPE_ZONE_LINE,(TEXT("y1 = %d\r\n"),y1));

					if( (long)y1 >= yBottom )
					{
						y1 = (unsigned long)(yBottom-1);
						x1 = (unsigned long)( x0 + ( (long)( y1 - y0 ) * dM - llGamma - 1 ) / dN );
						if( (long)x1 < xLeft )
							continue;
					}
#if DEBUGTEMP
					x1_v3 = (int)x1;
					y1_v3 = (int)y1;
					dM_v = (int)dM;
					dN_v = (int)dN;
					llGamma_v = (int)llGamma;
#endif
				}
								
				// Unflip the endpoint coordinates

				xStart = x + x0;
				yStart = y + y0;
				if( fl & FL_FLIP_D )
				{
					SWAP( xStart,yStart,LONG )
				}
				if( fl & FL_FLIP_V )
					yStart = -yStart;
				if( fl & FL_FLIP_H )
					xStart = -xStart;

				iDir = ( ( fl & FL_FLIP_V ) ? 7 : 0 ) ^ ( ( fl & FL_FLIP_D ) ? 1 : 0 )  ^ ( ( fl & FL_FLIP_H ) ? 3 : 0 );
				cPels = x1 - x0 + 1;
				if( cPels <= 0 )	// this can happen if line just touches cliprect
					continue;

				DEBUGMSG(GPE_ZONE_LINE,(TEXT("X,Y=%d,%d dM,dN=%d,%d llGamma=%d errorTerm = %d cPels=%d\r\n"),
					xStart,yStart,dM,dN,llGamma,errorTerm,cPels));

				parms.xStart = xStart;
				parms.yStart = yStart;
				parms.cPels = cPels;
				parms.dM = dM;
				parms.dN = dN;
				parms.llGamma = errorTerm;
				parms.iDir = iDir;
				parms.prclClip = prclCurr;

				if( FAILED((pGPE->*(parms.pLine))(&parms)))
				{
					DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvStrokePath\r\n")));
					return FALSE;
				}

				parms.styleState = ( parms.styleState + cStylePels ) & 31;

			}
		} while ( morePointLists );

			}

	pGPE->Line( &parms, gpeComplete );
	return TRUE;
}

⌨️ 快捷键说明

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