| 658 | } |
| 659 | |
| 660 | void 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){ |
nothing calls this directly
no test coverage detected