MCPcopy Create free account
hub / github.com/antvis/F2Native / DrawLabel

Method DrawLabel

core/graphics/axis/AxisController.cpp:660–803  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

658}
659
660void xg::axis::AxisController::DrawLabel(XChart &chart, std::unique_ptr<xg::axis::Axis> &axis, canvas::CanvasContext &context) {
661 // xg::util::Point start = GetOffsetPoint(axis, label.value);
662 // GetSidePoint(start, 5 * chart.GetRatio(), axis.dimType);
663 // 修改x,y 这里计算的真实值
664 // std::unique_ptr<xg::shape::Text> text = xg::make_unique<xg::shape::Text>(label.text.c_str(), xg::util::Point(start.x,
665 // start.y), label.fontSize, "", label.fill);
666
667 auto &coord = chart.GetCoord();
668 size_t size = axis->labels.size();
669
670 //textAlign 默认center textBaseline 默认bottom
671 //pt默认对应的是字体中下方的锚点
672 int index = 0;
673 axis->labelBBoxes.clear();
674 while(axis->labels.size() > 0) {
675 auto text = std::move(axis->labels[0]);
676 axis->labels.erase(axis->labels.begin());
677 index++;
678
679 bool isFirst = axis->labels.size() == (size - 1);
680 bool isLast = axis->labels.size() == 0;
681
682 const nlohmann::json &labelCfg = axis->GetLabelCfgForIndex(index);
683 float labelMargin = 0.f;
684 // 是否每个label都可设置labelMargin,默认只有首位两个label,true的化每个label都可使用
685 bool labelMarginUseAll = false;
686 if (labelCfg.is_object()) {
687 labelMargin = labelCfg["labelMargin"];
688 labelMarginUseAll = json::GetBool(labelCfg, "labelMarginUseAll", false);
689 }
690 labelMargin *= context.GetDevicePixelRatio();
691
692 float labelOffset = 0.f;
693 if (labelCfg.is_object()) {
694 labelOffset = labelCfg["labelOffset"];
695 }
696 labelOffset *= context.GetDevicePixelRatio();
697
698 double tickValue = text->ext["tickValue"];
699 xg::util::Point pt = axis->GetOffsetPoint(tickValue, labelOffset);
700 string dimType = axis->dimType;
701 if(chart.GetCoord().IsTransposed()) {
702 dimType = axis->dimType == "x" ? "y" : "x";
703 }
704
705 bool inner = json::GetBool(labelCfg, "inner");
706
707 //等于把pt.y轴下移了5个dp,textbaseline变成了middle
708 //这时候textAlign是center textBaseline是middle,等于pt对应了字体中心的锚点
709 GetSidePoint(pt, inner ? 0 : 5 * chart.GetCanvasContext().GetDevicePixelRatio(), dimType);
710 auto txtPoint = text->GetPoint();
711 pt.x += txtPoint.x;
712 pt.y += txtPoint.y;
713
714 xg::util::BBox bbox = text->GetBBox(context);
715
716 if(axis->position == "bottom") {
717 if (labelMarginUseAll){

Callers

nothing calls this directly

Calls 15

GetBoolFunction · 0.85
IsEqualFunction · 0.85
eraseMethod · 0.80
beginMethod · 0.80
GetLabelCfgForIndexMethod · 0.80
GetDevicePixelRatioMethod · 0.80
IsTransposedMethod · 0.80
GetPointMethod · 0.80
GetLineCountMethod · 0.80
GetSpacingYMethod · 0.80
push_backMethod · 0.80
AddElementMethod · 0.80

Tested by

no test coverage detected