bool MgDot::_draw(int mode, GiGraphics& gs, const GiContext& ctx, int segment) const { GiContext ctx2(0, GiColor::Invalid(), GiContext::kNullLine, ctx.hasFillColor() ? ctx.getFillColor() : ctx.getLineColor()); float w = gs.calcPenWidth(ctx.getLineWidth(), false); bool ret = gs.drawCircle(&ctx2, _point, gs.xf().displayToModel(w)); return __super::_draw(mode, gs, ctx, segment) || ret; }
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(); }
bool MgGrid::_draw(int mode, GiGraphics& gs, const GiContext& ctx) const { Vector2d cell(m_cell / 2); if (cell.x < _MGZERO || cell.y < _MGZERO) { GiContext ctxedge(ctx); ctxedge.setNoFillColor(); gs.drawRect(&ctxedge, getRect()); return __super::_draw(mode, gs, ctx); } int nx = (int)(getWidth() / cell.x + _MGZERO); int ny = (int)(getHeight() / cell.y + _MGZERO); Box2d rect(getPoint(3), getPoint(3) + Vector2d((float)(cell.x * nx), (float)(cell.y * ny))); float w = gs.calcPenWidth(ctx.getLineWidth(), ctx.isAutoScale()) / -2.f; GiContext ctxgrid(w, ctx.getLineColor()); bool antiAlias = gs.setAntiAliasMode(false); int ret = gs.drawRect(&ctxgrid, rect) ? 1 : 0; bool switchx = (nx >= 10 && cell.x < gs.xf().displayToModel(20, true)); bool switchy = (ny >= 10 && cell.y < gs.xf().displayToModel(20, true)); Point2d pts[2] = { rect.leftTop(), rect.leftBottom() }; for (int i = 1; i < nx; i++) { pts[0].x += cell.x; pts[1].x += cell.x; ctxgrid.setLineWidth(!switchx || i%5 > 0 ? w/2 : w, false); ctxgrid.setLineAlpha(-w < 0.9f && (!switchx || i%5 > 0) ? ctx.getLineAlpha() / 2 : ctx.getLineAlpha()); ret += gs.drawLine(&ctxgrid, pts[0], pts[1]) ? 1 : 0; } pts[0] = rect.leftBottom(); pts[1] = rect.rightBottom(); for (int j = 1; j < ny; j++) { pts[0].y += cell.y; pts[1].y += cell.y; ctxgrid.setLineWidth(!switchy || j%5 > 0 ? w/2 : w, false); ctxgrid.setLineAlpha(-w < 0.9f && (!switchy || j%5 > 0) ? ctx.getLineAlpha() / 2 : ctx.getLineAlpha()); ret += gs.drawLine(&ctxgrid, pts[0], pts[1]) ? 1 : 0; } gs.setAntiAliasMode(antiAlias); return __super::_draw(mode, gs, ctx) || ret > 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; }
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; }