Example #1
0
    G::Pen* createPen(const GiContext* ctx, bool* pNotSmoothing = NULL)
    {
        G::Pen* pPen = NULL;

        if (ctx == NULL)
            ctx = &m_context;

        m_penNull = ctx->isNullLine();
        if (!m_penNull)
        {
            if (m_pen == NULL
                || m_context.getLineStyle() != ctx->getLineStyle()
                || m_context.getLineWidth() != ctx->getLineWidth()
                || m_context.getLineColor() != ctx->getLineColor()
                || m_context.getLineAlpha() != ctx->getLineAlpha())
            {
                m_context.setLineStyle(ctx->getLineStyle());
                m_context.setLineWidth(ctx->getLineWidth());
                m_context.setLineColor(ctx->getLineColor());
                m_context.setLineAlpha(ctx->getLineAlpha());

                if (m_pen != NULL)
                {
                    delete m_pen;
                    m_pen = NULL;
                }

                float width = gs()->calcPenWidth(ctx->getLineWidth());
                GiColor color = gs()->calcPenColor(ctx->getLineColor());
                m_pen = new G::Pen(G::Color(ctx->getLineAlpha(), 
                    color.r, color.g, color.b), width);

                if (m_pen != NULL)
                {
                    m_pen->SetDashStyle((G::DashStyle)ctx->getLineStyle());
                    if (pNotSmoothing != NULL)
                    {
                        *pNotSmoothing = (width <= 1
                            && ctx->getLineStyle() != kGiLineSolid);
                    }
                }
            }

            pPen = m_pen;
        }

        return pPen;
    }
Example #2
0
    HGDIOBJ createPen(const GiContext* ctx, bool rectJoin = false)
    {
        if (ctx == NULL)
            ctx = &m_context;

        if (m_pen == NULL
            || m_context.getLineStyle() != ctx->getLineStyle()
            || m_context.getLineWidth() != ctx->getLineWidth()
            || m_context.getLineColor() != ctx->getLineColor()
            || m_context.getLineAlpha() != ctx->getLineAlpha())
        {
            m_context.setLineStyle(ctx->getLineStyle());
            m_context.setLineWidth(ctx->getLineWidth(), ctx->isAutoScale());
            m_context.setLineColor(ctx->getLineColor());
            m_context.setLineAlpha(ctx->getLineAlpha());

            if (m_pen != NULL)
                ::DeleteObject(m_pen);

            if (ctx->isNullLine() || ctx->getLineAlpha() < 127)
                m_pen = ::GetStockObject(NULL_PEN);
            else
            {
                int width = mgRound(m_this->gs()->calcPenWidth(
                    ctx->getLineWidth(), ctx->isAutoScale()));
                GiColor color = m_this->gs()->calcPenColor(ctx->getLineColor());
                COLORREF cr = RGB(color.r, color.g, color.b);
                int lineStyle = ctx->getLineStyle();

                if (width > 1)
                {
                    LOGBRUSH logBrush = { BS_SOLID, cr };
                    m_pen = ::ExtCreatePen(
                        (rectJoin ? PS_JOIN_MITER : 0)
                        | PS_GEOMETRIC | PS_ENDCAP_FLAT | lineStyle, 
                        width, &logBrush, 0, NULL);
                }
                else
                {
                    m_pen = ::CreatePen(lineStyle, width, cr);
                }
            }
        }

        return m_pen;
    }