|
14 | 14 |
|
15 | 15 | #include "ink/brush/brush_behavior.h" |
16 | 16 |
|
| 17 | +#include <algorithm> |
17 | 18 | #include <array> |
18 | 19 | #include <cmath> |
19 | 20 | #include <cstddef> |
|
25 | 26 | #include "absl/strings/str_format.h" |
26 | 27 | #include "absl/strings/str_join.h" |
27 | 28 | #include "ink/brush/easing_function.h" |
| 29 | +#include "ink/brush/version.h" |
28 | 30 |
|
29 | 31 | namespace ink { |
30 | 32 |
|
@@ -454,6 +456,207 @@ absl::Status ValidateBrushBehavior(const BrushBehavior& behavior) { |
454 | 456 | return absl::OkStatus(); |
455 | 457 | } |
456 | 458 |
|
| 459 | +namespace { |
| 460 | + |
| 461 | +Version CalculateMinimumRequiredVersion(BrushBehavior::Source source) { |
| 462 | + switch (source) { |
| 463 | + case BrushBehavior::Source::kNormalizedPressure: |
| 464 | + case BrushBehavior::Source::kTiltInRadians: |
| 465 | + case BrushBehavior::Source::kTiltXInRadians: |
| 466 | + case BrushBehavior::Source::kTiltYInRadians: |
| 467 | + case BrushBehavior::Source::kOrientationInRadians: |
| 468 | + case BrushBehavior::Source::kOrientationAboutZeroInRadians: |
| 469 | + case BrushBehavior::Source::kSpeedInMultiplesOfBrushSizePerSecond: |
| 470 | + case BrushBehavior::Source::kVelocityXInMultiplesOfBrushSizePerSecond: |
| 471 | + case BrushBehavior::Source::kVelocityYInMultiplesOfBrushSizePerSecond: |
| 472 | + case BrushBehavior::Source::kDirectionInRadians: |
| 473 | + case BrushBehavior::Source::kDirectionAboutZeroInRadians: |
| 474 | + case BrushBehavior::Source::kNormalizedDirectionX: |
| 475 | + case BrushBehavior::Source::kNormalizedDirectionY: |
| 476 | + case BrushBehavior::Source::kDistanceTraveledInMultiplesOfBrushSize: |
| 477 | + case BrushBehavior::Source::kTimeOfInputInSeconds: |
| 478 | + case BrushBehavior::Source:: |
| 479 | + kPredictedDistanceTraveledInMultiplesOfBrushSize: |
| 480 | + case BrushBehavior::Source::kPredictedTimeElapsedInSeconds: |
| 481 | + case BrushBehavior::Source::kDistanceRemainingInMultiplesOfBrushSize: |
| 482 | + case BrushBehavior::Source::kTimeSinceInputInSeconds: |
| 483 | + case BrushBehavior::Source:: |
| 484 | + kAccelerationInMultiplesOfBrushSizePerSecondSquared: |
| 485 | + case BrushBehavior::Source:: |
| 486 | + kAccelerationXInMultiplesOfBrushSizePerSecondSquared: |
| 487 | + case BrushBehavior::Source:: |
| 488 | + kAccelerationYInMultiplesOfBrushSizePerSecondSquared: |
| 489 | + case BrushBehavior::Source:: |
| 490 | + kAccelerationForwardInMultiplesOfBrushSizePerSecondSquared: |
| 491 | + case BrushBehavior::Source:: |
| 492 | + kAccelerationLateralInMultiplesOfBrushSizePerSecondSquared: |
| 493 | + case BrushBehavior::Source::kSpeedInCentimetersPerSecond: |
| 494 | + case BrushBehavior::Source::kVelocityXInCentimetersPerSecond: |
| 495 | + case BrushBehavior::Source::kVelocityYInCentimetersPerSecond: |
| 496 | + case BrushBehavior::Source::kDistanceTraveledInCentimeters: |
| 497 | + case BrushBehavior::Source::kPredictedDistanceTraveledInCentimeters: |
| 498 | + case BrushBehavior::Source::kAccelerationInCentimetersPerSecondSquared: |
| 499 | + case BrushBehavior::Source::kAccelerationXInCentimetersPerSecondSquared: |
| 500 | + case BrushBehavior::Source::kAccelerationYInCentimetersPerSecondSquared: |
| 501 | + case BrushBehavior::Source:: |
| 502 | + kAccelerationForwardInCentimetersPerSecondSquared: |
| 503 | + case BrushBehavior::Source:: |
| 504 | + kAccelerationLateralInCentimetersPerSecondSquared: |
| 505 | + case BrushBehavior::Source::kDistanceRemainingAsFractionOfStrokeLength: |
| 506 | + return Version::k0Jetpack1_0_0(); |
| 507 | + case BrushBehavior::Source::kTimeSinceStrokeEndInSeconds: |
| 508 | + return Version::k1Jetpack1_1_0Alpha01(); |
| 509 | + case BrushBehavior::Source::kTimeFromInputToStrokeEndInSeconds: |
| 510 | + return Version::kDevelopment(); |
| 511 | + } |
| 512 | +} |
| 513 | + |
| 514 | +Version CalculateMinimumRequiredVersion(BrushBehavior::Target target) { |
| 515 | + switch (target) { |
| 516 | + case BrushBehavior::Target::kWidthMultiplier: |
| 517 | + case BrushBehavior::Target::kHeightMultiplier: |
| 518 | + case BrushBehavior::Target::kSizeMultiplier: |
| 519 | + case BrushBehavior::Target::kSlantOffsetInRadians: |
| 520 | + case BrushBehavior::Target::kPinchOffset: |
| 521 | + case BrushBehavior::Target::kRotationOffsetInRadians: |
| 522 | + case BrushBehavior::Target::kCornerRoundingOffset: |
| 523 | + case BrushBehavior::Target::kPositionOffsetXInMultiplesOfBrushSize: |
| 524 | + case BrushBehavior::Target::kPositionOffsetYInMultiplesOfBrushSize: |
| 525 | + case BrushBehavior::Target::kPositionOffsetForwardInMultiplesOfBrushSize: |
| 526 | + case BrushBehavior::Target::kPositionOffsetLateralInMultiplesOfBrushSize: |
| 527 | + case BrushBehavior::Target::kTextureAnimationProgressOffset: |
| 528 | + case BrushBehavior::Target::kHueOffsetInRadians: |
| 529 | + case BrushBehavior::Target::kSaturationMultiplier: |
| 530 | + case BrushBehavior::Target::kLuminosityOffset: |
| 531 | + case BrushBehavior::Target::kOpacityMultiplier: |
| 532 | + return Version::k0Jetpack1_0_0(); |
| 533 | + } |
| 534 | +} |
| 535 | + |
| 536 | +Version CalculateMinimumRequiredVersion(BrushBehavior::PolarTarget target) { |
| 537 | + switch (target) { |
| 538 | + case BrushBehavior::PolarTarget:: |
| 539 | + kPositionOffsetAbsoluteInRadiansAndMultiplesOfBrushSize: |
| 540 | + case BrushBehavior::PolarTarget:: |
| 541 | + kPositionOffsetRelativeInRadiansAndMultiplesOfBrushSize: |
| 542 | + return Version::k0Jetpack1_0_0(); |
| 543 | + } |
| 544 | +} |
| 545 | + |
| 546 | +Version CalculateMinimumRequiredVersion( |
| 547 | + BrushBehavior::OutOfRange out_of_range) { |
| 548 | + switch (out_of_range) { |
| 549 | + case BrushBehavior::OutOfRange::kClamp: |
| 550 | + case BrushBehavior::OutOfRange::kMirror: |
| 551 | + case BrushBehavior::OutOfRange::kRepeat: |
| 552 | + return Version::k0Jetpack1_0_0(); |
| 553 | + } |
| 554 | +} |
| 555 | + |
| 556 | +Version CalculateMinimumRequiredVersion( |
| 557 | + BrushBehavior::EnabledToolTypes enabled) { |
| 558 | + return Version::k0Jetpack1_0_0(); |
| 559 | +} |
| 560 | + |
| 561 | +Version CalculateMinimumRequiredVersion(BrushBehavior::BinaryOp operation) { |
| 562 | + switch (operation) { |
| 563 | + case BrushBehavior::BinaryOp::kProduct: |
| 564 | + case BrushBehavior::BinaryOp::kSum: |
| 565 | + return Version::k0Jetpack1_0_0(); |
| 566 | + case BrushBehavior::BinaryOp::kMin: |
| 567 | + case BrushBehavior::BinaryOp::kMax: |
| 568 | + case BrushBehavior::BinaryOp::kAndThen: |
| 569 | + case BrushBehavior::BinaryOp::kOrElse: |
| 570 | + case BrushBehavior::BinaryOp::kXorElse: |
| 571 | + return Version::k1Jetpack1_1_0Alpha01(); |
| 572 | + } |
| 573 | +} |
| 574 | + |
| 575 | +Version CalculateMinimumRequiredVersion( |
| 576 | + BrushBehavior::ProgressDomain progress_domain) { |
| 577 | + switch (progress_domain) { |
| 578 | + case BrushBehavior::ProgressDomain::kDistanceInCentimeters: |
| 579 | + case BrushBehavior::ProgressDomain::kDistanceInMultiplesOfBrushSize: |
| 580 | + case BrushBehavior::ProgressDomain::kTimeInSeconds: |
| 581 | + return Version::k0Jetpack1_0_0(); |
| 582 | + } |
| 583 | +} |
| 584 | + |
| 585 | +Version CalculateMinimumRequiredVersion( |
| 586 | + BrushBehavior::Interpolation interpolation) { |
| 587 | + switch (interpolation) { |
| 588 | + case BrushBehavior::Interpolation::kLerp: |
| 589 | + case BrushBehavior::Interpolation::kInverseLerp: |
| 590 | + return Version::k0Jetpack1_0_0(); |
| 591 | + } |
| 592 | +} |
| 593 | + |
| 594 | +Version CalculateMinimumRequiredVersion(BrushBehavior::SourceNode node) { |
| 595 | + return std::max( |
| 596 | + CalculateMinimumRequiredVersion(node.source_out_of_range_behavior), |
| 597 | + CalculateMinimumRequiredVersion(node.source)); |
| 598 | +} |
| 599 | + |
| 600 | +Version CalculateMinimumRequiredVersion(BrushBehavior::ConstantNode node) { |
| 601 | + return Version::k0Jetpack1_0_0(); |
| 602 | +} |
| 603 | + |
| 604 | +Version CalculateMinimumRequiredVersion(BrushBehavior::NoiseNode node) { |
| 605 | + return CalculateMinimumRequiredVersion(node.vary_over); |
| 606 | +} |
| 607 | + |
| 608 | +Version CalculateMinimumRequiredVersion( |
| 609 | + BrushBehavior::ToolTypeFilterNode node) { |
| 610 | + return CalculateMinimumRequiredVersion(node.enabled_tool_types); |
| 611 | +} |
| 612 | + |
| 613 | +Version CalculateMinimumRequiredVersion(BrushBehavior::DampingNode node) { |
| 614 | + return CalculateMinimumRequiredVersion(node.damping_source); |
| 615 | +} |
| 616 | + |
| 617 | +Version CalculateMinimumRequiredVersion(BrushBehavior::ResponseNode node) { |
| 618 | + return brush_internal::CalculateMinimumRequiredVersion(node.response_curve); |
| 619 | +} |
| 620 | + |
| 621 | +Version CalculateMinimumRequiredVersion(BrushBehavior::IntegralNode node) { |
| 622 | + return std::max( |
| 623 | + {Version::k1Jetpack1_1_0Alpha01(), |
| 624 | + CalculateMinimumRequiredVersion(node.integrate_over), |
| 625 | + CalculateMinimumRequiredVersion(node.integral_out_of_range_behavior)}); |
| 626 | +} |
| 627 | + |
| 628 | +Version CalculateMinimumRequiredVersion(BrushBehavior::BinaryOpNode node) { |
| 629 | + return CalculateMinimumRequiredVersion(node.operation); |
| 630 | +} |
| 631 | + |
| 632 | +Version CalculateMinimumRequiredVersion(BrushBehavior::InterpolationNode node) { |
| 633 | + return CalculateMinimumRequiredVersion(node.interpolation); |
| 634 | +} |
| 635 | + |
| 636 | +Version CalculateMinimumRequiredVersion(BrushBehavior::TargetNode node) { |
| 637 | + return CalculateMinimumRequiredVersion(node.target); |
| 638 | +} |
| 639 | + |
| 640 | +Version CalculateMinimumRequiredVersion(BrushBehavior::PolarTargetNode node) { |
| 641 | + return CalculateMinimumRequiredVersion(node.target); |
| 642 | +} |
| 643 | + |
| 644 | +Version CalculateMinimumRequiredVersion(const BrushBehavior::Node& node) { |
| 645 | + return std::visit( |
| 646 | + [](const auto& node) { return CalculateMinimumRequiredVersion(node); }, |
| 647 | + node); |
| 648 | +} |
| 649 | + |
| 650 | +} // namespace |
| 651 | + |
| 652 | +Version CalculateMinimumRequiredVersion(const BrushBehavior& behavior) { |
| 653 | + Version max_version = Version::k0Jetpack1_0_0(); |
| 654 | + for (const auto& node : behavior.nodes) { |
| 655 | + max_version = std::max(max_version, CalculateMinimumRequiredVersion(node)); |
| 656 | + } |
| 657 | + return max_version; |
| 658 | +} |
| 659 | + |
457 | 660 | std::string ToFormattedString(BrushBehavior::Source source) { |
458 | 661 | switch (source) { |
459 | 662 | case BrushBehavior::Source::kNormalizedPressure: |
|
0 commit comments