Check bounds before casting float to integer in SamplePatch.cpp and SkBlurMaskFilter...
authorbenjaminwagner <benjaminwagner@google.com>
Tue, 1 Mar 2016 21:44:10 +0000 (13:44 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 1 Mar 2016 21:44:10 +0000 (13:44 -0800)
BUG=skia:4632
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1693013002

Review URL: https://codereview.chromium.org/1693013002

samplecode/SamplePatch.cpp
src/effects/SkEmbossMaskFilter.cpp

index 92bb17c..5347b01 100644 (file)
@@ -109,20 +109,8 @@ static void eval_sheet(const SkPoint edge[], int nu, int nv, int iu, int iv,
     pt->set(x, y);
 }
 
-static int ScalarTo255(SkScalar v) {
-    int scale = SkScalarToFixed(v) >> 8;
-    if (scale < 0) {
-        scale = 0;
-    } else if (scale > 255) {
-        scale = 255;
-    }
-    return scale;
-}
-
 static SkColor make_color(SkScalar s, SkScalar t) {
-    int cs = ScalarTo255(s);
-    int ct = ScalarTo255(t);
-    return SkColorSetARGB(0xFF, cs, 0, 0) + SkColorSetARGB(0, 0, ct, 0);
+    return SkColorSetARGB(0xFF, SkUnitScalarClampToByte(s), SkUnitScalarClampToByte(t), 0);
 }
 
 void Patch::draw(SkCanvas* canvas, const SkPaint& paint, int nu, int nv,
index 64afa49..aacc191 100644 (file)
@@ -17,15 +17,6 @@ SkMaskFilter* SkEmbossMaskFilter::Create(SkScalar blurSigma, const Light& light)
     return new SkEmbossMaskFilter(blurSigma, light);
 }
 
-static inline int pin2byte(int n) {
-    if (n < 0) {
-        n = 0;
-    } else if (n > 0xFF) {
-        n = 0xFF;
-    }
-    return n;
-}
-
 SkMaskFilter* SkBlurMaskFilter::CreateEmboss(const SkScalar direction[3],
                                              SkScalar ambient, SkScalar specular,
                                              SkScalar blurRadius) {
@@ -39,17 +30,14 @@ SkMaskFilter* SkBlurMaskFilter::CreateEmboss(SkScalar blurSigma, const SkScalar
         return nullptr;
     }
 
-    // ambient should be 0...1 as a scalar
-    int am = pin2byte(SkScalarToFixed(ambient) >> 8);
-
-    // specular should be 0..15.99 as a scalar
-    int sp = pin2byte(SkScalarToFixed(specular) >> 12);
-
     SkEmbossMaskFilter::Light   light;
 
     memcpy(light.fDirection, direction, sizeof(light.fDirection));
-    light.fAmbient = SkToU8(am);
-    light.fSpecular = SkToU8(sp);
+    // ambient should be 0...1 as a scalar
+    light.fAmbient = SkUnitScalarClampToByte(ambient);
+    // specular should be 0..15.99 as a scalar
+    static const SkScalar kSpecularMultiplier = SkIntToScalar(255) / 16;
+    light.fSpecular = static_cast<U8CPU>(SkScalarPin(specular, 0, 16) * kSpecularMultiplier + 0.5);
 
     return SkEmbossMaskFilter::Create(blurSigma, light);
 }