nsresult nsCSSFilterInstance::SetAttributesForDropShadow(FilterPrimitiveDescription& aDescr) { nsCSSShadowArray* shadows = mFilter.GetDropShadow(); if (!shadows || shadows->Length() != 1) { NS_NOTREACHED("Exactly one drop shadow should have been parsed."); return NS_ERROR_FAILURE; } nsCSSShadowItem* shadow = shadows->ShadowAt(0); // Set drop shadow blur radius. Size radiusInFilterSpace = BlurRadiusToFilterSpace(shadow->mRadius); aDescr.Attributes().Set(eDropShadowStdDeviation, radiusInFilterSpace); // Set offset. IntPoint offsetInFilterSpace = OffsetToFilterSpace(shadow->mXOffset, shadow->mYOffset); aDescr.Attributes().Set(eDropShadowOffset, offsetInFilterSpace); // Set color. If unspecified, use the CSS color property. nscolor shadowColor = shadow->mHasColor ? shadow->mColor : mTargetFrame->StyleColor()->mColor; aDescr.Attributes().Set(eDropShadowColor, ToAttributeColor(shadowColor)); return NS_OK; }
nsresult nsCSSFilterInstance::SetAttributesForSepia(FilterPrimitiveDescription& aDescr) { // Set color matrix type. aDescr.Attributes().Set(eColorMatrixType, (uint32_t)SVG_FECOLORMATRIX_TYPE_SEPIA); // Set color matrix values. const nsStyleCoord& styleValue = mFilter.GetFilterParameter(); float value = ClampFactor(styleValue.GetFactorOrPercentValue()); aDescr.Attributes().Set(eColorMatrixValues, &value, 1); return NS_OK; }
nsresult nsCSSFilterInstance::SetAttributesForHueRotate(FilterPrimitiveDescription& aDescr) { // Set color matrix type. aDescr.Attributes().Set(eColorMatrixType, (uint32_t)SVG_FECOLORMATRIX_TYPE_HUE_ROTATE); // Set color matrix values. const nsStyleCoord& styleValue = mFilter.GetFilterParameter(); float value = styleValue.GetAngleValueInDegrees(); aDescr.Attributes().Set(eColorMatrixValues, &value, 1); return NS_OK; }
void nsCSSFilterInstance::SetBounds(FilterPrimitiveDescription& aDescr, const nsTArray<FilterPrimitiveDescription>& aPrimitiveDescrs) { int32_t inputIndex = GetLastResultIndex(aPrimitiveDescrs); nsIntRect inputBounds = (inputIndex < 0) ? mTargetBBoxInFilterSpace : ThebesIntRect(aPrimitiveDescrs[inputIndex].PrimitiveSubregion()); nsTArray<nsIntRegion> inputExtents; inputExtents.AppendElement(inputBounds); nsIntRegion outputExtents = FilterSupport::PostFilterExtentsForPrimitive(aDescr, inputExtents); IntRect outputBounds = ToIntRect(outputExtents.GetBounds()); aDescr.SetPrimitiveSubregion(outputBounds); aDescr.SetFilterSpaceBounds(outputBounds); }
nsresult nsCSSFilterInstance::SetAttributesForBlur(FilterPrimitiveDescription& aDescr) { const nsStyleCoord& radiusInFrameSpace = mFilter.GetFilterParameter(); if (radiusInFrameSpace.GetUnit() != eStyleUnit_Coord) { NS_NOTREACHED("unexpected unit"); return NS_ERROR_FAILURE; } Size radiusInFilterSpace = BlurRadiusToFilterSpace(radiusInFrameSpace.GetCoordValue()); aDescr.Attributes().Set(eGaussianBlurStdDeviation, radiusInFilterSpace); return NS_OK; }
nsresult nsSVGFilterInstance::BuildPrimitives(nsTArray<FilterPrimitiveDescription>& aPrimitiveDescrs, nsTArray<RefPtr<SourceSurface>>& aInputImages, bool aInputIsTainted) { mSourceGraphicIndex = GetLastResultIndex(aPrimitiveDescrs); // Clip previous filter's output to this filter's filter region. if (mSourceGraphicIndex >= 0) { FilterPrimitiveDescription& sourceDescr = aPrimitiveDescrs[mSourceGraphicIndex]; sourceDescr.SetPrimitiveSubregion(sourceDescr.PrimitiveSubregion().Intersect(mFilterSpaceBounds)); } // Get the filter primitive elements. nsTArray<RefPtr<nsSVGFE> > primitives; for (nsIContent* child = mFilterElement->nsINode::GetFirstChild(); child; child = child->GetNextSibling()) { RefPtr<nsSVGFE> primitive; CallQueryInterface(child, (nsSVGFE**)getter_AddRefs(primitive)); if (primitive) { primitives.AppendElement(primitive); } } // Maps source image name to source index. nsDataHashtable<nsStringHashKey, int32_t> imageTable(8); // The principal that we check principals of any loaded images against. nsCOMPtr<nsIPrincipal> principal = mTargetContent->NodePrincipal(); for (uint32_t primitiveElementIndex = 0; primitiveElementIndex < primitives.Length(); ++primitiveElementIndex) { nsSVGFE* filter = primitives[primitiveElementIndex]; AutoTArray<int32_t,2> sourceIndices; nsresult rv = GetSourceIndices(filter, aPrimitiveDescrs, imageTable, sourceIndices); if (NS_FAILED(rv)) { return rv; } IntRect primitiveSubregion = ComputeFilterPrimitiveSubregion(filter, aPrimitiveDescrs, sourceIndices); nsTArray<bool> sourcesAreTainted; GetInputsAreTainted(aPrimitiveDescrs, sourceIndices, aInputIsTainted, sourcesAreTainted); FilterPrimitiveDescription descr = filter->GetPrimitiveDescription(this, primitiveSubregion, sourcesAreTainted, aInputImages); descr.SetIsTainted(filter->OutputIsTainted(sourcesAreTainted, principal)); descr.SetFilterSpaceBounds(mFilterSpaceBounds); descr.SetPrimitiveSubregion(primitiveSubregion.Intersect(descr.FilterSpaceBounds())); for (uint32_t i = 0; i < sourceIndices.Length(); i++) { int32_t inputIndex = sourceIndices[i]; descr.SetInputPrimitive(i, inputIndex); ColorSpace inputColorSpace = inputIndex >= 0 ? aPrimitiveDescrs[inputIndex].OutputColorSpace() : ColorSpace(ColorSpace::SRGB); ColorSpace desiredInputColorSpace = filter->GetInputColorSpace(i, inputColorSpace); descr.SetInputColorSpace(i, desiredInputColorSpace); if (i == 0) { // the output color space is whatever in1 is if there is an in1 descr.SetOutputColorSpace(desiredInputColorSpace); } } if (sourceIndices.Length() == 0) { descr.SetOutputColorSpace(filter->GetOutputColorSpace()); } aPrimitiveDescrs.AppendElement(descr); uint32_t primitiveDescrIndex = aPrimitiveDescrs.Length() - 1; nsAutoString str; filter->GetResultImageName().GetAnimValue(str, filter); imageTable.Put(str, primitiveDescrIndex); } return NS_OK; }
nsresult nsSVGFilterInstance::BuildPrimitives() { nsTArray<nsRefPtr<nsSVGFE> > primitives; for (nsIContent* child = mFilterElement->nsINode::GetFirstChild(); child; child = child->GetNextSibling()) { nsRefPtr<nsSVGFE> primitive; CallQueryInterface(child, (nsSVGFE**)getter_AddRefs(primitive)); if (primitive) { primitives.AppendElement(primitive); } } // Maps source image name to source index. nsDataHashtable<nsStringHashKey, int32_t> imageTable(10); // The principal that we check principals of any loaded images against. nsCOMPtr<nsIPrincipal> principal = mTargetFrame->GetContent()->NodePrincipal(); for (uint32_t i = 0; i < primitives.Length(); ++i) { nsSVGFE* filter = primitives[i]; nsAutoTArray<int32_t,2> sourceIndices; nsresult rv = GetSourceIndices(filter, i, imageTable, sourceIndices); if (NS_FAILED(rv)) { return rv; } IntRect primitiveSubregion = ComputeFilterPrimitiveSubregion(filter, sourceIndices); nsTArray<bool> sourcesAreTainted; GetInputsAreTainted(sourceIndices, sourcesAreTainted); FilterPrimitiveDescription descr = filter->GetPrimitiveDescription(this, primitiveSubregion, sourcesAreTainted, mInputImages); descr.SetIsTainted(filter->OutputIsTainted(sourcesAreTainted, principal)); descr.SetPrimitiveSubregion(primitiveSubregion); for (uint32_t j = 0; j < sourceIndices.Length(); j++) { int32_t inputIndex = sourceIndices[j]; descr.SetInputPrimitive(j, inputIndex); ColorSpace inputColorSpace = inputIndex < 0 ? SRGB : mPrimitiveDescriptions[inputIndex].OutputColorSpace(); ColorSpace desiredInputColorSpace = filter->GetInputColorSpace(j, inputColorSpace); descr.SetInputColorSpace(j, desiredInputColorSpace); if (j == 0) { // the output color space is whatever in1 is if there is an in1 descr.SetOutputColorSpace(desiredInputColorSpace); } } if (sourceIndices.Length() == 0) { descr.SetOutputColorSpace(filter->GetOutputColorSpace()); } mPrimitiveDescriptions.AppendElement(descr); nsAutoString str; filter->GetResultImageName().GetAnimValue(str, filter); imageTable.Put(str, i); } return NS_OK; }