bool GiGraphics::setClipBox(const RECT_2D& rc) { if (m_impl->drawRefcnt < 1) return false; bool ret = false; Box2d rect; if (!rect.intersectWith(Box2d(rc), Box2d(m_impl->clipBox0)).isEmpty()) { if (rect != Box2d(m_impl->clipBox)) { rect.get(m_impl->clipBox); m_impl->rectDraw.set(Box2d(rc)); m_impl->rectDraw.inflate(GiGraphicsImpl::CLIP_INFLATE); m_impl->rectDrawM = m_impl->rectDraw * xf().displayToModel(); m_impl->rectDrawW = m_impl->rectDrawM * xf().modelToWorld(); SafeCall(m_impl->canvas, clipRect(m_impl->clipBox.left, m_impl->clipBox.top, m_impl->clipBox.width(), m_impl->clipBox.height())); } ret = true; } return ret; }
bool GiGraphics::setClipWorld(const Box2d& rectWorld) { bool ret = false; if (isDrawing() && !rectWorld.isEmpty()) { Box2d box (rectWorld * xf().worldToDisplay()); box.intersectWith(Box2d(m_impl->clipBox0)); if (!box.isEmpty(Tol(1, 0))) { if (box != Box2d(m_impl->clipBox)) { box.get(m_impl->clipBox); m_impl->rectDraw = box; m_impl->rectDraw.inflate(GiGraphicsImpl::CLIP_INFLATE); m_impl->rectDrawM = m_impl->rectDraw * xf().displayToModel(); m_impl->rectDrawW = m_impl->rectDrawM * xf().modelToWorld(); SafeCall(m_impl->canvas, _clipBoxChanged(m_impl->clipBox)); } ret = true; } } return ret; }
bool GiCanvasGdipImpl::drawImage(G::Bitmap* pBmp, const Box2d& rectW, bool fast) { RECT_2D rc, rcDraw, rcFrom; Box2d rect; float width = (float)pBmp->GetWidth(); float height = (float)pBmp->GetHeight(); // rc: 整个图像对应的显示坐标区域 (rectW * gs()->xf().worldToDisplay()).get(rc); // rcDraw: 图像经剪裁后的可显示部分 gs()->getClipBox(rcDraw); if (rect.intersectWith(Box2d(rc), Box2d(rcDraw)).isEmpty()) return false; rect.get(rcDraw); // rcFrom: rcDraw在原始图像上对应的图像范围 rcFrom.left = (rcDraw.left - rc.left) * width / (rc.right - rc.left); rcFrom.top = (rcDraw.top - rc.top) * height / (rc.bottom - rc.top); rcFrom.right = (rcDraw.right - rc.left) * width / (rc.right - rc.left); rcFrom.bottom = (rcDraw.bottom - rc.top) * height / (rc.bottom - rc.top); // 根据rectW正负决定是否颠倒显示图像 if (rectW.xmin > rectW.xmax) mgSwap(rcDraw.left, rcDraw.right); if (rectW.ymin > rectW.ymax) mgSwap(rcDraw.top, rcDraw.bottom); G::InterpolationMode nOldMode = getDrawGs()->GetInterpolationMode(); getDrawGs()->SetInterpolationMode( (!fast || gs()->isPrint()) ? G::InterpolationModeBilinear : G::InterpolationModeLowQuality); G::Status ret = getDrawGs()->DrawImage(pBmp, G::RectF(rcDraw.left, rcDraw.top, rcDraw.right - rcDraw.left, rcDraw.bottom - rcDraw.top), rcFrom.left, rcFrom.top, rcFrom.right - rcFrom.left, rcFrom.bottom - rcFrom.top, G::UnitPixel); getDrawGs()->SetInterpolationMode(nOldMode); return G::Ok == ret; }