158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "PathOpsExtendedTest.h"
258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "PathOpsThreadedCommon.h"
37839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkBitmap.h"
47839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkDevice.h"
57839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkCanvas.h"
658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkImageDecoder.h"
77839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkImageEncoder.h"
87839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkStream.h"
97839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkOSFile.h"
107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkPicture.h"
117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkString.h"
1258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
1358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#ifdef SK_BUILD_FOR_WIN
1458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define PATH_SLASH "\\"
1558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define IN_DIR "D:" PATH_SLASH "skp"
1658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define OUT_DIR "D:" PATH_SLASH
1758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#else
1858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define PATH_SLASH "/"
1958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define IN_DIR "/Volumes/Untitled" PATH_SLASH
2058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define OUT_DIR PATH_SLASH
2158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#endif
2258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
2358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic const char pictDir[] = IN_DIR ;
2458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic const char outSkpClipDir[] = OUT_DIR "skpClip";
2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic const char outOldClipDir[] = OUT_DIR "oldClip";
267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic void make_filepath(SkString* path, const char* dir, const SkString& name) {
287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    size_t len = strlen(dir);
297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    path->set(dir);
3058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (len > 0 && dir[len - 1] != PATH_SLASH[0]) {
3158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        path->append(PATH_SLASH);
327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    path->append(name);
347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}
357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic void testOne(const SkString& filename) {
3758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#if DEBUG_SHOW_TEST_NAME
3858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkString testName(filename);
3958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    const char http[] = "http";
4058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (testName.startsWith(http)) {
4158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        testName.remove(0, sizeof(http) - 1);
4258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
4358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    while (testName.startsWith("_")) {
4458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        testName.remove(0, 1);
4558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
4658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    const char dotSkp[] = ".skp";
4758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (testName.endsWith(dotSkp)) {
4858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        size_t len = testName.size();
4958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        testName.remove(len - (sizeof(dotSkp) - 1), sizeof(dotSkp) - 1);
5058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    testName.prepend("skp");
5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    testName.append("1");
5358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    strncpy(DEBUG_FILENAME_STRING, testName.c_str(), DEBUG_FILENAME_STRING_LENGTH);
5458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#endif
5558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkString path;
5658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    make_filepath(&path, pictDir, filename);
5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkFILEStream stream(path.c_str());
5858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (!stream.isValid()) {
5958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return;
6058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
6158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkPicture* pic = SkPicture::CreateFromStream(&stream, &SkImageDecoder::DecodeMemory);
6258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (!pic) {
6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkDebugf("unable to decode %s\n", filename.c_str());
6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return;
6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    int width = pic->width();
6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    int height = pic->height();
6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkBitmap bitmap;
6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    bool success = bitmap.allocPixels();
7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (!success) {
7258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkDebugf("unable to allocate bitmap for %s\n", filename.c_str());
7358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return;
7458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
7558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkCanvas canvas(bitmap);
7658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkString pngName(filename);
7758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    pngName.remove(pngName.size() - 3, 3);
7858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    pngName.append("png");
7958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    for (int i = 0; i < 2; ++i) {
8058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        bool useOp = i ? true : false;
8158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        canvas.setAllowSimplifyClip(useOp);
8258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        pic->draw(&canvas);
8358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkString outFile;
8458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        make_filepath(&outFile, useOp ? outSkpClipDir : outOldClipDir, pngName);
8558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkImageEncoder::EncodeFile(outFile.c_str(), bitmap, SkImageEncoder::kPNG_Type, 100);
8658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
8758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkDELETE(pic);
8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
8958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerconst char skipBefore[] = "http___kkiste_to.skp";
9158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic void PathOpsSkpClipTest(skiatest::Reporter* reporter) {
937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkOSFile::Iter iter(pictDir, "skp");
947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkString filename;
9558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    int testCount = 0;
967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    while (iter.next(&filename)) {
9758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (strcmp(filename.c_str(), skipBefore) < 0) {
987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            continue;
997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
10058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        testOne(filename);
10158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (reporter->verbose()) {
10258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            SkDebugf(".");
10358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            if (++testCount % 100 == 0) {
10458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                SkDebugf("\n");
10558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            }
1067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
10758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        reporter->bumpTestCount();
10858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
10958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
11058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
11158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic void testSkpClipMain(PathOpsThreadState* data) {
11258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkString str(data->fSerialNo);
11358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        testOne(str);
11458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (data->fReporter->verbose()) {
11558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            SkDebugf(".");
11658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            static int threadTestCount;
11758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            sk_atomic_inc(&threadTestCount);
11858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            if (threadTestCount % 100 == 0) {
11958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                SkDebugf("\n");
12058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            }
1217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
12258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
12358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
12458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic void PathOpsSkpClipThreadedTest(skiatest::Reporter* reporter) {
12558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    int threadCount = initializeTests(reporter, "skpClipThreadedTest");
12658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    PathOpsThreadedTestRunner testRunner(reporter, threadCount);
12758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkOSFile::Iter iter(pictDir, "skp");
12858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkString filename;
12958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    while (iter.next(&filename)) {
13058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (strcmp(filename.c_str(), skipBefore) < 0) {
13158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            continue;
13258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
13358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        *testRunner.fRunnables.append() = SkNEW_ARGS(PathOpsThreadedRunnable,
13458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                (&testSkpClipMain, filename.c_str(), &testRunner));
1357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        reporter->bumpTestCount();
1367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
13758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    testRunner.render();
13858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
13958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
14058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic void PathOpsSkpClipOneOffTest(skiatest::Reporter* reporter) {
14158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkString filename(skipBefore);
14258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    testOne(filename);
1437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}
1447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "TestClassDef.h"
1467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerDEFINE_TESTCLASS_SHORT(PathOpsSkpClipTest)
14758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
14858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEFINE_TESTCLASS_SHORT(PathOpsSkpClipOneOffTest)
14958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
15058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEFINE_TESTCLASS_SHORT(PathOpsSkpClipThreadedTest)
151