Add nsCSSValuePair type and use it for storage of some properties. Bug 208729,

r+sr=dbaron
This commit is contained in:
bzbarsky@mit.edu
2004-09-10 03:26:58 +00:00
parent 6b94db10be
commit ccd5aa2f41
21 changed files with 660 additions and 308 deletions

View File

@@ -1,3 +1,4 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@@ -66,6 +67,11 @@ struct CDBRectStorage {
};
struct CDBValuePairStorage {
nsCSSProperty property;
nsCSSValuePair value;
};
struct CDBPointerStorage {
nsCSSProperty property;
void *value;
@@ -74,6 +80,7 @@ struct CDBPointerStorage {
enum {
CDBValueStorage_advance = sizeof(CDBValueStorage),
CDBRectStorage_advance = sizeof(CDBRectStorage),
CDBValuePairStorage_advance = sizeof(CDBValuePairStorage),
// round up using the closest estimate we can get of the alignment
// requirements of nsCSSValue:
CDBPointerStorage_advance = PR_ROUNDUP(sizeof(CDBPointerStorage),
@@ -112,6 +119,14 @@ inline const nsCSSRect* RectAtCursor(const char *aCursor) {
return & NS_REINTERPRET_CAST(const CDBRectStorage*, aCursor)->value;
}
inline nsCSSValuePair* ValuePairAtCursor(char *aCursor) {
return & NS_REINTERPRET_CAST(CDBValuePairStorage*, aCursor)->value;
}
inline const nsCSSValuePair* ValuePairAtCursor(const char *aCursor) {
return & NS_REINTERPRET_CAST(const CDBValuePairStorage*, aCursor)->value;
}
inline void*& PointerAtCursor(char *aCursor) {
return NS_REINTERPRET_CAST(CDBPointerStorage*, aCursor)->value;
}
@@ -215,6 +230,18 @@ nsCSSCompressedDataBlock::MapRuleInfoInto(nsRuleData *aRuleData) const
cursor += CDBRectStorage_advance;
} break;
case eCSSType_ValuePair: {
const nsCSSValuePair* val = ValuePairAtCursor(cursor);
NS_ASSERTION(val->mXValue.GetUnit() != eCSSUnit_Null ||
val->mYValue.GetUnit() != eCSSUnit_Null, "oops");
nsCSSValuePair* target = NS_STATIC_CAST(nsCSSValuePair*, prop);
if (target->mXValue.GetUnit() == eCSSUnit_Null)
target->mXValue = val->mXValue;
if (target->mYValue.GetUnit() == eCSSUnit_Null)
target->mYValue = val->mYValue;
cursor += CDBValuePairStorage_advance;
} break;
case eCSSType_ValueList:
if (iProp == eCSSProperty_content) {
for (nsCSSValueList* l = ValueListAtCursor(cursor);
@@ -246,6 +273,10 @@ nsCSSCompressedDataBlock::MapRuleInfoInto(nsRuleData *aRuleData) const
cursor += CDBRectStorage_advance;
} break;
case eCSSType_ValuePair: {
cursor += CDBValuePairStorage_advance;
} break;
case eCSSType_ValueList:
case eCSSType_CounterData:
case eCSSType_Quotes:
@@ -285,6 +316,9 @@ nsCSSCompressedDataBlock::StorageFor(nsCSSProperty aProperty) const
case eCSSType_Rect: {
return RectAtCursor(cursor);
}
case eCSSType_ValuePair: {
return ValuePairAtCursor(cursor);
}
case eCSSType_ValueList:
case eCSSType_CounterData:
case eCSSType_Quotes:
@@ -302,6 +336,10 @@ nsCSSCompressedDataBlock::StorageFor(nsCSSProperty aProperty) const
cursor += CDBRectStorage_advance;
} break;
case eCSSType_ValuePair: {
cursor += CDBValuePairStorage_advance;
} break;
case eCSSType_ValueList:
case eCSSType_CounterData:
case eCSSType_Quotes:
@@ -352,6 +390,16 @@ nsCSSCompressedDataBlock::Clone() const
result_cursor += CDBRectStorage_advance;
} break;
case eCSSType_ValuePair: {
const nsCSSValuePair* val = ValuePairAtCursor(cursor);
NS_ASSERTION(val->mXValue.GetUnit() != eCSSUnit_Null ||
val->mYValue.GetUnit() != eCSSUnit_Null, "oops");
nsCSSValuePair* result_val = ValuePairAtCursor(result_cursor);
new (result_val) nsCSSValuePair(*val);
cursor += CDBValuePairStorage_advance;
result_cursor += CDBValuePairStorage_advance;
} break;
case eCSSType_ValueList:
case eCSSType_CounterData:
case eCSSType_Quotes:
@@ -421,6 +469,14 @@ nsCSSCompressedDataBlock::Destroy()
cursor += CDBRectStorage_advance;
} break;
case eCSSType_ValuePair: {
const nsCSSValuePair* val = ValuePairAtCursor(cursor);
NS_ASSERTION(val->mXValue.GetUnit() != eCSSUnit_Null ||
val->mYValue.GetUnit() != eCSSUnit_Null, "oops");
val->~nsCSSValuePair();
cursor += CDBValuePairStorage_advance;
} break;
case eCSSType_ValueList: {
nsCSSValueList* val = ValueListAtCursor(cursor);
NS_ASSERTION(val, "oops");
@@ -532,6 +588,14 @@ nsCSSExpandedDataBlock::DoExpand(nsCSSCompressedDataBlock *aBlock,
cursor += CDBRectStorage_advance;
} break;
case eCSSType_ValuePair: {
const nsCSSValuePair* val = ValuePairAtCursor(cursor);
NS_ASSERTION(val->mXValue.GetUnit() != eCSSUnit_Null ||
val->mYValue.GetUnit() != eCSSUnit_Null, "oops");
memcpy(prop, val, sizeof(nsCSSValuePair));
cursor += CDBValuePairStorage_advance;
} break;
case eCSSType_ValueList:
case eCSSType_CounterData:
case eCSSType_Quotes:
@@ -594,6 +658,14 @@ nsCSSExpandedDataBlock::ComputeSize()
}
} break;
case eCSSType_ValuePair: {
nsCSSValuePair* val = NS_STATIC_CAST(nsCSSValuePair*, prop);
if (val->mXValue.GetUnit() != eCSSUnit_Null ||
val->mYValue.GetUnit() != eCSSUnit_Null) {
increment = CDBValuePairStorage_advance;
}
} break;
case eCSSType_ValueList:
case eCSSType_CounterData:
case eCSSType_Quotes:
@@ -692,6 +764,20 @@ nsCSSExpandedDataBlock::Compress(nsCSSCompressedDataBlock **aNormalBlock,
}
} break;
case eCSSType_ValuePair: {
nsCSSValuePair* val = NS_STATIC_CAST(nsCSSValuePair*, prop);
if (val->mXValue.GetUnit() != eCSSUnit_Null ||
val->mYValue.GetUnit() != eCSSUnit_Null) {
CDBValuePairStorage *storage =
NS_REINTERPRET_CAST(CDBValuePairStorage*, cursor);
storage->property = iProp;
memcpy(&storage->value, val, sizeof(nsCSSValuePair));
new (val) nsCSSValuePair();
cursor += CDBValuePairStorage_advance;
present = PR_TRUE;
}
} break;
case eCSSType_ValueList:
case eCSSType_CounterData:
case eCSSType_Quotes:
@@ -769,6 +855,12 @@ nsCSSExpandedDataBlock::ClearProperty(nsCSSProperty aPropID)
val->Reset();
} break;
case eCSSType_ValuePair: {
nsCSSValuePair* val = NS_STATIC_CAST(nsCSSValuePair*, prop);
val->mXValue.Reset();
val->mYValue.Reset();
} break;
case eCSSType_ValueList: {
nsCSSValueList*& val = *NS_STATIC_CAST(nsCSSValueList**, prop);
if (val) {
@@ -837,6 +929,14 @@ nsCSSExpandedDataBlock::DoAssertInitialState()
"not initial state");
} break;
case eCSSType_ValuePair: {
nsCSSValuePair* val = NS_STATIC_CAST(nsCSSValuePair*, prop);
NS_ASSERTION(val->mXValue.GetUnit() == eCSSUnit_Null,
"not initial state");
NS_ASSERTION(val->mYValue.GetUnit() == eCSSUnit_Null,
"not initial state");
} break;
case eCSSType_ValueList: {
nsCSSValueList* val = *NS_STATIC_CAST(nsCSSValueList**, prop);
NS_ASSERTION(val == nsnull, "not initial state");