void ImageLayer::ComputeEffectiveTransforms(const gfx::Matrix4x4& aTransformToSurface) { gfx::Matrix4x4 local = GetLocalTransform(); // Snap image edges to pixel boundaries gfxRect sourceRect(0, 0, 0, 0); if (mContainer) { sourceRect.SizeTo(mContainer->GetCurrentSize()); } // Snap our local transform first, and snap the inherited transform as well. // This makes our snapping equivalent to what would happen if our content // was drawn into a PaintedLayer (gfxContext would snap using the local // transform, then we'd snap again when compositing the PaintedLayer). mEffectiveTransform = SnapTransform(local, sourceRect, nullptr) * SnapTransformTranslation(aTransformToSurface, nullptr); if (mScaleMode != ScaleMode::SCALE_NONE && sourceRect.width != 0.0 && sourceRect.height != 0.0) { NS_ASSERTION(mScaleMode == ScaleMode::STRETCH, "No other scalemodes than stretch and none supported yet."); local.PreScale(mScaleToSize.width / sourceRect.width, mScaleToSize.height / sourceRect.height, 1.0); mEffectiveTransformForBuffer = SnapTransform(local, sourceRect, nullptr) * SnapTransformTranslation(aTransformToSurface, nullptr); } else { mEffectiveTransformForBuffer = mEffectiveTransform; } ComputeEffectiveTransformForMaskLayers(aTransformToSurface); }
void ImageLayerComposite::ComputeEffectiveTransforms(const gfx3DMatrix& aTransformToSurface) { gfx3DMatrix local = GetLocalTransform(); // Snap image edges to pixel boundaries gfxRect sourceRect(0, 0, 0, 0); if (mImageHost && mImageHost->IsAttached() && (mImageHost->GetDeprecatedTextureHost() || mImageHost->GetTextureHost())) { IntSize size = mImageHost->GetTextureHost() ? mImageHost->GetTextureHost()->GetSize() : mImageHost->GetDeprecatedTextureHost()->GetSize(); sourceRect.SizeTo(size.width, size.height); if (mScaleMode != SCALE_NONE && sourceRect.width != 0.0 && sourceRect.height != 0.0) { NS_ASSERTION(mScaleMode == SCALE_STRETCH, "No other scalemodes than stretch and none supported yet."); local.Scale(mScaleToSize.width / sourceRect.width, mScaleToSize.height / sourceRect.height, 1.0); } } // Snap our local transform first, and snap the inherited transform as well. // This makes our snapping equivalent to what would happen if our content // was drawn into a ThebesLayer (gfxContext would snap using the local // transform, then we'd snap again when compositing the ThebesLayer). mEffectiveTransform = SnapTransform(local, sourceRect, nullptr) * SnapTransformTranslation(aTransformToSurface, nullptr); ComputeEffectiveTransformForMaskLayer(aTransformToSurface); }
void ImageLayerMLGPU::ComputeEffectiveTransforms(const gfx::Matrix4x4& aTransformToSurface) { Matrix4x4 local = GetLocalTransform(); // Snap image edges to pixel boundaries. gfxRect sourceRect(0, 0, 0, 0); if (mHost && mHost->IsAttached()) { IntSize size = mHost->GetImageSize(); sourceRect.SizeTo(size.width, size.height); } // Snap our local transform first, and snap the inherited transform as well. // This makes our snapping equivalent to what would happen if our content // was drawn into a PaintedLayer (gfxContext would snap using the local // transform, then we'd snap again when compositing the PaintedLayer). mEffectiveTransform = SnapTransform(local, sourceRect, nullptr) * SnapTransformTranslation(aTransformToSurface, nullptr); mEffectiveTransformForBuffer = mEffectiveTransform; if (mScaleMode == ScaleMode::STRETCH && mScaleToSize.width != 0.0 && mScaleToSize.height != 0.0) { Size scale(sourceRect.Width() / mScaleToSize.width, sourceRect.Height() / mScaleToSize.height); mScale = Some(scale); } ComputeEffectiveTransformForMaskLayers(aTransformToSurface); }
void ContainerLayer::DefaultComputeEffectiveTransforms(const gfx3DMatrix& aTransformToSurface) { gfxMatrix residual; gfx3DMatrix idealTransform = GetLocalTransform()*aTransformToSurface; mEffectiveTransform = SnapTransform(idealTransform, gfxRect(0, 0, 0, 0), &residual); PRBool useIntermediateSurface; float opacity = GetEffectiveOpacity(); if (opacity != 1.0f && HasMultipleChildren()) { useIntermediateSurface = PR_TRUE; } else { useIntermediateSurface = PR_FALSE; gfxMatrix contTransform; if (!mEffectiveTransform.Is2D(&contTransform) || !contTransform.PreservesAxisAlignedRectangles()) { for (Layer* child = GetFirstChild(); child; child = child->GetNextSibling()) { const nsIntRect *clipRect = child->GetEffectiveClipRect(); /* We can't (easily) forward our transform to children with a non-empty clip * rect since it would need to be adjusted for the transform. * TODO: This is easily solvable for translation/scaling transforms. */ if (clipRect && !clipRect->IsEmpty() && !child->GetVisibleRegion().IsEmpty()) { useIntermediateSurface = PR_TRUE; break; } } } } mUseIntermediateSurface = useIntermediateSurface; if (useIntermediateSurface) { ComputeEffectiveTransformsForChildren(gfx3DMatrix::From2D(residual)); } else { ComputeEffectiveTransformsForChildren(idealTransform); } }