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

📄 cdib_vc.cpp

📁 CONAXCA的源代码
💻 CPP
字号:
// CDIB.cpp: implementation of the CDIB class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "VcImage.h"
#include "CDib_VC.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDIB::CDIB()
{

}

CDIB::~CDIB()
{

}

CDIB::CDIB(BYTE *m_lpdib)
{
   BITMAPINFOHEADER *lpbih;

   lpbi=(BITMAPINFO *) m_lpdib;

   lpbih=&(lpbi->bmiHeader);
   wid=lpbih->biWidth;
   hei=lpbih->biHeight;
   bits=lpbih->biBitCount;
   bpl=((long)wid*bits+31)/32*4;
   bpp=(bits+1)/8;

   colors=1<<lpbih->biBitCount;
   if(lpbih->biBitCount>8)   colors=0;
   else if(lpbih->biClrUsed!=0) 
		colors=lpbih->biClrUsed;

   lpbits=&m_lpdib[sizeof(BITMAPINFOHEADER)+
		                 colors*sizeof(RGBQUAD)];
}

CDIB::CDIB(BITMAPINFO *m_lpbi,BYTE *m_lpbits)
{
   BITMAPINFOHEADER *lpbih;

   lpbi=m_lpbi;		
   lpbits=m_lpbits;

   lpbih=&(lpbi->bmiHeader);
   wid=lpbih->biWidth;
   hei=lpbih->biHeight;
   bits=lpbih->biBitCount;
   bpl=((long)wid*bits+31)/32*4;
   bpp=(bits+1)/8;
   colors=1<<lpbih->biBitCount;
   if(lpbih->biBitCount>8)   colors=0;
   else if(lpbih->biClrUsed!=0) 
		colors=lpbih->biClrUsed;
}

BYTE* CDIB::DibAddress(int x,int y)
{
   BYTE   *lp;
   DWORD  le;
   int    yy;
 
   if (bits<8)  return 0;
   if ((x<0)||(y<0)||(x>=wid)||(y>=hei)) return 0;
   yy = hei-1-y;
   le = (DWORD) bpl*yy+bpp*x;
   lp = (BYTE *) lpbits + le;
   return(lp);
}

DWORD CDIB::pixel(int x,int y,DWORD c)
{
   BYTE   *lp;
   DWORD  dd=0;

   lp = DibAddress(x,y);
   if (lp==NULL) return 0;
   if (c==0xffffffff) {
      memcpy(&dd,lp,bpp);
   }
   else {  
	  memcpy(lp,&c,bpp);
   }
   return(dd);
}

DWORD CDIB::getpixel(int x,int y)
{
   return(pixel(x,y,(DWORD)0xffffffff));
}

void  CDIB::setpixel(int x,int y,DWORD c)
{
   pixel(x,y,c);
}

void  CDIB::getset(int x,int y,int Dx,int Dy,BYTE *buf,int flag)
{
   BYTE  *lp;
   int   i,dw,dh,delta=0;

   if ((bits<8)||(x+Dx<=0)) return;
   if (x<0) {                                             //  左边越界
      delta=-x;    x=0;
   }
   if ((x<0)||(y<0)||(x>=wid)||(y>=hei)) return;
   Dx *= bpp;                        //  像素地址转换成字节地址
   delta *= bpp;                           //  左边不显示的部分
   dw=min(Dx,(int) bpl-bpp*x);    
   dh=min(Dy,(int) hei-y);
   buf += delta;                        //  调整输入输出像素数据首地址
   dw  -= delta;                                  //  调整实际显示宽度
   lp = DibAddress(x,y);
   for (i=0;i<dh;i++) {
      if (flag==0) {
         memcpy(lp,buf,dw);                               //  写入数据
      }
      else {
         memcpy(buf,lp,dw);                               //  读出数据
	  }
      buf += Dx;	lp -= bpl;
   }
}

void  CDIB::getimage(int x,int y,int Dx,int Dy,BYTE *buf)
{
   getset(x,y,Dx,Dy,buf,1);
}

void  CDIB::setimage(int x,int y,int Dx,int Dy,BYTE *buf)
{
   getset(x,y,Dx,Dy,buf,0);
}

void  CDIB::setwin(int x,int y,int Dx,int Dy,DWORD color)
{
   int    i,dw,dh,k,len;
   BYTE*  buf;

   if (bits<8) return;
   if ((x<0)||(y<0)||(x>=wid)||(y>=hei)) return;
   Dx *= bpp;
   dw=min(Dx,(int) bpl-x*bpp);   
   dh=min(Dy,(int) hei-y);
   dw/=bpp;
   if (dw==bpp) len=dh;
   else         len=dw;

   buf=(BYTE*)malloc(len*bpp);
   if (bpp==1)  memset(buf,(BYTE)color,len);
   else {
	  for (i=0,k=0;i<len;i++,k+=bpp)
	     memcpy(&buf[k],&color,bpp);
   }
   if (dw==bpp)
	  setimage(x,y,1,dh,(BYTE*) buf);
   else {
	  for (i=0;i<dh;i++) {
		 setimage(x,y+i,dw,1,(BYTE*) buf);
	  }
   }
   free(buf);
}

void  CDIB::getpalette(int n,int *pr,int *pg,int *pb)
{
   BYTE *hpal;

   if (bits>8)  return;
   hpal=(BYTE *) lpbi + sizeof(BITMAPINFOHEADER);
   *pb=hpal[4*n];
   *pg=hpal[4*n+1];
   *pr=hpal[4*n+2];
}

void  CDIB::setpalette(int n,int r,int g,int b)
{
   BYTE *hpal;

   if (bits>8)  return;
   hpal=(BYTE *) lpbi + sizeof(BITMAPINFOHEADER);
   hpal[4*n]  =(BYTE) b;
   hpal[4*n+1]=(BYTE) g;
   hpal[4*n+2]=(BYTE) r;
}

int  CDIB::GetWidth(void)
{
   return(wid);
}

int  CDIB::GetHeight(void)
{
   return(hei);
}

int  CDIB::GetBitCount(void)
{
   return(bits);
}

int  CDIB::GetBytesPerLine(void)
{
   return(bpl);
}

int  CDIB::GetBytesPerPixel(void)
{
   return(bpp);
}

int  CDIB::GetColors(void)
{
   return(colors);
}

long CDIB::GetSize(void)
{
   return((long) bpl*hei);
}

COLORREF DWORD2CLRREF(DWORD c)
{
   BYTE		i;
   union    COLOR {
      DWORD     color;
      COLORREF  clrref;
      BYTE		c[4];
   } col;

   col.color=c;
   i=col.c[0];		col.c[0]=col.c[2];
   col.c[2]=i;
   return(col.clrref);
}

DWORD CLRREF2DWORD(COLORREF colorref)
{
   BYTE		i;
   union	COLOR {
      DWORD     color;
      COLORREF  clrref;
      BYTE		c[4];
   } col;

   col.clrref=colorref;
   i=col.c[0];		col.c[0]=col.c[2];
   col.c[2]=i;
   return(col.color);
}

DWORD BGR(int b,int g,int r)
{
   DWORD rr,gg,bb;

   rr=r;        gg=g;
   bb=b;
   bb=bb+(gg<<8)+(rr<<16);
   return(bb);
}

⌨️ 快捷键说明

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