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

📄 dib.cpp

📁 用Visual C++编写的查看磁盘信息的工具
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	// Do FillGlass
	while ( dy-- )
	{
		for ( int i=0; i<dx; i++ )
		{
			dst[0]=(BYTE)(((B-dst[0])*A+(dst[0]<<8))>>8);
			dst[1]=(BYTE)(((G-dst[1])*A+(dst[1]<<8))>>8);
			dst[2]=(BYTE)(((R-dst[2])*A+(dst[2]<<8))>>8);	
			dst+=4;
		}
		dst+=(m_Size.cx-dx)<<2;
	}
}

void CDib::FillStippledGlassRect ( int x, int y, int w, int h, int R, int G, int B )
{
	// Clip Rect
	int px=(x>=0) ? x : 0;
	int py=(y>=0) ? y : 0;
	int dx=((x+w)<m_Size.cx) ? w : m_Size.cx-x;
	int dy=((y+h)<m_Size.cy) ? h : m_Size.cy-y;
	dx=(x>=0) ? dx : dx + x;
	dy=(y>=0) ? dy : dy + y;

	// If Nothing to FillStippledGlass return
	if ( (dx<=0) || (dy<=0) )
		return;

	// Prepare Buffer Address
	COLORREF *dst=m_Bits+(py*m_Size.cx)+px;
	COLORREF Color=RGB ( B, G, R );

	// Do FillStippledGlass
	for ( int j=0; j<dy; j++ )
	{
		for ( int i=0; i<dx; i++ )
		{
			dst[i]=((i+j)&0x1) ? dst[i] : Color;	
		}
		dst+=m_Size.cx;
	}
}

void CDib::BlendRect ( CDib *Dib, int x, int y, int A )
{
	// Clip Rect
	int px=(x>=0) ? x : 0;
	int py=(y>=0) ? y : 0;
	int dx=((x+Dib->m_Size.cx)<m_Size.cx) ? Dib->m_Size.cx : m_Size.cx-x;
	int dy=((y+Dib->m_Size.cy)<m_Size.cy) ? Dib->m_Size.cy : m_Size.cy-y;
	dx=(x>=0) ? dx : dx + x;
	dy=(y>=0) ? dy : dy + y;

	// If Nothing to Blend return
	if ( (dx<=0) || (dy<=0) )
		return;

	// Prepare Buffer Addresses
	BYTE *src=(BYTE *)Dib->m_Bits+(((py-y)*Dib->m_Size.cx)+px-x)*4;
	BYTE *dst=(BYTE *)m_Bits+((py*m_Size.cx)+px)*4;

	// Do Blend
	while ( dy-- )
	{
		for ( int i=0; i<dx; i++ )
		{
			dst[0]=(BYTE)(((src[0]-dst[0])*A+(dst[0]<<8))>>8);
			dst[1]=(BYTE)(((src[1]-dst[1])*A+(dst[1]<<8))>>8);
			dst[2]=(BYTE)(((src[2]-dst[2])*A+(dst[2]<<8))>>8);	
			dst+=4;
			src+=4;
		}
		dst+=(m_Size.cx-dx)<<2;
		src+=(Dib->m_Size.cx-dx)<<2;
	}
}

void CDib::DarkenRect ( CDib *Dib, int x, int y )
{
	// Clip Rect
	int px=(x>=0) ? x : 0;
	int py=(y>=0) ? y : 0;
	int dx=((x+Dib->m_Size.cx)<m_Size.cx) ? Dib->m_Size.cx : m_Size.cx-x;
	int dy=((y+Dib->m_Size.cy)<m_Size.cy) ? Dib->m_Size.cy : m_Size.cy-y;
	dx=(x>=0) ? dx : dx + x;
	dy=(y>=0) ? dy : dy + y;

	// If Nothing to Darken return
	if ( (dx<=0) || (dy<=0) )
		return;

	// Prepare Buffer Addresses
	BYTE *src=(BYTE *)Dib->m_Bits+(((py-y)*Dib->m_Size.cx)+px-x)*4;
	BYTE *dst=(BYTE *)m_Bits+((py*m_Size.cx)+px)*4;

	// Do Darken
	while ( dy-- )
	{
		for ( int i=0; i<dx; i++ )
		{
			dst[0]=(BYTE)((src[0]<dst[0]) ? src[0] : dst[0]);
			dst[1]=(BYTE)((src[1]<dst[1]) ? src[1] : dst[1]);
			dst[2]=(BYTE)((src[2]<dst[2]) ? src[2] : dst[2]);	
			dst+=4;
			src+=4;
		}
		dst+=(m_Size.cx-dx)<<2;
		src+=(Dib->m_Size.cx-dx)<<2;
	}
}

