nsIntSize ClippedImage::OptimalImageSizeForDest(const gfxSize& aDest, uint32_t aWhichFrame, SamplingFilter aSamplingFilter, uint32_t aFlags) { if (!ShouldClip()) { return InnerImage()->OptimalImageSizeForDest(aDest, aWhichFrame, aSamplingFilter, aFlags); } int32_t imgWidth, imgHeight; bool needScale = false; bool forceUniformScaling = false; if (mSVGViewportSize && !mSVGViewportSize->IsEmpty()) { imgWidth = mSVGViewportSize->width; imgHeight = mSVGViewportSize->height; needScale = true; forceUniformScaling = (aFlags & imgIContainer::FLAG_FORCE_UNIFORM_SCALING); } else if (NS_SUCCEEDED(InnerImage()->GetWidth(&imgWidth)) && NS_SUCCEEDED(InnerImage()->GetHeight(&imgHeight))) { needScale = true; } if (needScale) { // To avoid ugly sampling artifacts, ClippedImage needs the image size to // be chosen such that the clipping region lies on pixel boundaries. // First, we select a scale that's good for ClippedImage. An integer // multiple of the size of the clipping region is always fine. IntSize scale = IntSize::Ceil(aDest.width / mClip.width, aDest.height / mClip.height); if (forceUniformScaling) { scale.width = scale.height = max(scale.height, scale.width); } // Determine the size we'd prefer to render the inner image at, and ask the // inner image what size we should actually use. gfxSize desiredSize(imgWidth * scale.width, imgHeight * scale.height); nsIntSize innerDesiredSize = InnerImage()->OptimalImageSizeForDest(desiredSize, aWhichFrame, aSamplingFilter, aFlags); // To get our final result, we take the inner image's desired size and // determine how large the clipped region would be at that scale. (Again, we // ensure an integer multiple of the size of the clipping region.) IntSize finalScale = IntSize::Ceil(double(innerDesiredSize.width) / imgWidth, double(innerDesiredSize.height) / imgHeight); return mClip.Size() * finalScale; } MOZ_ASSERT(false, "If ShouldClip() led us to draw then we should never get here"); return InnerImage()->OptimalImageSizeForDest(aDest, aWhichFrame, aSamplingFilter, aFlags); }
// // Compute the cell size which is determined by the widest and the highest // gadget // void TToolBox::ComputeCellSize(TSize& cellSize) { cellSize.cx = cellSize.cy = 0; for (TGadget* g = Gadgets; g; g = g->NextGadget()) { TSize desiredSize(0, 0); g->GetDesiredSize(desiredSize); if (desiredSize.cx > cellSize.cx) cellSize.cx = desiredSize.cx; if (desiredSize.cy > cellSize.cy) cellSize.cy = desiredSize.cy; } }
nsIntSize ClippedImage::OptimalImageSizeForDest(const gfxSize& aDest, uint32_t aWhichFrame, GraphicsFilter aFilter, uint32_t aFlags) { if (!ShouldClip()) { return InnerImage()->OptimalImageSizeForDest(aDest, aWhichFrame, aFilter, aFlags); } int32_t imgWidth, imgHeight; if (NS_SUCCEEDED(InnerImage()->GetWidth(&imgWidth)) && NS_SUCCEEDED(InnerImage()->GetHeight(&imgHeight))) { // To avoid ugly sampling artifacts, ClippedImage needs the image size to // be chosen such that the clipping region lies on pixel boundaries. // First, we select a scale that's good for ClippedImage. An integer // multiple of the size of the clipping region is always fine. nsIntSize scale(ceil(aDest.width / mClip.width), ceil(aDest.height / mClip.height)); // Determine the size we'd prefer to render the inner image at, and ask the // inner image what size we should actually use. gfxSize desiredSize(imgWidth * scale.width, imgHeight * scale.height); nsIntSize innerDesiredSize = InnerImage()->OptimalImageSizeForDest(desiredSize, aWhichFrame, aFilter, aFlags); // To get our final result, we take the inner image's desired size and // determine how large the clipped region would be at that scale. (Again, we // ensure an integer multiple of the size of the clipping region.) nsIntSize finalScale(ceil(double(innerDesiredSize.width) / imgWidth), ceil(double(innerDesiredSize.height) / imgHeight)); return mClip.Size() * finalScale; } else { MOZ_ASSERT(false, "If ShouldClip() led us to draw then we should never get here"); return InnerImage()->OptimalImageSizeForDest(aDest, aWhichFrame, aFilter, aFlags); } }
void nsTableCellFrame::VerticallyAlignChild(const nsHTMLReflowState& aReflowState, nscoord aMaxAscent) { const nsStyleTextReset* textStyle = GetStyleTextReset(); /* XXX: remove tableFrame when border-collapse inherits */ nsPresContext* presContext = GetPresContext(); GET_PIXELS_TO_TWIPS(presContext, p2t); nsMargin borderPadding = nsTableFrame::GetBorderPadding(aReflowState, p2t, this); nscoord topInset = borderPadding.top; nscoord bottomInset = borderPadding.bottom; // As per bug 10207, we map 'sub', 'super', 'text-top', 'text-bottom', // length and percentage values to 'baseline' // XXX It seems that we don't get to see length and percentage values here // because the Style System has already fixed the error and mapped them // to whatever is inherited from the parent, i.e, 'middle' in most cases. PRUint8 verticalAlignFlags = NS_STYLE_VERTICAL_ALIGN_BASELINE; if (textStyle->mVerticalAlign.GetUnit() == eStyleUnit_Enumerated) { verticalAlignFlags = textStyle->mVerticalAlign.GetIntValue(); if (verticalAlignFlags != NS_STYLE_VERTICAL_ALIGN_TOP && verticalAlignFlags != NS_STYLE_VERTICAL_ALIGN_MIDDLE && verticalAlignFlags != NS_STYLE_VERTICAL_ALIGN_BOTTOM) { verticalAlignFlags = NS_STYLE_VERTICAL_ALIGN_BASELINE; } } nscoord height = mRect.height; nsIFrame* firstKid = mFrames.FirstChild(); NS_ASSERTION(firstKid, "Frame construction error, a table cell always has an inner cell frame"); nsRect kidRect = firstKid->GetRect(); nscoord childHeight = kidRect.height; // Vertically align the child nscoord kidYTop = 0; switch (verticalAlignFlags) { case NS_STYLE_VERTICAL_ALIGN_BASELINE: // Align the baselines of the child frame with the baselines of // other children in the same row which have 'vertical-align: baseline' kidYTop = topInset + aMaxAscent - GetDesiredAscent(); break; case NS_STYLE_VERTICAL_ALIGN_TOP: // Align the top of the child frame with the top of the content area, kidYTop = topInset; break; case NS_STYLE_VERTICAL_ALIGN_BOTTOM: // Align the bottom of the child frame with the bottom of the content area, kidYTop = height - childHeight - bottomInset; break; default: case NS_STYLE_VERTICAL_ALIGN_MIDDLE: // Align the middle of the child frame with the middle of the content area, kidYTop = (height - childHeight - bottomInset + topInset) / 2; kidYTop = nsTableFrame::RoundToPixel(kidYTop, presContext->ScaledPixelsToTwips(), eAlwaysRoundDown); } // if the content is larger than the cell height align from top kidYTop = PR_MAX(0, kidYTop); firstKid->SetPosition(nsPoint(kidRect.x, kidYTop)); nsHTMLReflowMetrics desiredSize(PR_FALSE); desiredSize.width = mRect.width; desiredSize.height = mRect.height; GetSelfOverflow(desiredSize.mOverflowArea); ConsiderChildOverflow(desiredSize.mOverflowArea, firstKid); FinishAndStoreOverflow(&desiredSize); if (kidYTop != kidRect.y) { // Make sure any child views are correctly positioned. We know the inner table // cell won't have a view nsContainerFrame::PositionChildViews(firstKid); } if (HasView()) { nsContainerFrame::SyncFrameViewAfterReflow(presContext, this, GetView(), &desiredSize.mOverflowArea, 0); } }