diff --git a/include/core/SkPoint.h b/include/core/SkPoint.h index a6a8e730c..5eca72f6b 100644 --- a/include/core/SkPoint.h +++ b/include/core/SkPoint.h @@ -504,6 +504,11 @@ struct SK_API SkPoint { fY = -tmp; } } + + /** + * cast-safe way to treat the point as an array of (2) SkScalars. + */ + const SkScalar* asScalars() const { return &fX; } }; typedef SkPoint SkVector; diff --git a/include/core/SkRect.h b/include/core/SkRect.h index e6efed56d..ae0ac4f9e 100644 --- a/include/core/SkRect.h +++ b/include/core/SkRect.h @@ -769,6 +769,11 @@ struct SK_API SkRect { * other. When this returns, left <= right && top <= bottom */ void sort(); + + /** + * cast-safe way to treat the rect as an array of (4) SkScalars. + */ + const SkScalar* asScalars() const { return &fLeft; } }; #endif diff --git a/tests/PointTest.cpp b/tests/PointTest.cpp index de0ae84d7..b8f4398c2 100644 --- a/tests/PointTest.cpp +++ b/tests/PointTest.cpp @@ -8,8 +8,20 @@ // Unit tests for src/core/SkPoint.cpp and its header #include "SkPoint.h" +#include "SkRect.h" #include "Test.h" +static void test_casts(skiatest::Reporter* reporter) { + SkPoint p = { 0, 0 }; + SkRect r = { 0, 0, 0, 0 }; + + const SkScalar* pPtr = SkTCast(&p); + const SkScalar* rPtr = SkTCast(&r); + + REPORTER_ASSERT(reporter, p.asScalars() == pPtr); + REPORTER_ASSERT(reporter, r.asScalars() == rPtr); +} + // Tests that SkPoint::length() and SkPoint::Length() both return // approximately expectedLength for this (x,y). static void test_length(skiatest::Reporter* reporter, SkScalar x, SkScalar y, @@ -37,6 +49,8 @@ static void test_Normalize(skiatest::Reporter* reporter, } static void PointTest(skiatest::Reporter* reporter) { + test_casts(reporter); + test_length(reporter, SkIntToScalar(3), SkIntToScalar(4), SkIntToScalar(5)); test_length(reporter, SkFloatToScalar(0.6f), SkFloatToScalar(0.8f), SK_Scalar1);