diff --git a/mozilla/content/html/style/src/nsCSSValue.cpp b/mozilla/content/html/style/src/nsCSSValue.cpp new file mode 100644 index 00000000000..a2b6bf3aa9f --- /dev/null +++ b/mozilla/content/html/style/src/nsCSSValue.cpp @@ -0,0 +1,344 @@ +/* -*- 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 "nsCSSValue.h" +#include "nsString.h" +//#include "nsCRT.h" +#include "nsCSSProps.h" +#include "nsCSSPropIDs.h" +#include "nsUnitConversion.h" + +//#include "nsStyleConsts.h" + + +nsCSSValue::nsCSSValue(nsCSSUnit aUnit) + : mUnit(aUnit) +{ + NS_ASSERTION(mUnit <= eCSSUnit_Normal, "not a valueless unit"); + if (aUnit > eCSSUnit_Normal) { + mUnit = eCSSUnit_Null; + } + mValue.mInt = 0; +} + +nsCSSValue::nsCSSValue(PRInt32 aValue, nsCSSUnit aUnit) + : mUnit(aUnit) +{ + NS_ASSERTION((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit), "not an int value"); + if ((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit)) { + mValue.mInt = aValue; + } + else { + mUnit = eCSSUnit_Null; + mValue.mInt = 0; + } +} + +nsCSSValue::nsCSSValue(float aValue, nsCSSUnit aUnit) + : mUnit(aUnit) +{ + NS_ASSERTION(eCSSUnit_Percent <= aUnit, "not a float value"); + if (eCSSUnit_Percent <= aUnit) { + mValue.mFloat = aValue; + } + else { + mUnit = eCSSUnit_Null; + mValue.mInt = 0; + } +} + +nsCSSValue::nsCSSValue(const nsString& aValue) + : mUnit(eCSSUnit_String) +{ + mValue.mString = aValue.ToNewString(); +} + +nsCSSValue::nsCSSValue(nscolor aValue) + : mUnit(eCSSUnit_Color) +{ + mValue.mColor = aValue; +} + +nsCSSValue::nsCSSValue(const nsCSSValue& aCopy) + : mUnit(aCopy.mUnit) +{ + if (eCSSUnit_String == mUnit) { + if (nsnull != aCopy.mValue.mString) { + mValue.mString = (aCopy.mValue.mString)->ToNewString(); + } + else { + mValue.mString = nsnull; + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + mValue.mInt = aCopy.mValue.mInt; + } + else if (eCSSUnit_Color == mUnit){ + mValue.mColor = aCopy.mValue.mColor; + } + else { + mValue.mFloat = aCopy.mValue.mFloat; + } +} + +nsCSSValue::~nsCSSValue(void) +{ + Reset(); +} + +nsCSSValue& nsCSSValue::operator=(const nsCSSValue& aCopy) +{ + Reset(); + mUnit = aCopy.mUnit; + if (eCSSUnit_String == mUnit) { + if (nsnull != aCopy.mValue.mString) { + mValue.mString = (aCopy.mValue.mString)->ToNewString(); + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + mValue.mInt = aCopy.mValue.mInt; + } + else if (eCSSUnit_Color == mUnit){ + mValue.mColor = aCopy.mValue.mColor; + } + else { + mValue.mFloat = aCopy.mValue.mFloat; + } + return *this; +} + +PRBool nsCSSValue::operator==(const nsCSSValue& aOther) const +{ + if (mUnit == aOther.mUnit) { + if (eCSSUnit_String == mUnit) { + if (nsnull == mValue.mString) { + if (nsnull == aOther.mValue.mString) { + return PR_TRUE; + } + } + else if (nsnull != aOther.mValue.mString) { + return mValue.mString->Equals(*(aOther.mValue.mString)); + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + return PRBool(mValue.mInt == aOther.mValue.mInt); + } + else if (eCSSUnit_Color == mUnit){ + return PRBool(mValue.mColor == aOther.mValue.mColor); + } + else { + return PRBool(mValue.mFloat == aOther.mValue.mFloat); + } + } + return PR_FALSE; +} + +nscoord nsCSSValue::GetLengthTwips(void) const +{ + NS_ASSERTION(IsFixedLengthUnit(), "not a fixed length unit"); + + if (IsFixedLengthUnit()) { + switch (mUnit) { + case eCSSUnit_Inch: + return NS_INCHES_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Foot: + return NS_FEET_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Mile: + return NS_MILES_TO_TWIPS(mValue.mFloat); + + case eCSSUnit_Millimeter: + return NS_MILLIMETERS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Centimeter: + return NS_CENTIMETERS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Meter: + return NS_METERS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Kilometer: + return NS_KILOMETERS_TO_TWIPS(mValue.mFloat); + + case eCSSUnit_Point: + return NSFloatPointsToTwips(mValue.mFloat); + case eCSSUnit_Pica: + return NS_PICAS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Didot: + return NS_DIDOTS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Cicero: + return NS_CICEROS_TO_TWIPS(mValue.mFloat); + } + } + return 0; +} + +void nsCSSValue::Reset(void) +{ + if ((eCSSUnit_String == mUnit) && (nsnull != mValue.mString)) { + delete mValue.mString; + } + mUnit = eCSSUnit_Null; + mValue.mInt = 0; +}; + +void nsCSSValue::SetIntValue(PRInt32 aValue, nsCSSUnit aUnit) +{ + NS_ASSERTION((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit), "not an int value"); + Reset(); + if ((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit)) { + mUnit = aUnit; + mValue.mInt = aValue; + } +} + +void nsCSSValue::SetPercentValue(float aValue) +{ + Reset(); + mUnit = eCSSUnit_Percent; + mValue.mFloat = aValue; +} + +void nsCSSValue::SetFloatValue(float aValue, nsCSSUnit aUnit) +{ + NS_ASSERTION(eCSSUnit_Number <= aUnit, "not a float value"); + Reset(); + if (eCSSUnit_Number <= aUnit) { + mUnit = aUnit; + mValue.mFloat = aValue; + } +} + +void nsCSSValue::SetStringValue(const nsString& aValue) +{ + Reset(); + mUnit = eCSSUnit_String; + mValue.mString = aValue.ToNewString(); +} + +void nsCSSValue::SetColorValue(nscolor aValue) +{ + Reset(); + mUnit = eCSSUnit_Color; + mValue.mColor = aValue; +} + +void nsCSSValue::SetAutoValue(void) +{ + Reset(); + mUnit = eCSSUnit_Auto; +} + +void nsCSSValue::SetInheritValue(void) +{ + Reset(); + mUnit = eCSSUnit_Inherit; +} + +void nsCSSValue::SetNoneValue(void) +{ + Reset(); + mUnit = eCSSUnit_None; +} + +void nsCSSValue::SetNormalValue(void) +{ + Reset(); + mUnit = eCSSUnit_Normal; +} + +void nsCSSValue::AppendToString(nsString& aBuffer, PRInt32 aPropID) const +{ + if (eCSSUnit_Null == mUnit) { + return; + } + + if (-1 < aPropID) { + aBuffer.Append(nsCSSProps::kNameTable[aPropID].name); + aBuffer.Append(": "); + } + + if (eCSSUnit_String == mUnit) { + if (nsnull != mValue.mString) { + aBuffer.Append('"'); + aBuffer.Append(*(mValue.mString)); + aBuffer.Append('"'); + } + else { + aBuffer.Append("null str"); + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + aBuffer.Append(mValue.mInt, 10); + aBuffer.Append("[0x"); + aBuffer.Append(mValue.mInt, 16); + aBuffer.Append(']'); + } + else if (eCSSUnit_Color == mUnit){ + aBuffer.Append("(0x"); + aBuffer.Append(NS_GET_R(mValue.mColor), 16); + aBuffer.Append(" 0x"); + aBuffer.Append(NS_GET_G(mValue.mColor), 16); + aBuffer.Append(" 0x"); + aBuffer.Append(NS_GET_B(mValue.mColor), 16); + aBuffer.Append(" 0x"); + aBuffer.Append(NS_GET_A(mValue.mColor), 16); + aBuffer.Append(')'); + } + else if (eCSSUnit_Percent == mUnit) { + aBuffer.Append(mValue.mFloat * 100.0f); + } + else if (eCSSUnit_Percent < mUnit) { + aBuffer.Append(mValue.mFloat); + } + + switch (mUnit) { + case eCSSUnit_Null: break; + case eCSSUnit_Auto: aBuffer.Append("auto"); break; + case eCSSUnit_Inherit: aBuffer.Append("inherit"); break; + case eCSSUnit_None: aBuffer.Append("none"); break; + case eCSSUnit_String: break; + case eCSSUnit_Integer: aBuffer.Append("int"); break; + case eCSSUnit_Enumerated: aBuffer.Append("enum"); break; + case eCSSUnit_Color: aBuffer.Append("rbga"); break; + case eCSSUnit_Percent: aBuffer.Append("%"); break; + case eCSSUnit_Number: aBuffer.Append("#"); break; + case eCSSUnit_Inch: aBuffer.Append("in"); break; + case eCSSUnit_Foot: aBuffer.Append("ft"); break; + case eCSSUnit_Mile: aBuffer.Append("mi"); break; + case eCSSUnit_Millimeter: aBuffer.Append("mm"); break; + case eCSSUnit_Centimeter: aBuffer.Append("cm"); break; + case eCSSUnit_Meter: aBuffer.Append("m"); break; + case eCSSUnit_Kilometer: aBuffer.Append("km"); break; + case eCSSUnit_Point: aBuffer.Append("pt"); break; + case eCSSUnit_Pica: aBuffer.Append("pc"); break; + case eCSSUnit_Didot: aBuffer.Append("dt"); break; + case eCSSUnit_Cicero: aBuffer.Append("cc"); break; + case eCSSUnit_EM: aBuffer.Append("em"); break; + case eCSSUnit_EN: aBuffer.Append("en"); break; + case eCSSUnit_XHeight: aBuffer.Append("ex"); break; + case eCSSUnit_CapHeight: aBuffer.Append("cap"); break; + case eCSSUnit_Pixel: aBuffer.Append("px"); break; + } + aBuffer.Append(' '); +} + +void nsCSSValue::ToString(nsString& aBuffer, PRInt32 aPropID) const +{ + aBuffer.Truncate(); + AppendToString(aBuffer, aPropID); +} + diff --git a/mozilla/content/html/style/src/nsCSSValue.h b/mozilla/content/html/style/src/nsCSSValue.h new file mode 100644 index 00000000000..3aa3a441673 --- /dev/null +++ b/mozilla/content/html/style/src/nsCSSValue.h @@ -0,0 +1,173 @@ +/* -*- 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 nsCSSValue_h___ +#define nsCSSValue_h___ + +#include "nslayout.h" +#include "nsColor.h" +#include "nsString.h" +#include "nsCoord.h" + + +enum nsCSSUnit { + eCSSUnit_Null = 0, // (n/a) null unit, value is not specified + eCSSUnit_Auto = 1, // (n/a) value is algorithmic + eCSSUnit_Inherit = 2, // (n/a) value is inherited + eCSSUnit_None = 3, // (n/a) value is none + eCSSUnit_Normal = 4, // (n/a) value is normal (algorithmic, different than auto) + eCSSUnit_String = 10, // (nsString) a string value + eCSSUnit_Integer = 50, // (int) simple value + eCSSUnit_Enumerated = 51, // (int) value has enumerated meaning + eCSSUnit_Color = 80, // (color) an RGBA value + eCSSUnit_Percent = 90, // (float) 1.0 == 100%) value is percentage of something + eCSSUnit_Number = 91, // (float) value is numeric (usually multiplier, different behavior that percent) + + // US English + eCSSUnit_Inch = 100, // (float) Standard length + eCSSUnit_Foot = 101, // (float) 12 inches + eCSSUnit_Mile = 102, // (float) 5280 feet + + // Metric + eCSSUnit_Millimeter = 207, // (float) 1/1000 meter + eCSSUnit_Centimeter = 208, // (float) 1/100 meter + eCSSUnit_Meter = 210, // (float) Standard length + eCSSUnit_Kilometer = 213, // (float) 1000 meters + + // US Typographic + eCSSUnit_Point = 300, // (float) 1/72 inch + eCSSUnit_Pica = 301, // (float) 12 points == 1/6 inch + + // European Typographic + eCSSUnit_Didot = 400, // (float) 15 didots == 16 points + eCSSUnit_Cicero = 401, // (float) 12 didots + + // relative units + // Font relative measure + eCSSUnit_EM = 800, // (float) == current font size + eCSSUnit_EN = 801, // (float) .5 em + eCSSUnit_XHeight = 802, // (float) distance from top of lower case x to baseline + eCSSUnit_CapHeight = 803, // (float) distance from top of uppercase case H to baseline + + // Screen relative measure + eCSSUnit_Pixel = 900 // (float) +}; + +class nsCSSValue { +public: + nsCSSValue(nsCSSUnit aUnit = eCSSUnit_Null); // for valueless units only (null, auto, inherit, none, normal) + nsCSSValue(PRInt32 aValue, nsCSSUnit aUnit); + nsCSSValue(float aValue, nsCSSUnit aUnit); + nsCSSValue(const nsString& aValue); + nsCSSValue(nscolor aValue); + nsCSSValue(const nsCSSValue& aCopy); + ~nsCSSValue(void); + + nsCSSValue& operator=(const nsCSSValue& aCopy); + PRBool operator==(const nsCSSValue& aOther) const; + + nsCSSUnit GetUnit(void) const { return mUnit; }; + PRBool IsLengthUnit(void) const + { return PRBool(eCSSUnit_Inch <= mUnit); } + PRBool IsFixedLengthUnit(void) const + { return PRBool((eCSSUnit_Inch <= mUnit) && (mUnit < eCSSUnit_EM)); } + PRBool IsRelativeLengthUnit(void) const + { return PRBool(eCSSUnit_EM <= mUnit); } + + PRInt32 GetIntValue(void) const; + float GetPercentValue(void) const; + float GetFloatValue(void) const; + nsString& GetStringValue(nsString& aBuffer) const; + nscolor GetColorValue(void) const; + nscoord GetLengthTwips(void) const; + + void Reset(void); // sets to null + void SetIntValue(PRInt32 aValue, nsCSSUnit aUnit); + void SetPercentValue(float aValue); + void SetFloatValue(float aValue, nsCSSUnit aUnit); + void SetStringValue(const nsString& aValue); + void SetColorValue(nscolor aValue); + void SetAutoValue(void); + void SetInheritValue(void); + void SetNoneValue(void); + void SetNormalValue(void); + + // debugging methods only + void AppendToString(nsString& aBuffer, PRInt32 aPropID = -1) const; + void ToString(nsString& aBuffer, PRInt32 aPropID = -1) const; + +protected: + nsCSSUnit mUnit; + union { + PRInt32 mInt; + float mFloat; + nsString* mString; + nscolor mColor; + } mValue; +}; + +inline PRInt32 nsCSSValue::GetIntValue(void) const +{ + NS_ASSERTION((mUnit == eCSSUnit_Integer) || + (mUnit == eCSSUnit_Enumerated), "not an int value"); + if ((mUnit == eCSSUnit_Integer) || + (mUnit == eCSSUnit_Enumerated)) { + return mValue.mInt; + } + return 0; +} + +inline float nsCSSValue::GetPercentValue(void) const +{ + NS_ASSERTION((mUnit == eCSSUnit_Percent), "not a percent value"); + if ((mUnit == eCSSUnit_Percent)) { + return mValue.mFloat; + } + return 0.0f; +} + +inline float nsCSSValue::GetFloatValue(void) const +{ + NS_ASSERTION((mUnit >= eCSSUnit_Number), "not a float value"); + if ((mUnit >= eCSSUnit_Number)) { + return mValue.mFloat; + } + return 0.0f; +} + +inline nsString& nsCSSValue::GetStringValue(nsString& aBuffer) const +{ + NS_ASSERTION((mUnit == eCSSUnit_String), "not a string value"); + aBuffer.Truncate(); + if ((mUnit == eCSSUnit_String) && (nsnull != mValue.mString)) { + aBuffer.Append(*(mValue.mString)); + } + return aBuffer; +} + +inline nscolor nsCSSValue::GetColorValue(void) const +{ + NS_ASSERTION((mUnit == eCSSUnit_Color), "not a color value"); + if (mUnit == eCSSUnit_Color) { + return mValue.mColor; + } + return NS_RGB(0,0,0); +} + + +#endif /* nsCSSValue_h___ */ + diff --git a/mozilla/layout/html/style/src/nsCSSValue.cpp b/mozilla/layout/html/style/src/nsCSSValue.cpp new file mode 100644 index 00000000000..a2b6bf3aa9f --- /dev/null +++ b/mozilla/layout/html/style/src/nsCSSValue.cpp @@ -0,0 +1,344 @@ +/* -*- 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 "nsCSSValue.h" +#include "nsString.h" +//#include "nsCRT.h" +#include "nsCSSProps.h" +#include "nsCSSPropIDs.h" +#include "nsUnitConversion.h" + +//#include "nsStyleConsts.h" + + +nsCSSValue::nsCSSValue(nsCSSUnit aUnit) + : mUnit(aUnit) +{ + NS_ASSERTION(mUnit <= eCSSUnit_Normal, "not a valueless unit"); + if (aUnit > eCSSUnit_Normal) { + mUnit = eCSSUnit_Null; + } + mValue.mInt = 0; +} + +nsCSSValue::nsCSSValue(PRInt32 aValue, nsCSSUnit aUnit) + : mUnit(aUnit) +{ + NS_ASSERTION((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit), "not an int value"); + if ((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit)) { + mValue.mInt = aValue; + } + else { + mUnit = eCSSUnit_Null; + mValue.mInt = 0; + } +} + +nsCSSValue::nsCSSValue(float aValue, nsCSSUnit aUnit) + : mUnit(aUnit) +{ + NS_ASSERTION(eCSSUnit_Percent <= aUnit, "not a float value"); + if (eCSSUnit_Percent <= aUnit) { + mValue.mFloat = aValue; + } + else { + mUnit = eCSSUnit_Null; + mValue.mInt = 0; + } +} + +nsCSSValue::nsCSSValue(const nsString& aValue) + : mUnit(eCSSUnit_String) +{ + mValue.mString = aValue.ToNewString(); +} + +nsCSSValue::nsCSSValue(nscolor aValue) + : mUnit(eCSSUnit_Color) +{ + mValue.mColor = aValue; +} + +nsCSSValue::nsCSSValue(const nsCSSValue& aCopy) + : mUnit(aCopy.mUnit) +{ + if (eCSSUnit_String == mUnit) { + if (nsnull != aCopy.mValue.mString) { + mValue.mString = (aCopy.mValue.mString)->ToNewString(); + } + else { + mValue.mString = nsnull; + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + mValue.mInt = aCopy.mValue.mInt; + } + else if (eCSSUnit_Color == mUnit){ + mValue.mColor = aCopy.mValue.mColor; + } + else { + mValue.mFloat = aCopy.mValue.mFloat; + } +} + +nsCSSValue::~nsCSSValue(void) +{ + Reset(); +} + +nsCSSValue& nsCSSValue::operator=(const nsCSSValue& aCopy) +{ + Reset(); + mUnit = aCopy.mUnit; + if (eCSSUnit_String == mUnit) { + if (nsnull != aCopy.mValue.mString) { + mValue.mString = (aCopy.mValue.mString)->ToNewString(); + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + mValue.mInt = aCopy.mValue.mInt; + } + else if (eCSSUnit_Color == mUnit){ + mValue.mColor = aCopy.mValue.mColor; + } + else { + mValue.mFloat = aCopy.mValue.mFloat; + } + return *this; +} + +PRBool nsCSSValue::operator==(const nsCSSValue& aOther) const +{ + if (mUnit == aOther.mUnit) { + if (eCSSUnit_String == mUnit) { + if (nsnull == mValue.mString) { + if (nsnull == aOther.mValue.mString) { + return PR_TRUE; + } + } + else if (nsnull != aOther.mValue.mString) { + return mValue.mString->Equals(*(aOther.mValue.mString)); + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + return PRBool(mValue.mInt == aOther.mValue.mInt); + } + else if (eCSSUnit_Color == mUnit){ + return PRBool(mValue.mColor == aOther.mValue.mColor); + } + else { + return PRBool(mValue.mFloat == aOther.mValue.mFloat); + } + } + return PR_FALSE; +} + +nscoord nsCSSValue::GetLengthTwips(void) const +{ + NS_ASSERTION(IsFixedLengthUnit(), "not a fixed length unit"); + + if (IsFixedLengthUnit()) { + switch (mUnit) { + case eCSSUnit_Inch: + return NS_INCHES_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Foot: + return NS_FEET_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Mile: + return NS_MILES_TO_TWIPS(mValue.mFloat); + + case eCSSUnit_Millimeter: + return NS_MILLIMETERS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Centimeter: + return NS_CENTIMETERS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Meter: + return NS_METERS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Kilometer: + return NS_KILOMETERS_TO_TWIPS(mValue.mFloat); + + case eCSSUnit_Point: + return NSFloatPointsToTwips(mValue.mFloat); + case eCSSUnit_Pica: + return NS_PICAS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Didot: + return NS_DIDOTS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Cicero: + return NS_CICEROS_TO_TWIPS(mValue.mFloat); + } + } + return 0; +} + +void nsCSSValue::Reset(void) +{ + if ((eCSSUnit_String == mUnit) && (nsnull != mValue.mString)) { + delete mValue.mString; + } + mUnit = eCSSUnit_Null; + mValue.mInt = 0; +}; + +void nsCSSValue::SetIntValue(PRInt32 aValue, nsCSSUnit aUnit) +{ + NS_ASSERTION((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit), "not an int value"); + Reset(); + if ((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit)) { + mUnit = aUnit; + mValue.mInt = aValue; + } +} + +void nsCSSValue::SetPercentValue(float aValue) +{ + Reset(); + mUnit = eCSSUnit_Percent; + mValue.mFloat = aValue; +} + +void nsCSSValue::SetFloatValue(float aValue, nsCSSUnit aUnit) +{ + NS_ASSERTION(eCSSUnit_Number <= aUnit, "not a float value"); + Reset(); + if (eCSSUnit_Number <= aUnit) { + mUnit = aUnit; + mValue.mFloat = aValue; + } +} + +void nsCSSValue::SetStringValue(const nsString& aValue) +{ + Reset(); + mUnit = eCSSUnit_String; + mValue.mString = aValue.ToNewString(); +} + +void nsCSSValue::SetColorValue(nscolor aValue) +{ + Reset(); + mUnit = eCSSUnit_Color; + mValue.mColor = aValue; +} + +void nsCSSValue::SetAutoValue(void) +{ + Reset(); + mUnit = eCSSUnit_Auto; +} + +void nsCSSValue::SetInheritValue(void) +{ + Reset(); + mUnit = eCSSUnit_Inherit; +} + +void nsCSSValue::SetNoneValue(void) +{ + Reset(); + mUnit = eCSSUnit_None; +} + +void nsCSSValue::SetNormalValue(void) +{ + Reset(); + mUnit = eCSSUnit_Normal; +} + +void nsCSSValue::AppendToString(nsString& aBuffer, PRInt32 aPropID) const +{ + if (eCSSUnit_Null == mUnit) { + return; + } + + if (-1 < aPropID) { + aBuffer.Append(nsCSSProps::kNameTable[aPropID].name); + aBuffer.Append(": "); + } + + if (eCSSUnit_String == mUnit) { + if (nsnull != mValue.mString) { + aBuffer.Append('"'); + aBuffer.Append(*(mValue.mString)); + aBuffer.Append('"'); + } + else { + aBuffer.Append("null str"); + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + aBuffer.Append(mValue.mInt, 10); + aBuffer.Append("[0x"); + aBuffer.Append(mValue.mInt, 16); + aBuffer.Append(']'); + } + else if (eCSSUnit_Color == mUnit){ + aBuffer.Append("(0x"); + aBuffer.Append(NS_GET_R(mValue.mColor), 16); + aBuffer.Append(" 0x"); + aBuffer.Append(NS_GET_G(mValue.mColor), 16); + aBuffer.Append(" 0x"); + aBuffer.Append(NS_GET_B(mValue.mColor), 16); + aBuffer.Append(" 0x"); + aBuffer.Append(NS_GET_A(mValue.mColor), 16); + aBuffer.Append(')'); + } + else if (eCSSUnit_Percent == mUnit) { + aBuffer.Append(mValue.mFloat * 100.0f); + } + else if (eCSSUnit_Percent < mUnit) { + aBuffer.Append(mValue.mFloat); + } + + switch (mUnit) { + case eCSSUnit_Null: break; + case eCSSUnit_Auto: aBuffer.Append("auto"); break; + case eCSSUnit_Inherit: aBuffer.Append("inherit"); break; + case eCSSUnit_None: aBuffer.Append("none"); break; + case eCSSUnit_String: break; + case eCSSUnit_Integer: aBuffer.Append("int"); break; + case eCSSUnit_Enumerated: aBuffer.Append("enum"); break; + case eCSSUnit_Color: aBuffer.Append("rbga"); break; + case eCSSUnit_Percent: aBuffer.Append("%"); break; + case eCSSUnit_Number: aBuffer.Append("#"); break; + case eCSSUnit_Inch: aBuffer.Append("in"); break; + case eCSSUnit_Foot: aBuffer.Append("ft"); break; + case eCSSUnit_Mile: aBuffer.Append("mi"); break; + case eCSSUnit_Millimeter: aBuffer.Append("mm"); break; + case eCSSUnit_Centimeter: aBuffer.Append("cm"); break; + case eCSSUnit_Meter: aBuffer.Append("m"); break; + case eCSSUnit_Kilometer: aBuffer.Append("km"); break; + case eCSSUnit_Point: aBuffer.Append("pt"); break; + case eCSSUnit_Pica: aBuffer.Append("pc"); break; + case eCSSUnit_Didot: aBuffer.Append("dt"); break; + case eCSSUnit_Cicero: aBuffer.Append("cc"); break; + case eCSSUnit_EM: aBuffer.Append("em"); break; + case eCSSUnit_EN: aBuffer.Append("en"); break; + case eCSSUnit_XHeight: aBuffer.Append("ex"); break; + case eCSSUnit_CapHeight: aBuffer.Append("cap"); break; + case eCSSUnit_Pixel: aBuffer.Append("px"); break; + } + aBuffer.Append(' '); +} + +void nsCSSValue::ToString(nsString& aBuffer, PRInt32 aPropID) const +{ + aBuffer.Truncate(); + AppendToString(aBuffer, aPropID); +} + diff --git a/mozilla/layout/html/style/src/nsCSSValue.h b/mozilla/layout/html/style/src/nsCSSValue.h new file mode 100644 index 00000000000..3aa3a441673 --- /dev/null +++ b/mozilla/layout/html/style/src/nsCSSValue.h @@ -0,0 +1,173 @@ +/* -*- 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 nsCSSValue_h___ +#define nsCSSValue_h___ + +#include "nslayout.h" +#include "nsColor.h" +#include "nsString.h" +#include "nsCoord.h" + + +enum nsCSSUnit { + eCSSUnit_Null = 0, // (n/a) null unit, value is not specified + eCSSUnit_Auto = 1, // (n/a) value is algorithmic + eCSSUnit_Inherit = 2, // (n/a) value is inherited + eCSSUnit_None = 3, // (n/a) value is none + eCSSUnit_Normal = 4, // (n/a) value is normal (algorithmic, different than auto) + eCSSUnit_String = 10, // (nsString) a string value + eCSSUnit_Integer = 50, // (int) simple value + eCSSUnit_Enumerated = 51, // (int) value has enumerated meaning + eCSSUnit_Color = 80, // (color) an RGBA value + eCSSUnit_Percent = 90, // (float) 1.0 == 100%) value is percentage of something + eCSSUnit_Number = 91, // (float) value is numeric (usually multiplier, different behavior that percent) + + // US English + eCSSUnit_Inch = 100, // (float) Standard length + eCSSUnit_Foot = 101, // (float) 12 inches + eCSSUnit_Mile = 102, // (float) 5280 feet + + // Metric + eCSSUnit_Millimeter = 207, // (float) 1/1000 meter + eCSSUnit_Centimeter = 208, // (float) 1/100 meter + eCSSUnit_Meter = 210, // (float) Standard length + eCSSUnit_Kilometer = 213, // (float) 1000 meters + + // US Typographic + eCSSUnit_Point = 300, // (float) 1/72 inch + eCSSUnit_Pica = 301, // (float) 12 points == 1/6 inch + + // European Typographic + eCSSUnit_Didot = 400, // (float) 15 didots == 16 points + eCSSUnit_Cicero = 401, // (float) 12 didots + + // relative units + // Font relative measure + eCSSUnit_EM = 800, // (float) == current font size + eCSSUnit_EN = 801, // (float) .5 em + eCSSUnit_XHeight = 802, // (float) distance from top of lower case x to baseline + eCSSUnit_CapHeight = 803, // (float) distance from top of uppercase case H to baseline + + // Screen relative measure + eCSSUnit_Pixel = 900 // (float) +}; + +class nsCSSValue { +public: + nsCSSValue(nsCSSUnit aUnit = eCSSUnit_Null); // for valueless units only (null, auto, inherit, none, normal) + nsCSSValue(PRInt32 aValue, nsCSSUnit aUnit); + nsCSSValue(float aValue, nsCSSUnit aUnit); + nsCSSValue(const nsString& aValue); + nsCSSValue(nscolor aValue); + nsCSSValue(const nsCSSValue& aCopy); + ~nsCSSValue(void); + + nsCSSValue& operator=(const nsCSSValue& aCopy); + PRBool operator==(const nsCSSValue& aOther) const; + + nsCSSUnit GetUnit(void) const { return mUnit; }; + PRBool IsLengthUnit(void) const + { return PRBool(eCSSUnit_Inch <= mUnit); } + PRBool IsFixedLengthUnit(void) const + { return PRBool((eCSSUnit_Inch <= mUnit) && (mUnit < eCSSUnit_EM)); } + PRBool IsRelativeLengthUnit(void) const + { return PRBool(eCSSUnit_EM <= mUnit); } + + PRInt32 GetIntValue(void) const; + float GetPercentValue(void) const; + float GetFloatValue(void) const; + nsString& GetStringValue(nsString& aBuffer) const; + nscolor GetColorValue(void) const; + nscoord GetLengthTwips(void) const; + + void Reset(void); // sets to null + void SetIntValue(PRInt32 aValue, nsCSSUnit aUnit); + void SetPercentValue(float aValue); + void SetFloatValue(float aValue, nsCSSUnit aUnit); + void SetStringValue(const nsString& aValue); + void SetColorValue(nscolor aValue); + void SetAutoValue(void); + void SetInheritValue(void); + void SetNoneValue(void); + void SetNormalValue(void); + + // debugging methods only + void AppendToString(nsString& aBuffer, PRInt32 aPropID = -1) const; + void ToString(nsString& aBuffer, PRInt32 aPropID = -1) const; + +protected: + nsCSSUnit mUnit; + union { + PRInt32 mInt; + float mFloat; + nsString* mString; + nscolor mColor; + } mValue; +}; + +inline PRInt32 nsCSSValue::GetIntValue(void) const +{ + NS_ASSERTION((mUnit == eCSSUnit_Integer) || + (mUnit == eCSSUnit_Enumerated), "not an int value"); + if ((mUnit == eCSSUnit_Integer) || + (mUnit == eCSSUnit_Enumerated)) { + return mValue.mInt; + } + return 0; +} + +inline float nsCSSValue::GetPercentValue(void) const +{ + NS_ASSERTION((mUnit == eCSSUnit_Percent), "not a percent value"); + if ((mUnit == eCSSUnit_Percent)) { + return mValue.mFloat; + } + return 0.0f; +} + +inline float nsCSSValue::GetFloatValue(void) const +{ + NS_ASSERTION((mUnit >= eCSSUnit_Number), "not a float value"); + if ((mUnit >= eCSSUnit_Number)) { + return mValue.mFloat; + } + return 0.0f; +} + +inline nsString& nsCSSValue::GetStringValue(nsString& aBuffer) const +{ + NS_ASSERTION((mUnit == eCSSUnit_String), "not a string value"); + aBuffer.Truncate(); + if ((mUnit == eCSSUnit_String) && (nsnull != mValue.mString)) { + aBuffer.Append(*(mValue.mString)); + } + return aBuffer; +} + +inline nscolor nsCSSValue::GetColorValue(void) const +{ + NS_ASSERTION((mUnit == eCSSUnit_Color), "not a color value"); + if (mUnit == eCSSUnit_Color) { + return mValue.mColor; + } + return NS_RGB(0,0,0); +} + + +#endif /* nsCSSValue_h___ */ + diff --git a/mozilla/layout/style/nsCSSValue.cpp b/mozilla/layout/style/nsCSSValue.cpp new file mode 100644 index 00000000000..a2b6bf3aa9f --- /dev/null +++ b/mozilla/layout/style/nsCSSValue.cpp @@ -0,0 +1,344 @@ +/* -*- 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 "nsCSSValue.h" +#include "nsString.h" +//#include "nsCRT.h" +#include "nsCSSProps.h" +#include "nsCSSPropIDs.h" +#include "nsUnitConversion.h" + +//#include "nsStyleConsts.h" + + +nsCSSValue::nsCSSValue(nsCSSUnit aUnit) + : mUnit(aUnit) +{ + NS_ASSERTION(mUnit <= eCSSUnit_Normal, "not a valueless unit"); + if (aUnit > eCSSUnit_Normal) { + mUnit = eCSSUnit_Null; + } + mValue.mInt = 0; +} + +nsCSSValue::nsCSSValue(PRInt32 aValue, nsCSSUnit aUnit) + : mUnit(aUnit) +{ + NS_ASSERTION((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit), "not an int value"); + if ((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit)) { + mValue.mInt = aValue; + } + else { + mUnit = eCSSUnit_Null; + mValue.mInt = 0; + } +} + +nsCSSValue::nsCSSValue(float aValue, nsCSSUnit aUnit) + : mUnit(aUnit) +{ + NS_ASSERTION(eCSSUnit_Percent <= aUnit, "not a float value"); + if (eCSSUnit_Percent <= aUnit) { + mValue.mFloat = aValue; + } + else { + mUnit = eCSSUnit_Null; + mValue.mInt = 0; + } +} + +nsCSSValue::nsCSSValue(const nsString& aValue) + : mUnit(eCSSUnit_String) +{ + mValue.mString = aValue.ToNewString(); +} + +nsCSSValue::nsCSSValue(nscolor aValue) + : mUnit(eCSSUnit_Color) +{ + mValue.mColor = aValue; +} + +nsCSSValue::nsCSSValue(const nsCSSValue& aCopy) + : mUnit(aCopy.mUnit) +{ + if (eCSSUnit_String == mUnit) { + if (nsnull != aCopy.mValue.mString) { + mValue.mString = (aCopy.mValue.mString)->ToNewString(); + } + else { + mValue.mString = nsnull; + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + mValue.mInt = aCopy.mValue.mInt; + } + else if (eCSSUnit_Color == mUnit){ + mValue.mColor = aCopy.mValue.mColor; + } + else { + mValue.mFloat = aCopy.mValue.mFloat; + } +} + +nsCSSValue::~nsCSSValue(void) +{ + Reset(); +} + +nsCSSValue& nsCSSValue::operator=(const nsCSSValue& aCopy) +{ + Reset(); + mUnit = aCopy.mUnit; + if (eCSSUnit_String == mUnit) { + if (nsnull != aCopy.mValue.mString) { + mValue.mString = (aCopy.mValue.mString)->ToNewString(); + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + mValue.mInt = aCopy.mValue.mInt; + } + else if (eCSSUnit_Color == mUnit){ + mValue.mColor = aCopy.mValue.mColor; + } + else { + mValue.mFloat = aCopy.mValue.mFloat; + } + return *this; +} + +PRBool nsCSSValue::operator==(const nsCSSValue& aOther) const +{ + if (mUnit == aOther.mUnit) { + if (eCSSUnit_String == mUnit) { + if (nsnull == mValue.mString) { + if (nsnull == aOther.mValue.mString) { + return PR_TRUE; + } + } + else if (nsnull != aOther.mValue.mString) { + return mValue.mString->Equals(*(aOther.mValue.mString)); + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + return PRBool(mValue.mInt == aOther.mValue.mInt); + } + else if (eCSSUnit_Color == mUnit){ + return PRBool(mValue.mColor == aOther.mValue.mColor); + } + else { + return PRBool(mValue.mFloat == aOther.mValue.mFloat); + } + } + return PR_FALSE; +} + +nscoord nsCSSValue::GetLengthTwips(void) const +{ + NS_ASSERTION(IsFixedLengthUnit(), "not a fixed length unit"); + + if (IsFixedLengthUnit()) { + switch (mUnit) { + case eCSSUnit_Inch: + return NS_INCHES_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Foot: + return NS_FEET_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Mile: + return NS_MILES_TO_TWIPS(mValue.mFloat); + + case eCSSUnit_Millimeter: + return NS_MILLIMETERS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Centimeter: + return NS_CENTIMETERS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Meter: + return NS_METERS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Kilometer: + return NS_KILOMETERS_TO_TWIPS(mValue.mFloat); + + case eCSSUnit_Point: + return NSFloatPointsToTwips(mValue.mFloat); + case eCSSUnit_Pica: + return NS_PICAS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Didot: + return NS_DIDOTS_TO_TWIPS(mValue.mFloat); + case eCSSUnit_Cicero: + return NS_CICEROS_TO_TWIPS(mValue.mFloat); + } + } + return 0; +} + +void nsCSSValue::Reset(void) +{ + if ((eCSSUnit_String == mUnit) && (nsnull != mValue.mString)) { + delete mValue.mString; + } + mUnit = eCSSUnit_Null; + mValue.mInt = 0; +}; + +void nsCSSValue::SetIntValue(PRInt32 aValue, nsCSSUnit aUnit) +{ + NS_ASSERTION((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit), "not an int value"); + Reset(); + if ((eCSSUnit_Integer == aUnit) || + (eCSSUnit_Enumerated == aUnit)) { + mUnit = aUnit; + mValue.mInt = aValue; + } +} + +void nsCSSValue::SetPercentValue(float aValue) +{ + Reset(); + mUnit = eCSSUnit_Percent; + mValue.mFloat = aValue; +} + +void nsCSSValue::SetFloatValue(float aValue, nsCSSUnit aUnit) +{ + NS_ASSERTION(eCSSUnit_Number <= aUnit, "not a float value"); + Reset(); + if (eCSSUnit_Number <= aUnit) { + mUnit = aUnit; + mValue.mFloat = aValue; + } +} + +void nsCSSValue::SetStringValue(const nsString& aValue) +{ + Reset(); + mUnit = eCSSUnit_String; + mValue.mString = aValue.ToNewString(); +} + +void nsCSSValue::SetColorValue(nscolor aValue) +{ + Reset(); + mUnit = eCSSUnit_Color; + mValue.mColor = aValue; +} + +void nsCSSValue::SetAutoValue(void) +{ + Reset(); + mUnit = eCSSUnit_Auto; +} + +void nsCSSValue::SetInheritValue(void) +{ + Reset(); + mUnit = eCSSUnit_Inherit; +} + +void nsCSSValue::SetNoneValue(void) +{ + Reset(); + mUnit = eCSSUnit_None; +} + +void nsCSSValue::SetNormalValue(void) +{ + Reset(); + mUnit = eCSSUnit_Normal; +} + +void nsCSSValue::AppendToString(nsString& aBuffer, PRInt32 aPropID) const +{ + if (eCSSUnit_Null == mUnit) { + return; + } + + if (-1 < aPropID) { + aBuffer.Append(nsCSSProps::kNameTable[aPropID].name); + aBuffer.Append(": "); + } + + if (eCSSUnit_String == mUnit) { + if (nsnull != mValue.mString) { + aBuffer.Append('"'); + aBuffer.Append(*(mValue.mString)); + aBuffer.Append('"'); + } + else { + aBuffer.Append("null str"); + } + } + else if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { + aBuffer.Append(mValue.mInt, 10); + aBuffer.Append("[0x"); + aBuffer.Append(mValue.mInt, 16); + aBuffer.Append(']'); + } + else if (eCSSUnit_Color == mUnit){ + aBuffer.Append("(0x"); + aBuffer.Append(NS_GET_R(mValue.mColor), 16); + aBuffer.Append(" 0x"); + aBuffer.Append(NS_GET_G(mValue.mColor), 16); + aBuffer.Append(" 0x"); + aBuffer.Append(NS_GET_B(mValue.mColor), 16); + aBuffer.Append(" 0x"); + aBuffer.Append(NS_GET_A(mValue.mColor), 16); + aBuffer.Append(')'); + } + else if (eCSSUnit_Percent == mUnit) { + aBuffer.Append(mValue.mFloat * 100.0f); + } + else if (eCSSUnit_Percent < mUnit) { + aBuffer.Append(mValue.mFloat); + } + + switch (mUnit) { + case eCSSUnit_Null: break; + case eCSSUnit_Auto: aBuffer.Append("auto"); break; + case eCSSUnit_Inherit: aBuffer.Append("inherit"); break; + case eCSSUnit_None: aBuffer.Append("none"); break; + case eCSSUnit_String: break; + case eCSSUnit_Integer: aBuffer.Append("int"); break; + case eCSSUnit_Enumerated: aBuffer.Append("enum"); break; + case eCSSUnit_Color: aBuffer.Append("rbga"); break; + case eCSSUnit_Percent: aBuffer.Append("%"); break; + case eCSSUnit_Number: aBuffer.Append("#"); break; + case eCSSUnit_Inch: aBuffer.Append("in"); break; + case eCSSUnit_Foot: aBuffer.Append("ft"); break; + case eCSSUnit_Mile: aBuffer.Append("mi"); break; + case eCSSUnit_Millimeter: aBuffer.Append("mm"); break; + case eCSSUnit_Centimeter: aBuffer.Append("cm"); break; + case eCSSUnit_Meter: aBuffer.Append("m"); break; + case eCSSUnit_Kilometer: aBuffer.Append("km"); break; + case eCSSUnit_Point: aBuffer.Append("pt"); break; + case eCSSUnit_Pica: aBuffer.Append("pc"); break; + case eCSSUnit_Didot: aBuffer.Append("dt"); break; + case eCSSUnit_Cicero: aBuffer.Append("cc"); break; + case eCSSUnit_EM: aBuffer.Append("em"); break; + case eCSSUnit_EN: aBuffer.Append("en"); break; + case eCSSUnit_XHeight: aBuffer.Append("ex"); break; + case eCSSUnit_CapHeight: aBuffer.Append("cap"); break; + case eCSSUnit_Pixel: aBuffer.Append("px"); break; + } + aBuffer.Append(' '); +} + +void nsCSSValue::ToString(nsString& aBuffer, PRInt32 aPropID) const +{ + aBuffer.Truncate(); + AppendToString(aBuffer, aPropID); +} + diff --git a/mozilla/layout/style/nsCSSValue.h b/mozilla/layout/style/nsCSSValue.h new file mode 100644 index 00000000000..3aa3a441673 --- /dev/null +++ b/mozilla/layout/style/nsCSSValue.h @@ -0,0 +1,173 @@ +/* -*- 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 nsCSSValue_h___ +#define nsCSSValue_h___ + +#include "nslayout.h" +#include "nsColor.h" +#include "nsString.h" +#include "nsCoord.h" + + +enum nsCSSUnit { + eCSSUnit_Null = 0, // (n/a) null unit, value is not specified + eCSSUnit_Auto = 1, // (n/a) value is algorithmic + eCSSUnit_Inherit = 2, // (n/a) value is inherited + eCSSUnit_None = 3, // (n/a) value is none + eCSSUnit_Normal = 4, // (n/a) value is normal (algorithmic, different than auto) + eCSSUnit_String = 10, // (nsString) a string value + eCSSUnit_Integer = 50, // (int) simple value + eCSSUnit_Enumerated = 51, // (int) value has enumerated meaning + eCSSUnit_Color = 80, // (color) an RGBA value + eCSSUnit_Percent = 90, // (float) 1.0 == 100%) value is percentage of something + eCSSUnit_Number = 91, // (float) value is numeric (usually multiplier, different behavior that percent) + + // US English + eCSSUnit_Inch = 100, // (float) Standard length + eCSSUnit_Foot = 101, // (float) 12 inches + eCSSUnit_Mile = 102, // (float) 5280 feet + + // Metric + eCSSUnit_Millimeter = 207, // (float) 1/1000 meter + eCSSUnit_Centimeter = 208, // (float) 1/100 meter + eCSSUnit_Meter = 210, // (float) Standard length + eCSSUnit_Kilometer = 213, // (float) 1000 meters + + // US Typographic + eCSSUnit_Point = 300, // (float) 1/72 inch + eCSSUnit_Pica = 301, // (float) 12 points == 1/6 inch + + // European Typographic + eCSSUnit_Didot = 400, // (float) 15 didots == 16 points + eCSSUnit_Cicero = 401, // (float) 12 didots + + // relative units + // Font relative measure + eCSSUnit_EM = 800, // (float) == current font size + eCSSUnit_EN = 801, // (float) .5 em + eCSSUnit_XHeight = 802, // (float) distance from top of lower case x to baseline + eCSSUnit_CapHeight = 803, // (float) distance from top of uppercase case H to baseline + + // Screen relative measure + eCSSUnit_Pixel = 900 // (float) +}; + +class nsCSSValue { +public: + nsCSSValue(nsCSSUnit aUnit = eCSSUnit_Null); // for valueless units only (null, auto, inherit, none, normal) + nsCSSValue(PRInt32 aValue, nsCSSUnit aUnit); + nsCSSValue(float aValue, nsCSSUnit aUnit); + nsCSSValue(const nsString& aValue); + nsCSSValue(nscolor aValue); + nsCSSValue(const nsCSSValue& aCopy); + ~nsCSSValue(void); + + nsCSSValue& operator=(const nsCSSValue& aCopy); + PRBool operator==(const nsCSSValue& aOther) const; + + nsCSSUnit GetUnit(void) const { return mUnit; }; + PRBool IsLengthUnit(void) const + { return PRBool(eCSSUnit_Inch <= mUnit); } + PRBool IsFixedLengthUnit(void) const + { return PRBool((eCSSUnit_Inch <= mUnit) && (mUnit < eCSSUnit_EM)); } + PRBool IsRelativeLengthUnit(void) const + { return PRBool(eCSSUnit_EM <= mUnit); } + + PRInt32 GetIntValue(void) const; + float GetPercentValue(void) const; + float GetFloatValue(void) const; + nsString& GetStringValue(nsString& aBuffer) const; + nscolor GetColorValue(void) const; + nscoord GetLengthTwips(void) const; + + void Reset(void); // sets to null + void SetIntValue(PRInt32 aValue, nsCSSUnit aUnit); + void SetPercentValue(float aValue); + void SetFloatValue(float aValue, nsCSSUnit aUnit); + void SetStringValue(const nsString& aValue); + void SetColorValue(nscolor aValue); + void SetAutoValue(void); + void SetInheritValue(void); + void SetNoneValue(void); + void SetNormalValue(void); + + // debugging methods only + void AppendToString(nsString& aBuffer, PRInt32 aPropID = -1) const; + void ToString(nsString& aBuffer, PRInt32 aPropID = -1) const; + +protected: + nsCSSUnit mUnit; + union { + PRInt32 mInt; + float mFloat; + nsString* mString; + nscolor mColor; + } mValue; +}; + +inline PRInt32 nsCSSValue::GetIntValue(void) const +{ + NS_ASSERTION((mUnit == eCSSUnit_Integer) || + (mUnit == eCSSUnit_Enumerated), "not an int value"); + if ((mUnit == eCSSUnit_Integer) || + (mUnit == eCSSUnit_Enumerated)) { + return mValue.mInt; + } + return 0; +} + +inline float nsCSSValue::GetPercentValue(void) const +{ + NS_ASSERTION((mUnit == eCSSUnit_Percent), "not a percent value"); + if ((mUnit == eCSSUnit_Percent)) { + return mValue.mFloat; + } + return 0.0f; +} + +inline float nsCSSValue::GetFloatValue(void) const +{ + NS_ASSERTION((mUnit >= eCSSUnit_Number), "not a float value"); + if ((mUnit >= eCSSUnit_Number)) { + return mValue.mFloat; + } + return 0.0f; +} + +inline nsString& nsCSSValue::GetStringValue(nsString& aBuffer) const +{ + NS_ASSERTION((mUnit == eCSSUnit_String), "not a string value"); + aBuffer.Truncate(); + if ((mUnit == eCSSUnit_String) && (nsnull != mValue.mString)) { + aBuffer.Append(*(mValue.mString)); + } + return aBuffer; +} + +inline nscolor nsCSSValue::GetColorValue(void) const +{ + NS_ASSERTION((mUnit == eCSSUnit_Color), "not a color value"); + if (mUnit == eCSSUnit_Color) { + return mValue.mColor; + } + return NS_RGB(0,0,0); +} + + +#endif /* nsCSSValue_h___ */ +