Пример #1
0
bool GiGraphics::beginPaint(GiCanvas* canvas, const RECT_2D& clipBox)
{
    if (!canvas || m_impl->canvas || isStopping()) {
        return false;
    }
    
    m_impl->canvas = canvas;
    m_impl->ctxused = 0;
    m_impl->stopping = 0;
    
    float phase = fabsf(m_impl->phase);
    m_impl->phase = (phase < 1e4f ? phase + 0.5f : 0.5f) * (m_impl->phase > 0 ? 1.f : -1.f);
    
    if (m_impl->lastZoomTimes != xf().getZoomTimes()) {
        m_impl->zoomChanged();
        m_impl->lastZoomTimes = xf().getZoomTimes();
    }
    
    m_impl->clipBox0 = clipBox;
    if (Box2d(clipBox).isEmpty()) {
        xf().getWndRect().get(m_impl->clipBox0);
    }
    m_impl->clipBox  = m_impl->clipBox0;
    m_impl->rectDraw = m_impl->clipBox0;
    m_impl->rectDraw.inflate(GiGraphicsImpl::CLIP_INFLATE);
    m_impl->rectDrawM = Box2d(m_impl->rectDraw) * xf().displayToModel();
    m_impl->rectDrawMaxM = xf().getWndRectM();
    m_impl->rectDrawW = m_impl->rectDrawM * xf().modelToWorld();
    m_impl->rectDrawMaxW = m_impl->rectDrawMaxM * xf().modelToWorld();
    
    return true;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
bool GiGraphics::beginPaint(GiCanvas* canvas, const RECT_2D& clipBox)
{
    if (!canvas || m_impl->canvas || m_impl->drawRefcnt > 0) {
        return false;
    }
    
    m_impl->canvas = canvas;
    m_impl->ctxused = 0;
    m_impl->stopping = 0;
    giInterlockedIncrement(&m_impl->drawRefcnt);
    
    if (m_impl->lastZoomTimes != xf().getZoomTimes()) {
        m_impl->zoomChanged();
        m_impl->lastZoomTimes = xf().getZoomTimes();
    }
    
    m_impl->clipBox0 = clipBox;
    if (Box2d(clipBox).isEmpty()) {
        (xf().getWndRectW() * xf().worldToDisplay()).get(m_impl->clipBox0);
    }
    m_impl->clipBox  = m_impl->clipBox0;
    m_impl->rectDraw = m_impl->clipBox0;
    m_impl->rectDraw.inflate(GiGraphicsImpl::CLIP_INFLATE);
    m_impl->rectDrawM = Box2d(m_impl->rectDraw) * xf().displayToModel();
    m_impl->rectDrawMaxM = xf().getWndRectM();
    m_impl->rectDrawW = m_impl->rectDrawM * xf().modelToWorld();
    m_impl->rectDrawMaxW = m_impl->rectDrawMaxM * xf().modelToWorld();
    
    return true;
}
Пример #5
0
bool GiCanvasGdi::drawImage(long hmWidth, long hmHeight, HBITMAP hbitmap, 
                            const Box2d& rectW, bool fast)
{
    BOOL ret = FALSE;
    HDC hdc = m_draw->getDrawDC();

    if (hdc != NULL && hmWidth > 0 && hmHeight > 0 && hbitmap != NULL
        && m_owner->getClipWorld().isIntersect(Box2d(rectW, true)))
    {
        RECT_2D clipBox;
        RECT rc, rcDraw, rcFrom;

        // rc: 整个图像对应的显示坐标区域
        (rectW * xf().worldToDisplay()).get(rc);

        // rcDraw: 图像经剪裁后的可显示部分
        Box2d(gs()->getClipBox(clipBox)).get(rcFrom);
        if (!IntersectRect(&rcDraw, &rc, &rcFrom))
            return false;

        long width, height;       // pixel units
        width = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), 2540);
        height = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), 2540);

        // rcFrom: rcDraw在原始图像上对应的图像范围
        rcFrom.left = MulDiv(rcDraw.left - rc.left, width, rc.right - rc.left);
        rcFrom.top = MulDiv(rcDraw.top - rc.top, height, rc.bottom - rc.top);
        rcFrom.right = MulDiv(rcDraw.right - rc.left, width, rc.right - rc.left);
        rcFrom.bottom = MulDiv(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);

        GiCompatibleDC memDC (hdc);
        if (memDC == NULL)
            return false;
        KGDIObject bmp (memDC, hbitmap, false);
        KGDIObject brush (hdc, ::GetStockObject(NULL_BRUSH), false);

        int nBltMode = (!fast || m_owner->isPrint()) ? HALFTONE : COLORONCOLOR;
        int nOldMode = ::SetStretchBltMode(hdc, nBltMode);
        ::SetBrushOrgEx(hdc, rcDraw.left % 8, rcDraw.top % 8, NULL);
        ret = ::StretchBlt(hdc, 
            rcDraw.left, rcDraw.top, 
            rcDraw.right - rcDraw.left, 
            rcDraw.bottom - rcDraw.top, 
            memDC, 
            rcFrom.left, rcFrom.top, 
            rcFrom.right - rcFrom.left, 
            rcFrom.bottom - rcFrom.top, 
            SRCCOPY);
        ::SetStretchBltMode(hdc, nOldMode);
    }

    return ret ? true : false;
}
Пример #6
0
bool GiGraphics::drawBeziers(const GiContext* ctx, int count, 
                             const Point2d* points, bool closed, bool modelUnit)
{
    if (count < 4 || !points || isStopping())
        return false;
    if (count > 0x2000)
        count = 0x2000;
    count = 1 + (count - 1) / 3 * 3;

    bool ret = false;
    vector<Point2d> pxpoints;
    vector<Point2d> pointBuf;
    int i, j, n, si, ei;
    Point2d * pxs;
    Matrix2d matD(S2D(xf(), modelUnit));

    const Box2d extent (count, points);                 // 模型坐标范围
    if (!DRAW_RECT(m_impl, modelUnit).isIntersect(extent))  // 全部在显示区域外
        return false;
    
    if (closed) {
        pxpoints.resize(count);
        pxs = &pxpoints.front();
        for (i = 0; i < count; i++)
            pxs[i] = points[i] * matD;
        ret = rawBeziers(ctx, pxs, count, closed);
    }
    else if (DRAW_MAXR(m_impl, modelUnit).contains(extent)) {   // 全部在显示区域内
        pxpoints.resize(count);
        pxs = &pxpoints.front();
        for (i = 0; i < count; i++)
            pxs[i] = points[i] * matD;
        ret = rawBeziers(ctx, pxs, count);
    } else {
        pointBuf.resize(count);
        for (i = 0; i < count; i++)                 // 转换到像素坐标
            pointBuf[i] = points[i] * matD;
        Point2d* pts = &pointBuf.front();

        for (i = 0; i + 3 < count;) {
            for (; i + 3 < count && !m_impl->rectDraw.isIntersect(Box2d(4, &pts[i])); i += 3) ;
            si = ei = i;
            for (; i + 3 < count && m_impl->rectDraw.isIntersect(Box2d(4, &pts[i])); i += 3)
                ei = i + 3;
            if (ei > si) {
                n = ei - si + 1;
                pxpoints.resize(n);
                pxs = &pxpoints.front();
                for (j=0; j<n; j++)
                    pxs[j] = pts[si + j];
                ret = rawBeziers(ctx, pxs, n);
            }
        }
    }
    return ret;
}
Пример #7
0
float MgEllipse::_hitTest(const Point2d& pt, float tol, MgHitResult& res) const
{
    if (isCircle()) {
        Point2d pt1(getCenter()), pt2(pt);
        crossCircle(pt1, pt2, this);
        float d1 = pt.distanceTo(pt1);
        float d2 = pt.distanceTo(pt2);
        res.nearpt = d1 < d2 ? pt1 : pt2;
        return mgMin(d1, d2);
    }
    
    float distMin = _FLT_MAX;
    const Box2d rect (pt, 2 * tol, 2 * tol);
    Point2d ptTemp;

    for (int i = 0; i < 4; i++) {
        if (rect.isIntersect(Box2d(4, _bzpts + 3 * i))) {
            mgnear::nearestOnBezier(pt, _bzpts + 3 * i, ptTemp);
            float dist = pt.distanceTo(ptTemp);
            if (dist <= tol && dist < distMin) {
                distMin = dist;
                res.nearpt = ptTemp;
                res.segment = i;
            }
        }
    }

    return distMin;
}
Пример #8
0
MgShape* MgCmdManagerImpl::addImageShape(const MgMotion* sender,
        const char* name, float width, float height)
{
    if (!name || *name == 0 || width < 1 || height < 1)
        return NULL;

    Vector2d size(Vector2d(width, height) * sender->view->xform()->displayToWorld());
    while (fabsf(size.x) > 200.f || fabsf(size.y) > 200.f) {
        size *= 0.95f;
    }
    Box2d rect(sender->view->xform()->getWndRectW() + Vector2d(10.f, -10.f));
    rect = Box2d(rect.leftTop(), rect.leftTop() + size);
    rect *= sender->view->xform()->worldToModel();

    MgShapeT<MgImageShape> shape;
    MgImageShape* imagesp = (MgImageShape*)shape.shape();

    shape.context()->setLineStyle(kGiLineNull);         // 默认没有边框
    shape.context()->setFillColor(GiColor::White());    // 设为实填充,避免在中心无法点中
    imagesp->setName(name);
    imagesp->setRect2P(rect.leftTop(), rect.rightBottom());

    MgShapesLock locker(MgShapesLock::Add, sender->view);
    if (sender->view->shapeWillAdded(&shape)) {
        MgShape* newsp = sender->view->shapes()->addShape(shape);
        sender->view->shapeAdded(newsp);

        sender->view->setNewShapeID(newsp->getID());
        sender->view->cancel(sender);

        return newsp;
    }

    return NULL;
}
Пример #9
0
float MgEllipse::_hitTest(const Point2d& pt, float tol, 
                          Point2d& nearpt, int& segment) const
{
    float distMin = _FLT_MAX;
    const Box2d rect (pt, 2 * tol, 2 * tol);
    Point2d ptTemp;

    segment = -1;
    for (int i = 0; i < 4; i++)
    {
        if (rect.isIntersect(Box2d(4, _bzpts + 3 * i)))
        {
            mgNearestOnBezier(pt, _bzpts + 3 * i, ptTemp);
            float dist = pt.distanceTo(ptTemp);
            if (dist <= tol && dist < distMin)
            {
                distMin = dist;
                nearpt = ptTemp;
                segment = i;
            }
        }
    }

    return distMin;
}
Пример #10
0
Box2d GiTransform::setWorldLimits(const Box2d& rect)
{
    Box2d ret = m_impl->rectLimitsW;
    m_impl->rectLimitsW = rect.isEmpty() ? Box2d(Point2d::kOrigin(), 2e5f, 2e5f) : rect;
    m_impl->rectLimitsW.normalize();
    return ret;
}
Пример #11
0
 inline
 Box2d
 Circle2d::bounds() const {
     return Box2d(
         Interval(centerPoint().x() - radius(), centerPoint().x() + radius()),
         Interval(centerPoint().y() - radius(), centerPoint().y() + radius())
     );
 }
