Use ARM fixes for SDF encoding.

This pulls out the encoding fixes by Joel Liang from
https://codereview.chromium.org/1643143002/
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1726763002

Review URL: https://codereview.chromium.org/1726763002
This commit is contained in:
jvanverth 2016-02-24 08:33:10 -08:00 committed by Commit bot
parent c2d35d8513
commit 970fd1fbea
2 changed files with 20 additions and 13 deletions

View File

@ -316,14 +316,20 @@ static void B2(DFData* curr, int width) {
#define DUMP_EDGE 0
#if !DUMP_EDGE
static unsigned char pack_distance_field_val(float dist, float distanceMagnitude) {
if (dist <= -distanceMagnitude) {
return 255;
} else if (dist > distanceMagnitude) {
return 0;
} else {
return (unsigned char)((distanceMagnitude-dist)*128.0f/distanceMagnitude);
}
template <int distanceMagnitude>
static unsigned char pack_distance_field_val(float dist) {
// The distance field is constructed as unsigned char values, so that the zero value is at 128,
// Beside 128, we have 128 values in range [0, 128), but only 127 values in range (128, 255].
// So we multiply distanceMagnitude by 127/128 at the latter range to avoid overflow.
dist = SkScalarPin(-dist, -distanceMagnitude, distanceMagnitude * 127.0f / 128.0f);
// Scale into the positive range for unsigned distance.
dist += distanceMagnitude;
// Scale into unsigned char range.
// Round to place negative and positive values as equally as possible around 128
// (which represents zero).
return (unsigned char)SkScalarRoundToInt(dist / (2 * distanceMagnitude) * 256.0f);
}
#endif
@ -441,7 +447,7 @@ static bool generate_distance_field_from_image(unsigned char* distanceField,
} else {
dist = SkScalarSqrt(currData->fDistSq);
}
*dfPtr++ = pack_distance_field_val(dist, (float)SK_DistanceFieldMagnitude);
*dfPtr++ = pack_distance_field_val<SK_DistanceFieldMagnitude>(dist);
#endif
++currData;
++currEdge;

View File

@ -10,7 +10,7 @@
#include "SkTypes.h"
// the max magnitude for the distance field
// distance values are limited to the range [-SK_DistanceFieldMagnitude, SK_DistanceFieldMagnitude)
// distance values are limited to the range (-SK_DistanceFieldMagnitude, SK_DistanceFieldMagnitude]
#define SK_DistanceFieldMagnitude 4
// we need to pad around the original glyph to allow our maximum distance of
// SK_DistanceFieldMagnitude texels away from any edge
@ -18,9 +18,10 @@
// the rect we render with is inset from the distance field glyph size to allow for bilerp
#define SK_DistanceFieldInset 2
// for the fragment shader
// The distance field is constructed as unsigned char values, so that the zero value is at 128,
// and the range is [-4, 4 - 1/255). Hence our multiplier is 8 - 1/32 and zero threshold is 128/255.
// For the fragment shader:
// The distance field is constructed as unsigned char values,
// so that the zero value is at 128, and the supported range of distances is [-4 * 127/128, 4].
// Hence our multiplier (width of the range) is 4 * 255/128 and zero threshold is 128/255.
#define SK_DistanceFieldMultiplier "7.96875"
#define SK_DistanceFieldThreshold "0.50196078431"