void CDib::DifferenceRect ( CDib *Dib, int x, int y )
{
	// Clip Rect
	int px=(x>=0) ? x : 0;
	int py=(y>=0) ? y : 0;
	int dx=((x+Dib->m_Size.cx)<m_Size.cx) ? Dib->m_Size.cx : m_Size.cx-x;
	int dy=((y+Dib->m_Size.cy)<m_Size.cy) ? Dib->m_Size.cy : m_Size.cy-y;
	dx=(x>=0) ? dx : dx + x;
	dy=(y>=0) ? dy : dy + y;

	// If Nothing to Difference return
	if ( (dx<=0) || (dy<=0) )
		return;

	// Prepare Buffer Addresses
	BYTE *src=(BYTE *)Dib->m_Bits+(((py-y)*Dib->m_Size.cx)+px-x)*4;
	BYTE *dst=(BYTE *)m_Bits+((py*m_Size.cx)+px)*4;

	// Do Difference
	while ( dy-- )
	{
		for ( int i=0; i<dx; i++ )
		{
			int Difference;
			Difference=src[0]-dst[0];
			dst[0]=(BYTE)((Difference<0) ? -Difference : Difference);
			Difference=src[1]-dst[1];
			dst[1]=(BYTE)((Difference<0) ? -Difference : Difference);
			Difference=src[2]-dst[2];
			dst[2]=(BYTE)((Difference<0) ? -Difference : Difference);	
			dst+=4;
			src+=4;
		}
		dst+=(m_Size.cx-dx)<<2;
		src+=(Dib->m_Size.cx-dx)<<2;
	}
}

void CDib::LightenRect ( CDib *Dib, int x, int y )
{
	// Clip Rect
	int px=(x>=0) ? x : 0;
	int py=(y>=0) ? y : 0;
	int dx=((x+Dib->m_Size.cx)<m_Size.cx) ? Dib->m_Size.cx : m_Size.cx-x;
	int dy=((y+Dib->m_Size.cy)<m_Size.cy) ? Dib->m_Size.cy : m_Size.cy-y;
	dx=(x>=0) ? dx : dx + x;
	dy=(y>=0) ? dy : dy + y;

	// If Nothing to Lighten return
	if ( (dx<=0) || (dy<=0) )
		return;

	// Prepare Buffer Addresses
	BYTE *src=(BYTE *)Dib->m_Bits+(((py-y)*Dib->m_Size.cx)+px-x)*4;
	BYTE *dst=(BYTE *)m_Bits+((py*m_Size.cx)+px)*4;

	// Do Lighten
	while ( dy-- )
	{
		for ( int i=0; i<dx; i++ )
		{
			dst[0]=(BYTE)((src[0]>dst[0]) ? src[0] : dst[0]);
			dst[1]=(BYTE)((src[1]>dst[1]) ? src[1] : dst[1]);
			dst[2]=(BYTE)((src[2]>dst[2]) ? src[2] : dst[2]);
			dst+=4;
			src+=4;
		}
		dst+=(m_Size.cx-dx)<<2;
		src+=(Dib->m_Size.cx-dx)<<2;
	}
}

void CDib::MultiplyRect ( CDib *Dib, int x, int y )
{
	// Clip Rect
	int px=(x>=0) ? x : 0;
	int py=(y>=0) ? y : 0;
	int dx=((x+Dib->m_Size.cx)<m_Size.cx) ? Dib->m_Size.cx : m_Size.cx-x;
	int dy=((y+Dib->m_Size.cy)<m_Size.cy) ? Dib->m_Size.cy : m_Size.cy-y;
	dx=(x>=0) ? dx : dx + x;
	dy=(y>=0) ? dy : dy + y;

	// If Nothing to Multiply return
	if ( (dx<=0) || (dy<=0) )
		return;

	// Prepare Buffer Addresses
	BYTE *src=(BYTE *)Dib->m_Bits+(((py-y)*Dib->m_Size.cx)+px-x)*4;
	BYTE *dst=(BYTE *)m_Bits+((py*m_Size.cx)+px)*4;

	// Do Multiply
	while ( dy-- )
	{
		for ( int i=0; i<dx; i++ )
		{
			dst[0]=(BYTE)(((src[0])*(dst[0]))>>8);
			dst[1]=(BYTE)(((src[1])*(dst[1]))>>8);
			dst[2]=(BYTE)(((src[2])*(dst[2]))>>8);
			dst+=4;
			src+=4;
		}
		dst+=(m_Size.cx-dx)<<2;
		src+=(Dib->m_Size.cx-dx)<<2;
	}
}

void CDib::ScreenRect ( CDib *Dib, int x, int y )
{
	// Clip Rect
	int px=(x>=0) ? x : 0;
	int py=(y>=0) ? y : 0;
	int dx=((x+Dib->m_Size.cx)<m_Size.cx) ? Dib->m_Size.cx : m_Size.cx-x;
	int dy=((y+Dib->m_Size.cy)<m_Size.cy) ? Dib->m_Size.cy : m_Size.cy-y;
	dx=(x>=0) ? dx : dx + x;
	dy=(y>=0) ? dy : dy + y;

	// If Nothing to Screen return
	if ( (dx<=0) || (dy<=0) )
		return;

	// Prepare Buffer Addresses
	BYTE *src=(BYTE *)Dib->m_Bits+(((py-y)*Dib->m_Size.cx)+px-x)*4;
	BYTE *dst=(BYTE *)m_Bits+((py*m_Size.cx)+px)*4;

	// Do Screen
	while ( dy-- )
	{
		for ( int i=0; i<dx; i++ )
		{
			dst[0]=(BYTE)(255-(((255-src[0])*(255-dst[0]))>>8));
			dst[1]=(BYTE)(255-(((255-src[1])*(255-dst[1]))>>8));
			dst[2]=(BYTE)(255-(((255-src[2])*(255-dst[2]))>>8));
			dst+=4;
			src+=4;
		}
		dst+=(m_Size.cx-dx)<<2;
		src+=(Dib->m_Size.cx-dx)<<2;
	}
}

