Revised API so that correct percentage width/height could be computed

This commit is contained in:
kipp 1998-05-30 21:22:17 +00:00
Родитель 9a2d1c3765
Коммит 669da95542
3 изменённых файлов: 50 добавлений и 53 удалений

Просмотреть файл

@ -281,54 +281,52 @@ nsCSSLayout::RelativePositionChildren(nsIPresContext* aCX,
// XXX check against other possible values and update
static PRBool
GetStyleDimension(nsIPresContext* aPresContext,
nsIFrame* aFrame,
const nsReflowState& aReflowState,
nsStylePosition* aStylePos,
nsStyleCoord& aCoord,
nscoord& aResult)
{
nsIFrame* parentFrame;
PRBool rv = PR_FALSE;
switch (aCoord.GetUnit()) {
case eStyleUnit_Coord:
PRIntn unit = aCoord.GetUnit();
if (eStyleUnit_Coord == unit) {
aResult = aCoord.GetCoordValue();
rv = PR_TRUE;
break;
case eStyleUnit_Percent:
}
else if (eStyleUnit_Percent == unit) {
// CSS2 has specified that percentage width/height values are basd
// on the containing block's <B>width</B>.
// XXX need to subtract out padding, also this needs
// to be synced with nsFrame's IsPercentageBase
// XXX should this be geometric parent
aFrame->GetContentParent(parentFrame);
while (nsnull != parentFrame) {
nsBlockFrame* block;
nsresult status =
parentFrame->QueryInterface(kBlockFrameCID, (void**) &block);
if (NS_OK == status) {
nsRect blockRect;
block->GetRect(blockRect);
aResult = nscoord(blockRect.width * aCoord.GetPercentValue());
const nsReflowState* rs = &aReflowState;
while (nsnull != rs) {
nsIFrame* block = nsnull;
rs->frame->QueryInterface(kBlockFrameCID, (void**) &block);
if (nsnull != block) {
// We found the nearest containing block which defines what a
// percentage size is relative to. Use the width that it will
// reflow to as the basis for computing our width.
aResult = nscoord(rs->maxSize.width * aCoord.GetPercentValue());
rv = PR_TRUE;
break;
}
parentFrame->GetContentParent(parentFrame);
rs = rs->parentReflowState;
}
break;
default:
}
else {
aResult = 0;
}
if (aResult < 0) {
// Negative width's are ignored
if (aResult <= 0) {
rv = PR_FALSE;
}
return rv;
}
PRIntn
nsCSSLayout::GetStyleSize(nsIPresContext* aPresContext,
nsIFrame* aFrame,
const nsReflowState& aReflowState,
nsSize& aStyleSize)
{
// XXX if display == row || rowspan ignore width
@ -336,15 +334,15 @@ nsCSSLayout::GetStyleSize(nsIPresContext* aPresContext,
PRIntn rv = NS_SIZE_HAS_NONE;
nsIStyleContext* sc = nsnull;
aFrame->GetStyleContext(aPresContext, sc);
aReflowState.frame->GetStyleContext(aPresContext, sc);
if (nsnull != sc) {
nsStylePosition* pos = (nsStylePosition*)
sc->GetData(eStyleStruct_Position);
if (GetStyleDimension(aPresContext, aFrame, pos, pos->mWidth,
if (GetStyleDimension(aPresContext, aReflowState, pos, pos->mWidth,
aStyleSize.width)) {
rv |= NS_SIZE_HAS_WIDTH;
}
if (GetStyleDimension(aPresContext, aFrame, pos, pos->mHeight,
if (GetStyleDimension(aPresContext, aReflowState, pos, pos->mHeight,
aStyleSize.height)) {
rv |= NS_SIZE_HAS_HEIGHT;
}

Просмотреть файл

@ -281,54 +281,52 @@ nsCSSLayout::RelativePositionChildren(nsIPresContext* aCX,
// XXX check against other possible values and update
static PRBool
GetStyleDimension(nsIPresContext* aPresContext,
nsIFrame* aFrame,
const nsReflowState& aReflowState,
nsStylePosition* aStylePos,
nsStyleCoord& aCoord,
nscoord& aResult)
{
nsIFrame* parentFrame;
PRBool rv = PR_FALSE;
switch (aCoord.GetUnit()) {
case eStyleUnit_Coord:
PRIntn unit = aCoord.GetUnit();
if (eStyleUnit_Coord == unit) {
aResult = aCoord.GetCoordValue();
rv = PR_TRUE;
break;
case eStyleUnit_Percent:
}
else if (eStyleUnit_Percent == unit) {
// CSS2 has specified that percentage width/height values are basd
// on the containing block's <B>width</B>.
// XXX need to subtract out padding, also this needs
// to be synced with nsFrame's IsPercentageBase
// XXX should this be geometric parent
aFrame->GetContentParent(parentFrame);
while (nsnull != parentFrame) {
nsBlockFrame* block;
nsresult status =
parentFrame->QueryInterface(kBlockFrameCID, (void**) &block);
if (NS_OK == status) {
nsRect blockRect;
block->GetRect(blockRect);
aResult = nscoord(blockRect.width * aCoord.GetPercentValue());
const nsReflowState* rs = &aReflowState;
while (nsnull != rs) {
nsIFrame* block = nsnull;
rs->frame->QueryInterface(kBlockFrameCID, (void**) &block);
if (nsnull != block) {
// We found the nearest containing block which defines what a
// percentage size is relative to. Use the width that it will
// reflow to as the basis for computing our width.
aResult = nscoord(rs->maxSize.width * aCoord.GetPercentValue());
rv = PR_TRUE;
break;
}
parentFrame->GetContentParent(parentFrame);
rs = rs->parentReflowState;
}
break;
default:
}
else {
aResult = 0;
}
if (aResult < 0) {
// Negative width's are ignored
if (aResult <= 0) {
rv = PR_FALSE;
}
return rv;
}
PRIntn
nsCSSLayout::GetStyleSize(nsIPresContext* aPresContext,
nsIFrame* aFrame,
const nsReflowState& aReflowState,
nsSize& aStyleSize)
{
// XXX if display == row || rowspan ignore width
@ -336,15 +334,15 @@ nsCSSLayout::GetStyleSize(nsIPresContext* aPresContext,
PRIntn rv = NS_SIZE_HAS_NONE;
nsIStyleContext* sc = nsnull;
aFrame->GetStyleContext(aPresContext, sc);
aReflowState.frame->GetStyleContext(aPresContext, sc);
if (nsnull != sc) {
nsStylePosition* pos = (nsStylePosition*)
sc->GetData(eStyleStruct_Position);
if (GetStyleDimension(aPresContext, aFrame, pos, pos->mWidth,
if (GetStyleDimension(aPresContext, aReflowState, pos, pos->mWidth,
aStyleSize.width)) {
rv |= NS_SIZE_HAS_WIDTH;
}
if (GetStyleDimension(aPresContext, aFrame, pos, pos->mHeight,
if (GetStyleDimension(aPresContext, aReflowState, pos, pos->mHeight,
aStyleSize.height)) {
rv |= NS_SIZE_HAS_HEIGHT;
}

Просмотреть файл

@ -24,6 +24,7 @@ class nsIPresContext;
struct nsSize;
struct nsStyleFont;
struct nsStyleText;
struct nsReflowState;
class nsCSSLayout {
public:
@ -66,7 +67,7 @@ public:
* stylistically.
*/
static PRIntn GetStyleSize(nsIPresContext* aPresContext,
nsIFrame* aFrame,
const nsReflowState& aReflowState,
nsSize& aStyleSize);
// Return value from GetStyleSize