1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2016 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h"
8cb93a386Sopenharmony_ci#include "tests/PathOpsExtendedTest.h"
9cb93a386Sopenharmony_ci#include "tests/PathOpsThreadedCommon.h"
10cb93a386Sopenharmony_ci#include <atomic>
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ci#define TEST(name) { name, #name }
13cb93a386Sopenharmony_ci
14cb93a386Sopenharmony_cistatic std::atomic<int> gTestNo{0};
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_cistatic void chalkboard(skiatest::Reporter* reporter, uint64_t testlines) {
17cb93a386Sopenharmony_ci    SkPath path;
18cb93a386Sopenharmony_ciuint64_t i = 0;
19cb93a386Sopenharmony_cipath.moveTo(SkBits2Float(0x4470eed9), SkBits2Float(0x439c1ac1));  // 963.732f, 312.209f
20cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x4470dde3), SkBits2Float(0x439c63d8));  // 963.467f, 312.78f
21cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x4470dbd7), SkBits2Float(0x439c3e57), SkBits2Float(0x4470c893), SkBits2Float(0x439c69fd), SkBits2Float(0x4470cfcf), SkBits2Float(0x439c297a));  // 963.435f, 312.487f, 963.134f, 312.828f, 963.247f, 312.324f
22cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x4470c46b), SkBits2Float(0x439c8149), SkBits2Float(0x4470b137), SkBits2Float(0x439c2938), SkBits2Float(0x4470b5f4), SkBits2Float(0x439ca99b));  // 963.069f, 313.01f, 962.769f, 312.322f, 962.843f, 313.325f
23cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x4470e842), SkBits2Float(0x439c8335), SkBits2Float(0x447125a2), SkBits2Float(0x439cce78), SkBits2Float(0x44715a2d), SkBits2Float(0x439c61ed));  // 963.629f, 313.025f, 964.588f, 313.613f, 965.409f, 312.765f
24cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x447150d5), SkBits2Float(0x439c945c));  // 965.263f, 313.159f
25cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x4471546b), SkBits2Float(0x439c87f2), SkBits2Float(0x4471579e), SkBits2Float(0x439c8085), SkBits2Float(0x44715a8f), SkBits2Float(0x439c7c4c));  // 965.319f, 313.062f, 965.369f, 313.004f, 965.415f, 312.971f
26cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44715cbc), SkBits2Float(0x439c79dd));  // 965.449f, 312.952f
27cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44715dd3), SkBits2Float(0x439c7918));  // 965.466f, 312.946f
28cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44715e56), SkBits2Float(0x439c78d6));  // 965.474f, 312.944f
29cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44715e77), SkBits2Float(0x439c78b5));  // 965.476f, 312.943f
30cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44715e77), SkBits2Float(0x439c78b5));  // 965.476f, 312.943f
31cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44715e87), SkBits2Float(0x439c78b5));  // 965.477f, 312.943f
32cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x4471a50e), SkBits2Float(0x439d05c3), SkBits2Float(0x4470fe77), SkBits2Float(0x439bb894), SkBits2Float(0x44710f9e), SkBits2Float(0x439bdb03));  // 966.579f, 314.045f, 963.976f, 311.442f, 964.244f, 311.711f
33cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44710fae), SkBits2Float(0x439bdb24));  // 964.245f, 311.712f
34cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44710fbe), SkBits2Float(0x439bdba7));  // 964.246f, 311.716f
35cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44710fce), SkBits2Float(0x439be397));  // 964.247f, 311.778f
36cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44710eb7), SkBits2Float(0x439bedf5), SkBits2Float(0x44710978), SkBits2Float(0x439bf74d), SkBits2Float(0x447105e2), SkBits2Float(0x439c0064));  // 964.23f, 311.859f, 964.148f, 311.932f, 964.092f, 312.003f
37cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x4470fe86), SkBits2Float(0x439c1270), SkBits2Float(0x4470fd4f), SkBits2Float(0x439c2250), SkBits2Float(0x44712fde), SkBits2Float(0x439c33d9));  // 963.977f, 312.144f, 963.958f, 312.268f, 964.748f, 312.405f
38cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x4470fc48), SkBits2Float(0x439c3271));  // 963.942f, 312.394f
39cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x4470ee13), SkBits2Float(0x439c4c2b), SkBits2Float(0x4471476b), SkBits2Float(0x439c5c0b), SkBits2Float(0x44711177), SkBits2Float(0x439c7a40));  // 963.72f, 312.595f, 965.116f, 312.719f, 964.273f, 312.955f
40cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44712685), SkBits2Float(0x439c7648));  // 964.602f, 312.924f
41cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x447126a6), SkBits2Float(0x439c7d31), SkBits2Float(0x44711d2d), SkBits2Float(0x439c8085), SkBits2Float(0x44711d1d), SkBits2Float(0x439c8790));  // 964.604f, 312.978f, 964.456f, 313.004f, 964.455f, 313.059f
42cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44712675), SkBits2Float(0x439c843c));  // 964.601f, 313.033f
43cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44713bd5), SkBits2Float(0x439c94e0), SkBits2Float(0x44713956), SkBits2Float(0x439ca065), SkBits2Float(0x44712b63), SkBits2Float(0x439cb357));  // 964.935f, 313.163f, 964.896f, 313.253f, 964.678f, 313.401f
44cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44711af0), SkBits2Float(0x439cb5a5), SkBits2Float(0x44712459), SkBits2Float(0x439cab47), SkBits2Float(0x44711fad), SkBits2Float(0x439ca607));  // 964.421f, 313.419f, 964.568f, 313.338f, 964.495f, 313.297f
45cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44710f1a), SkBits2Float(0x439caf3e), SkBits2Float(0x4471325d), SkBits2Float(0x439cbb26), SkBits2Float(0x4471326e), SkBits2Float(0x439cc93a));  // 964.236f, 313.369f, 964.787f, 313.462f, 964.788f, 313.572f
46cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44712428), SkBits2Float(0x439cd501), SkBits2Float(0x44711ad0), SkBits2Float(0x439cca82), SkBits2Float(0x447113b6), SkBits2Float(0x439cc95b));  // 964.565f, 313.664f, 964.419f, 313.582f, 964.308f, 313.573f
47cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44712b95), SkBits2Float(0x439cf20f), SkBits2Float(0x4470f550), SkBits2Float(0x439d0790), SkBits2Float(0x4471426e), SkBits2Float(0x439d21ce));  // 964.681f, 313.891f, 963.833f, 314.059f, 965.038f, 314.264f
48cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44715072), SkBits2Float(0x439d241c), SkBits2Float(0x44715c6a), SkBits2Float(0x439d15a5), SkBits2Float(0x44716364), SkBits2Float(0x439d24c0));  // 965.257f, 314.282f, 965.444f, 314.169f, 965.553f, 314.287f
49cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44717b22), SkBits2Float(0x439d0791), SkBits2Float(0x44715cbc), SkBits2Float(0x439cf231), SkBits2Float(0x4471475c), SkBits2Float(0x439cda20));  // 965.924f, 314.059f, 965.449f, 313.892f, 965.115f, 313.704f
50cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x4471477d), SkBits2Float(0x439ce12a));  // 965.117f, 313.759f
51cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x4470fc4a), SkBits2Float(0x439cd14b), SkBits2Float(0x44715810), SkBits2Float(0x439cd0e8), SkBits2Float(0x4471372b), SkBits2Float(0x439cb272));  // 963.942f, 313.635f, 965.376f, 313.632f, 964.862f, 313.394f
52cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x447155b2), SkBits2Float(0x439cb91a), SkBits2Float(0x44715581), SkBits2Float(0x439cc72e), SkBits2Float(0x447165f4), SkBits2Float(0x439ccbeb));  // 965.339f, 313.446f, 965.336f, 313.556f, 965.593f, 313.593f
53cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44719e77), SkBits2Float(0x439ca2b4), SkBits2Float(0x44713979), SkBits2Float(0x439c993b), SkBits2Float(0x4471821d), SkBits2Float(0x439c7b47));  // 966.476f, 313.271f, 964.898f, 313.197f, 966.033f, 312.963f
54cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x4471847b), SkBits2Float(0x439c7dd6));  // 966.07f, 312.983f
55cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44718b96), SkBits2Float(0x439c77b1), SkBits2Float(0x44717d81), SkBits2Float(0x439c6ebb), SkBits2Float(0x44717667), SkBits2Float(0x439c66ab));  // 966.181f, 312.935f, 965.961f, 312.865f, 965.85f, 312.802f
56cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44716cff), SkBits2Float(0x439c6a41), SkBits2Float(0x44716842), SkBits2Float(0x439c7315), SkBits2Float(0x44716159), SkBits2Float(0x439c793a));  // 965.703f, 312.83f, 965.629f, 312.899f, 965.521f, 312.947f
57cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44715a0d), SkBits2Float(0x439c712a), SkBits2Float(0x44713938), SkBits2Float(0x439c6f3e), SkBits2Float(0x44712b34), SkBits2Float(0x439c6d73));  // 965.407f, 312.884f, 964.894f, 312.869f, 964.675f, 312.855f
58cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44714c19), SkBits2Float(0x439c614a), SkBits2Float(0x44711af2), SkBits2Float(0x439c61ee), SkBits2Float(0x44712b34), SkBits2Float(0x439c518c));  // 965.189f, 312.76f, 964.421f, 312.765f, 964.675f, 312.637f
59cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x447149ab), SkBits2Float(0x439c499c), SkBits2Float(0x4471474d), SkBits2Float(0x439c5c0b), SkBits2Float(0x447157d0), SkBits2Float(0x439c6065));  // 965.151f, 312.575f, 965.114f, 312.719f, 965.372f, 312.753f
60cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x447142b1), SkBits2Float(0x439c4fa0));  // 965.042f, 312.622f
61cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44714053), SkBits2Float(0x439c3f1d), SkBits2Float(0x44716396), SkBits2Float(0x439c3c6d), SkBits2Float(0x447173f9), SkBits2Float(0x439c3292));  // 965.005f, 312.493f, 965.556f, 312.472f, 965.812f, 312.395f
62cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44715c7c), SkBits2Float(0x439c2628), SkBits2Float(0x44716397), SkBits2Float(0x439c3c4c), SkBits2Float(0x447142b1), SkBits2Float(0x439c3398));  // 965.445f, 312.298f, 965.556f, 312.471f, 965.042f, 312.403f
63cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44715572), SkBits2Float(0x439c2919), SkBits2Float(0x44715bd8), SkBits2Float(0x439c10a6), SkBits2Float(0x447159bb), SkBits2Float(0x439bf68a));  // 965.335f, 312.321f, 965.435f, 312.13f, 965.402f, 311.926f
64cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44715698), SkBits2Float(0x439be2f4));  // 965.353f, 311.773f
65cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x447153f8), SkBits2Float(0x439bd95a));  // 965.312f, 311.698f
66cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x4471526f), SkBits2Float(0x439bd49e));  // 965.288f, 311.661f
67cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x4471524e), SkBits2Float(0x439bd45c));  // 965.286f, 311.659f
68cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x4471523e), SkBits2Float(0x439bd41a));  // 965.285f, 311.657f
69cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44717148), SkBits2Float(0x439c124f), SkBits2Float(0x44715ae2), SkBits2Float(0x439be562), SkBits2Float(0x447161cb), SkBits2Float(0x439bf335));  // 965.77f, 312.143f, 965.42f, 311.792f, 965.528f, 311.9f
70cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x447161bb), SkBits2Float(0x439bf356));  // 965.527f, 311.901f
71cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x447161bb), SkBits2Float(0x439bf356));  // 965.527f, 311.901f
72cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44716169), SkBits2Float(0x439bf3b8));  // 965.522f, 311.904f
73cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x447160c5), SkBits2Float(0x439bf47d));  // 965.512f, 311.91f
74cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44715f7d), SkBits2Float(0x439bf627));  // 965.492f, 311.923f
75cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x447158f6), SkBits2Float(0x439bfeba), SkBits2Float(0x447152e1), SkBits2Float(0x439c0ac3), SkBits2Float(0x44714e15), SkBits2Float(0x439c1919));  // 965.39f, 311.99f, 965.295f, 312.084f, 965.22f, 312.196f
76cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x4471548c), SkBits2Float(0x439c10c7), SkBits2Float(0x447151bb), SkBits2Float(0x439bd7f2), SkBits2Float(0x44715927), SkBits2Float(0x439be271));  // 965.321f, 312.131f, 965.277f, 311.687f, 965.393f, 311.769f
77cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x447156b8), SkBits2Float(0x439bd41b), SkBits2Float(0x44714c19), SkBits2Float(0x439bf356), SkBits2Float(0x44714b13), SkBits2Float(0x439c222f));  // 965.355f, 311.657f, 965.189f, 311.901f, 965.173f, 312.267f
78cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44713dd4), SkBits2Float(0x439c4aa2), SkBits2Float(0x44712ea9), SkBits2Float(0x439c2be9), SkBits2Float(0x44712344), SkBits2Float(0x439c0085));  // 964.966f, 312.583f, 964.729f, 312.343f, 964.551f, 312.004f
79cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x44712605), SkBits2Float(0x439c2fa0));  // 964.594f, 312.372f
80cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x44711af3), SkBits2Float(0x439c7e9a), SkBits2Float(0x44710de4), SkBits2Float(0x439bf41b), SkBits2Float(0x4470fb65), SkBits2Float(0x439c20c7));  // 964.421f, 312.989f, 964.217f, 311.907f, 963.928f, 312.256f
81cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x4470fbb7), SkBits2Float(0x439c220f));  // 963.933f, 312.266f
82cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x4470f5e4), SkBits2Float(0x439c2bc9), SkBits2Float(0x4470ef5d), SkBits2Float(0x439c9e59), SkBits2Float(0x4470e50f), SkBits2Float(0x439c85e6));  // 963.842f, 312.342f, 963.74f, 313.237f, 963.579f, 313.046f
83cb93a386Sopenharmony_ciif (testlines & (1LL << i++)) path.cubicTo(SkBits2Float(0x4470e8f6), SkBits2Float(0x439c4e35), SkBits2Float(0x4470ee98), SkBits2Float(0x439c5333), SkBits2Float(0x4470eed9), SkBits2Float(0x439c1ac1));  // 963.64f, 312.611f, 963.728f, 312.65f, 963.732f, 312.209f
84cb93a386Sopenharmony_ciSkASSERT(64 == i);
85cb93a386Sopenharmony_cipath.close();
86cb93a386Sopenharmony_ciSkString testName;
87cb93a386Sopenharmony_citestName.printf("chalkboard%d", ++gTestNo);
88cb93a386Sopenharmony_citestSimplify(reporter, path, testName.c_str());
89cb93a386Sopenharmony_ci}
90cb93a386Sopenharmony_ci
91cb93a386Sopenharmony_cistatic void testChalkboard(PathOpsThreadState* data) {
92cb93a386Sopenharmony_ci    uint64_t testlines = ((uint64_t) data->fB << 32) | (unsigned int) data->fA;
93cb93a386Sopenharmony_ci    chalkboard(data->fReporter, testlines);
94cb93a386Sopenharmony_ci}
95cb93a386Sopenharmony_ci
96cb93a386Sopenharmony_cistatic void chalkboard_threaded(skiatest::Reporter* reporter, const char* filename) {
97cb93a386Sopenharmony_ci#if DEBUG_UNDER_DEVELOPMENT
98cb93a386Sopenharmony_ci    return;
99cb93a386Sopenharmony_ci#endif
100cb93a386Sopenharmony_ci    initializeTests(reporter, "chalkboard");
101cb93a386Sopenharmony_ci    PathOpsThreadedTestRunner testRunner(reporter);
102cb93a386Sopenharmony_ci    SkRandom r;
103cb93a386Sopenharmony_ci    for (int samples = 0; samples <= 64; ++samples) {
104cb93a386Sopenharmony_ci        int testCount;
105cb93a386Sopenharmony_ci        int bitCount = samples < 32 ? samples : 64 - samples;
106cb93a386Sopenharmony_ci        int index1 = 63;
107cb93a386Sopenharmony_ci        int index2 = 62;
108cb93a386Sopenharmony_ci        switch (bitCount) {
109cb93a386Sopenharmony_ci            case 0:
110cb93a386Sopenharmony_ci                testCount = 1;
111cb93a386Sopenharmony_ci                break;
112cb93a386Sopenharmony_ci            case 1:
113cb93a386Sopenharmony_ci                testCount = 64;
114cb93a386Sopenharmony_ci                break;
115cb93a386Sopenharmony_ci            case 2:
116cb93a386Sopenharmony_ci                testCount = reporter->allowExtendedTest() ? 63 * 62 / 2 : 100;
117cb93a386Sopenharmony_ci                break;
118cb93a386Sopenharmony_ci            default:
119cb93a386Sopenharmony_ci                testCount = reporter->allowExtendedTest() ? 10000 : 100;
120cb93a386Sopenharmony_ci                break;
121cb93a386Sopenharmony_ci        }
122cb93a386Sopenharmony_ci        for (int test = 0; test < testCount; ++test) {
123cb93a386Sopenharmony_ci            uint64_t testlines;
124cb93a386Sopenharmony_ci            switch (bitCount) {
125cb93a386Sopenharmony_ci                case 0:
126cb93a386Sopenharmony_ci                    testlines = 0;
127cb93a386Sopenharmony_ci                    break;
128cb93a386Sopenharmony_ci                case 1:
129cb93a386Sopenharmony_ci                    testlines = 1LL << test;
130cb93a386Sopenharmony_ci                    break;
131cb93a386Sopenharmony_ci                case 2:
132cb93a386Sopenharmony_ci                    if (reporter->allowExtendedTest()) {
133cb93a386Sopenharmony_ci                        SkASSERT(index1 >= 1);
134cb93a386Sopenharmony_ci                        SkASSERT(index2 >= 0);
135cb93a386Sopenharmony_ci                        testlines = 1LL << index1;
136cb93a386Sopenharmony_ci                        testlines |= 1LL << index2;
137cb93a386Sopenharmony_ci                        if (--index2 < 0) {
138cb93a386Sopenharmony_ci                            --index1;
139cb93a386Sopenharmony_ci                            index2 = index1 - 1;
140cb93a386Sopenharmony_ci                        }
141cb93a386Sopenharmony_ci                        break;
142cb93a386Sopenharmony_ci                    }
143cb93a386Sopenharmony_ci                    [[fallthrough]];
144cb93a386Sopenharmony_ci                default:
145cb93a386Sopenharmony_ci                    testlines = 0;
146cb93a386Sopenharmony_ci                    for (int i = 0; i < bitCount; ++i) {
147cb93a386Sopenharmony_ci                        int bit;
148cb93a386Sopenharmony_ci                        do {
149cb93a386Sopenharmony_ci                            bit = r.nextRangeU(0, 63);
150cb93a386Sopenharmony_ci                        } while (testlines & (1LL << bit));
151cb93a386Sopenharmony_ci                        testlines |= 1LL << bit;
152cb93a386Sopenharmony_ci                    }
153cb93a386Sopenharmony_ci            }
154cb93a386Sopenharmony_ci            if (samples >= 32) {
155cb93a386Sopenharmony_ci                testlines ^= 0xFFFFFFFFFFFFFFFFLL;
156cb93a386Sopenharmony_ci            }
157cb93a386Sopenharmony_ci            *testRunner.fRunnables.append() =
158cb93a386Sopenharmony_ci                    new PathOpsThreadedRunnable(&testChalkboard,
159cb93a386Sopenharmony_ci                                                (int) (unsigned) (testlines & 0xFFFFFFFF),
160cb93a386Sopenharmony_ci                                                (int) (unsigned) (testlines >> 32),
161cb93a386Sopenharmony_ci                                                0, 0, &testRunner);
162cb93a386Sopenharmony_ci        }
163cb93a386Sopenharmony_ci    }
164cb93a386Sopenharmony_ci    testRunner.render();
165cb93a386Sopenharmony_ci}
166cb93a386Sopenharmony_ci
167cb93a386Sopenharmony_cistatic void chalkboard_1(skiatest::Reporter* reporter, const char* filename) {
168cb93a386Sopenharmony_ci    uint64_t testlines = 0xFFFFFFFFFFFFFFFFLL;
169cb93a386Sopenharmony_ci    chalkboard(reporter, testlines);
170cb93a386Sopenharmony_ci}
171cb93a386Sopenharmony_ci
172cb93a386Sopenharmony_cistatic void (*skipTest)(skiatest::Reporter* , const char* filename) = nullptr;
173cb93a386Sopenharmony_cistatic void (*firstTest)(skiatest::Reporter* , const char* filename) = nullptr;
174cb93a386Sopenharmony_cistatic void (*stopTest)(skiatest::Reporter* , const char* filename) = nullptr;
175cb93a386Sopenharmony_ci
176cb93a386Sopenharmony_cistatic TestDesc tests[] = {
177cb93a386Sopenharmony_ci    TEST(chalkboard_1),
178cb93a386Sopenharmony_ci    TEST(chalkboard_threaded),
179cb93a386Sopenharmony_ci};
180cb93a386Sopenharmony_ci
181cb93a386Sopenharmony_cistatic const size_t testCount = SK_ARRAY_COUNT(tests);
182cb93a386Sopenharmony_cistatic bool runReverse = false;
183cb93a386Sopenharmony_ci
184cb93a386Sopenharmony_ciDEF_TEST(PathOpsChalkboard, reporter) {
185cb93a386Sopenharmony_ci    RunTestSet(reporter, tests, testCount, firstTest, skipTest, stopTest, runReverse);
186cb93a386Sopenharmony_ci}
187