зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1361550 - Make font-size: larger/smaller a simple ratio; add stylo support; r=dbaron
MozReview-Commit-ID: DMmFc2i2OIA
This commit is contained in:
Родитель
a91c462cd7
Коммит
31d5d4a29e
|
@ -3234,141 +3234,6 @@ nsRuleNode::CalcFontPointSize(int32_t aHTMLSize, int32_t aBasePointSize,
|
|||
return (nscoord)1;
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/* static */ nscoord
|
||||
nsRuleNode::FindNextSmallerFontSize(nscoord aFontSize, int32_t aBasePointSize,
|
||||
nsPresContext* aPresContext,
|
||||
nsFontSizeType aFontSizeType)
|
||||
{
|
||||
int32_t index;
|
||||
int32_t indexMin;
|
||||
int32_t indexMax;
|
||||
float relativePosition;
|
||||
nscoord smallerSize;
|
||||
nscoord indexFontSize = aFontSize; // XXX initialize to quell a spurious gcc3.2 warning
|
||||
nscoord smallestIndexFontSize;
|
||||
nscoord largestIndexFontSize;
|
||||
nscoord smallerIndexFontSize;
|
||||
nscoord largerIndexFontSize;
|
||||
|
||||
nscoord onePx = nsPresContext::CSSPixelsToAppUnits(1);
|
||||
|
||||
if (aFontSizeType == eFontSize_HTML) {
|
||||
indexMin = 1;
|
||||
indexMax = 7;
|
||||
} else {
|
||||
indexMin = 0;
|
||||
indexMax = 6;
|
||||
}
|
||||
|
||||
smallestIndexFontSize = CalcFontPointSize(indexMin, aBasePointSize, aPresContext, aFontSizeType);
|
||||
largestIndexFontSize = CalcFontPointSize(indexMax, aBasePointSize, aPresContext, aFontSizeType);
|
||||
if (aFontSize > smallestIndexFontSize) {
|
||||
if (aFontSize < NSToCoordRound(float(largestIndexFontSize) * 1.5)) { // smaller will be in HTML table
|
||||
// find largest index smaller than current
|
||||
for (index = indexMax; index >= indexMin; index--) {
|
||||
indexFontSize = CalcFontPointSize(index, aBasePointSize, aPresContext, aFontSizeType);
|
||||
if (indexFontSize < aFontSize)
|
||||
break;
|
||||
}
|
||||
// set up points beyond table for interpolation purposes
|
||||
if (indexFontSize == smallestIndexFontSize) {
|
||||
smallerIndexFontSize = indexFontSize - onePx;
|
||||
largerIndexFontSize = CalcFontPointSize(index+1, aBasePointSize, aPresContext, aFontSizeType);
|
||||
} else if (indexFontSize == largestIndexFontSize) {
|
||||
smallerIndexFontSize = CalcFontPointSize(index-1, aBasePointSize, aPresContext, aFontSizeType);
|
||||
largerIndexFontSize = NSToCoordRound(float(largestIndexFontSize) * 1.5);
|
||||
} else {
|
||||
smallerIndexFontSize = CalcFontPointSize(index-1, aBasePointSize, aPresContext, aFontSizeType);
|
||||
largerIndexFontSize = CalcFontPointSize(index+1, aBasePointSize, aPresContext, aFontSizeType);
|
||||
}
|
||||
// compute the relative position of the parent size between the two closest indexed sizes
|
||||
relativePosition = float(aFontSize - indexFontSize) / float(largerIndexFontSize - indexFontSize);
|
||||
// set the new size to have the same relative position between the next smallest two indexed sizes
|
||||
smallerSize = smallerIndexFontSize + NSToCoordRound(relativePosition * (indexFontSize - smallerIndexFontSize));
|
||||
}
|
||||
else { // larger than HTML table, drop by 33%
|
||||
smallerSize = NSToCoordRound(float(aFontSize) / 1.5);
|
||||
}
|
||||
}
|
||||
else { // smaller than HTML table, drop by 1px
|
||||
smallerSize = std::max(aFontSize - onePx, onePx);
|
||||
}
|
||||
return smallerSize;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/* static */ nscoord
|
||||
nsRuleNode::FindNextLargerFontSize(nscoord aFontSize, int32_t aBasePointSize,
|
||||
nsPresContext* aPresContext,
|
||||
nsFontSizeType aFontSizeType)
|
||||
{
|
||||
int32_t index;
|
||||
int32_t indexMin;
|
||||
int32_t indexMax;
|
||||
float relativePosition;
|
||||
nscoord adjustment;
|
||||
nscoord largerSize;
|
||||
nscoord indexFontSize = aFontSize; // XXX initialize to quell a spurious gcc3.2 warning
|
||||
nscoord smallestIndexFontSize;
|
||||
nscoord largestIndexFontSize;
|
||||
nscoord smallerIndexFontSize;
|
||||
nscoord largerIndexFontSize;
|
||||
|
||||
nscoord onePx = nsPresContext::CSSPixelsToAppUnits(1);
|
||||
|
||||
if (aFontSizeType == eFontSize_HTML) {
|
||||
indexMin = 1;
|
||||
indexMax = 7;
|
||||
} else {
|
||||
indexMin = 0;
|
||||
indexMax = 6;
|
||||
}
|
||||
|
||||
smallestIndexFontSize = CalcFontPointSize(indexMin, aBasePointSize, aPresContext, aFontSizeType);
|
||||
largestIndexFontSize = CalcFontPointSize(indexMax, aBasePointSize, aPresContext, aFontSizeType);
|
||||
if (aFontSize > (smallestIndexFontSize - onePx)) {
|
||||
if (aFontSize < largestIndexFontSize) { // larger will be in HTML table
|
||||
// find smallest index larger than current
|
||||
for (index = indexMin; index <= indexMax; index++) {
|
||||
indexFontSize = CalcFontPointSize(index, aBasePointSize, aPresContext, aFontSizeType);
|
||||
if (indexFontSize > aFontSize)
|
||||
break;
|
||||
}
|
||||
// set up points beyond table for interpolation purposes
|
||||
if (indexFontSize == smallestIndexFontSize) {
|
||||
smallerIndexFontSize = indexFontSize - onePx;
|
||||
largerIndexFontSize = CalcFontPointSize(index+1, aBasePointSize, aPresContext, aFontSizeType);
|
||||
} else if (indexFontSize == largestIndexFontSize) {
|
||||
smallerIndexFontSize = CalcFontPointSize(index-1, aBasePointSize, aPresContext, aFontSizeType);
|
||||
largerIndexFontSize = NSCoordSaturatingMultiply(largestIndexFontSize, 1.5);
|
||||
} else {
|
||||
smallerIndexFontSize = CalcFontPointSize(index-1, aBasePointSize, aPresContext, aFontSizeType);
|
||||
largerIndexFontSize = CalcFontPointSize(index+1, aBasePointSize, aPresContext, aFontSizeType);
|
||||
}
|
||||
// compute the relative position of the parent size between the two closest indexed sizes
|
||||
relativePosition = float(aFontSize - smallerIndexFontSize) / float(indexFontSize - smallerIndexFontSize);
|
||||
// set the new size to have the same relative position between the next largest two indexed sizes
|
||||
adjustment = NSCoordSaturatingNonnegativeMultiply(largerIndexFontSize - indexFontSize, relativePosition);
|
||||
largerSize = NSCoordSaturatingAdd(indexFontSize, adjustment);
|
||||
}
|
||||
else { // larger than HTML table, increase by 50%
|
||||
largerSize = NSCoordSaturatingMultiply(aFontSize, 1.5);
|
||||
}
|
||||
}
|
||||
else { // smaller than HTML table, increase by 1px
|
||||
largerSize = NSCoordSaturatingAdd(aFontSize, onePx);
|
||||
}
|
||||
return largerSize;
|
||||
}
|
||||
|
||||
struct SetFontSizeCalcOps : public css::BasicCoordCalcOps,
|
||||
public css::FloatCoeffsAlreadyNormalizedOps
|
||||
{
|
||||
|
@ -3477,20 +3342,10 @@ nsRuleNode::SetFontSize(nsPresContext* aPresContext,
|
|||
parentSize = nsStyleFont::UnZoomText(aPresContext, parentSize);
|
||||
}
|
||||
|
||||
if (NS_STYLE_FONT_SIZE_LARGER == value) {
|
||||
*aSize = FindNextLargerFontSize(parentSize,
|
||||
baseSize, aPresContext, eFontSize_CSS);
|
||||
float factor = (NS_STYLE_FONT_SIZE_LARGER == value) ? 1.2f : (1.0f / 1.2f);
|
||||
|
||||
*aSize = parentSize * factor;
|
||||
|
||||
NS_ASSERTION(*aSize >= parentSize,
|
||||
"FindNextLargerFontSize failed");
|
||||
}
|
||||
else {
|
||||
*aSize = FindNextSmallerFontSize(parentSize,
|
||||
baseSize, aPresContext, eFontSize_CSS);
|
||||
NS_ASSERTION(*aSize < parentSize ||
|
||||
parentSize <= nsPresContext::CSSPixelsToAppUnits(1),
|
||||
"FindNextSmallerFontSize failed");
|
||||
}
|
||||
} else {
|
||||
NS_NOTREACHED("unexpected value");
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче