|
25 | 25 | #include "absl/strings/str_format.h" |
26 | 26 | #include "absl/strings/str_join.h" |
27 | 27 | #include "ink/brush/easing_function.h" |
| 28 | +#include "ink/brush/version.h" |
28 | 29 |
|
29 | 30 | namespace ink { |
30 | 31 |
|
@@ -473,6 +474,277 @@ absl::Status ValidateBrushBehavior(const BrushBehavior& behavior) { |
473 | 474 | return absl::OkStatus(); |
474 | 475 | } |
475 | 476 |
|
| 477 | +namespace { |
| 478 | + |
| 479 | +Version CalculateMinimumRequiredVersion(BrushBehavior::Source source) { |
| 480 | + Version max_version = version::k1_0_0; |
| 481 | + switch (source) { |
| 482 | + case BrushBehavior::Source::kNormalizedPressure: |
| 483 | + case BrushBehavior::Source::kTiltInRadians: |
| 484 | + case BrushBehavior::Source::kTiltXInRadians: |
| 485 | + case BrushBehavior::Source::kTiltYInRadians: |
| 486 | + case BrushBehavior::Source::kOrientationInRadians: |
| 487 | + case BrushBehavior::Source::kOrientationAboutZeroInRadians: |
| 488 | + case BrushBehavior::Source::kSpeedInMultiplesOfBrushSizePerSecond: |
| 489 | + case BrushBehavior::Source::kVelocityXInMultiplesOfBrushSizePerSecond: |
| 490 | + case BrushBehavior::Source::kVelocityYInMultiplesOfBrushSizePerSecond: |
| 491 | + case BrushBehavior::Source::kDirectionInRadians: |
| 492 | + case BrushBehavior::Source::kDirectionAboutZeroInRadians: |
| 493 | + case BrushBehavior::Source::kNormalizedDirectionX: |
| 494 | + case BrushBehavior::Source::kNormalizedDirectionY: |
| 495 | + case BrushBehavior::Source::kDistanceTraveledInMultiplesOfBrushSize: |
| 496 | + case BrushBehavior::Source::kTimeOfInputInSeconds: |
| 497 | + case BrushBehavior::Source:: |
| 498 | + kPredictedDistanceTraveledInMultiplesOfBrushSize: |
| 499 | + case BrushBehavior::Source::kPredictedTimeElapsedInSeconds: |
| 500 | + case BrushBehavior::Source::kDistanceRemainingInMultiplesOfBrushSize: |
| 501 | + case BrushBehavior::Source::kTimeSinceInputInSeconds: |
| 502 | + case BrushBehavior::Source:: |
| 503 | + kAccelerationInMultiplesOfBrushSizePerSecondSquared: |
| 504 | + case BrushBehavior::Source:: |
| 505 | + kAccelerationXInMultiplesOfBrushSizePerSecondSquared: |
| 506 | + case BrushBehavior::Source:: |
| 507 | + kAccelerationYInMultiplesOfBrushSizePerSecondSquared: |
| 508 | + case BrushBehavior::Source:: |
| 509 | + kAccelerationForwardInMultiplesOfBrushSizePerSecondSquared: |
| 510 | + case BrushBehavior::Source:: |
| 511 | + kAccelerationLateralInMultiplesOfBrushSizePerSecondSquared: |
| 512 | + case BrushBehavior::Source::kInputSpeedInCentimetersPerSecond: |
| 513 | + case BrushBehavior::Source::kInputVelocityXInCentimetersPerSecond: |
| 514 | + case BrushBehavior::Source::kInputVelocityYInCentimetersPerSecond: |
| 515 | + case BrushBehavior::Source::kInputDistanceTraveledInCentimeters: |
| 516 | + case BrushBehavior::Source::kPredictedInputDistanceTraveledInCentimeters: |
| 517 | + case BrushBehavior::Source::kInputAccelerationInCentimetersPerSecondSquared: |
| 518 | + case BrushBehavior::Source:: |
| 519 | + kInputAccelerationXInCentimetersPerSecondSquared: |
| 520 | + case BrushBehavior::Source:: |
| 521 | + kInputAccelerationYInCentimetersPerSecondSquared: |
| 522 | + case BrushBehavior::Source:: |
| 523 | + kInputAccelerationForwardInCentimetersPerSecondSquared: |
| 524 | + case BrushBehavior::Source:: |
| 525 | + kInputAccelerationLateralInCentimetersPerSecondSquared: |
| 526 | + case BrushBehavior::Source::kDistanceRemainingAsFractionOfStrokeLength: |
| 527 | + break; |
| 528 | + } |
| 529 | + return max_version; |
| 530 | +} |
| 531 | + |
| 532 | +Version CalculateMinimumRequiredVersion(BrushBehavior::Target target) { |
| 533 | + Version max_version = version::k1_0_0; |
| 534 | + switch (target) { |
| 535 | + case BrushBehavior::Target::kWidthMultiplier: |
| 536 | + case BrushBehavior::Target::kHeightMultiplier: |
| 537 | + case BrushBehavior::Target::kSizeMultiplier: |
| 538 | + case BrushBehavior::Target::kSlantOffsetInRadians: |
| 539 | + case BrushBehavior::Target::kPinchOffset: |
| 540 | + case BrushBehavior::Target::kRotationOffsetInRadians: |
| 541 | + case BrushBehavior::Target::kCornerRoundingOffset: |
| 542 | + case BrushBehavior::Target::kPositionOffsetXInMultiplesOfBrushSize: |
| 543 | + case BrushBehavior::Target::kPositionOffsetYInMultiplesOfBrushSize: |
| 544 | + case BrushBehavior::Target::kPositionOffsetForwardInMultiplesOfBrushSize: |
| 545 | + case BrushBehavior::Target::kPositionOffsetLateralInMultiplesOfBrushSize: |
| 546 | + case BrushBehavior::Target::kTextureAnimationProgressOffset: |
| 547 | + case BrushBehavior::Target::kHueOffsetInRadians: |
| 548 | + case BrushBehavior::Target::kSaturationMultiplier: |
| 549 | + case BrushBehavior::Target::kLuminosity: |
| 550 | + case BrushBehavior::Target::kOpacityMultiplier: |
| 551 | + break; |
| 552 | + } |
| 553 | + return max_version; |
| 554 | +} |
| 555 | + |
| 556 | +Version CalculateMinimumRequiredVersion(BrushBehavior::PolarTarget target) { |
| 557 | + Version max_version = version::k1_0_0; |
| 558 | + switch (target) { |
| 559 | + case BrushBehavior::PolarTarget:: |
| 560 | + kPositionOffsetAbsoluteInRadiansAndMultiplesOfBrushSize: |
| 561 | + case BrushBehavior::PolarTarget:: |
| 562 | + kPositionOffsetRelativeInRadiansAndMultiplesOfBrushSize: |
| 563 | + break; |
| 564 | + } |
| 565 | + return max_version; |
| 566 | +} |
| 567 | + |
| 568 | +Version CalculateMinimumRequiredVersion( |
| 569 | + BrushBehavior::OutOfRange out_of_range) { |
| 570 | + Version max_version = version::k1_0_0; |
| 571 | + switch (out_of_range) { |
| 572 | + case BrushBehavior::OutOfRange::kClamp: |
| 573 | + case BrushBehavior::OutOfRange::kMirror: |
| 574 | + case BrushBehavior::OutOfRange::kRepeat: |
| 575 | + break; |
| 576 | + } |
| 577 | + return max_version; |
| 578 | +} |
| 579 | + |
| 580 | +Version CalculateMinimumRequiredVersion( |
| 581 | + BrushBehavior::EnabledToolTypes enabled) { |
| 582 | + Version max_version = version::k1_0_0; |
| 583 | + if (enabled.unknown || enabled.mouse || enabled.stylus || enabled.touch) { |
| 584 | + return max_version; |
| 585 | + } |
| 586 | + // A tool type filter is compatible with the lowest version that supports any |
| 587 | + // of the included tool types. |
| 588 | + return max_version; |
| 589 | +} |
| 590 | + |
| 591 | +Version CalculateMinimumRequiredVersion( |
| 592 | + BrushBehavior::OptionalInputProperty input) { |
| 593 | + Version max_version = version::k1_0_0; |
| 594 | + switch (input) { |
| 595 | + case BrushBehavior::OptionalInputProperty::kPressure: |
| 596 | + case BrushBehavior::OptionalInputProperty::kTilt: |
| 597 | + case BrushBehavior::OptionalInputProperty::kOrientation: |
| 598 | + case BrushBehavior::OptionalInputProperty::kTiltXAndY: |
| 599 | + break; |
| 600 | + } |
| 601 | + return max_version; |
| 602 | +} |
| 603 | + |
| 604 | +Version CalculateMinimumRequiredVersion(BrushBehavior::BinaryOp operation) { |
| 605 | + Version max_version = version::k1_0_0; |
| 606 | + switch (operation) { |
| 607 | + case BrushBehavior::BinaryOp::kProduct: |
| 608 | + case BrushBehavior::BinaryOp::kSum: |
| 609 | + break; |
| 610 | + case BrushBehavior::BinaryOp::kMin: |
| 611 | + case BrushBehavior::BinaryOp::kMax: |
| 612 | + max_version = MaxVersion(max_version, version::k1_1_0_alpha_01); |
| 613 | + break; |
| 614 | + } |
| 615 | + return max_version; |
| 616 | +} |
| 617 | + |
| 618 | +Version CalculateMinimumRequiredVersion( |
| 619 | + BrushBehavior::ProgressDomain progress_domain) { |
| 620 | + Version max_version = version::k1_0_0; |
| 621 | + switch (progress_domain) { |
| 622 | + case BrushBehavior::ProgressDomain::kDistanceInCentimeters: |
| 623 | + case BrushBehavior::ProgressDomain::kDistanceInMultiplesOfBrushSize: |
| 624 | + case BrushBehavior::ProgressDomain::kTimeInSeconds: |
| 625 | + break; |
| 626 | + } |
| 627 | + return max_version; |
| 628 | +} |
| 629 | + |
| 630 | +Version CalculateMinimumRequiredVersion( |
| 631 | + BrushBehavior::Interpolation interpolation) { |
| 632 | + Version max_version = version::k1_0_0; |
| 633 | + switch (interpolation) { |
| 634 | + case BrushBehavior::Interpolation::kLerp: |
| 635 | + case BrushBehavior::Interpolation::kInverseLerp: |
| 636 | + break; |
| 637 | + } |
| 638 | + return max_version; |
| 639 | +} |
| 640 | + |
| 641 | +Version CalculateMinimumRequiredVersion(BrushBehavior::SourceNode node) { |
| 642 | + Version max_version = version::k1_0_0; |
| 643 | + max_version = MaxVersion(max_version, CalculateMinimumRequiredVersion( |
| 644 | + node.source_out_of_range_behavior)); |
| 645 | + max_version = |
| 646 | + MaxVersion(max_version, CalculateMinimumRequiredVersion(node.source)); |
| 647 | + return max_version; |
| 648 | +} |
| 649 | + |
| 650 | +Version CalculateMinimumRequiredVersion(BrushBehavior::ConstantNode node) { |
| 651 | + Version max_version = version::k1_0_0; |
| 652 | + return max_version; |
| 653 | +} |
| 654 | + |
| 655 | +Version CalculateMinimumRequiredVersion(BrushBehavior::NoiseNode node) { |
| 656 | + Version max_version = version::k1_0_0; |
| 657 | + max_version = |
| 658 | + MaxVersion(max_version, CalculateMinimumRequiredVersion(node.vary_over)); |
| 659 | + return max_version; |
| 660 | +} |
| 661 | + |
| 662 | +Version CalculateMinimumRequiredVersion( |
| 663 | + BrushBehavior::FallbackFilterNode node) { |
| 664 | + Version max_version = version::k1_0_0; |
| 665 | + max_version = MaxVersion( |
| 666 | + max_version, CalculateMinimumRequiredVersion(node.is_fallback_for)); |
| 667 | + return max_version; |
| 668 | +} |
| 669 | + |
| 670 | +Version CalculateMinimumRequiredVersion( |
| 671 | + BrushBehavior::ToolTypeFilterNode node) { |
| 672 | + Version max_version = version::k1_0_0; |
| 673 | + max_version = MaxVersion( |
| 674 | + max_version, CalculateMinimumRequiredVersion(node.enabled_tool_types)); |
| 675 | + return max_version; |
| 676 | +} |
| 677 | + |
| 678 | +Version CalculateMinimumRequiredVersion(BrushBehavior::DampingNode node) { |
| 679 | + Version max_version = version::k1_0_0; |
| 680 | + max_version = MaxVersion( |
| 681 | + max_version, CalculateMinimumRequiredVersion(node.damping_source)); |
| 682 | + return max_version; |
| 683 | +} |
| 684 | + |
| 685 | +Version CalculateMinimumRequiredVersion(BrushBehavior::ResponseNode node) { |
| 686 | + Version max_version = version::k1_0_0; |
| 687 | + max_version = MaxVersion( |
| 688 | + max_version, |
| 689 | + brush_internal::CalculateMinimumRequiredVersion(node.response_curve)); |
| 690 | + return max_version; |
| 691 | +} |
| 692 | + |
| 693 | +Version CalculateMinimumRequiredVersion(BrushBehavior::IntegralNode node) { |
| 694 | + Version max_version = version::k1_1_0_alpha_01; |
| 695 | + max_version = MaxVersion( |
| 696 | + max_version, CalculateMinimumRequiredVersion(node.integrate_over)); |
| 697 | + max_version = MaxVersion( |
| 698 | + max_version, |
| 699 | + CalculateMinimumRequiredVersion(node.integral_out_of_range_behavior)); |
| 700 | + return max_version; |
| 701 | +} |
| 702 | + |
| 703 | +Version CalculateMinimumRequiredVersion(BrushBehavior::BinaryOpNode node) { |
| 704 | + Version max_version = version::k1_0_0; |
| 705 | + max_version = |
| 706 | + MaxVersion(max_version, CalculateMinimumRequiredVersion(node.operation)); |
| 707 | + return max_version; |
| 708 | +} |
| 709 | + |
| 710 | +Version CalculateMinimumRequiredVersion(BrushBehavior::InterpolationNode node) { |
| 711 | + Version max_version = version::k1_0_0; |
| 712 | + max_version = MaxVersion(max_version, |
| 713 | + CalculateMinimumRequiredVersion(node.interpolation)); |
| 714 | + return max_version; |
| 715 | +} |
| 716 | + |
| 717 | +Version CalculateMinimumRequiredVersion(BrushBehavior::TargetNode node) { |
| 718 | + Version max_version = version::k1_0_0; |
| 719 | + max_version = |
| 720 | + MaxVersion(max_version, CalculateMinimumRequiredVersion(node.target)); |
| 721 | + return max_version; |
| 722 | +} |
| 723 | + |
| 724 | +Version CalculateMinimumRequiredVersion(BrushBehavior::PolarTargetNode node) { |
| 725 | + Version max_version = version::k1_0_0; |
| 726 | + max_version = |
| 727 | + MaxVersion(max_version, CalculateMinimumRequiredVersion(node.target)); |
| 728 | + return max_version; |
| 729 | +} |
| 730 | + |
| 731 | +Version CalculateMinimumRequiredVersion(const BrushBehavior::Node& node) { |
| 732 | + return std::visit( |
| 733 | + [](const auto& node) { return CalculateMinimumRequiredVersion(node); }, |
| 734 | + node); |
| 735 | +} |
| 736 | + |
| 737 | +} // namespace |
| 738 | + |
| 739 | +Version CalculateMinimumRequiredVersion(const BrushBehavior& behavior) { |
| 740 | + Version max_version = version::k1_0_0; |
| 741 | + for (const BrushBehavior::Node& node : behavior.nodes) { |
| 742 | + max_version = |
| 743 | + MaxVersion(max_version, CalculateMinimumRequiredVersion(node)); |
| 744 | + } |
| 745 | + return max_version; |
| 746 | +} |
| 747 | + |
476 | 748 | std::string ToFormattedString(BrushBehavior::Source source) { |
477 | 749 | switch (source) { |
478 | 750 | case BrushBehavior::Source::kNormalizedPressure: |
|
0 commit comments