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:
parent
c2d35d8513
commit
970fd1fbea
@ -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;
|
||||
|
@ -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"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user