win32context.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 2,636 行 · 第 1/5 页

CPP
2,636
字号
			}			if ( xfrmedImageRect.top_ > vert_y ) {				xfrmedImageRect.top_ = vert_y;			}			if ( xfrmedImageRect.bottom_ < vert_y ) {				xfrmedImageRect.bottom_ = vert_y;			}			cmd = xfrmedImgPath.vertex(&vert_x, &vert_y);		}		xfrmedImageRect.offset( xx, yy );		xfrmedImageRect.inflate( 2, 2 );		double imageTX = imageBounds->getWidth()/2.0;		double imageTY = imageBounds->getHeight()/2.0;		double xfrmImageTX = xfrmedImageRect.getWidth()/2.0;		double xfrmImageTY = xfrmedImageRect.getHeight()/2.0;		agg::trans_affine pathMat2;		pathMat2 *= agg::trans_affine_translation( -imageTX, -imageTY );		pathMat2 *= agg::trans_affine_rotation( Math::degreesToRadians( context_->getRotation() ) );		pathMat2 *= agg::trans_affine_scaling( context_->getScaleX(), context_->getScaleY() );		pathMat2 *= agg::trans_affine_skewing( Math::degreesToRadians(context_->getShearX()),										Math::degreesToRadians(context_->getShearY()) );		pathMat2 *= agg::trans_affine_translation( xfrmImageTX, xfrmImageTY );		agg::conv_transform< agg::path_storage > xfrmedImgPath2(imagePath,pathMat2);		HBitmap32Bit hbmp;		size_t hbmpWidth = xfrmedImageRect.getWidth();		size_t hbmpHeight = xfrmedImageRect.getHeight();		//we can't get rid of this be cause we		//need it for the SetDIBitsToDevice		//call		BITMAPINFO bmpInfo;		memset( &bmpInfo, 0, sizeof(BITMAPINFO) );		bmpInfo.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);		bmpInfo.bmiHeader.biWidth = (long)xfrmedImageRect.getWidth();		bmpInfo.bmiHeader.biHeight = (long)-xfrmedImageRect.getHeight(); // Win32 DIB are upside down - do this to filp it over		bmpInfo.bmiHeader.biPlanes = 1;		bmpInfo.bmiHeader.biBitCount = 32;		bmpInfo.bmiHeader.biCompression = BI_RGB;		bmpInfo.bmiHeader.biSizeImage = (-bmpInfo.bmiHeader.biHeight) * bmpInfo.bmiHeader.biWidth * 4;		SysPixelType* bmpBuf = NULL;		hbmp.setSize( hbmpWidth, hbmpHeight );		bmpBuf = (SysPixelType*) hbmp.data();		safeToRender = (hbmp != NULL) ? true : false;		if ( safeToRender ) {			BitBlt( hbmp.dc(), 0, 0, hbmpWidth, hbmpHeight,					dc_, xfrmedImageRect.left_, xfrmedImageRect.top_, SRCCOPY );			agg::rendering_buffer xfrmImgRenderBuf;			xfrmImgRenderBuf.attach( (unsigned char*)bmpBuf, hbmpWidth,										hbmpHeight,	hbmpWidth * 4 );			pixfmt pixf(xfrmImgRenderBuf);			RendererBase rb(pixf);			SolidRenderer srcImageRenderer(rb);			agg::trans_affine imageMat;			imageMat *= agg::trans_affine_translation( -imageTX, -imageTY );			imageMat *= agg::trans_affine_rotation( Math::degreesToRadians( context_->getRotation() ) );			imageMat *= agg::trans_affine_scaling( context_->getScaleX(), context_->getScaleY() );			imageMat *= agg::trans_affine_skewing( Math::degreesToRadians(context_->getShearX()),											Math::degreesToRadians(context_->getShearY()) );			imageMat *= agg::trans_affine_translation( xfrmImageTX, xfrmImageTY );			imageMat.invert();			SpanAllocator spanAllocator;			SpanInterpolator interpolator(imageMat);			image->getImageBits()->attachRenderBuffer( image->getWidth(), image->getHeight() );			pixfmt imgPixf(*image->getImageBits()->renderBuffer_);			SpanGenerator spanGen(//spanAllocator,							 imgPixf,							 agg::rgba(0, 0, 0, 0.0),							 interpolator);			RendererType imageRenderer(rb);			agg::rasterizer_scanline_aa<> rasterizer;			agg::scanline_u8 scanLine;			rasterizer.add_path(xfrmedImgPath2);			agg::render_scanlines_aa(rasterizer, scanLine, rb, spanAllocator, spanGen );			SetDIBitsToDevice( dc_,								(long)xfrmedImageRect.left_,								(long)xfrmedImageRect.top_,								(long)xfrmedImageRect.getWidth(),								(long)xfrmedImageRect.getHeight(),								0,								0,								0,								(long)xfrmedImageRect.getHeight(),								bmpBuf,								&bmpInfo,								DIB_RGB_COLORS );		}	}	else {		Win32Image* win32image = (Win32Image*)(image);		if ( NULL != win32image ){			//HDC bmpDC = win32image->getDC();			ImageBits* bits = win32image->getImageBits();			HPALETTE oldPalette = NULL;			if ( NULL != win32image->palette_ ){				oldPalette = ::SelectPalette( dc_, win32image->palette_, FALSE );				::RealizePalette( dc_ );			}			BITMAPINFO bmpInfo;			memset( &bmpInfo, 0, sizeof(BITMAPINFO) );			//memset( &bmpInfo.bmiHeader, 0, sizeof (BITMAPINFOHEADER) );			bmpInfo.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);			bmpInfo.bmiHeader.biWidth = (long)imageBounds->getWidth();			bmpInfo.bmiHeader.biHeight = (long)-imageBounds->getHeight(); // Win32 DIB are upside down - do this to filp it over			bmpInfo.bmiHeader.biPlanes = 1;			bmpInfo.bmiHeader.biBitCount = 32;			bmpInfo.bmiHeader.biCompression = BI_RGB;			bmpInfo.bmiHeader.biSizeImage = (bmpInfo.bmiHeader.biHeight) * bmpInfo.bmiHeader.biWidth * 4;			SysPixelType* bmpBuf = NULL;			SysPixelType* tmpBmpBuf = NULL;			HBITMAP hbmp = CreateDIBSection ( dc_, &bmpInfo, DIB_RGB_COLORS, (void**)&bmpBuf, NULL, NULL );			SysPixelType* imageBuf = image->getImageBits()->pixels_;			if ( NULL != hbmp ) {				int incr = (long)((imageBounds->top_ * image->getWidth()) + imageBounds->left_);				imageBuf += incr;				tmpBmpBuf = bmpBuf;				int imgWidth = image->getWidth();				int wIncr = (long)imageBounds->getWidth();				int s = (int)imageBounds->top_;				int e = (int)imageBounds->bottom_;				for (int y1=s;y1<e;y1++) {					int xIndex = 0;					for ( xIndex=0;xIndex<wIncr;xIndex++ ) {						tmpBmpBuf[xIndex].r = imageBuf[xIndex].r;						tmpBmpBuf[xIndex].g = imageBuf[xIndex].g;						tmpBmpBuf[xIndex].b = imageBuf[xIndex].b;						tmpBmpBuf[xIndex].a = 0; //JC don't use the alpha val here it mucks												//up the transparent drawing code.												//we can replace this once we add in real transparency					}					tmpBmpBuf += wIncr;					imageBuf += imgWidth;				}				if ( true == image->isTransparent() )  {					Color* imageTransColor = image->getTransparencyColor();					COLORREF transColor = RGB( imageTransColor->getRed()*255,						imageTransColor->getGreen()*255,						imageTransColor->getBlue()*255 );					Win32Context::drawTransparentBitmap( dc_, hbmp, (short)x, (short)y, transColor );				}				else {					SetDIBitsToDevice( dc_,										(long)x,										(long)y,										(long)imageBounds->getWidth(),										(long)imageBounds->getHeight(),										0,										0,										0,										(long)imageBounds->getHeight(),										bmpBuf,										&bmpInfo,										DIB_RGB_COLORS );				}				DeleteObject( hbmp );			}			if ( NULL != oldPalette ){				::SelectPalette( dc_, oldPalette, FALSE );			}		}		else {			throw InvalidImage( "Image Peer is not usable under MS Windows" );		}	}	//releaseHandle();}void Win32Context::drawImageAGG(  const double& x, const double& y, Rect* imageBounds, Image* image ){	Matrix2D& currentXFrm = *context_->getCurrentTransform();	agg::path_storage imagePath;	imagePath.move_to( imageBounds->left_, imageBounds->top_ );	imagePath.line_to( imageBounds->right_, imageBounds->top_ );	imagePath.line_to( imageBounds->right_, imageBounds->bottom_ );	imagePath.line_to( imageBounds->left_, imageBounds->bottom_ );	imagePath.close_polygon();	bool safeToRender = true;	BITMAPINFO bmpInfo;	memset( &bmpInfo, 0, sizeof(BITMAPINFO) );	bmpInfo.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);	bmpInfo.bmiHeader.biPlanes = 1;	bmpInfo.bmiHeader.biBitCount = 32;	bmpInfo.bmiHeader.biCompression = BI_RGB;	int destLeft = 0;	int destTop = 0;	agg::rasterizer_scanline_aa<> rasterizer;	agg::scanline_u8 scanLine;	SysPixelType* bmpBuf = NULL;	//HDC memDC = ::CreateCompatibleDC( NULL );	HBitmap32Bit hbmp;	HBITMAP oldBMP = NULL;	agg::rendering_buffer imgRenderBuf;	Rect xfrmedImageRect = *imageBounds;	bool defaultXFrm = false;//context_->isDefaultTransform();	if ( !defaultXFrm ) {		double xx = x * (currentXFrm[Matrix2D::mei00]) +							y * (currentXFrm[Matrix2D::mei10]) +								(currentXFrm[Matrix2D::mei20]);		double yy = x * (currentXFrm[Matrix2D::mei01]) +							y * (currentXFrm[Matrix2D::mei11]) +								(currentXFrm[Matrix2D::mei21]);		agg::trans_affine pathMat;		pathMat *= agg::trans_affine_rotation( Math::degreesToRadians( context_->getRotation() ) );		pathMat *= agg::trans_affine_scaling( context_->getScaleX(), context_->getScaleY() );		pathMat *= agg::trans_affine_skewing( Math::degreesToRadians(context_->getShearX()),										Math::degreesToRadians(context_->getShearY()) );		agg::conv_transform< agg::path_storage > xfrmedImgPath(imagePath,pathMat);		double vert_x, vert_y;		xfrmedImgPath.vertex( &vert_x, &vert_y );		Point p1(vert_x, vert_y );		xfrmedImgPath.vertex( &vert_x, &vert_y );		Point p2(vert_x, vert_y );		if ( p2.x_ > p1.x_ ) {			xfrmedImageRect.left_ = p1.x_;		}		else {			xfrmedImageRect.left_ = p2.x_;		}		if ( p1.x_ < p2.x_ ) {			xfrmedImageRect.right_ = p2.x_;		}		else {			xfrmedImageRect.right_ = p1.x_;		}		if ( p2.y_ > p1.y_ ) {			xfrmedImageRect.top_ = p1.y_;		}		else {			xfrmedImageRect.top_ = p2.y_;		}		if ( p1.y_ < p2.y_ ) {			xfrmedImageRect.bottom_ = p2.y_;		}		else {			xfrmedImageRect.bottom_ = p1.y_;		}		unsigned cmd = xfrmedImgPath.vertex(&vert_x, &vert_y);		while(!agg::is_stop(cmd)) {			if ( xfrmedImageRect.left_ > vert_x ) {				xfrmedImageRect.left_ = vert_x;			}			if ( xfrmedImageRect.right_ < vert_x ) {				xfrmedImageRect.right_ = vert_x;			}			if ( xfrmedImageRect.top_ > vert_y ) {				xfrmedImageRect.top_ = vert_y;			}			if ( xfrmedImageRect.bottom_ < vert_y ) {				xfrmedImageRect.bottom_ = vert_y;			}			cmd = xfrmedImgPath.vertex(&vert_x, &vert_y);		}		xfrmedImageRect.offset( xx, yy );		//xfrmedImageRect.inflate( 2, 2 );		double imageTX = imageBounds->getWidth()/2.0;		double imageTY = imageBounds->getHeight()/2.0;		double xfrmImageTX = xfrmedImageRect.getWidth()/2.0;		double xfrmImageTY = xfrmedImageRect.getHeight()/2.0;		agg::trans_affine pathMat2;		pathMat2 *= agg::trans_affine_translation( -imageTX, -imageTY );		pathMat2 *= agg::trans_affine_rotation( Math::degreesToRadians( context_->getRotation() ) );		pathMat2 *= agg::trans_affine_scaling( context_->getScaleX(), context_->getScaleY() );		pathMat2 *= agg::trans_affine_skewing( Math::degreesToRadians(context_->getShearX()),										Math::degreesToRadians(context_->getShearY()) );		pathMat2 *= agg::trans_affine_translation( xfrmImageTX, xfrmImageTY );		agg::conv_transform< agg::path_storage > xfrmedImgPath2(imagePath,pathMat2);		bmpInfo.bmiHeader.biWidth = (long)xfrmedImageRect.getWidth();		bmpInfo.bmiHeader.biHeight = (long)-xfrmedImageRect.getHeight(); // Win32 DIB are upside down - do this to filp it over		bmpInfo.bmiHeader.biSizeImage = (-bmpInfo.bmiHeader.biHeight) * bmpInfo.bmiHeader.biWidth * 4;		hbmp.setSize( bmpInfo.bmiHeader.biWidth, -bmpInfo.bmiHeader.biHeight );		bmpBuf = (SysPixelType*) hbmp.data();		//hbmp = CreateDIBSection ( memDC, &bmpInfo, DIB_RGB_COLORS, (void**)&bmpBuf, NULL, NULL );		safeToRender = (hbmp != NULL) ? true : false;		if ( safeToRender ) {			//HBITMAP oldBMP = (HBITMAP)SelectObject( memDC, hbmp );			BitBlt( hbmp.dc(), 0, 0, bmpInfo.bmiHeader.biWidth, -bmpInfo.bmiHeader.biHeight,					dc_, xfrmedImageRect.left_, xfrmedImageRect.top_, SRCCOPY );			imgRenderBuf.attach( (unsigned char*)bmpBuf, bmpInfo.bmiHeader.biWidth,										-bmpInfo.bmiHeader.biHeight,										bmpInfo.bmiHeader.biWidth * 4 );			pixfmt pixf(imgRenderBuf);			RendererBase rb(pixf);			agg::trans_affine imageMat;			imageMat *= agg::trans_affine_translation( -imageTX, -imageTY );			imageMat *= agg::trans_affine_rotation( Math::degreesToRadians( context_->getRotation() ) );			imageMat *= agg::trans_affine_scaling( context_->getScaleX(), context_->getScaleY() );			imageMat *= agg::trans_affine_skewing( Math::degreesToRadians(context_->getShearX()),											Math::degreesToRadians(context_->getShearY()) );			imageMat *= agg::trans_affine_translation( xfrmImageTX, xfrmImageTY );			imageMat.invert();			SpanAllocator spanAllocator;			SpanInterpolator interpolator(imageMat);			agg::rendering_buffer tmpImgRenderBuf;			tmpImgRenderBuf.attach( (unsigned char*)image->getData(),									image->getWidth(),									image->getHeight(),									image->getWidth() * image->getType() );			pixfmt tmpPixf(tmpImgRenderBuf);			SpanGenerator spanGen(//spanAllocator,							 tmpPixf,							 agg::rgba(0, 0, 0, 0.0),							 interpolator);			RendererType imageRenderer(rb);			rasterizer.add_path(xfrmedImgPath2);			agg::render_scanlines_aa(rasterizer, scanLine, rb, spanAllocator, spanGen );		}	}	else {		bmpInfo.bmiHeader.biWidth = (long)xfrmedImageRect.getWidth();		bmpInfo.bmiHeader.biHeight = (long)-xfrmedImageRect.getHeight(); // Win32 DIB are upside down - do this to filp it over		bmpInfo.bmiHeader.biSizeImage = (-bmpInfo.bmiHeader.biHeight) * bmpInfo.bmiHeader.biWidth * 4;		hbmp.setSize( bmpInfo.bmiHeader.biWidth, -bmpInfo.bmiHeader.biHeight ); // = CreateDIBSection ( memDC, &bmpInfo, DIB_RGB_COLORS, (void**)&bmpBuf, NULL, NULL );		bmpBuf = (SysPixelType*)hbmp.data();		safeToRender = (hbmp != NULL) ? true : false;		if ( safeToRender ) {			//HBITMAP oldBMP = (HBITMAP)SelectObject( memDC, hbmp );			//BitBlt( hbmp.dc(), 0, 0, bmpInfo.bmiHeader.biWidth, -bmpInfo.bmiHeader.biHeight,			//		dc_, xfrmedImageRect.left_, xfrmedImageRect.top_, SRCCOPY );			imgRenderBuf.attach( (unsigned char*)bmpBuf, bmpInfo.bmiHeader.biWidth,										-bmpInfo.bmiHeader.biHeight,										bmpInfo.bmiHeader.biWidth * 4 );			agg::trans_affine imageMat = agg::trans_affine_translation(x, y);			imageMat.invert();			pixfmt pixf(imgRenderBuf);			RendererBase rb(pixf);			SpanAllocator spanAllocator;			SpanInterpolator interpolator(imageMat);			agg::rendering_buffer tmpImgRenderBuf;			tmpImgRenderBuf.attach( (unsigned char*)image->getData(),									image->getWidth(),									image->getHeight(),									image->getWidth() * image->getType() );			pixfmt tmpPixf(tmpImgRenderBuf);			//image->getImageBits()->attachRenderBuffer( image->getWidth(), image->getHeight() );			SpanGenerator spanGen(//spanAllocator,							 tmpPixf,							 agg::rgba(0, 234, 0, 0.0),							 interpolator);			RendererType imageRenderer(rb);			rasterizer.add_path(imagePath);			agg::render_scanlines_aa(rasterizer, scanLine, rb, spanAllocator, spanGen );		}	}	if ( safeToRender ) {		SetDIBitsToDevice( dc_,								(long)xfrmedImageRect.left_,								(long)xfrmedImageRect.top_,								(long)xfrmedImageRect.getWidth(),								(long)xfrmedImageRect.getHeight(),								0,								0,								0,								(long)xfrmedImageRect.getHeight(),								bmpBuf,								&bmpInfo,								DIB_RGB_COLORS );		//SelectObject( memDC, oldBMP );		//DeleteObject( hbmp );		//DeleteDC( memDC );	}}

⌨️ 快捷键说明

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