//////////////////////////////////////////////////////////////////////
// Line Functions
//////////////////////////////////////////////////////////////////////

/*void CDib::Line ( int x1, int y1, int x2, int y2, int R, int G, int B )
{
	int dx, dy, k1, k2, d, x, y;
	COLORREF Color=RGB ( B, G, R );

	dx=x2-x1;
	dy=y2-y1;
	d=(dy<<1)-dx;
	k1=dy<<1;
	k2=(dy-dx)<<1;
	x=x1;
	y=y1;

	m_Bits[y*m_Size.cx+x]=Color;
	while (x<dx) 
	{
		if (d<=0) 
		{
			d+=k1;
			x++;
		} 
		else 
		{
			d+=k2;
			x++;
			y++;
		}
		m_Bits[y*m_Size.cx+x]=Color;
	}
}*/

void CDib::Line ( int x1, int y1, int x2, int y2, int R, int G, int B )
{
	int d, x, y, ax, ay, sx, sy, dx, dy;
	COLORREF Color=RGB ( B, G, R );
	
	dx=x2-x1;
	ax=abs ( dx )<<1;
	sx=(dx<0) ? -1 : 1;
	dy=y2-y1;
	ay=abs ( dy )<<1;
	sy=(dy<0) ? -1 : 1;
	x=x1;
	y=y1;
	
	if ( ax>ay )
	{
		d=ay-(ax>>1);
		while ( x!=x2 )
		{
			m_Bits[y*m_Size.cx+x]=Color;
			if ( d>=0 )
			{
				y+=sy;
				d-=ax;
			}
			x+=sx;
			d+=ay;
		}
	}
	else
	{
		d=ax-(ay>>1);
		while ( y!=y2 )
		{
			m_Bits[y*m_Size.cx+x]=Color;
			if ( d>=0 )
			{
				x+=sx;
				d-=ay;
			}
			y+=sy;
			d+=ax;
		}
	}
}

void CDib::LineGlass ( int x1, int y1, int x2, int y2, int R, int G, int B, int A )
{
	int d, x, y, ax, ay, sx, sy, dx, dy;
	COLORREF Color=RGB ( B, G, R );
	BYTE *dst=(BYTE *)m_Bits;
	
	dx=x2-x1;
	ax=abs ( dx )<<1;
	sx=(dx<0) ? -1 : 1;
	dy=y2-y1;
	ay=abs ( dy )<<1;
	sy=(dy<0) ? -1 : 1;
	x=x1;
	y=y1;
	
	if ( ax>ay )
	{
		d=ay-(ax>>1);
		while ( x!=x2 )
		{
			dst[(y*m_Size.cx+x)<<2]=(BYTE)(((B-dst[(y*m_Size.cx+x)<<2])*A+(dst[(y*m_Size.cx+x)<<2]<<8))>>8);
			dst[((y*m_Size.cx+x)<<2)+1]=(BYTE)(((G-dst[((y*m_Size.cx+x)<<2)+1])*A+(dst[((y*m_Size.cx+x)<<2)+1]<<8))>>8);
			dst[((y*m_Size.cx+x)<<2)+2]=(BYTE)(((R-dst[((y*m_Size.cx+x)<<2)+2])*A+(dst[((y*m_Size.cx+x)<<2)+2]<<8))>>8);
			if ( d>=0 )
			{
				y+=sy;
				d-=ax;
			}
			x+=sx;
			d+=ay;
		}
	}
	else
	{
		d=ax-(ay>>1);
		while ( y!=y2 )
		{
			dst[(y*m_Size.cx+x)<<2]=(BYTE)(((B-dst[(y*m_Size.cx+x)<<2])*A+(dst[(y*m_Size.cx+x)<<2]<<8))>>8);
			dst[((y*m_Size.cx+x)<<2)+1]=(BYTE)(((G-dst[((y*m_Size.cx+x)<<2)+1])*A+(dst[((y*m_Size.cx+x)<<2)+1]<<8))>>8);
			dst[((y*m_Size.cx+x)<<2)+2]=(BYTE)(((R-dst[((y*m_Size.cx+x)<<2)+2])*A+(dst[((y*m_Size.cx+x)<<2)+2]<<8))>>8);
			if ( d>=0 )
			{
				x+=sx;
				d-=ay;
			}
			y+=sy;
			d+=ax;
		}
	}
}

⌨️ 快捷键说明

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