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 + -
显示快捷键?