17839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/*
27839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Copyright 2012 Google Inc.
37839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *
47839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
57839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * found in the LICENSE file.
67839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */
77839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#ifndef PathOpsThreadedCommon_DEFINED
87839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define PathOpsThreadedCommon_DEFINED
97839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
100a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "SkGraphics.h"
117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkRunnable.h"
127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkTDArray.h"
137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define PATH_STR_SIZE 512
157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass PathOpsThreadedRunnable;
177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergernamespace skiatest {
197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass Reporter;
207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}
217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstruct PathOpsThreadState {
237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    unsigned char fA;
247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    unsigned char fB;
257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    unsigned char fC;
267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    unsigned char fD;
277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    char* fPathStr;
287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    const char* fKey;
290a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    char fSerialNo[256];
307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    skiatest::Reporter* fReporter;
317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkBitmap* fBitmap;
327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass PathOpsThreadedTestRunner {
357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    PathOpsThreadedTestRunner(skiatest::Reporter* reporter, int threadCount)
377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        : fNumThreads(threadCount)
387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fReporter(reporter) {
397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    ~PathOpsThreadedTestRunner();
427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void render();
447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    int fNumThreads;
477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkTDArray<PathOpsThreadedRunnable*> fRunnables;
487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    skiatest::Reporter* fReporter;
497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass PathOpsThreadedRunnable : public SkRunnable {
527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    PathOpsThreadedRunnable(void (*testFun)(PathOpsThreadState*), int a, int b, int c, int d,
547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            PathOpsThreadedTestRunner* runner) {
557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fState.fA = a;
567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fState.fB = b;
577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fState.fC = c;
587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fState.fD = d;
597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fState.fReporter = runner->fReporter;
607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fTestFun = testFun;
617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    PathOpsThreadedRunnable(void (*testFun)(PathOpsThreadState*), const char* str,
6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            PathOpsThreadedTestRunner* runner) {
6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkASSERT(strlen(str) < sizeof(fState.fSerialNo) - 1);
6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        strcpy(fState.fSerialNo, str);
6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        fState.fReporter = runner->fReporter;
6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        fTestFun = testFun;
6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
710a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    PathOpsThreadedRunnable(void (*testFun)(PathOpsThreadState*), int dirNo, const char* str,
720a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            PathOpsThreadedTestRunner* runner) {
730a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkASSERT(strlen(str) < sizeof(fState.fSerialNo) - 1);
740a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        fState.fA = dirNo;
750a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        strcpy(fState.fSerialNo, str);
760a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        fState.fReporter = runner->fReporter;
770a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        fTestFun = testFun;
780a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    }
790a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual void run() SK_OVERRIDE {
817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkBitmap bitmap;
827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fState.fBitmap = &bitmap;
837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        char pathStr[PATH_STR_SIZE];
847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fState.fPathStr = pathStr;
850a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkGraphics::SetTLSFontCacheLimit(1 * 1024 * 1024);
867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        (*fTestFun)(&fState);
877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    PathOpsThreadState fState;
917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void (*fTestFun)(PathOpsThreadState*);
927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
95