Bug 984761 - Use a typed enum for ColorSpace and AlphaModel. r=bjacob

This commit is contained in:
Markus Stange 2014-03-20 10:12:43 +08:00
parent 73513f44be
commit 0837b9905e
4 changed files with 40 additions and 23 deletions

View File

@ -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

View File

@ -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)
{
}

View File

@ -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;

View File

@ -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) {