Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion ink/brush/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,9 @@ cc_library(
srcs = ["brush_coat.cc"],
hdrs = ["brush_coat.h"],
deps = [
":brush_behavior",
":brush_paint",
":brush_tip",
":version",
"//ink/geometry:mesh_format",
"@com_google_absl//absl/container:flat_hash_set",
"@com_google_absl//absl/container:inlined_vector",
Expand Down Expand Up @@ -120,6 +120,7 @@ cc_library(
":brush_coat",
":brush_paint",
":brush_tip",
":version",
"//ink/types:duration",
"@com_google_absl//absl/status",
"@com_google_absl//absl/status:statusor",
Expand Down Expand Up @@ -160,6 +161,7 @@ cc_library(
hdrs = ["brush_tip.h"],
deps = [
":brush_behavior",
":version",
"//ink/geometry:angle",
"//ink/geometry:mesh_format",
"//ink/geometry:vec",
Expand Down Expand Up @@ -190,6 +192,7 @@ cc_library(
srcs = ["color_function.cc"],
hdrs = ["color_function.h"],
deps = [
":version",
"//ink/color",
"@com_google_absl//absl/status",
"@com_google_absl//absl/strings",
Expand Down Expand Up @@ -219,6 +222,7 @@ cc_library(
srcs = ["easing_function.cc"],
hdrs = ["easing_function.h"],
deps = [
":version",
"//ink/geometry:point",
"@com_google_absl//absl/status",
"@com_google_absl//absl/strings",
Expand All @@ -245,6 +249,7 @@ cc_library(
hdrs = ["brush_behavior.h"],
deps = [
":easing_function",
":version",
"@com_google_absl//absl/status",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/strings:str_format",
Expand Down Expand Up @@ -273,6 +278,7 @@ cc_library(
hdrs = ["brush_paint.h"],
deps = [
":color_function",
":version",
"//ink/geometry:angle",
"//ink/geometry:mesh_format",
"//ink/geometry:vec",
Expand Down Expand Up @@ -365,6 +371,15 @@ cc_library(
],
)

cc_library(
name = "version",
hdrs = ["version.h"],
deps = [
"@com_google_absl//absl/status",
"@com_google_absl//absl/strings",
],
)

cc_test(
name = "stock_brushes_test",
srcs = ["stock_brushes_test.cc"],
Expand Down
217 changes: 217 additions & 0 deletions ink/brush/brush_behavior.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

#include "ink/brush/brush_behavior.h"

#include <algorithm>
#include <array>
#include <cmath>
#include <cstddef>
Expand All @@ -25,6 +26,7 @@
#include "absl/strings/str_format.h"
#include "absl/strings/str_join.h"
#include "ink/brush/easing_function.h"
#include "ink/brush/version.h"

namespace ink {

Expand Down Expand Up @@ -476,6 +478,221 @@ absl::Status ValidateBrushBehavior(const BrushBehavior& behavior) {
return absl::OkStatus();
}

namespace {

Version CalculateMinimumRequiredVersion(BrushBehavior::Source source) {
switch (source) {
case BrushBehavior::Source::kNormalizedPressure:
case BrushBehavior::Source::kTiltInRadians:
case BrushBehavior::Source::kTiltXInRadians:
case BrushBehavior::Source::kTiltYInRadians:
case BrushBehavior::Source::kOrientationInRadians:
case BrushBehavior::Source::kOrientationAboutZeroInRadians:
case BrushBehavior::Source::kSpeedInMultiplesOfBrushSizePerSecond:
case BrushBehavior::Source::kVelocityXInMultiplesOfBrushSizePerSecond:
case BrushBehavior::Source::kVelocityYInMultiplesOfBrushSizePerSecond:
case BrushBehavior::Source::kDirectionInRadians:
case BrushBehavior::Source::kDirectionAboutZeroInRadians:
case BrushBehavior::Source::kNormalizedDirectionX:
case BrushBehavior::Source::kNormalizedDirectionY:
case BrushBehavior::Source::kDistanceTraveledInMultiplesOfBrushSize:
case BrushBehavior::Source::kTimeOfInputInSeconds:
case BrushBehavior::Source::
kPredictedDistanceTraveledInMultiplesOfBrushSize:
case BrushBehavior::Source::kPredictedTimeElapsedInSeconds:
case BrushBehavior::Source::kDistanceRemainingInMultiplesOfBrushSize:
case BrushBehavior::Source::kTimeSinceInputInSeconds:
case BrushBehavior::Source::
kAccelerationInMultiplesOfBrushSizePerSecondSquared:
case BrushBehavior::Source::
kAccelerationXInMultiplesOfBrushSizePerSecondSquared:
case BrushBehavior::Source::
kAccelerationYInMultiplesOfBrushSizePerSecondSquared:
case BrushBehavior::Source::
kAccelerationForwardInMultiplesOfBrushSizePerSecondSquared:
case BrushBehavior::Source::
kAccelerationLateralInMultiplesOfBrushSizePerSecondSquared:
case BrushBehavior::Source::kInputSpeedInCentimetersPerSecond:
case BrushBehavior::Source::kInputVelocityXInCentimetersPerSecond:
case BrushBehavior::Source::kInputVelocityYInCentimetersPerSecond:
case BrushBehavior::Source::kInputDistanceTraveledInCentimeters:
case BrushBehavior::Source::kPredictedInputDistanceTraveledInCentimeters:
case BrushBehavior::Source::kInputAccelerationInCentimetersPerSecondSquared:
case BrushBehavior::Source::
kInputAccelerationXInCentimetersPerSecondSquared:
case BrushBehavior::Source::
kInputAccelerationYInCentimetersPerSecondSquared:
case BrushBehavior::Source::
kInputAccelerationForwardInCentimetersPerSecondSquared:
case BrushBehavior::Source::
kInputAccelerationLateralInCentimetersPerSecondSquared:
case BrushBehavior::Source::kDistanceRemainingAsFractionOfStrokeLength:
return version::k1_0_0;
}
}

Version CalculateMinimumRequiredVersion(BrushBehavior::Target target) {
switch (target) {
case BrushBehavior::Target::kWidthMultiplier:
case BrushBehavior::Target::kHeightMultiplier:
case BrushBehavior::Target::kSizeMultiplier:
case BrushBehavior::Target::kSlantOffsetInRadians:
case BrushBehavior::Target::kPinchOffset:
case BrushBehavior::Target::kRotationOffsetInRadians:
case BrushBehavior::Target::kCornerRoundingOffset:
case BrushBehavior::Target::kPositionOffsetXInMultiplesOfBrushSize:
case BrushBehavior::Target::kPositionOffsetYInMultiplesOfBrushSize:
case BrushBehavior::Target::kPositionOffsetForwardInMultiplesOfBrushSize:
case BrushBehavior::Target::kPositionOffsetLateralInMultiplesOfBrushSize:
case BrushBehavior::Target::kTextureAnimationProgressOffset:
case BrushBehavior::Target::kHueOffsetInRadians:
case BrushBehavior::Target::kSaturationMultiplier:
case BrushBehavior::Target::kLuminosity:
case BrushBehavior::Target::kOpacityMultiplier:
return version::k1_0_0;
}
}

Version CalculateMinimumRequiredVersion(BrushBehavior::PolarTarget target) {
switch (target) {
case BrushBehavior::PolarTarget::
kPositionOffsetAbsoluteInRadiansAndMultiplesOfBrushSize:
case BrushBehavior::PolarTarget::
kPositionOffsetRelativeInRadiansAndMultiplesOfBrushSize:
return version::k1_0_0;
}
}

Version CalculateMinimumRequiredVersion(
BrushBehavior::OutOfRange out_of_range) {
switch (out_of_range) {
case BrushBehavior::OutOfRange::kClamp:
case BrushBehavior::OutOfRange::kMirror:
case BrushBehavior::OutOfRange::kRepeat:
return version::k1_0_0;
}
}

Version CalculateMinimumRequiredVersion(
BrushBehavior::EnabledToolTypes enabled) {
return version::k1_0_0;
}

Version CalculateMinimumRequiredVersion(
BrushBehavior::OptionalInputProperty input) {
switch (input) {
case BrushBehavior::OptionalInputProperty::kPressure:
case BrushBehavior::OptionalInputProperty::kTilt:
case BrushBehavior::OptionalInputProperty::kOrientation:
case BrushBehavior::OptionalInputProperty::kTiltXAndY:
return version::k1_0_0;
}
}

Version CalculateMinimumRequiredVersion(BrushBehavior::BinaryOp operation) {
switch (operation) {
case BrushBehavior::BinaryOp::kProduct:
case BrushBehavior::BinaryOp::kSum:
return version::k1_0_0;
case BrushBehavior::BinaryOp::kMin:
case BrushBehavior::BinaryOp::kMax:
case BrushBehavior::BinaryOp::kAndThen:
case BrushBehavior::BinaryOp::kOrElse:
case BrushBehavior::BinaryOp::kXorElse:
return version::k1_1_0_alpha_01;
}
}

Version CalculateMinimumRequiredVersion(
BrushBehavior::ProgressDomain progress_domain) {
switch (progress_domain) {
case BrushBehavior::ProgressDomain::kDistanceInCentimeters:
case BrushBehavior::ProgressDomain::kDistanceInMultiplesOfBrushSize:
case BrushBehavior::ProgressDomain::kTimeInSeconds:
return version::k1_0_0;
}
}

Version CalculateMinimumRequiredVersion(
BrushBehavior::Interpolation interpolation) {
switch (interpolation) {
case BrushBehavior::Interpolation::kLerp:
case BrushBehavior::Interpolation::kInverseLerp:
return version::k1_0_0;
}
}

Version CalculateMinimumRequiredVersion(BrushBehavior::SourceNode node) {
return std::max(
CalculateMinimumRequiredVersion(node.source_out_of_range_behavior),
CalculateMinimumRequiredVersion(node.source));
}

Version CalculateMinimumRequiredVersion(BrushBehavior::ConstantNode node) {
return version::k1_0_0;
}

Version CalculateMinimumRequiredVersion(BrushBehavior::NoiseNode node) {
return CalculateMinimumRequiredVersion(node.vary_over);
}

Version CalculateMinimumRequiredVersion(
BrushBehavior::FallbackFilterNode node) {
return CalculateMinimumRequiredVersion(node.is_fallback_for);
}

Version CalculateMinimumRequiredVersion(
BrushBehavior::ToolTypeFilterNode node) {
return CalculateMinimumRequiredVersion(node.enabled_tool_types);
}

Version CalculateMinimumRequiredVersion(BrushBehavior::DampingNode node) {
return CalculateMinimumRequiredVersion(node.damping_source);
}

Version CalculateMinimumRequiredVersion(BrushBehavior::ResponseNode node) {
return brush_internal::CalculateMinimumRequiredVersion(node.response_curve);
}

Version CalculateMinimumRequiredVersion(BrushBehavior::IntegralNode node) {
return std::max(
{version::k1_1_0_alpha_01,
CalculateMinimumRequiredVersion(node.integrate_over),
CalculateMinimumRequiredVersion(node.integral_out_of_range_behavior)});
}

Version CalculateMinimumRequiredVersion(BrushBehavior::BinaryOpNode node) {
return CalculateMinimumRequiredVersion(node.operation);
}

Version CalculateMinimumRequiredVersion(BrushBehavior::InterpolationNode node) {
return CalculateMinimumRequiredVersion(node.interpolation);
}

Version CalculateMinimumRequiredVersion(BrushBehavior::TargetNode node) {
return CalculateMinimumRequiredVersion(node.target);
}

Version CalculateMinimumRequiredVersion(BrushBehavior::PolarTargetNode node) {
return CalculateMinimumRequiredVersion(node.target);
}

Version CalculateMinimumRequiredVersion(const BrushBehavior::Node& node) {
return std::visit(
[](const auto& node) { return CalculateMinimumRequiredVersion(node); },
node);
}

} // namespace

Version CalculateMinimumRequiredVersion(const BrushBehavior& behavior) {
Version max_version = version::k1_0_0;
for (const BrushBehavior::Node& node : behavior.nodes) {
max_version = std::max(max_version, CalculateMinimumRequiredVersion(node));
}
return max_version;
}

std::string ToFormattedString(BrushBehavior::Source source) {
switch (source) {
case BrushBehavior::Source::kNormalizedPressure:
Expand Down
5 changes: 5 additions & 0 deletions ink/brush/brush_behavior.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

#include "absl/status/status.h"
#include "ink/brush/easing_function.h"
#include "ink/brush/version.h"

namespace ink {

Expand Down Expand Up @@ -693,6 +694,10 @@ absl::Status ValidateBrushBehaviorTopLevel(const BrushBehavior& behavior);

absl::Status ValidateBrushBehaviorNode(const BrushBehavior::Node& node);

// Calculates the minimum version of the Ink library that is required to use
// this brush behavior.
Version CalculateMinimumRequiredVersion(const BrushBehavior& behavior);

std::string ToFormattedString(BrushBehavior::Source source);
std::string ToFormattedString(BrushBehavior::Target target);
std::string ToFormattedString(BrushBehavior::PolarTarget target);
Expand Down
11 changes: 10 additions & 1 deletion ink/brush/brush_coat.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,17 @@

#include "ink/brush/brush_coat.h"

#include <algorithm>
#include <string>

#include "absl/container/flat_hash_set.h"
#include "absl/status/status.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/strings/str_join.h"
#include "ink/brush/brush_behavior.h"
#include "ink/brush/brush_paint.h"
#include "ink/brush/brush_tip.h"
#include "ink/brush/version.h"
#include "ink/geometry/mesh_format.h"

namespace ink {
Expand All @@ -45,6 +46,14 @@ absl::Status ValidateBrushCoat(const BrushCoat& coat) {
return absl::OkStatus();
}

Version CalculateMinimumRequiredVersion(const BrushCoat& coat) {
Version max_version = CalculateMinimumRequiredVersion(coat.tip);
for (const BrushPaint& paint : coat.paint_preferences) {
max_version = std::max(max_version, CalculateMinimumRequiredVersion(paint));
}
return max_version;
}

void AddAttributeIdsRequiredByCoat(
const BrushCoat& coat,
absl::flat_hash_set<MeshFormat::AttributeId>& attribute_ids) {
Expand Down
5 changes: 5 additions & 0 deletions ink/brush/brush_coat.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "absl/status/status.h"
#include "ink/brush/brush_paint.h"
#include "ink/brush/brush_tip.h"
#include "ink/brush/version.h"
#include "ink/geometry/mesh_format.h"

namespace ink {
Expand All @@ -46,6 +47,10 @@ namespace brush_internal {
// BrushFamily, and returns an error if not.
absl::Status ValidateBrushCoat(const BrushCoat& coat);

// Calculates the minimum version of the Ink library that is required to use
// this brush coat.
Version CalculateMinimumRequiredVersion(const BrushCoat& coat);

// Adds the mesh attribute IDs that are required to properly render a mesh
// made with this brush coat to the given `attribute_ids` set. This will always
// include `kPosition` and certain other attribute IDs (`kSideDerivative`,
Expand Down
Loading
Loading