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