mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 23:06:52 +00:00
5a5b052a7c
- Bug 930218 part 1. Factor out the computation of block-size taken up by box-sizing into a separate function so we can reuse it. r=dbaron (22033f4184) - Bug 930218 part 2. Account for the parent's box-sizing whe figuring out the percentage height of a kid with an intrinsic ratio for purposes of determining the parent's shrink-wrap width. r=dbaron (041711f58f) - Bug 1235306 - Fix -Wimplicit-fallthrough warnings in layout/. r=dholbert (581c212254) - Bug 1074971 - Add support for reserved commandkey combinations that can't be handled by content (e10s-only feature). r=smaug (e43d39dcef) - Bug 1186799 part.1 nsHTMLEditorEventListener should commit composition when it receives unacceptable mousedown event r=smaug (17f2c48e96) - Bug 1230216 - Changing nsIDOM*Event interfaces so that they don't inherit nsIDOMEvent. r=smaug (df77f91ecc) - fix cancelBubble situation and align to gecko (bc133dc50a) - Bug 1211402. Re-enable the upload step, but take out the stuff that no longer works (as in, everything.) r=me (cb7abd67d2) - align (bac4aec6cc) - Bug 1243608: P1. Only use video time if video frame contains seek target. r=cpearce (21d9e988ed) - Bug 1244477: Offset seek time by start time. r=jwwang (743c24b2f7) - Bug 1243608: P2. Pass the full SeekTarget object to MediaDecoderReader::Seek. r=cpearce (6ff30b4b65) - Bug 1243608: P3. Make SeekTarget::mTime a TimeUnit object. r=cpearce (357d9864de) - Bug 1243608: P4. Have MediaDecoderReader::SeekPromise return a TimeUnit. r=cpearce (53b476c62d) - Bug 1159343: Interrupt seek early when possible. r=jwwang (9e26e69593) - Bug 1243608: P5. Add type utility methods to SeekTarget class. r=cpearce (8e740bab50) - Bug 1243608: P6. Only seek audio to video seek time when performing a fast seek. r=cpearce (d2a51a71f0) - Bug 1233650. Part 1 - extract OutputStreamManager to its own file. r=roc. (52d533f923) - Bug 1230882. Part 2 - remove DecodedStream::BeginShutdown() and other unused code. r=roc. (b2820b8f14) - Bug 1231091. Part 1 - Add mVideoCompleted so MDSM can check when audio/video is done rendering. This removes the only caller of DecodedStream::IsFinished(). r=roc. (536f63e385) - Bug 1146086: Properly marking overridden member with override keyword. v2. a=bustage (b6ed1b4e6c) - Bug 1177243 - Use PodZero rather than memset in WebM decoders. r=rillian (f9853b72ee) - Bug 1230054: Remove unused WebMReader. r=kinetik (1f88fe3c43) - Bug 1230054: Add missing headers ON A CLOSED TREE. r=me (6e33accf03) - Bug 1231091. Part 2 - return correct promises when audio/video track is asked. r=roc. (aef6342e59) - Bug 1231091. Part 3 - resolve the end promise when all frames are rendered. r=roc. (bbb180dd90) - Bug 1231091. Part 4 - ensure the end promise is resolved in the special case where video duration is 0. r=roc. (7835c31e75) - Bug 1231091. Part 5 - Remove DecodedStream::IsFinished() and unused code. r=roc. (6dd02e5d6b) - Bug 1231091. Part 6 - fix test_streams_element_capture.html timeout. r=roc. (8aae5c09cc) - Bug 1232520 - dont' invoke AbstractThread::MainThread()->Dispatch() to avoid reentrant of AutoTaskDispatcher during tail dispatching phase. r=jya. (5434d0f370) - Bug 1233650. Part 2 - make OutputStreamManager ref-counted so it can be shared between MDSM and DecodedStream. r=roc. (93e7d0e065) - Bug 1233650. Part 3 - move creation of OutputStreamManager from DecodedStream to MDSM. r=roc. (a469dbcc9f) - Bug 1233650. Part 4 - remove unused functions from DecodedStream. r=roc. (ec8753365e) - Bug 1248314. Part 1 - Since OutputStreamManager::Connect/Disconnect is tightly coupled with the constructor/destructor of DecodedStreamData, it would improve cohesion to let DecodedStreamData manage an OutputStreamManager and know when to call OutputStreamManager::Connect/Disconnect. r=roc. (467d1472ca) - Bug 1234424. Part 1 - share the underlying value of MDSM::mSameOriginMedia with DecodedStream. r=roc. (ff0abefb26) - Bug 1234424. Part 2 - remove unused code. r=roc. (5a8266779b) - Bug 1248314. part 2 - move track initialization code into the constructor of DecodedStreamData. r=roc. (4d57f47654) - Bug 1248229. Part 1 - add test case to test if playback can work correctly after GC. r=roc. (83c81dc7cc) - Bug 1248229. Part 2 - GC might happen in between OutputStreamManager::Disconnect() and OutputStreamManager::Connect(). We need to check if the stream is already destroyed before trying to connect it. r=roc. (c5a0ed670c) - remove PM leftover (ed9ce00aad) - Bug 1236703: P1. Add debugging information for MSE to about:media plugin. r=kentuckyfriedtakahe (4385a86197) - Bug 1236703: P2. Add methods to retrieve debugging data on plain readers. r=jwwang (34bf637124) - Bug 1236703: P3. Add moz specific method to retrieve debug data to media object IDL. r=bz (65c95eff74) - Bug 1194721: Add additional PDU pack and unpack functions, r=shuang (d6ae416a10) - Bug 1261307: Convert Unix socket IPC code to |UniquePtr|, r=nfroyd (cd797f4581) - Bug 1236574 - use UniquePtr<T[]> instead of nsAutoArrayPtr<T> in SocketBase subclasses; r=tzimmerman (6a20e9e905) - Bug 1239207 - Don't process IPDL when not compiling; r=glandium (20ba7fb311) - Bug 1210099 - Use diagnostic assert for union discriminator checks (r=jld) (74844eee1b) - Bug 1208226 - Don't crash when failing to map a segment of shared memory. r=sotaro, billm (1822a634d9) - Bug 1236635 - Fix compile error in IPC unit tests (r=jld) (c82e0bfe61) - Bug 1263429 - Don't build libevent with sysctl on Linux. r=billm (00f248f61e) - Bug 1304266 - Remove libevent workaround for MacOS 10.4 bug (r=dvander) a=jcristau (676758a926) - Bug 1241776 - turn ENABLE_SHARED_ARRAY_BUFFER on for all channels. r=nbp (dc53fff545) - Bug 1248851 part 1 - Explicitly mark some release() calls result-unused. r=Waldo (b377e3d86e) - Bug 1246697 - Use simpler semantics for PersistentRooted<Traceable>; r=sfink (7afab5c807) - bug 1225649 use CreatePlanarYCbCrImage() now that CreateImage() is gone r=dvander (b8a30f3d84) - Bug 1234092: P1. Remove GStreamer support. r=kentuckyfriedtakahe (bf6a5d8811) - Bug 1234092: P2. Remove GStreamer check from configure. r=glandium (73b69b41db) - remove configure options (f9585af0d1) - Bug 1168309 - Add the define, MOZ_GONK_MEDIACODEC, to dom/media. r=cpearce. (a4481af932) - Bug 1240616 - mach mochitest-run suggests deprecated commands as an alternative r=cmanchester (17687db974) - Bug 1249838 - Avoid dependency from the mozconfig loader on mach. r=gps (a88506c027) - Bug 382721 - Part 0: Add missing includes and namespaces. r=jrmuizel (eecf253c5e)
434 lines
16 KiB
C++
434 lines
16 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
// vim:cindent:ts=2:et:sw=2:
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
/*
|
|
* Algorithms that determine column and table inline sizes used for
|
|
* CSS2's 'table-layout: fixed'.
|
|
*/
|
|
|
|
#include "FixedTableLayoutStrategy.h"
|
|
#include "nsTableFrame.h"
|
|
#include "nsTableColFrame.h"
|
|
#include "nsTableCellFrame.h"
|
|
#include <algorithm>
|
|
|
|
FixedTableLayoutStrategy::FixedTableLayoutStrategy(nsTableFrame *aTableFrame)
|
|
: nsITableLayoutStrategy(nsITableLayoutStrategy::Fixed)
|
|
, mTableFrame(aTableFrame)
|
|
{
|
|
MarkIntrinsicISizesDirty();
|
|
}
|
|
|
|
/* virtual */
|
|
FixedTableLayoutStrategy::~FixedTableLayoutStrategy()
|
|
{
|
|
}
|
|
|
|
/* virtual */ nscoord
|
|
FixedTableLayoutStrategy::GetMinISize(nsRenderingContext* aRenderingContext)
|
|
{
|
|
DISPLAY_MIN_WIDTH(mTableFrame, mMinISize);
|
|
if (mMinISize != NS_INTRINSIC_WIDTH_UNKNOWN) {
|
|
return mMinISize;
|
|
}
|
|
|
|
// It's theoretically possible to do something much better here that
|
|
// depends only on the columns and the first row (where we look at
|
|
// intrinsic inline sizes inside the first row and then reverse the
|
|
// algorithm to find the narrowest inline size that would hold all of
|
|
// those intrinsic inline sizes), but it wouldn't be compatible with
|
|
// other browsers, or with the use of GetMinISize by
|
|
// nsTableFrame::ComputeSize to determine the inline size of a fixed
|
|
// layout table, since CSS2.1 says:
|
|
// The width of the table is then the greater of the value of the
|
|
// 'width' property for the table element and the sum of the column
|
|
// widths (plus cell spacing or borders).
|
|
|
|
// XXX Should we really ignore 'min-width' and 'max-width'?
|
|
// XXX Should we really ignore widths on column groups?
|
|
|
|
nsTableCellMap *cellMap = mTableFrame->GetCellMap();
|
|
int32_t colCount = cellMap->GetColCount();
|
|
|
|
nscoord result = 0;
|
|
|
|
if (colCount > 0) {
|
|
result += mTableFrame->GetColSpacing(-1, colCount);
|
|
}
|
|
|
|
WritingMode wm = mTableFrame->GetWritingMode();
|
|
for (int32_t col = 0; col < colCount; ++col) {
|
|
nsTableColFrame *colFrame = mTableFrame->GetColFrame(col);
|
|
if (!colFrame) {
|
|
NS_ERROR("column frames out of sync with cell map");
|
|
continue;
|
|
}
|
|
nscoord spacing = mTableFrame->GetColSpacing(col);
|
|
const nsStyleCoord *styleISize = &colFrame->StylePosition()->ISize(wm);
|
|
if (styleISize->ConvertsToLength()) {
|
|
result += nsLayoutUtils::ComputeISizeValue(aRenderingContext,
|
|
colFrame, 0, 0, 0,
|
|
*styleISize);
|
|
} else if (styleISize->GetUnit() == eStyleUnit_Percent) {
|
|
// do nothing
|
|
} else {
|
|
NS_ASSERTION(styleISize->GetUnit() == eStyleUnit_Auto ||
|
|
styleISize->GetUnit() == eStyleUnit_Enumerated ||
|
|
(styleISize->IsCalcUnit() && styleISize->CalcHasPercent()),
|
|
"bad inline size");
|
|
|
|
// The 'table-layout: fixed' algorithm considers only cells in the
|
|
// first row.
|
|
bool originates;
|
|
int32_t colSpan;
|
|
nsTableCellFrame *cellFrame = cellMap->GetCellInfoAt(0, col, &originates,
|
|
&colSpan);
|
|
if (cellFrame) {
|
|
styleISize = &cellFrame->StylePosition()->ISize(wm);
|
|
if (styleISize->ConvertsToLength() ||
|
|
(styleISize->GetUnit() == eStyleUnit_Enumerated &&
|
|
(styleISize->GetIntValue() == NS_STYLE_WIDTH_MAX_CONTENT ||
|
|
styleISize->GetIntValue() == NS_STYLE_WIDTH_MIN_CONTENT))) {
|
|
nscoord cellISize =
|
|
nsLayoutUtils::IntrinsicForContainer(aRenderingContext, cellFrame,
|
|
nsLayoutUtils::MIN_ISIZE);
|
|
if (colSpan > 1) {
|
|
// If a column-spanning cell is in the first row, split up
|
|
// the space evenly. (XXX This isn't quite right if some of
|
|
// the columns it's in have specified inline sizes. Should
|
|
// we care?)
|
|
cellISize = ((cellISize + spacing) / colSpan) - spacing;
|
|
}
|
|
result += cellISize;
|
|
} else if (styleISize->GetUnit() == eStyleUnit_Percent) {
|
|
if (colSpan > 1) {
|
|
// XXX Can this force columns to negative inline sizes?
|
|
result -= spacing * (colSpan - 1);
|
|
}
|
|
}
|
|
// else, for 'auto', '-moz-available', '-moz-fit-content',
|
|
// and 'calc()' with percentages, do nothing
|
|
}
|
|
}
|
|
}
|
|
|
|
return (mMinISize = result);
|
|
}
|
|
|
|
/* virtual */ nscoord
|
|
FixedTableLayoutStrategy::GetPrefISize(nsRenderingContext* aRenderingContext,
|
|
bool aComputingSize)
|
|
{
|
|
// It's theoretically possible to do something much better here that
|
|
// depends only on the columns and the first row (where we look at
|
|
// intrinsic inline sizes inside the first row and then reverse the
|
|
// algorithm to find the narrowest inline size that would hold all of
|
|
// those intrinsic inline sizes), but it wouldn't be compatible with
|
|
// other browsers.
|
|
nscoord result = nscoord_MAX;
|
|
DISPLAY_PREF_WIDTH(mTableFrame, result);
|
|
return result;
|
|
}
|
|
|
|
/* virtual */ void
|
|
FixedTableLayoutStrategy::MarkIntrinsicISizesDirty()
|
|
{
|
|
mMinISize = NS_INTRINSIC_WIDTH_UNKNOWN;
|
|
mLastCalcISize = nscoord_MIN;
|
|
}
|
|
|
|
static inline nscoord
|
|
AllocateUnassigned(nscoord aUnassignedSpace, float aShare)
|
|
{
|
|
if (aShare == 1.0f) {
|
|
// This happens when the numbers we're dividing to get aShare are
|
|
// equal. We want to return unassignedSpace exactly, even if it
|
|
// can't be precisely round-tripped through float.
|
|
return aUnassignedSpace;
|
|
}
|
|
return NSToCoordRound(float(aUnassignedSpace) * aShare);
|
|
}
|
|
|
|
/* virtual */ void
|
|
FixedTableLayoutStrategy::ComputeColumnISizes(const nsHTMLReflowState& aReflowState)
|
|
{
|
|
nscoord tableISize = aReflowState.ComputedISize();
|
|
|
|
if (mLastCalcISize == tableISize) {
|
|
return;
|
|
}
|
|
mLastCalcISize = tableISize;
|
|
|
|
nsTableCellMap *cellMap = mTableFrame->GetCellMap();
|
|
int32_t colCount = cellMap->GetColCount();
|
|
|
|
if (colCount == 0) {
|
|
// No Columns - nothing to compute
|
|
return;
|
|
}
|
|
|
|
// border-spacing isn't part of the basis for percentages.
|
|
tableISize -= mTableFrame->GetColSpacing(-1, colCount);
|
|
|
|
// store the old column inline sizes. We might call SetFinalISize
|
|
// multiple times on the columns, due to this we can't compare at the
|
|
// last call that the inline size has changed with respect to the last
|
|
// call to ComputeColumnISizes. In order to overcome this we store the
|
|
// old values in this array. A single call to SetFinalISize would make
|
|
// it possible to call GetFinalISize before and to compare when
|
|
// setting the final inline size.
|
|
nsTArray<nscoord> oldColISizes;
|
|
|
|
// XXX This ignores the 'min-width' and 'max-width' properties
|
|
// throughout. Then again, that's what the CSS spec says to do.
|
|
|
|
// XXX Should we really ignore widths on column groups?
|
|
|
|
uint32_t unassignedCount = 0;
|
|
nscoord unassignedSpace = tableISize;
|
|
const nscoord unassignedMarker = nscoord_MIN;
|
|
|
|
// We use the PrefPercent on the columns to store the percentages
|
|
// used to compute column inline sizes in case we need to shrink or
|
|
// expand the columns.
|
|
float pctTotal = 0.0f;
|
|
|
|
// Accumulate the total specified (non-percent) on the columns for
|
|
// distributing excess inline size to the columns.
|
|
nscoord specTotal = 0;
|
|
|
|
WritingMode wm = mTableFrame->GetWritingMode();
|
|
for (int32_t col = 0; col < colCount; ++col) {
|
|
nsTableColFrame *colFrame = mTableFrame->GetColFrame(col);
|
|
if (!colFrame) {
|
|
oldColISizes.AppendElement(0);
|
|
NS_ERROR("column frames out of sync with cell map");
|
|
continue;
|
|
}
|
|
oldColISizes.AppendElement(colFrame->GetFinalISize());
|
|
colFrame->ResetPrefPercent();
|
|
const nsStyleCoord *styleISize = &colFrame->StylePosition()->ISize(wm);
|
|
nscoord colISize;
|
|
if (styleISize->ConvertsToLength()) {
|
|
colISize = nsLayoutUtils::ComputeISizeValue(aReflowState.rendContext,
|
|
colFrame, 0, 0, 0,
|
|
*styleISize);
|
|
specTotal += colISize;
|
|
} else if (styleISize->GetUnit() == eStyleUnit_Percent) {
|
|
float pct = styleISize->GetPercentValue();
|
|
colISize = NSToCoordFloor(pct * float(tableISize));
|
|
colFrame->AddPrefPercent(pct);
|
|
pctTotal += pct;
|
|
} else {
|
|
NS_ASSERTION(styleISize->GetUnit() == eStyleUnit_Auto ||
|
|
styleISize->GetUnit() == eStyleUnit_Enumerated ||
|
|
(styleISize->IsCalcUnit() && styleISize->CalcHasPercent()),
|
|
"bad inline size");
|
|
|
|
// The 'table-layout: fixed' algorithm considers only cells in the
|
|
// first row.
|
|
bool originates;
|
|
int32_t colSpan;
|
|
nsTableCellFrame *cellFrame = cellMap->GetCellInfoAt(0, col, &originates,
|
|
&colSpan);
|
|
if (cellFrame) {
|
|
styleISize = &cellFrame->StylePosition()->ISize(wm);
|
|
if (styleISize->ConvertsToLength() ||
|
|
(styleISize->GetUnit() == eStyleUnit_Enumerated &&
|
|
(styleISize->GetIntValue() == NS_STYLE_WIDTH_MAX_CONTENT ||
|
|
styleISize->GetIntValue() == NS_STYLE_WIDTH_MIN_CONTENT))) {
|
|
// XXX This should use real percentage padding
|
|
// Note that the difference between MIN_ISIZE and PREF_ISIZE
|
|
// shouldn't matter for any of these values of styleISize; use
|
|
// MIN_ISIZE for symmetry with GetMinISize above, just in case
|
|
// there is a difference.
|
|
colISize =
|
|
nsLayoutUtils::IntrinsicForContainer(aReflowState.rendContext,
|
|
cellFrame,
|
|
nsLayoutUtils::MIN_ISIZE);
|
|
} else if (styleISize->GetUnit() == eStyleUnit_Percent) {
|
|
// XXX This should use real percentage padding
|
|
nsIFrame::IntrinsicISizeOffsetData offsets =
|
|
cellFrame->IntrinsicISizeOffsets();
|
|
float pct = styleISize->GetPercentValue();
|
|
colISize = NSToCoordFloor(pct * float(tableISize));
|
|
|
|
nscoord boxSizingAdjust = 0;
|
|
switch (cellFrame->StylePosition()->mBoxSizing) {
|
|
case StyleBoxSizing::Content:
|
|
boxSizingAdjust += offsets.hPadding;
|
|
MOZ_FALLTHROUGH;
|
|
case StyleBoxSizing::Padding:
|
|
boxSizingAdjust += offsets.hBorder;
|
|
MOZ_FALLTHROUGH;
|
|
case StyleBoxSizing::Border:
|
|
// Don't add anything
|
|
break;
|
|
}
|
|
colISize += boxSizingAdjust;
|
|
|
|
pct /= float(colSpan);
|
|
colFrame->AddPrefPercent(pct);
|
|
pctTotal += pct;
|
|
} else {
|
|
// 'auto', '-moz-available', '-moz-fit-content', and 'calc()'
|
|
// with percentages
|
|
colISize = unassignedMarker;
|
|
}
|
|
if (colISize != unassignedMarker) {
|
|
if (colSpan > 1) {
|
|
// If a column-spanning cell is in the first row, split up
|
|
// the space evenly. (XXX This isn't quite right if some of
|
|
// the columns it's in have specified iSizes. Should we
|
|
// care?)
|
|
nscoord spacing = mTableFrame->GetColSpacing(col);
|
|
colISize = ((colISize + spacing) / colSpan) - spacing;
|
|
if (colISize < 0) {
|
|
colISize = 0;
|
|
}
|
|
}
|
|
if (styleISize->GetUnit() != eStyleUnit_Percent) {
|
|
specTotal += colISize;
|
|
}
|
|
}
|
|
} else {
|
|
colISize = unassignedMarker;
|
|
}
|
|
}
|
|
|
|
colFrame->SetFinalISize(colISize);
|
|
|
|
if (colISize == unassignedMarker) {
|
|
++unassignedCount;
|
|
} else {
|
|
unassignedSpace -= colISize;
|
|
}
|
|
}
|
|
|
|
if (unassignedSpace < 0) {
|
|
if (pctTotal > 0) {
|
|
// If the columns took up too much space, reduce those that had
|
|
// percentage inline sizes. The spec doesn't say to do this, but
|
|
// we've always done it in the past, and so does WinIE6.
|
|
nscoord pctUsed = NSToCoordFloor(pctTotal * float(tableISize));
|
|
nscoord reduce = std::min(pctUsed, -unassignedSpace);
|
|
float reduceRatio = float(reduce) / pctTotal;
|
|
for (int32_t col = 0; col < colCount; ++col) {
|
|
nsTableColFrame *colFrame = mTableFrame->GetColFrame(col);
|
|
if (!colFrame) {
|
|
NS_ERROR("column frames out of sync with cell map");
|
|
continue;
|
|
}
|
|
nscoord colISize = colFrame->GetFinalISize();
|
|
colISize -= NSToCoordFloor(colFrame->GetPrefPercent() * reduceRatio);
|
|
if (colISize < 0) {
|
|
colISize = 0;
|
|
}
|
|
colFrame->SetFinalISize(colISize);
|
|
}
|
|
}
|
|
unassignedSpace = 0;
|
|
}
|
|
|
|
if (unassignedCount > 0) {
|
|
// The spec says to distribute the remaining space evenly among
|
|
// the columns.
|
|
nscoord toAssign = unassignedSpace / unassignedCount;
|
|
for (int32_t col = 0; col < colCount; ++col) {
|
|
nsTableColFrame *colFrame = mTableFrame->GetColFrame(col);
|
|
if (!colFrame) {
|
|
NS_ERROR("column frames out of sync with cell map");
|
|
continue;
|
|
}
|
|
if (colFrame->GetFinalISize() == unassignedMarker) {
|
|
colFrame->SetFinalISize(toAssign);
|
|
}
|
|
}
|
|
} else if (unassignedSpace > 0) {
|
|
// The spec doesn't say how to distribute the unassigned space.
|
|
if (specTotal > 0) {
|
|
// Distribute proportionally to non-percentage columns.
|
|
nscoord specUndist = specTotal;
|
|
for (int32_t col = 0; col < colCount; ++col) {
|
|
nsTableColFrame *colFrame = mTableFrame->GetColFrame(col);
|
|
if (!colFrame) {
|
|
NS_ERROR("column frames out of sync with cell map");
|
|
continue;
|
|
}
|
|
if (colFrame->GetPrefPercent() == 0.0f) {
|
|
NS_ASSERTION(colFrame->GetFinalISize() <= specUndist,
|
|
"inline sizes don't add up");
|
|
nscoord toAdd = AllocateUnassigned(unassignedSpace,
|
|
float(colFrame->GetFinalISize()) /
|
|
float(specUndist));
|
|
specUndist -= colFrame->GetFinalISize();
|
|
colFrame->SetFinalISize(colFrame->GetFinalISize() + toAdd);
|
|
unassignedSpace -= toAdd;
|
|
if (specUndist <= 0) {
|
|
NS_ASSERTION(specUndist == 0, "math should be exact");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
NS_ASSERTION(unassignedSpace == 0, "failed to redistribute");
|
|
} else if (pctTotal > 0) {
|
|
// Distribute proportionally to percentage columns.
|
|
float pctUndist = pctTotal;
|
|
for (int32_t col = 0; col < colCount; ++col) {
|
|
nsTableColFrame *colFrame = mTableFrame->GetColFrame(col);
|
|
if (!colFrame) {
|
|
NS_ERROR("column frames out of sync with cell map");
|
|
continue;
|
|
}
|
|
if (pctUndist < colFrame->GetPrefPercent()) {
|
|
// This can happen with floating-point math.
|
|
NS_ASSERTION(colFrame->GetPrefPercent() - pctUndist < 0.0001,
|
|
"inline sizes don't add up");
|
|
pctUndist = colFrame->GetPrefPercent();
|
|
}
|
|
nscoord toAdd = AllocateUnassigned(unassignedSpace,
|
|
colFrame->GetPrefPercent() /
|
|
pctUndist);
|
|
colFrame->SetFinalISize(colFrame->GetFinalISize() + toAdd);
|
|
unassignedSpace -= toAdd;
|
|
pctUndist -= colFrame->GetPrefPercent();
|
|
if (pctUndist <= 0.0f) {
|
|
break;
|
|
}
|
|
}
|
|
NS_ASSERTION(unassignedSpace == 0, "failed to redistribute");
|
|
} else {
|
|
// Distribute equally to the zero-iSize columns.
|
|
int32_t colsRemaining = colCount;
|
|
for (int32_t col = 0; col < colCount; ++col) {
|
|
nsTableColFrame *colFrame = mTableFrame->GetColFrame(col);
|
|
if (!colFrame) {
|
|
NS_ERROR("column frames out of sync with cell map");
|
|
continue;
|
|
}
|
|
NS_ASSERTION(colFrame->GetFinalISize() == 0, "yikes");
|
|
nscoord toAdd = AllocateUnassigned(unassignedSpace,
|
|
1.0f / float(colsRemaining));
|
|
colFrame->SetFinalISize(toAdd);
|
|
unassignedSpace -= toAdd;
|
|
--colsRemaining;
|
|
}
|
|
NS_ASSERTION(unassignedSpace == 0, "failed to redistribute");
|
|
}
|
|
}
|
|
for (int32_t col = 0; col < colCount; ++col) {
|
|
nsTableColFrame *colFrame = mTableFrame->GetColFrame(col);
|
|
if (!colFrame) {
|
|
NS_ERROR("column frames out of sync with cell map");
|
|
continue;
|
|
}
|
|
if (oldColISizes.ElementAt(col) != colFrame->GetFinalISize()) {
|
|
mTableFrame->DidResizeColumns();
|
|
break;
|
|
}
|
|
}
|
|
}
|