本文整理汇总了C++中UnderlyingValueOwner类的典型用法代码示例。如果您正苦于以下问题:C++ UnderlyingValueOwner类的具体用法?C++ UnderlyingValueOwner怎么用?C++ UnderlyingValueOwner使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了UnderlyingValueOwner类的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: composite
void CSSBasicShapeInterpolationType::composite(UnderlyingValueOwner& underlyingValueOwner, double underlyingFraction, const InterpolationValue& value, double interpolationFraction) const
{
if (!BasicShapeInterpolationFunctions::shapesAreCompatible(*underlyingValueOwner.value().nonInterpolableValue, *value.nonInterpolableValue)) {
underlyingValueOwner.set(*this, value);
return;
}
underlyingValueOwner.mutableValue().interpolableValue->scaleAndAdd(underlyingFraction, *value.interpolableValue);
}
示例2: composite
void CSSClipInterpolationType::composite(UnderlyingValueOwner& underlyingValueOwner, double underlyingFraction, const InterpolationValue& value, double interpolationFraction) const
{
const ClipAutos& underlyingAutos = toCSSClipNonInterpolableValue(*underlyingValueOwner.value().nonInterpolableValue).clipAutos();
const ClipAutos& autos = toCSSClipNonInterpolableValue(*value.nonInterpolableValue).clipAutos();
if (underlyingAutos == autos)
underlyingValueOwner.mutableValue().interpolableValue->scaleAndAdd(underlyingFraction, *value.interpolableValue);
else
underlyingValueOwner.set(*this, value);
}
示例3: composite
void CSSMotionRotationInterpolationType::composite(UnderlyingValueOwner& underlyingValueOwner, double underlyingFraction, const InterpolationValue& value) const
{
const MotionRotationType& underlyingType = toCSSMotionRotationNonInterpolableValue(*underlyingValueOwner.value().nonInterpolableValue).rotationType();
const MotionRotationType& rotationType = toCSSMotionRotationNonInterpolableValue(*value.nonInterpolableValue).rotationType();
if (underlyingType == rotationType)
underlyingValueOwner.mutableValue().interpolableValue->scaleAndAdd(underlyingFraction, *value.interpolableValue);
else
underlyingValueOwner.set(*this, value);
}
示例4: composite
void CSSImageSliceInterpolationType::composite(UnderlyingValueOwner& underlyingValueOwner, double underlyingFraction, const InterpolationValue& value, double interpolationFraction) const
{
const SliceTypes& underlyingTypes = toCSSImageSliceNonInterpolableValue(*underlyingValueOwner.value().nonInterpolableValue).types();
const SliceTypes& types = toCSSImageSliceNonInterpolableValue(*value.nonInterpolableValue).types();
if (underlyingTypes == types)
underlyingValueOwner.mutableValue().interpolableValue->scaleAndAdd(underlyingFraction, *value.interpolableValue);
else
underlyingValueOwner.set(*this, value);
}
示例5: DCHECK
void InvalidatableInterpolation::applyStack(
const ActiveInterpolations& interpolations,
InterpolationEnvironment& environment) {
DCHECK(!interpolations.isEmpty());
size_t startingIndex = 0;
// Compute the underlying value to composite onto.
UnderlyingValueOwner underlyingValueOwner;
const InvalidatableInterpolation& firstInterpolation =
toInvalidatableInterpolation(*interpolations.at(startingIndex));
if (firstInterpolation.dependsOnUnderlyingValue()) {
underlyingValueOwner.set(
firstInterpolation.maybeConvertUnderlyingValue(environment));
} else {
const TypedInterpolationValue* firstValue =
firstInterpolation.ensureValidInterpolation(environment,
underlyingValueOwner);
// Fast path for replace interpolations that are the only one to apply.
if (interpolations.size() == 1) {
if (firstValue) {
firstInterpolation.setFlagIfInheritUsed(environment);
firstValue->type().apply(firstValue->interpolableValue(),
firstValue->getNonInterpolableValue(),
environment);
}
return;
}
underlyingValueOwner.set(firstValue);
startingIndex++;
}
// Composite interpolations onto the underlying value.
bool shouldApply = false;
for (size_t i = startingIndex; i < interpolations.size(); i++) {
const InvalidatableInterpolation& currentInterpolation =
toInvalidatableInterpolation(*interpolations.at(i));
DCHECK(currentInterpolation.dependsOnUnderlyingValue());
const TypedInterpolationValue* currentValue =
currentInterpolation.ensureValidInterpolation(environment,
underlyingValueOwner);
if (!currentValue)
continue;
shouldApply = true;
currentInterpolation.setFlagIfInheritUsed(environment);
double underlyingFraction = currentInterpolation.underlyingFraction();
if (underlyingFraction == 0 || !underlyingValueOwner ||
underlyingValueOwner.type() != currentValue->type())
underlyingValueOwner.set(currentValue);
else
currentValue->type().composite(underlyingValueOwner, underlyingFraction,
currentValue->value(),
currentInterpolation.m_currentFraction);
}
if (shouldApply && underlyingValueOwner)
underlyingValueOwner.type().apply(
*underlyingValueOwner.value().interpolableValue,
underlyingValueOwner.value().nonInterpolableValue.get(), environment);
}
示例6: composite
void SVGPointListInterpolationType::composite(
UnderlyingValueOwner& underlyingValueOwner,
double underlyingFraction,
const InterpolationValue& value,
double interpolationFraction) const {
size_t startLength =
toInterpolableList(*underlyingValueOwner.value().interpolableValue)
.length();
size_t endLength = toInterpolableList(*value.interpolableValue).length();
if (startLength == endLength)
InterpolationType::composite(underlyingValueOwner, underlyingFraction,
value, interpolationFraction);
else
underlyingValueOwner.set(*this, value);
}
示例7: composite
void SVGTransformListInterpolationType::composite(
UnderlyingValueOwner& underlyingValueOwner,
double underlyingFraction,
const InterpolationValue& value,
double interpolationFraction) const {
underlyingValueOwner.set(*this, value);
}
示例8: isCacheValid
bool InvalidatableInterpolation::isCacheValid(
const InterpolationEnvironment& environment,
const UnderlyingValueOwner& underlyingValueOwner) const {
if (!m_isCached)
return false;
if (isNeutralKeyframeActive()) {
if (m_cachedPairConversion && m_cachedPairConversion->isFlip())
return false;
// Pairwise interpolation can never happen between different
// InterpolationTypes, neutral values always represent the underlying value.
if (!underlyingValueOwner || !m_cachedValue ||
m_cachedValue->type() != underlyingValueOwner.type())
return false;
}
for (const auto& checker : m_conversionCheckers) {
if (!checker->isValid(environment, underlyingValueOwner.value()))
return false;
}
return true;
}
示例9: composite
void CSSBorderImageLengthBoxInterpolationType::composite(
UnderlyingValueOwner& underlyingValueOwner,
double underlyingFraction,
const InterpolationValue& value,
double interpolationFraction) const {
const SideNumbers& underlyingSideNumbers =
toCSSBorderImageLengthBoxNonInterpolableValue(
*underlyingValueOwner.value().nonInterpolableValue)
.sideNumbers();
const auto& nonInterpolableValue =
toCSSBorderImageLengthBoxNonInterpolableValue(
*value.nonInterpolableValue);
const SideNumbers& sideNumbers = nonInterpolableValue.sideNumbers();
if (underlyingSideNumbers != sideNumbers) {
underlyingValueOwner.set(*this, value);
return;
}
InterpolationValue& underlyingValue = underlyingValueOwner.mutableValue();
InterpolableList& underlyingList =
toInterpolableList(*underlyingValue.interpolableValue);
Vector<RefPtr<NonInterpolableValue>>& underlyingSideNonInterpolableValues =
toCSSBorderImageLengthBoxNonInterpolableValue(
*underlyingValue.nonInterpolableValue)
.sideNonInterpolableValues();
const InterpolableList& list = toInterpolableList(*value.interpolableValue);
const Vector<RefPtr<NonInterpolableValue>>& sideNonInterpolableValues =
nonInterpolableValue.sideNonInterpolableValues();
for (size_t i = 0; i < SideIndexCount; i++) {
if (sideNumbers.isNumber[i])
underlyingList.getMutable(i)->scaleAndAdd(underlyingFraction,
*list.get(i));
else
LengthInterpolationFunctions::composite(
underlyingList.getMutable(i), underlyingSideNonInterpolableValues[i],
underlyingFraction, *list.get(i), sideNonInterpolableValues[i].get());
}
}
示例10: create
std::unique_ptr<PairwisePrimitiveInterpolation>
InvalidatableInterpolation::maybeConvertPairwise(
const InterpolationEnvironment& environment,
const UnderlyingValueOwner& underlyingValueOwner) const {
DCHECK(m_currentFraction != 0 && m_currentFraction != 1);
for (const auto& interpolationType : m_interpolationTypes) {
if ((m_startKeyframe->isNeutral() || m_endKeyframe->isNeutral()) &&
(!underlyingValueOwner ||
underlyingValueOwner.type() != *interpolationType))
continue;
ConversionCheckers conversionCheckers;
PairwiseInterpolationValue result = interpolationType->maybeConvertPairwise(
*m_startKeyframe, *m_endKeyframe, environment,
underlyingValueOwner.value(), conversionCheckers);
addConversionCheckers(*interpolationType, conversionCheckers);
if (result) {
return PairwisePrimitiveInterpolation::create(
*interpolationType, std::move(result.startInterpolableValue),
std::move(result.endInterpolableValue),
result.nonInterpolableValue.release());
}
}
return nullptr;
}
示例11: composite
void CSSScaleInterpolationType::composite(
UnderlyingValueOwner& underlyingValueOwner,
double underlyingFraction,
const InterpolationValue& value,
double interpolationFraction) const {
const CSSScaleNonInterpolableValue& metadata =
toCSSScaleNonInterpolableValue(*value.nonInterpolableValue);
DCHECK(metadata.isStartAdditive() || metadata.isEndAdditive());
InterpolableList& underlyingList = toInterpolableList(
*underlyingValueOwner.mutableValue().interpolableValue);
for (size_t i = 0; i < 3; i++) {
InterpolableNumber& underlying =
toInterpolableNumber(*underlyingList.getMutable(i));
double start = metadata.start().array[i] *
(metadata.isStartAdditive() ? underlying.value() : 1);
double end = metadata.end().array[i] *
(metadata.isEndAdditive() ? underlying.value() : 1);
underlying.set(blend(start, end, interpolationFraction));
}
}
示例12: composite
void ListInterpolationFunctions::composite(UnderlyingValueOwner& underlyingValueOwner, double underlyingFraction, const InterpolationType& type, const InterpolationValue& value, NonInterpolableValuesAreCompatibleCallback nonInterpolableValuesAreCompatible, CompositeItemCallback compositeItem)
{
size_t underlyingLength = toInterpolableList(*underlyingValueOwner.value().interpolableValue).length();
if (underlyingLength == 0) {
ASSERT(!underlyingValueOwner.value().nonInterpolableValue);
underlyingValueOwner.set(type, value);
return;
}
const InterpolableList& interpolableList = toInterpolableList(*value.interpolableValue);
size_t valueLength = interpolableList.length();
if (valueLength == 0) {
ASSERT(!value.nonInterpolableValue);
underlyingValueOwner.mutableValue().interpolableValue->scale(underlyingFraction);
return;
}
const NonInterpolableList& nonInterpolableList = toNonInterpolableList(*value.nonInterpolableValue);
size_t newLength = lowestCommonMultiple(underlyingLength, valueLength);
if (!nonInterpolableListsAreCompatible(toNonInterpolableList(*underlyingValueOwner.value().nonInterpolableValue), nonInterpolableList, newLength, nonInterpolableValuesAreCompatible)) {
underlyingValueOwner.set(type, value);
return;
}
InterpolationValue& underlyingValue = underlyingValueOwner.mutableValue();
if (underlyingLength < newLength)
repeatToLength(underlyingValue, newLength);
InterpolableList& underlyingInterpolableList = toInterpolableList(*underlyingValue.interpolableValue);
NonInterpolableList& underlyingNonInterpolableList = toNonInterpolableList(*underlyingValue.nonInterpolableValue);
for (size_t i = 0; i < newLength; i++) {
compositeItem(
underlyingInterpolableList.getMutable(i),
underlyingNonInterpolableList.getMutable(i),
underlyingFraction,
*interpolableList.get(i % valueLength),
nonInterpolableList.get(i % valueLength));
}
}