This commit is contained in:
peterl 1998-04-28 23:54:06 +00:00
Родитель 72a58411f2
Коммит 3545f4e831
13 изменённых файлов: 525 добавлений и 70 удалений

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

@ -272,13 +272,8 @@ struct StyleTextImpl: public nsStyleText {
mTextAlign = NS_STYLE_TEXT_ALIGN_LEFT;
mTextDecoration = NS_STYLE_TEXT_DECORATION_NONE;
mTextTransform = NS_STYLE_TEXT_TRANSFORM_NONE;
mVerticalAlignFlags = NS_STYLE_VERTICAL_ALIGN_BASELINE;
mVerticalAlign.Set(NS_STYLE_VERTICAL_ALIGN_BASELINE, eStyleUnit_Enumerated);
mWhiteSpace = NS_STYLE_WHITESPACE_NORMAL;
mLetterSpacing.coord = 0;
mLineHeight.coord = 0;
mTextIndent.coord = 0;
mWordSpacing.coord = 0;
mVerticalAlign.coord = 0;
}
~StyleTextImpl() {
}
@ -359,7 +354,7 @@ public:
virtual nsStyleStruct* GetData(const nsIID& aSID);
virtual void InheritFrom(const StyleContextImpl& aParent);
virtual void PostProcessData(void);
virtual void RecalcAutomaticData(void);
nsIStyleContext* mParent;
PRUint32 mHashValid: 1;
@ -522,23 +517,32 @@ void StyleContextImpl::InheritFrom(const StyleContextImpl& aParent)
mDisplay.InheritFrom(aParent.mDisplay);
}
static void CalcBorderSize(nscoord& aSize, PRUint8 aFlag)
static void CalcBorderSize(nscoord& aSize, const nsStyleBorder& aBorder, PRUint8 aSide)
{
static const nscoord kBorderSize[3] = // XXX need real numbers here (this is probably wrong anyway)
{ NS_POINTS_TO_TWIPS_INT(1),
NS_POINTS_TO_TWIPS_INT(3),
NS_POINTS_TO_TWIPS_INT(5) };
if (aFlag < NS_STYLE_BORDER_WIDTH_LENGTH_VALUE) {
aSize = kBorderSize[aFlag];
PRUint8 style = aBorder.mStyle[aSide];
if (NS_STYLE_BORDER_STYLE_NONE == style) {
aSize = 0;
}
else {
PRUint8 flag = aBorder.mSizeFlag[aSide];
if (flag < NS_STYLE_BORDER_WIDTH_LENGTH_VALUE) {
aSize = kBorderSize[flag];
}
}
}
void StyleContextImpl::PostProcessData(void)
void StyleContextImpl::RecalcAutomaticData(void)
{
CalcBorderSize(mBorder.mSize.top, mBorder.mSizeFlag[NS_SIDE_TOP]);
CalcBorderSize(mBorder.mSize.right, mBorder.mSizeFlag[NS_SIDE_RIGHT]);
CalcBorderSize(mBorder.mSize.bottom, mBorder.mSizeFlag[NS_SIDE_BOTTOM]);
CalcBorderSize(mBorder.mSize.left, mBorder.mSizeFlag[NS_SIDE_LEFT]);
CalcBorderSize(mBorder.mSize.top, mBorder, NS_SIDE_TOP);
CalcBorderSize(mBorder.mSize.right, mBorder, NS_SIDE_RIGHT);
CalcBorderSize(mBorder.mSize.bottom, mBorder, NS_SIDE_BOTTOM);
CalcBorderSize(mBorder.mSize.left, mBorder, NS_SIDE_LEFT);
// XXX fixup missing border colors
mSpacing.mBorder = mBorder.mSize;
mSpacing.mBorderPadding = mSpacing.mPadding;
@ -568,7 +572,7 @@ NS_NewStyleContext(nsIStyleContext** aInstancePtrResult,
if (nsnull == context) {
return NS_ERROR_OUT_OF_MEMORY;
}
context->PostProcessData();
context->RecalcAutomaticData();
return context->QueryInterface(kIStyleContextIID, (void **) aInstancePtrResult);
}

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

@ -0,0 +1,99 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#ifndef nsStyleCoord_h___
#define nsStyleCoord_h___
#include "nscore.h"
#include "nsCoord.h"
class nsString;
enum nsStyleUnit {
eStyleUnit_Twips = 0, // (nscoord) value is twips
eStyleUnit_Percent = 1, // (float) 1.0 == 100%
eStyleUnit_Auto = 2, // (no value)
eStyleUnit_Inherit = 3, // (no value) value should be inherited
eStyleUnit_Proportional = 4, // (int) value has proportional meaning
eStyleUnit_Enumerated = 5, // (int) value has enumerated meaning
};
class nsStyleCoord {
public:
nsStyleCoord(void); // sets to 0 twips
nsStyleCoord(nscoord aValue);
nsStyleCoord(PRInt32 aValue, nsStyleUnit aUnit);
nsStyleCoord(float aValue);
nsStyleCoord(const nsStyleCoord& aCopy);
~nsStyleCoord(void);
nsStyleCoord& operator=(const nsStyleCoord& aCopy);
PRBool operator==(const nsStyleCoord& aOther) const;
nsStyleUnit GetUnit(void) const { return mUnit; }
nscoord GetCoordValue(void) const;
PRInt32 GetIntValue(void) const;
float GetFloatValue(void) const;
void Set(nscoord aValue);
void Set(PRInt32 aValue, nsStyleUnit aUnit);
void Set(float aValue);
void SetAuto(void);
void SetInherit(void);
void AppendToString(nsString& aBuffer) const;
void ToString(nsString& aBuffer) const;
protected:
nsStyleUnit mUnit;
union {
PRInt32 mInt; // nscoord is a PRInt32 for now
float mFloat;
} mValue;
};
inline PRInt32 nsStyleCoord::GetCoordValue(void) const
{
NS_ASSERTION((mUnit == eStyleUnit_Twips), "not a coord value");
if (mUnit == eStyleUnit_Twips) {
return mValue.mInt;
}
return 0;
}
inline PRInt32 nsStyleCoord::GetIntValue(void) const
{
NS_ASSERTION((mUnit == eStyleUnit_Proportional) ||
(mUnit == eStyleUnit_Enumerated), "not an int value");
if ((mUnit == eStyleUnit_Proportional) ||
(mUnit == eStyleUnit_Enumerated)) {
return mValue.mInt;
}
return 0;
}
inline float nsStyleCoord::GetFloatValue(void) const
{
NS_ASSERTION(mUnit == eStyleUnit_Percent, "not a float value");
if (mUnit == eStyleUnit_Percent) {
return mValue.mFloat;
}
return 0.0f;
}
#endif /* nsStyleCoord_h___ */

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

@ -31,6 +31,7 @@ EXPORTS = \
nsIPresShell.h \
nsIRunaround.h \
nsISpaceManager.h \
nsStyleCoord.h \
nsIStyleContext.h \
nsIStyleRule.h \
nsIStyleSet.h \

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

@ -30,6 +30,7 @@ EXPORTS = \
nsIPresShell.h \
nsIRunaround.h \
nsISpaceManager.h \
nsStyleCoord.h \
nsIStyleContext.h \
nsIStyleRule.h \
nsIStyleSet.h \

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

@ -24,6 +24,8 @@
#include "nsCoord.h"
#include "nsMargin.h"
#include "nsFont.h"
#include "nsStyleCoord.h"
class nsIFrame;
class nsIPresContext;
class nsIContent;
@ -67,11 +69,6 @@ class nsISupportsArray;
#define NS_SIDE_BOTTOM 2
#define NS_SIDE_LEFT 3
union nsStyleValue {
nscoord coord;
float percent;
};
// The lifetime of these objects is managed by the nsIStyleContext.
struct nsStyleStruct {
@ -110,8 +107,8 @@ protected:
struct nsStyleSpacing: public nsStyleStruct {
nsMargin mMargin;
nsMargin mPadding;
nsMargin mBorder; // automatic computed value
nsMargin mBorderPadding; // automatic computed value
nsMargin mBorder; // automatic computed value (DON'T SET)
nsMargin mBorderPadding; // automatic computed value (DON'T SET)
protected:
nsStyleSpacing(void);
@ -167,18 +164,13 @@ struct nsStyleText : public nsStyleStruct {
PRUint8 mTextAlign; // see nsStyleConsts.h
PRUint8 mTextDecoration; // see nsStyleConsts.h
PRUint8 mTextTransform; // see nsStyleConsts.h
PRUint8 mVerticalAlignFlags; // see nsStyleConsts.h
PRUint8 mWhiteSpace; // see nsStyleConsts.h
PRUint8 mLetterSpacingFlags;
PRUint8 mLineHeightFlags;
PRUint8 mTextIndentFlags;
PRUint8 mWordSpacingFlags;
nsStyleValue mLetterSpacing;
nsStyleValue mLineHeight;
nsStyleValue mTextIndent;
nsStyleValue mWordSpacing;
nsStyleValue mVerticalAlign;
nsStyleCoord mLetterSpacing;
nsStyleCoord mLineHeight;
nsStyleCoord mTextIndent;
nsStyleCoord mWordSpacing;
nsStyleCoord mVerticalAlign; // see nsStyleConsts.h for enums
protected:
nsStyleText();
@ -214,6 +206,9 @@ public:
// get a style data struct by ID, may return null
virtual nsStyleStruct* GetData(const nsIID& aSID) = 0;
// call if you change style data after creation
virtual void RecalcAutomaticData(void) = 0;
};
// this is private to nsStyleSet, don't call it

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

@ -0,0 +1,99 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#ifndef nsStyleCoord_h___
#define nsStyleCoord_h___
#include "nscore.h"
#include "nsCoord.h"
class nsString;
enum nsStyleUnit {
eStyleUnit_Twips = 0, // (nscoord) value is twips
eStyleUnit_Percent = 1, // (float) 1.0 == 100%
eStyleUnit_Auto = 2, // (no value)
eStyleUnit_Inherit = 3, // (no value) value should be inherited
eStyleUnit_Proportional = 4, // (int) value has proportional meaning
eStyleUnit_Enumerated = 5, // (int) value has enumerated meaning
};
class nsStyleCoord {
public:
nsStyleCoord(void); // sets to 0 twips
nsStyleCoord(nscoord aValue);
nsStyleCoord(PRInt32 aValue, nsStyleUnit aUnit);
nsStyleCoord(float aValue);
nsStyleCoord(const nsStyleCoord& aCopy);
~nsStyleCoord(void);
nsStyleCoord& operator=(const nsStyleCoord& aCopy);
PRBool operator==(const nsStyleCoord& aOther) const;
nsStyleUnit GetUnit(void) const { return mUnit; }
nscoord GetCoordValue(void) const;
PRInt32 GetIntValue(void) const;
float GetFloatValue(void) const;
void Set(nscoord aValue);
void Set(PRInt32 aValue, nsStyleUnit aUnit);
void Set(float aValue);
void SetAuto(void);
void SetInherit(void);
void AppendToString(nsString& aBuffer) const;
void ToString(nsString& aBuffer) const;
protected:
nsStyleUnit mUnit;
union {
PRInt32 mInt; // nscoord is a PRInt32 for now
float mFloat;
} mValue;
};
inline PRInt32 nsStyleCoord::GetCoordValue(void) const
{
NS_ASSERTION((mUnit == eStyleUnit_Twips), "not a coord value");
if (mUnit == eStyleUnit_Twips) {
return mValue.mInt;
}
return 0;
}
inline PRInt32 nsStyleCoord::GetIntValue(void) const
{
NS_ASSERTION((mUnit == eStyleUnit_Proportional) ||
(mUnit == eStyleUnit_Enumerated), "not an int value");
if ((mUnit == eStyleUnit_Proportional) ||
(mUnit == eStyleUnit_Enumerated)) {
return mValue.mInt;
}
return 0;
}
inline float nsStyleCoord::GetFloatValue(void) const
{
NS_ASSERTION(mUnit == eStyleUnit_Percent, "not a float value");
if (mUnit == eStyleUnit_Percent) {
return mValue.mFloat;
}
return 0.0f;
}
#endif /* nsStyleCoord_h___ */

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

@ -32,6 +32,7 @@ CPPSRCS = \
nsReflowCommand.cpp \
nsSpaceManager.cpp \
nsSplittableFrame.cpp \
nsStyleCoord.cpp \
nsStyleContext.cpp \
nsStyleSet.cpp \
$(NULL)

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

@ -23,7 +23,8 @@ DEFINES=-D_IMPL_NS_LAYOUT -DWIN32_LEAN_AND_MEAN
CPPSRCS=nsContainerFrame.cpp nsDocument.cpp nsFrame.cpp \
nsGalleyContext.cpp nsPresContext.cpp nsPresShell.cpp \
nsPrintPreviewContext.cpp nsReflowCommand.cpp nsSpaceManager.cpp \
nsSplittableFrame.cpp nsStyleContext.cpp nsStyleSet.cpp
nsSplittableFrame.cpp nsStyleCoord.cpp nsStyleContext.cpp \
nsStyleSet.cpp
MODULE=raptor
REQUIRES=xpcom raptor dom
CPP_OBJS=.\$(OBJDIR)\nsContainerFrame.obj .\$(OBJDIR)\nsDocument.obj \
@ -31,8 +32,8 @@ CPP_OBJS=.\$(OBJDIR)\nsContainerFrame.obj .\$(OBJDIR)\nsDocument.obj \
.\$(OBJDIR)\nsPresContext.obj .\$(OBJDIR)\nsPresShell.obj \
.\$(OBJDIR)\nsPrintPreviewContext.obj \
.\$(OBJDIR)\nsReflowCommand.obj .\$(OBJDIR)\nsSpaceManager.obj \
.\$(OBJDIR)\nsSplittableFrame.obj .\$(OBJDIR)\nsStyleContext.obj \
.\$(OBJDIR)\nsStyleSet.obj
.\$(OBJDIR)\nsSplittableFrame.obj .\$(OBJDIR)\nsStyleCoord.obj \
.\$(OBJDIR)\nsStyleContext.obj .\$(OBJDIR)\nsStyleSet.obj
LINCS=-I$(XPDIST)\public\xpcom -I$(XPDIST)\public\raptor \
-I$(XPDIST)\public\dom -I$(XPDIST)\public\js

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

@ -199,8 +199,8 @@
#define NS_STYLE_VERTICAL_ALIGN_MIDDLE 15
#define NS_STYLE_VERTICAL_ALIGN_TEXT_BOTTOM 16
#define NS_STYLE_VERTICAL_ALIGN_BOTTOM 17
#define NS_STYLE_VERTICAL_ALIGN_LENGTH 18
#define NS_STYLE_VERTICAL_ALIGN_PERCENT 19
//#define NS_STYLE_VERTICAL_ALIGN_LENGTH 18
//#define NS_STYLE_VERTICAL_ALIGN_PERCENT 19
// See nsStyleDisplay
#define NS_STYLE_VISIBILITY_INHERIT 0

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

@ -272,13 +272,8 @@ struct StyleTextImpl: public nsStyleText {
mTextAlign = NS_STYLE_TEXT_ALIGN_LEFT;
mTextDecoration = NS_STYLE_TEXT_DECORATION_NONE;
mTextTransform = NS_STYLE_TEXT_TRANSFORM_NONE;
mVerticalAlignFlags = NS_STYLE_VERTICAL_ALIGN_BASELINE;
mVerticalAlign.Set(NS_STYLE_VERTICAL_ALIGN_BASELINE, eStyleUnit_Enumerated);
mWhiteSpace = NS_STYLE_WHITESPACE_NORMAL;
mLetterSpacing.coord = 0;
mLineHeight.coord = 0;
mTextIndent.coord = 0;
mWordSpacing.coord = 0;
mVerticalAlign.coord = 0;
}
~StyleTextImpl() {
}
@ -359,7 +354,7 @@ public:
virtual nsStyleStruct* GetData(const nsIID& aSID);
virtual void InheritFrom(const StyleContextImpl& aParent);
virtual void PostProcessData(void);
virtual void RecalcAutomaticData(void);
nsIStyleContext* mParent;
PRUint32 mHashValid: 1;
@ -522,23 +517,32 @@ void StyleContextImpl::InheritFrom(const StyleContextImpl& aParent)
mDisplay.InheritFrom(aParent.mDisplay);
}
static void CalcBorderSize(nscoord& aSize, PRUint8 aFlag)
static void CalcBorderSize(nscoord& aSize, const nsStyleBorder& aBorder, PRUint8 aSide)
{
static const nscoord kBorderSize[3] = // XXX need real numbers here (this is probably wrong anyway)
{ NS_POINTS_TO_TWIPS_INT(1),
NS_POINTS_TO_TWIPS_INT(3),
NS_POINTS_TO_TWIPS_INT(5) };
if (aFlag < NS_STYLE_BORDER_WIDTH_LENGTH_VALUE) {
aSize = kBorderSize[aFlag];
PRUint8 style = aBorder.mStyle[aSide];
if (NS_STYLE_BORDER_STYLE_NONE == style) {
aSize = 0;
}
else {
PRUint8 flag = aBorder.mSizeFlag[aSide];
if (flag < NS_STYLE_BORDER_WIDTH_LENGTH_VALUE) {
aSize = kBorderSize[flag];
}
}
}
void StyleContextImpl::PostProcessData(void)
void StyleContextImpl::RecalcAutomaticData(void)
{
CalcBorderSize(mBorder.mSize.top, mBorder.mSizeFlag[NS_SIDE_TOP]);
CalcBorderSize(mBorder.mSize.right, mBorder.mSizeFlag[NS_SIDE_RIGHT]);
CalcBorderSize(mBorder.mSize.bottom, mBorder.mSizeFlag[NS_SIDE_BOTTOM]);
CalcBorderSize(mBorder.mSize.left, mBorder.mSizeFlag[NS_SIDE_LEFT]);
CalcBorderSize(mBorder.mSize.top, mBorder, NS_SIDE_TOP);
CalcBorderSize(mBorder.mSize.right, mBorder, NS_SIDE_RIGHT);
CalcBorderSize(mBorder.mSize.bottom, mBorder, NS_SIDE_BOTTOM);
CalcBorderSize(mBorder.mSize.left, mBorder, NS_SIDE_LEFT);
// XXX fixup missing border colors
mSpacing.mBorder = mBorder.mSize;
mSpacing.mBorderPadding = mSpacing.mPadding;
@ -568,7 +572,7 @@ NS_NewStyleContext(nsIStyleContext** aInstancePtrResult,
if (nsnull == context) {
return NS_ERROR_OUT_OF_MEMORY;
}
context->PostProcessData();
context->RecalcAutomaticData();
return context->QueryInterface(kIStyleContextIID, (void **) aInstancePtrResult);
}

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

@ -0,0 +1,147 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsStyleCoord.h"
#include "nsString.h"
#include "nsCRT.h"
nsStyleCoord::nsStyleCoord(void)
: mUnit(eStyleUnit_Twips)
{
mValue.mInt = 0;
}
nsStyleCoord::nsStyleCoord(nscoord aValue)
: mUnit(eStyleUnit_Twips)
{
mValue.mInt = aValue;
}
nsStyleCoord::nsStyleCoord(PRInt32 aValue, nsStyleUnit aUnit)
: mUnit(aUnit)
{
mValue.mInt = aValue;
}
nsStyleCoord::nsStyleCoord(float aValue)
: mUnit(eStyleUnit_Percent)
{
mValue.mFloat = aValue;
}
nsStyleCoord::nsStyleCoord(const nsStyleCoord& aCopy)
: mUnit(aCopy.mUnit)
{
if (eStyleUnit_Percent == mUnit) {
mValue.mFloat = aCopy.mValue.mFloat;
}
else {
mValue.mInt = aCopy.mValue.mInt;
}
}
nsStyleCoord::~nsStyleCoord(void)
{
}
nsStyleCoord& nsStyleCoord::operator=(const nsStyleCoord& aCopy)
{
mUnit = aCopy.mUnit;
if (eStyleUnit_Percent == mUnit) {
mValue.mFloat = aCopy.mValue.mFloat;
}
else {
mValue.mInt = aCopy.mValue.mInt;
}
return *this;
}
PRBool nsStyleCoord::operator==(const nsStyleCoord& aOther) const
{
if (mUnit == aOther.mUnit) {
if (eStyleUnit_Percent == mUnit) {
return PRBool(mValue.mFloat == aOther.mValue.mFloat);
}
else {
return PRBool(mValue.mInt == aOther.mValue.mInt);
}
}
return PR_FALSE;
}
void nsStyleCoord::Set(nscoord aValue)
{
mUnit = eStyleUnit_Twips;
mValue.mInt = aValue;
}
void nsStyleCoord::Set(PRInt32 aValue, nsStyleUnit aUnit)
{
mUnit = aUnit;
mValue.mInt = aValue;
}
void nsStyleCoord::Set(float aValue)
{
mUnit = eStyleUnit_Percent;
mValue.mFloat = aValue;
}
void nsStyleCoord::SetAuto(void)
{
mUnit = eStyleUnit_Auto;
mValue.mInt = 0;
}
void nsStyleCoord::SetInherit(void)
{
mUnit = eStyleUnit_Inherit;
mValue.mInt = 0;
}
void nsStyleCoord::AppendToString(nsString& aBuffer) const
{
if (eStyleUnit_Percent == mUnit) {
aBuffer.Append(mValue.mFloat);
}
else if ((eStyleUnit_Twips == mUnit) ||
(eStyleUnit_Proportional == mUnit) ||
(eStyleUnit_Enumerated == mUnit)) {
aBuffer.Append(mValue.mInt, 10);
aBuffer.Append("[0x");
aBuffer.Append(mValue.mInt, 16);
aBuffer.Append(']');
}
switch (mUnit) {
case eStyleUnit_Twips: aBuffer.Append("tw"); break;
case eStyleUnit_Percent: aBuffer.Append("%"); break;
case eStyleUnit_Auto: aBuffer.Append("Auto"); break;
case eStyleUnit_Inherit: aBuffer.Append("Inherit"); break;
case eStyleUnit_Proportional: aBuffer.Append("*"); break;
case eStyleUnit_Enumerated: aBuffer.Append("enum"); break;
}
aBuffer.Append(' ');
}
void nsStyleCoord::ToString(nsString& aBuffer) const
{
aBuffer.Truncate();
AppendToString(aBuffer);
}

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

@ -272,13 +272,8 @@ struct StyleTextImpl: public nsStyleText {
mTextAlign = NS_STYLE_TEXT_ALIGN_LEFT;
mTextDecoration = NS_STYLE_TEXT_DECORATION_NONE;
mTextTransform = NS_STYLE_TEXT_TRANSFORM_NONE;
mVerticalAlignFlags = NS_STYLE_VERTICAL_ALIGN_BASELINE;
mVerticalAlign.Set(NS_STYLE_VERTICAL_ALIGN_BASELINE, eStyleUnit_Enumerated);
mWhiteSpace = NS_STYLE_WHITESPACE_NORMAL;
mLetterSpacing.coord = 0;
mLineHeight.coord = 0;
mTextIndent.coord = 0;
mWordSpacing.coord = 0;
mVerticalAlign.coord = 0;
}
~StyleTextImpl() {
}
@ -359,7 +354,7 @@ public:
virtual nsStyleStruct* GetData(const nsIID& aSID);
virtual void InheritFrom(const StyleContextImpl& aParent);
virtual void PostProcessData(void);
virtual void RecalcAutomaticData(void);
nsIStyleContext* mParent;
PRUint32 mHashValid: 1;
@ -522,23 +517,32 @@ void StyleContextImpl::InheritFrom(const StyleContextImpl& aParent)
mDisplay.InheritFrom(aParent.mDisplay);
}
static void CalcBorderSize(nscoord& aSize, PRUint8 aFlag)
static void CalcBorderSize(nscoord& aSize, const nsStyleBorder& aBorder, PRUint8 aSide)
{
static const nscoord kBorderSize[3] = // XXX need real numbers here (this is probably wrong anyway)
{ NS_POINTS_TO_TWIPS_INT(1),
NS_POINTS_TO_TWIPS_INT(3),
NS_POINTS_TO_TWIPS_INT(5) };
if (aFlag < NS_STYLE_BORDER_WIDTH_LENGTH_VALUE) {
aSize = kBorderSize[aFlag];
PRUint8 style = aBorder.mStyle[aSide];
if (NS_STYLE_BORDER_STYLE_NONE == style) {
aSize = 0;
}
else {
PRUint8 flag = aBorder.mSizeFlag[aSide];
if (flag < NS_STYLE_BORDER_WIDTH_LENGTH_VALUE) {
aSize = kBorderSize[flag];
}
}
}
void StyleContextImpl::PostProcessData(void)
void StyleContextImpl::RecalcAutomaticData(void)
{
CalcBorderSize(mBorder.mSize.top, mBorder.mSizeFlag[NS_SIDE_TOP]);
CalcBorderSize(mBorder.mSize.right, mBorder.mSizeFlag[NS_SIDE_RIGHT]);
CalcBorderSize(mBorder.mSize.bottom, mBorder.mSizeFlag[NS_SIDE_BOTTOM]);
CalcBorderSize(mBorder.mSize.left, mBorder.mSizeFlag[NS_SIDE_LEFT]);
CalcBorderSize(mBorder.mSize.top, mBorder, NS_SIDE_TOP);
CalcBorderSize(mBorder.mSize.right, mBorder, NS_SIDE_RIGHT);
CalcBorderSize(mBorder.mSize.bottom, mBorder, NS_SIDE_BOTTOM);
CalcBorderSize(mBorder.mSize.left, mBorder, NS_SIDE_LEFT);
// XXX fixup missing border colors
mSpacing.mBorder = mBorder.mSize;
mSpacing.mBorderPadding = mSpacing.mPadding;
@ -568,7 +572,7 @@ NS_NewStyleContext(nsIStyleContext** aInstancePtrResult,
if (nsnull == context) {
return NS_ERROR_OUT_OF_MEMORY;
}
context->PostProcessData();
context->RecalcAutomaticData();
return context->QueryInterface(kIStyleContextIID, (void **) aInstancePtrResult);
}

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

@ -0,0 +1,99 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#ifndef nsStyleCoord_h___
#define nsStyleCoord_h___
#include "nscore.h"
#include "nsCoord.h"
class nsString;
enum nsStyleUnit {
eStyleUnit_Twips = 0, // (nscoord) value is twips
eStyleUnit_Percent = 1, // (float) 1.0 == 100%
eStyleUnit_Auto = 2, // (no value)
eStyleUnit_Inherit = 3, // (no value) value should be inherited
eStyleUnit_Proportional = 4, // (int) value has proportional meaning
eStyleUnit_Enumerated = 5, // (int) value has enumerated meaning
};
class nsStyleCoord {
public:
nsStyleCoord(void); // sets to 0 twips
nsStyleCoord(nscoord aValue);
nsStyleCoord(PRInt32 aValue, nsStyleUnit aUnit);
nsStyleCoord(float aValue);
nsStyleCoord(const nsStyleCoord& aCopy);
~nsStyleCoord(void);
nsStyleCoord& operator=(const nsStyleCoord& aCopy);
PRBool operator==(const nsStyleCoord& aOther) const;
nsStyleUnit GetUnit(void) const { return mUnit; }
nscoord GetCoordValue(void) const;
PRInt32 GetIntValue(void) const;
float GetFloatValue(void) const;
void Set(nscoord aValue);
void Set(PRInt32 aValue, nsStyleUnit aUnit);
void Set(float aValue);
void SetAuto(void);
void SetInherit(void);
void AppendToString(nsString& aBuffer) const;
void ToString(nsString& aBuffer) const;
protected:
nsStyleUnit mUnit;
union {
PRInt32 mInt; // nscoord is a PRInt32 for now
float mFloat;
} mValue;
};
inline PRInt32 nsStyleCoord::GetCoordValue(void) const
{
NS_ASSERTION((mUnit == eStyleUnit_Twips), "not a coord value");
if (mUnit == eStyleUnit_Twips) {
return mValue.mInt;
}
return 0;
}
inline PRInt32 nsStyleCoord::GetIntValue(void) const
{
NS_ASSERTION((mUnit == eStyleUnit_Proportional) ||
(mUnit == eStyleUnit_Enumerated), "not an int value");
if ((mUnit == eStyleUnit_Proportional) ||
(mUnit == eStyleUnit_Enumerated)) {
return mValue.mInt;
}
return 0;
}
inline float nsStyleCoord::GetFloatValue(void) const
{
NS_ASSERTION(mUnit == eStyleUnit_Percent, "not a float value");
if (mUnit == eStyleUnit_Percent) {
return mValue.mFloat;
}
return 0.0f;
}
#endif /* nsStyleCoord_h___ */