Bug 1110181 - Move mTextOrientation to the nsStyleVisibility struct to avoid potential recursive dependency in nsStyleText. r=dbaron
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -6190,17 +6190,17 @@ nsLayoutUtils::GetTextRunFlagsForStyle(n
result |= gfxTextRunFactory::TEXT_OPTIMIZE_SPEED;
}
break;
default:
break;
}
WritingMode wm(aStyleContext);
if (wm.IsVertical()) {
- switch (aStyleText->mTextOrientation) {
+ switch (aStyleContext->StyleVisibility()->mTextOrientation) {
case NS_STYLE_TEXT_ORIENTATION_MIXED:
result |= gfxTextRunFactory::TEXT_ORIENT_VERTICAL_MIXED;
break;
case NS_STYLE_TEXT_ORIENTATION_UPRIGHT:
result |= gfxTextRunFactory::TEXT_ORIENT_VERTICAL_UPRIGHT;
break;
case NS_STYLE_TEXT_ORIENTATION_SIDEWAYS:
// This should depend on writing mode vertical-lr vs vertical-rl,
--- a/layout/generic/WritingModes.h
+++ b/layout/generic/WritingModes.h
@@ -257,32 +257,32 @@ public:
mWritingMode = 0;
break;
case NS_STYLE_WRITING_MODE_VERTICAL_LR:
{
mWritingMode = eBlockFlowMask |
eLineOrientMask |
eOrientationMask;
- uint8_t textOrientation = aStyleContext->StyleText()->mTextOrientation;
+ uint8_t textOrientation = aStyleContext->StyleVisibility()->mTextOrientation;
#if 0 // not yet implemented
if (textOrientation == NS_STYLE_TEXT_ORIENTATION_SIDEWAYS_LEFT) {
mWritingMode &= ~eLineOrientMask;
}
#endif
if (textOrientation >= NS_STYLE_TEXT_ORIENTATION_SIDEWAYS_RIGHT) {
mWritingMode |= eSidewaysMask;
}
break;
}
case NS_STYLE_WRITING_MODE_VERTICAL_RL:
{
mWritingMode = eOrientationMask;
- uint8_t textOrientation = aStyleContext->StyleText()->mTextOrientation;
+ uint8_t textOrientation = aStyleContext->StyleVisibility()->mTextOrientation;
#if 0 // not yet implemented
if (textOrientation == NS_STYLE_TEXT_ORIENTATION_SIDEWAYS_LEFT) {
mWritingMode |= eLineOrientMask;
}
#endif
if (textOrientation >= NS_STYLE_TEXT_ORIENTATION_SIDEWAYS_RIGHT) {
mWritingMode |= eSidewaysMask;
}
--- a/layout/style/nsCSSPropList.h
+++ b/layout/style/nsCSSPropList.h
@@ -3089,25 +3089,25 @@ CSS_PROP_TEXT(
CSS_PROPERTY_PARSE_VALUE |
CSS_PROPERTY_STORES_CALC |
CSS_PROPERTY_GETCS_NEEDS_LAYOUT_FLUSH,
"",
VARIANT_HLP | VARIANT_CALC,
nullptr,
offsetof(nsStyleText, mTextIndent),
eStyleAnimType_Coord)
-CSS_PROP_TEXT(
+CSS_PROP_VISIBILITY(
text-orientation,
text_orientation,
TextOrientation,
CSS_PROPERTY_PARSE_VALUE,
"layout.css.vertical-text.enabled",
VARIANT_HK,
kTextOrientationKTable,
- offsetof(nsStyleText, mTextOrientation),
+ offsetof(nsStyleVisibility, mTextOrientation),
eStyleAnimType_EnumU8)
CSS_PROP_TEXTRESET(
text-overflow,
text_overflow,
TextOverflow,
CSS_PROPERTY_PARSE_VALUE |
CSS_PROPERTY_VALUE_PARSER_FUNCTION |
CSS_PROPERTY_APPLIES_TO_PLACEHOLDER,
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -3232,17 +3232,17 @@ nsComputedDOMStyle::DoGetTextIndent()
return val;
}
CSSValue*
nsComputedDOMStyle::DoGetTextOrientation()
{
nsROCSSPrimitiveValue* val = new nsROCSSPrimitiveValue;
val->SetIdent(
- nsCSSProps::ValueToKeywordEnum(StyleText()->mTextOrientation,
+ nsCSSProps::ValueToKeywordEnum(StyleVisibility()->mTextOrientation,
nsCSSProps::kTextOrientationKTable));
return val;
}
CSSValue*
nsComputedDOMStyle::DoGetTextOverflow()
{
const nsStyleTextReset *style = StyleTextReset();
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -4372,23 +4372,16 @@ nsRuleNode::ComputeTextData(void* aStart
canStoreInRuleTree,
SETDSC_NONE | SETDSC_AUTO | SETDSC_UNSET_INHERIT,
parentText->mTextSizeAdjust,
NS_STYLE_TEXT_SIZE_ADJUST_AUTO, // initial value
NS_STYLE_TEXT_SIZE_ADJUST_AUTO, // auto value
NS_STYLE_TEXT_SIZE_ADJUST_NONE, // none value
0, 0);
- // text-orientation: enum, inherit, initial
- SetDiscrete(*aRuleData->ValueForTextOrientation(), text->mTextOrientation,
- canStoreInRuleTree,
- SETDSC_ENUMERATED | SETDSC_UNSET_INHERIT,
- parentText->mTextOrientation,
- NS_STYLE_TEXT_ORIENTATION_MIXED, 0, 0, 0, 0);
-
// text-combine-upright: enum, inherit, initial
SetDiscrete(*aRuleData->ValueForTextCombineUpright(),
text->mTextCombineUpright,
canStoreInRuleTree,
SETDSC_ENUMERATED | SETDSC_UNSET_INHERIT,
parentText->mTextCombineUpright,
NS_STYLE_TEXT_COMBINE_UPRIGHT_NONE, 0, 0, 0, 0);
@@ -5843,16 +5836,23 @@ nsRuleNode::ComputeVisibilityData(void*
// writing-mode: enum, inherit, initial
SetDiscrete(*aRuleData->ValueForWritingMode(), visibility->mWritingMode,
canStoreInRuleTree,
SETDSC_ENUMERATED | SETDSC_UNSET_INHERIT,
parentVisibility->mWritingMode,
NS_STYLE_WRITING_MODE_HORIZONTAL_TB, 0, 0, 0, 0);
+ // text-orientation: enum, inherit, initial
+ SetDiscrete(*aRuleData->ValueForTextOrientation(), visibility->mTextOrientation,
+ canStoreInRuleTree,
+ SETDSC_ENUMERATED | SETDSC_UNSET_INHERIT,
+ parentVisibility->mTextOrientation,
+ NS_STYLE_TEXT_ORIENTATION_MIXED, 0, 0, 0, 0);
+
// image-orientation: enum, inherit, initial
const nsCSSValue* orientation = aRuleData->ValueForImageOrientation();
if (orientation->GetUnit() == eCSSUnit_Inherit ||
orientation->GetUnit() == eCSSUnit_Unset) {
canStoreInRuleTree = false;
visibility->mImageOrientation = parentVisibility->mImageOrientation;
} else if (orientation->GetUnit() == eCSSUnit_Initial) {
visibility->mImageOrientation = nsStyleImageOrientation();
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -2875,26 +2875,28 @@ nsStyleVisibility::nsStyleVisibility(nsP
if (GET_BIDI_OPTION_DIRECTION(bidiOptions) == IBMBIDI_TEXTDIRECTION_RTL)
mDirection = NS_STYLE_DIRECTION_RTL;
else
mDirection = NS_STYLE_DIRECTION_LTR;
mVisible = NS_STYLE_VISIBILITY_VISIBLE;
mPointerEvents = NS_STYLE_POINTER_EVENTS_AUTO;
mWritingMode = NS_STYLE_WRITING_MODE_HORIZONTAL_TB;
+ mTextOrientation = NS_STYLE_TEXT_ORIENTATION_MIXED;
}
nsStyleVisibility::nsStyleVisibility(const nsStyleVisibility& aSource)
{
MOZ_COUNT_CTOR(nsStyleVisibility);
mImageOrientation = aSource.mImageOrientation;
mDirection = aSource.mDirection;
mVisible = aSource.mVisible;
mPointerEvents = aSource.mPointerEvents;
mWritingMode = aSource.mWritingMode;
+ mTextOrientation = aSource.mTextOrientation;
}
nsChangeHint nsStyleVisibility::CalcDifference(const nsStyleVisibility& aOther) const
{
nsChangeHint hint = nsChangeHint(0);
if (mDirection != aOther.mDirection || mWritingMode != aOther.mWritingMode) {
NS_UpdateHint(hint, nsChangeHint_ReconstructFrame);
@@ -2906,16 +2908,19 @@ nsChangeHint nsStyleVisibility::CalcDiff
if (mVisible != aOther.mVisible) {
if ((NS_STYLE_VISIBILITY_COLLAPSE == mVisible) ||
(NS_STYLE_VISIBILITY_COLLAPSE == aOther.mVisible)) {
NS_UpdateHint(hint, NS_STYLE_HINT_REFLOW);
} else {
NS_UpdateHint(hint, NS_STYLE_HINT_VISUAL);
}
}
+ if (mTextOrientation != aOther.mTextOrientation) {
+ NS_UpdateHint(hint, NS_STYLE_HINT_REFLOW);
+ }
if (mPointerEvents != aOther.mPointerEvents) {
// nsSVGPathGeometryFrame's mRect depends on stroke _and_ on the value
// of pointer-events. See nsSVGPathGeometryFrame::ReflowSVG's use of
// GetHitTestFlags. (Only a reflow, no visual change.)
NS_UpdateHint(hint, nsChangeHint_NeedReflow);
NS_UpdateHint(hint, nsChangeHint_NeedDirtyReflow); // XXX remove me: bug 876085
}
}
@@ -3335,17 +3340,16 @@ nsStyleText::nsStyleText(void)
mTextAlignTrue = false;
mTextAlignLastTrue = false;
mTextTransform = NS_STYLE_TEXT_TRANSFORM_NONE;
mWhiteSpace = NS_STYLE_WHITESPACE_NORMAL;
mWordBreak = NS_STYLE_WORDBREAK_NORMAL;
mWordWrap = NS_STYLE_WORDWRAP_NORMAL;
mHyphens = NS_STYLE_HYPHENS_MANUAL;
mTextSizeAdjust = NS_STYLE_TEXT_SIZE_ADJUST_AUTO;
- mTextOrientation = NS_STYLE_TEXT_ORIENTATION_MIXED;
mTextCombineUpright = NS_STYLE_TEXT_COMBINE_UPRIGHT_NONE;
mControlCharacterVisibility = NS_STYLE_CONTROL_CHARACTER_VISIBILITY_HIDDEN;
mLetterSpacing.SetNormalValue();
mLineHeight.SetNormalValue();
mTextIndent.SetCoordValue(0);
mWordSpacing = 0;
@@ -3359,17 +3363,16 @@ nsStyleText::nsStyleText(const nsStyleTe
mTextAlignTrue(false),
mTextAlignLastTrue(false),
mTextTransform(aSource.mTextTransform),
mWhiteSpace(aSource.mWhiteSpace),
mWordBreak(aSource.mWordBreak),
mWordWrap(aSource.mWordWrap),
mHyphens(aSource.mHyphens),
mTextSizeAdjust(aSource.mTextSizeAdjust),
- mTextOrientation(aSource.mTextOrientation),
mTextCombineUpright(aSource.mTextCombineUpright),
mControlCharacterVisibility(aSource.mControlCharacterVisibility),
mTabSize(aSource.mTabSize),
mWordSpacing(aSource.mWordSpacing),
mLetterSpacing(aSource.mLetterSpacing),
mLineHeight(aSource.mLineHeight),
mTextIndent(aSource.mTextIndent),
mTextShadow(aSource.mTextShadow)
@@ -3400,17 +3403,16 @@ nsChangeHint nsStyleText::CalcDifference
(mTextAlignTrue != aOther.mTextAlignTrue) ||
(mTextAlignLastTrue != aOther.mTextAlignLastTrue) ||
(mTextTransform != aOther.mTextTransform) ||
(mWhiteSpace != aOther.mWhiteSpace) ||
(mWordBreak != aOther.mWordBreak) ||
(mWordWrap != aOther.mWordWrap) ||
(mHyphens != aOther.mHyphens) ||
(mTextSizeAdjust != aOther.mTextSizeAdjust) ||
- (mTextOrientation != aOther.mTextOrientation) ||
(mLetterSpacing != aOther.mLetterSpacing) ||
(mLineHeight != aOther.mLineHeight) ||
(mTextIndent != aOther.mTextIndent) ||
(mWordSpacing != aOther.mWordSpacing) ||
(mTabSize != aOther.mTabSize))
return NS_STYLE_HINT_REFLOW;
return CalcShadowDifference(mTextShadow, aOther.mTextShadow);
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -1591,17 +1591,16 @@ struct nsStyleText {
bool mTextAlignTrue : 1; // [inherited] see nsStyleConsts.h
bool mTextAlignLastTrue : 1; // [inherited] see nsStyleConsts.h
uint8_t mTextTransform; // [inherited] see nsStyleConsts.h
uint8_t mWhiteSpace; // [inherited] see nsStyleConsts.h
uint8_t mWordBreak; // [inherited] see nsStyleConsts.h
uint8_t mWordWrap; // [inherited] see nsStyleConsts.h
uint8_t mHyphens; // [inherited] see nsStyleConsts.h
uint8_t mTextSizeAdjust; // [inherited] see nsStyleConsts.h
- uint8_t mTextOrientation; // [inherited] see nsStyleConsts.h
uint8_t mTextCombineUpright; // [inherited] see nsStyleConsts.h
uint8_t mControlCharacterVisibility; // [inherited] see nsStyleConsts.h
int32_t mTabSize; // [inherited] see nsStyleConsts.h
nscoord mWordSpacing; // [inherited]
nsStyleCoord mLetterSpacing; // [inherited] coord, normal
nsStyleCoord mLineHeight; // [inherited] coord, factor, normal
nsStyleCoord mTextIndent; // [inherited] coord, percent, calc
@@ -1775,16 +1774,17 @@ struct nsStyleVisibility {
nsChangeHint_ClearAncestorIntrinsics);
}
nsStyleImageOrientation mImageOrientation; // [inherited]
uint8_t mDirection; // [inherited] see nsStyleConsts.h NS_STYLE_DIRECTION_*
uint8_t mVisible; // [inherited]
uint8_t mPointerEvents; // [inherited] see nsStyleConsts.h
uint8_t mWritingMode; // [inherited] see nsStyleConsts.h
+ uint8_t mTextOrientation; // [inherited] see nsStyleConsts.h
bool IsVisible() const {
return (mVisible == NS_STYLE_VISIBILITY_VISIBLE);
}
bool IsVisibleOrCollapsed() const {
return ((mVisible == NS_STYLE_VISIBILITY_VISIBLE) ||
(mVisible == NS_STYLE_VISIBILITY_COLLAPSE));