зеркало из https://github.com/mozilla/gecko-dev.git
Revised API so that correct percentage width/height could be computed
This commit is contained in:
Родитель
9a2d1c3765
Коммит
669da95542
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче