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; }
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; }