bool setPen(const GiContext* ctx) { bool changed = !_ctxused[0]; if (ctx && !ctx->isNullLine()) { if (_gictx.getLineColor() != ctx->getLineColor()) { _gictx.setLineColor(ctx->getLineColor()); changed = true; } if (_gictx.getLineWidth() != ctx->getLineWidth()) { _gictx.setLineWidth(ctx->getLineWidth(), ctx->isAutoScale()); changed = true; } if (_gictx.getLineStyle() != ctx->getLineStyle()) { _gictx.setLineStyle(ctx->getLineStyle()); changed = true; } } if (!ctx) ctx = &_gictx; if (!ctx->isNullLine() && changed) { _ctxused[0] = true; GiColor color = ctx->getLineColor(); if (gs()) color = gs()->calcPenColor(color); CGContextSetRGBStrokeColor(getContext(), toFloat(color.r), toFloat(color.g), toFloat(color.b), toFloat(color.a)); float w = ctx->getLineWidth(); w = gs() ? gs()->calcPenWidth(w, ctx->isAutoScale()) : (w < 0 ? -w : 1); CGContextSetLineWidth(getContext(), _fast && w > 1 ? w - 1 : w); // 不是反走样就细一点 int style = ctx->getLineStyle(); CGFloat pattern[6]; if (style >= 0 && style < sizeof(lpats)/sizeof(lpats[0])) { if (lpats[style].arr && !_fast) { // 快速画时不要线型 makeLinePattern(pattern, lpats[style].arr, lpats[style].n, w); CGContextSetLineDash(getContext(), 0, pattern, lpats[style].n); } else { CGContextSetLineDash(getContext(), 0, NULL, 0); } CGContextSetLineCap(getContext(), style > 0 ? kCGLineCapButt : kCGLineCapRound); } } return !ctx->isNullLine(); }
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; }