Пример #12
0
bool GiCoreView::zoomToModel(float x, float y, float w, float h)
{
    Box2d rect(Box2d(x, y, x + w, y + h) * impl->xform()->modelToWorld());
    bool ret = impl->xform()->zoomTo(rect);
    if (ret) {
        impl->regenAll();
    }
    return ret;
}
Пример #13
0
void MgEllipse::setRadius(float rx, float ry)
{
    rx = fabs(rx);
    rx = fabs(ry);
    if (rx < _MGZERO)
        rx = rx;

    setRect(Box2d(getCenter(), rx * 2, ry * 2), getAngle());
}
Пример #14
0
 bool drawHandle(GiGraphics* gs, const Point2d& pnt, bool hotdot)
 {
     GiContext ctx(0, GiColor::Black(), kGiLineSolid,
         GiColor(240, 240, 240, hotdot ? 200 : 128));
     bool old = gs->setAntiAliasMode(false);
     gs->drawRect(&ctx, Box2d(pnt, gs->xf().displayToModel(hotdot ? 3.f : 1.5f, true), 0));
     gs->setAntiAliasMode(old);
     return true;
 }
Пример #15
0
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;
}
Пример #16
0
bool GiGraphics::drawBeziers(const GiContext* ctx, int count, 
                             const Point2d* points, bool modelUnit)
{
    if (m_impl->drawRefcnt == 0 || count < 4 || points == NULL)
        return false;
    GiLock lock (&m_impl->drawRefcnt);
    if (count > 0x2000)
        count = 0x2000;
    count = 1 + (count - 1) / 3 * 3;

    bool ret = false;
    vector<Point2d> pxpoints;
    vector<Point2d> pointBuf;
    int i, j, n, si, ei;
    Point2d * pxs;
    Matrix2d matD(S2D(xf(), modelUnit));

    const Box2d extent (count, points);                 // 模型坐标范围
    if (!DRAW_RECT(m_impl, modelUnit).isIntersect(extent))  // 全部在显示区域外
        return false;

    if (DRAW_MAXR(m_impl, modelUnit).contains(extent))  // 全部在显示区域内
    {
        pxpoints.resize(count);
        pxs = &pxpoints.front();
        for (i = 0; i < count; i++)
            pxs[i] = points[i] * matD;
        ret = rawBeziers(ctx, pxs, count);
    }
    else
    {        
        pointBuf.resize(count);
        for (i = 0; i < count; i++)                 // 转换到像素坐标
            pointBuf[i] = points[i] * matD;
        Point2d* pts = &pointBuf.front();

        si = ei = 0;
        for (i = 3; i < count; i += 3)
        {
            for ( ; i < count
                && m_impl->rectDraw.isIntersect(Box2d(4, &pts[ei])); i += 3)
                ei = i;
            n = ei - si + 1;
            if (n > 1)
            {
                pxpoints.resize(n);
                pxs = &pxpoints.front();
                for (j=0; j<n; j++)
                    pxs[j] = pts[si + j];
                ret = rawBeziers(ctx, pxs, n);
            }
            si = ei = i;
        }
    }
    return ret;
}
Пример #17
0
void CScrollShapeView::OnZoomed()
{
    CRandomShapeView::OnZoomed();

    Box2d rect;

    // m_rcLimits: 极限范围对应的坐标范围, 像素
    rect = m_shapes->getExtent() * m_graph->xf.modelToDisplay();
    rect.inflate(1, 1);
    rect.get(m_rcLimits);

    // m_rcScrWnd: 当前窗口对应的坐标范围, 像素
    rect = Box2d(m_graph->xf.getCenterW(),
        m_graph->xf.getWidth() / m_graph->xf.getWorldToDisplayX(),
        m_graph->xf.getHeight() / m_graph->xf.getWorldToDisplayY());
    rect *= m_graph->xf.worldToDisplay();
    rect.get(m_rcScrWnd);

    // 以m_rcLimits左上角为原点调整m_rcScrWnd和m_rcLimits
    ::OffsetRect(&m_rcScrWnd, -m_rcLimits.left, -m_rcLimits.top);
    ::OffsetRect(&m_rcLimits, -m_rcLimits.left, -m_rcLimits.top);

    // 避免m_rcScrWnd部分超出m_rcLimits
    ::UnionRect(&m_rcLimits, &m_rcLimits, &m_rcScrWnd);

    SCROLLINFO si;
    si.cbSize = sizeof(si);
    si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
    si.nMin = 0;

    if (m_rcLimits.right - m_rcLimits.left > m_rcScrWnd.right - m_rcScrWnd.left)
    {
        si.nMax = max(1, m_rcLimits.right - m_rcLimits.left);
        si.nPage = m_rcScrWnd.right - m_rcScrWnd.left;
        si.nPos = m_rcScrWnd.left;
        ::EnableScrollBar(m_hWnd, SB_HORZ, ESB_ENABLE_BOTH);
        ::SetScrollInfo(m_hWnd, SB_HORZ, &si, TRUE);
    }
    else
    {
        ::EnableScrollBar(m_hWnd, SB_HORZ, ESB_DISABLE_BOTH);
    }

    if (m_rcLimits.bottom - m_rcLimits.top > m_rcScrWnd.bottom - m_rcScrWnd.top)
    {
        si.nMax = max(1, m_rcLimits.bottom - m_rcLimits.top);
        si.nPage = m_rcScrWnd.bottom - m_rcScrWnd.top;
        si.nPos = m_rcScrWnd.top;
        ::EnableScrollBar(m_hWnd, SB_VERT, ESB_ENABLE_BOTH);
        ::SetScrollInfo(m_hWnd, SB_VERT, &si, TRUE);
    }
    else
    {
        ::EnableScrollBar(m_hWnd, SB_VERT, ESB_DISABLE_BOTH);
    }
}
Пример #18
0
void GiCanvasGdi::clearWindow()
{
    if (!m_owner->isPrint() && m_owner->isDrawing())
    {
        RECT rc;
        RECT_2D clipBox;

        Box2d(gs()->getClipBox(clipBox)).get(rc);
        ExtTextOut(m_draw->getDrawDC(), 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
    }
}
Пример #19
0
 virtual bool processLine(int, int&, const Point2d& startpt, const Point2d& endpt) {
     if (box.contains(Box2d(startpt, endpt))
         && mglnrel::cross2Line(startpt, endpt, a, b, tmpcross)) {
         dist = tmpcross.distanceTo(box.center());
         if (mindist > dist) {
             mindist = dist;
             crosspt = tmpcross;
         }
     }
     return true;
 }
Пример #20
0
bool GiCanvasGdip::drawGdipImage(LPVOID pBmp, const Box2d& rectW, bool fast)
{
    bool ret = false;

    if (m_draw->getDrawGs() != NULL && pBmp != NULL
        && gs()->getClipWorld().isIntersect(Box2d(rectW, true)))
    {
        ret = m_draw->drawImage((G::Bitmap*)pBmp, rectW, fast);
    }

    return ret;
}
Пример #21
0
bool GiCanvasGdi::beginPaint(HDC hdc, HDC attribDC, bool buffered, bool overlay)
{
    bool ret = (NULL == m_draw->m_hdc)
        && GiCanvasWin::beginPaint(hdc, attribDC, buffered, overlay);
    if (!ret)
        return false;

    buffered = buffered && !m_owner->isPrint();
    m_draw->m_hdc = hdc;

    GdiCachedBmp oldDrawing;
    if (buffered && overlay)
        oldDrawing.saveCachedBitmap(m_draw, hdc);

    if (buffered)
    {
        if ((m_draw->m_buffDC = ::CreateCompatibleDC(hdc)) != NULL)
        {
            RECT rc;
            RECT_2D clipBox;

            Box2d(gs()->getClipBox(clipBox)).get(rc);

            m_draw->m_buffBmp = ::CreateCompatibleBitmap(hdc, 
                rc.right - rc.left, rc.bottom - rc.top);
            if (m_draw->m_buffBmp == NULL)
            {
                ::DeleteDC(m_draw->m_buffDC);
                m_draw->m_buffDC = NULL;
            }
            else
            {
                ::OffsetViewportOrgEx(m_draw->m_buffDC, -rc.left, -rc.top, NULL);
                m_draw->m_buffOldBmp = ::SelectObject(
                    m_draw->m_buffDC, m_draw->m_buffBmp);
                ::SetBrushOrgEx(m_draw->m_buffDC, rc.left % 8, rc.top % 8, NULL);
                ::IntersectClipRect(m_draw->m_buffDC,
                    rc.left, rc.top, rc.right, rc.bottom);

                ::SetBkColor(m_draw->m_buffDC, ::GetBkColor(hdc));
            }
        }
        oldDrawing.draw(m_draw, m_draw->m_buffDC);
    }

    ::SetBkMode(m_draw->getDrawDC(), TRANSPARENT);

    // 设置折线斜接连接的最小夹角为60度
    ::SetMiterLimit(m_draw->getDrawDC(), 
        static_cast<float>(1.0 / sin(_M_PI_6)), NULL);

    return ret;
}
Пример #22
0
bool MgParallel::_hitTestBox(const Box2d& rect) const
{
    if (!__super::_hitTestBox(rect))
        return false;

    for (int i = 0; i < 4; i++) {
        if (Box2d(_points[i], _points[(i + 1) % 4]).isIntersect(rect))
            return true;
    }

    return false;
}
Пример #23
0
bool MgDiamond::_hitTestBox(const Box2d& rect) const
{
    if (!__super::_hitTestBox(rect))
        return false;
    
    for (int i = 0; i < 3; i++) {
        if (Box2d(_getHandlePoint(i), _getHandlePoint(i + 1)).isIntersect(rect))
            return true;
    }
    
    return false;
}
Пример #24
0
bool MgBaseRect::_hitTestBox(const Box2d& rect) const
{
    if (!__super::_hitTestBox(rect))
        return false;
    
    for (int i = 0; i < 3; i++) {
        if (Box2d(_points[i], _points[i + 1]).isIntersect(rect))
            return true;
    }
    
    return false;
}
Пример #25
0
bool MgBaseLines::_hitTestBox(const Box2d& rect) const
{
    if (!__super::_hitTestBox(rect))
        return false;
    
    for (UInt32 i = 0; i + 1 < _count; i++) {
        if (Box2d(_points[i], _points[i + 1]).isIntersect(rect))
            return true;
    }
    
    return _count < 2;
}
Пример #26
0
void GiGraphics::_beginPaint(const RECT2D& clipBox)
{
    if (m_impl->lastZoomTimes != xf().getZoomTimes())
    {
        m_impl->zoomChanged();
        m_impl->lastZoomTimes = xf().getZoomTimes();
    }
    giInterlockedIncrement(&m_impl->drawRefcnt);

    if (!Box2d(clipBox).isEmpty())
    {
        m_impl->clipBox0 = clipBox;
        m_impl->clipBox  = clipBox;
        m_impl->rectDraw = Box2d(clipBox);
        m_impl->rectDraw.inflate(GiGraphicsImpl::CLIP_INFLATE);
        m_impl->rectDrawM = m_impl->rectDraw * xf().displayToModel();
        m_impl->rectDrawMaxM = Box2d(0, 0, xf().getWidth(), xf().getHeight()) * xf().displayToModel();
        m_impl->rectDrawW = m_impl->rectDrawM * xf().modelToWorld();
        m_impl->rectDrawMaxW = m_impl->rectDrawMaxM * xf().modelToWorld();
    }
}
Пример #27
0
bool GiGraphics::drawLine(const GiContext* ctx, const Point2d& startPt,
                          const Point2d& endPt, bool modelUnit)
{
    if (!DRAW_RECT(m_impl, modelUnit).isIntersect(Box2d(startPt, endPt)))
        return false;

    Point2d pts[2] = { startPt * S2D(xf(), modelUnit), endPt * S2D(xf(), modelUnit) };

    if (!mglnrel::clipLine(pts[0], pts[1], m_impl->rectDraw))
        return false;

    return rawLine(ctx, pts[0].x, pts[0].y, pts[1].x, pts[1].y);
}
Пример #28
0
float MgRoundRect::_hitTest(const Point2d& pt, float tol, 
                            Point2d& nearpt, Int32& segment) const
{
    float dist;

    if (isOrtho())
    {
        dist = mgRoundRectHit(Box2d(_points[0], _points[2]), _rx, _ry, pt, tol, nearpt, segment);
    }
    else
    {
        Matrix2d mat(Matrix2d::rotation(getAngle(), getCenter()));
        Box2d rect(Box2d(pt, 2 * tol, 2 * tol) * mat.inverse());

        dist = mgRoundRectHit(getRect(), _rx, _ry, 
            rect.center(), rect.width(), nearpt, segment);
        if (dist < 1e10)
            nearpt *= mat;
    }

    return dist;
}
Пример #29
0
bool MgBaseRect::_setHandlePoint(UInt32 index, const Point2d& pt, float)
{
    if (index < 4 && getFlag(kMgSquare)) {
        Point2d basept(getCenter());
        Point2d pt2(pt * Matrix2d::rotation(-getAngle(), basept));
        setRect(basept * 2.f - pt2.asVector(), pt2, getAngle(), basept);
    }
    else {
        Point2d pt2(pt * Matrix2d::rotation(-getAngle(), getCenter()));
        Box2d rect(getRect());
        mgMoveRectHandle(rect, index, pt2);
        if (getFlag(kMgSquare) && (4 == index || 6 == index)) {
            rect = Box2d(rect.center(), rect.height(), rect.height());
        }
        else if (getFlag(kMgSquare)) {
            rect = Box2d(rect.center(), rect.width(), rect.width());
        }
        setRect(rect.leftTop(), rect.rightBottom(), getAngle(), getCenter());
    }
    update();
    return true;
}
Пример #30
0
bool MgCmdManagerImpl::cancel(const MgMotion* sender)
{
    clearSnap();
    
    int actions[] = { 0 };
    sender->view->showContextActions(0, actions, Box2d(), NULL);

    CMDS::iterator it = _cmds.find(_cmdname);
    if (it != _cmds.end()) {
        return it->second->cancel(sender);
    }
    return false;
}