mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 11:55:49 +00:00
Bug 984761 - Use a typed enum for ColorSpace and AlphaModel. r=bjacob
This commit is contained in:
parent
73513f44be
commit
0837b9905e
@ -58,15 +58,15 @@ public:
|
||||
|
||||
ColorSpace
|
||||
GetInputColorSpace(int32_t aInputIndex, ColorSpace aUnchangedInputColorSpace) {
|
||||
return OperatesOnSRGB(aInputIndex, aUnchangedInputColorSpace == mozilla::gfx::SRGB) ?
|
||||
mozilla::gfx::SRGB : mozilla::gfx::LINEAR_RGB;
|
||||
return OperatesOnSRGB(aInputIndex, aUnchangedInputColorSpace == ColorSpace::SRGB) ?
|
||||
ColorSpace::SRGB : ColorSpace::LinearRGB;
|
||||
}
|
||||
|
||||
// This is only called for filter primitives without inputs. For primitives
|
||||
// with inputs, the output color model is the same as of the first input.
|
||||
ColorSpace
|
||||
GetOutputColorSpace() {
|
||||
return ProducesSRGB() ? mozilla::gfx::SRGB : mozilla::gfx::LINEAR_RGB;
|
||||
return ProducesSRGB() ? ColorSpace::SRGB : ColorSpace::LinearRGB;
|
||||
}
|
||||
|
||||
// See http://www.w3.org/TR/SVG/filters.html#FilterPrimitiveSubRegion
|
||||
|
@ -291,22 +291,22 @@ FilterCachedColorModels::WrapForColorModel(ColorModel aColorModel)
|
||||
// Conversions between different color spaces can only happen on
|
||||
// unpremultiplied color channels.
|
||||
|
||||
if (aColorModel.mAlphaModel == PREMULTIPLIED) {
|
||||
if (aColorModel.mAlphaModel == AlphaModel::Premultiplied) {
|
||||
RefPtr<FilterNode> unpre =
|
||||
ForColorModel(ColorModel(aColorModel.mColorSpace, UNPREMULTIPLIED));
|
||||
ForColorModel(ColorModel(aColorModel.mColorSpace, AlphaModel::Unpremultiplied));
|
||||
return FilterWrappers::Premultiply(mDT, unpre);
|
||||
}
|
||||
|
||||
MOZ_ASSERT(aColorModel.mAlphaModel == UNPREMULTIPLIED);
|
||||
MOZ_ASSERT(aColorModel.mAlphaModel == AlphaModel::Unpremultiplied);
|
||||
if (aColorModel.mColorSpace == mOriginalColorModel.mColorSpace) {
|
||||
RefPtr<FilterNode> premultiplied =
|
||||
ForColorModel(ColorModel(aColorModel.mColorSpace, PREMULTIPLIED));
|
||||
ForColorModel(ColorModel(aColorModel.mColorSpace, AlphaModel::Premultiplied));
|
||||
return FilterWrappers::Unpremultiply(mDT, premultiplied);
|
||||
}
|
||||
|
||||
RefPtr<FilterNode> unpremultipliedOriginal =
|
||||
ForColorModel(ColorModel(mOriginalColorModel.mColorSpace, UNPREMULTIPLIED));
|
||||
if (aColorModel.mColorSpace == LINEAR_RGB) {
|
||||
ForColorModel(ColorModel(mOriginalColorModel.mColorSpace, AlphaModel::Unpremultiplied));
|
||||
if (aColorModel.mColorSpace == ColorSpace::LinearRGB) {
|
||||
return FilterWrappers::SRGBToLinearRGB(mDT, unpremultipliedOriginal);
|
||||
}
|
||||
return FilterWrappers::LinearRGBToSRGB(mDT, unpremultipliedOriginal);
|
||||
@ -853,7 +853,7 @@ FilterNodeFromPrimitiveDescription(const FilterPrimitiveDescription& aDescriptio
|
||||
atts.GetIntPoint(eDropShadowOffset));
|
||||
RefPtr<FilterNode> flood = aDT->CreateFilter(FilterType::FLOOD);
|
||||
Color color = atts.GetColor(eDropShadowColor);
|
||||
if (aDescription.InputColorSpace(0) == LINEAR_RGB) {
|
||||
if (aDescription.InputColorSpace(0) == ColorSpace::LinearRGB) {
|
||||
color = Color(gsRGBToLinearRGBMap[uint8_t(color.r * 255)],
|
||||
gsRGBToLinearRGBMap[uint8_t(color.g * 255)],
|
||||
gsRGBToLinearRGBMap[uint8_t(color.b * 255)],
|
||||
@ -1003,17 +1003,18 @@ InputAlphaModelForPrimitive(const FilterPrimitiveDescription& aDescr,
|
||||
|
||||
case PrimitiveType::ColorMatrix:
|
||||
case PrimitiveType::ComponentTransfer:
|
||||
return UNPREMULTIPLIED;
|
||||
return AlphaModel::Unpremultiplied;
|
||||
|
||||
case PrimitiveType::DisplacementMap:
|
||||
return aInputIndex == 0 ? PREMULTIPLIED : UNPREMULTIPLIED;
|
||||
return aInputIndex == 0 ?
|
||||
AlphaModel::Premultiplied : AlphaModel::Unpremultiplied;
|
||||
|
||||
case PrimitiveType::ConvolveMatrix:
|
||||
return aDescr.Attributes().GetBool(eConvolveMatrixPreserveAlpha) ?
|
||||
UNPREMULTIPLIED : PREMULTIPLIED;
|
||||
AlphaModel::Unpremultiplied : AlphaModel::Premultiplied;
|
||||
|
||||
default:
|
||||
return PREMULTIPLIED;
|
||||
return AlphaModel::Premultiplied;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1028,7 +1029,7 @@ OutputAlphaModelForPrimitive(const FilterPrimitiveDescription& aDescr,
|
||||
}
|
||||
|
||||
// All filters without inputs produce premultiplied alpha.
|
||||
return PREMULTIPLIED;
|
||||
return AlphaModel::Premultiplied;
|
||||
}
|
||||
|
||||
// Returns the output FilterNode, in premultiplied sRGB space.
|
||||
@ -1536,7 +1537,7 @@ FilterSupport::ComputeSourceNeededRegions(const FilterDescription& aFilter,
|
||||
|
||||
FilterPrimitiveDescription::FilterPrimitiveDescription(PrimitiveType aType)
|
||||
: mType(aType)
|
||||
, mOutputColorSpace(SRGB)
|
||||
, mOutputColorSpace(ColorSpace::SRGB)
|
||||
, mIsTainted(false)
|
||||
{
|
||||
}
|
||||
|
@ -204,24 +204,37 @@ private:
|
||||
mutable nsClassHashtable<nsUint32HashKey, FilterAttribute> mMap;
|
||||
};
|
||||
|
||||
enum ColorSpace { SRGB, LINEAR_RGB };
|
||||
enum AlphaModel { UNPREMULTIPLIED, PREMULTIPLIED };
|
||||
MOZ_BEGIN_ENUM_CLASS(ColorSpace)
|
||||
SRGB,
|
||||
LinearRGB
|
||||
MOZ_END_ENUM_CLASS(ColorSpace)
|
||||
|
||||
MOZ_BEGIN_ENUM_CLASS(AlphaModel)
|
||||
Unpremultiplied,
|
||||
Premultiplied
|
||||
MOZ_END_ENUM_CLASS(AlphaModel)
|
||||
|
||||
class ColorModel {
|
||||
public:
|
||||
static ColorModel PremulSRGB() { return ColorModel(SRGB, PREMULTIPLIED); }
|
||||
static ColorModel PremulSRGB()
|
||||
{
|
||||
return ColorModel(ColorSpace::SRGB, AlphaModel::Premultiplied);
|
||||
}
|
||||
|
||||
ColorModel(ColorSpace aColorSpace, AlphaModel aAlphaModel) :
|
||||
mColorSpace(aColorSpace), mAlphaModel(aAlphaModel) {}
|
||||
ColorModel() :
|
||||
mColorSpace(SRGB), mAlphaModel(PREMULTIPLIED) {}
|
||||
mColorSpace(ColorSpace::SRGB), mAlphaModel(AlphaModel::Premultiplied) {}
|
||||
bool operator==(const ColorModel& aOther) const {
|
||||
return mColorSpace == aOther.mColorSpace &&
|
||||
mAlphaModel == aOther.mAlphaModel;
|
||||
}
|
||||
|
||||
// Used to index FilterCachedColorModels::mFilterForColorModel.
|
||||
uint8_t ToIndex() const { return (mColorSpace << 1) + mAlphaModel; }
|
||||
uint8_t ToIndex() const
|
||||
{
|
||||
return (uint8_t(mColorSpace) << 1) + uint8_t(mAlphaModel);
|
||||
}
|
||||
|
||||
ColorSpace mColorSpace;
|
||||
AlphaModel mAlphaModel;
|
||||
|
@ -399,8 +399,11 @@ nsSVGFilterInstance::BuildPrimitives(nsTArray<FilterPrimitiveDescription>& aPrim
|
||||
for (uint32_t i = 0; i < sourceIndices.Length(); i++) {
|
||||
int32_t inputIndex = sourceIndices[i];
|
||||
descr.SetInputPrimitive(i, inputIndex);
|
||||
ColorSpace inputColorSpace =
|
||||
inputIndex < 0 ? SRGB : aPrimitiveDescrs[inputIndex].OutputColorSpace();
|
||||
|
||||
ColorSpace inputColorSpace = inputIndex >= 0
|
||||
? aPrimitiveDescrs[inputIndex].OutputColorSpace()
|
||||
: ColorSpace(ColorSpace::SRGB);
|
||||
|
||||
ColorSpace desiredInputColorSpace = filter->GetInputColorSpace(i, inputColorSpace);
|
||||
descr.SetInputColorSpace(i, desiredInputColorSpace);
|
||||
if (i == 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user