14a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com/*
24a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com * Copyright 2013 Google Inc.
34a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com *
44a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
54a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com * found in the LICENSE file.
64a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com */
74a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
94a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com#include "SkCanvas.h"
104a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com#include "SkPaint.h"
114a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com#include "SkRandom.h"
124a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
134a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com/**
144a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com * This is a conversion of samplecode/SampleChart.cpp into a bench. It sure would be nice to be able
154a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com * to write one subclass that can be a GM, bench, and/or Sample.
164a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com */
174a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
184a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// Generates y values for the chart plots.
198a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.orgstatic void gen_data(SkScalar yAvg, SkScalar ySpread, int count,
208a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org                     SkRandom* random, SkTDArray<SkScalar>* dataPts) {
214a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    dataPts->setCount(count);
224a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    for (int i = 0; i < count; ++i) {
238a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org        (*dataPts)[i] = random->nextRangeScalar(yAvg - SkScalarHalf(ySpread),
244a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                                                yAvg + SkScalarHalf(ySpread));
254a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    }
264a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com}
274a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
284a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// Generates a path to stroke along the top of each plot and a fill path for the area below each
294a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// plot. The fill path is bounded below by the bottomData plot points or a horizontal line at
304a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// yBase if bottomData == NULL.
314a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// The plots are animated by rotating the data points by leftShift.
3297b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.orgstatic void gen_paths(const SkTDArray<SkScalar>& topData,
3397b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.org                      const SkTDArray<SkScalar>* bottomData,
3497b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.org                      SkScalar yBase,
3597b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.org                      SkScalar xLeft, SkScalar xDelta,
3697b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.org                      int leftShift,
3797b4b67ee79b094ea6ec84071d4a233177f9c7bccommit-bot@chromium.org                      SkPath* plot, SkPath* fill) {
384a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    plot->rewind();
394a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    fill->rewind();
404a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    plot->incReserve(topData.count());
414a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    if (NULL == bottomData) {
424a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        fill->incReserve(topData.count() + 2);
434a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    } else {
444a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        fill->incReserve(2 * topData.count());
454a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    }
464a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
474a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    leftShift %= topData.count();
484a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    SkScalar x = xLeft;
494a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
504a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    // Account for the leftShift using two loops
514a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    int shiftToEndCount = topData.count() - leftShift;
524a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    plot->moveTo(x, topData[leftShift]);
534a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    fill->moveTo(x, topData[leftShift]);
544a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
554a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    for (int i = 1; i < shiftToEndCount; ++i) {
564a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        plot->lineTo(x, topData[i + leftShift]);
574a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        fill->lineTo(x, topData[i + leftShift]);
584a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        x += xDelta;
594a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    }
604a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
614a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    for (int i = 0; i < leftShift; ++i) {
624a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        plot->lineTo(x, topData[i]);
634a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        fill->lineTo(x, topData[i]);
644a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        x += xDelta;
654a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    }
664a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
6749f085dddff10473b6ebf832a974288300224e60bsalomon    if (bottomData) {
684a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        SkASSERT(bottomData->count() == topData.count());
694a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        // iterate backwards over the previous graph's data to generate the bottom of the filled
704a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        // area (and account for leftShift).
714a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        for (int i = 0; i < leftShift; ++i) {
724a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            x -= xDelta;
734a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            fill->lineTo(x, (*bottomData)[leftShift - 1 - i]);
744a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        }
754a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        for (int i = 0; i < shiftToEndCount; ++i) {
764a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            x -= xDelta;
774a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            fill->lineTo(x, (*bottomData)[bottomData->count() - 1 - i]);
784a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        }
794a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    } else {
804a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        fill->lineTo(x - xDelta, yBase);
814a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        fill->lineTo(xLeft, yBase);
824a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    }
834a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com}
844a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
854a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// A set of scrolling line plots with the area between each plot filled. Stresses out GPU path
864a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com// filling
87f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ChartBench : public Benchmark {
884a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.compublic:
89410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ChartBench(bool aa) {
904a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        fShift = 0;
914a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        fAA = aa;
92cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com        fSize.fWidth = -1;
93cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com        fSize.fHeight = -1;
944a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    }
954a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
964a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.comprotected:
974a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    virtual const char* onGetName() SK_OVERRIDE {
984a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        if (fAA) {
994a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            return "chart_aa";
1004a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        } else {
1014a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            return "chart_bw";
1024a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        }
1034a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    }
1044a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1053361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
1064a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        bool sizeChanged = false;
1074a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        if (canvas->getDeviceSize() != fSize) {
1084a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            fSize = canvas->getDeviceSize();
1094a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            sizeChanged = true;
1104a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        }
1114a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1124a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        SkScalar ySpread = SkIntToScalar(fSize.fHeight / 20);
1134a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1144a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        SkScalar height = SkIntToScalar(fSize.fHeight);
115cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com        if (sizeChanged) {
116cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com            int dataPointCount = SkMax32(fSize.fWidth / kPixelsPerTick + 1, 2);
1174a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1188a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org            SkRandom random;
119cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com            for (int i = 0; i < kNumGraphs; ++i) {
120cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com                SkScalar y = (kNumGraphs - i) * (height - ySpread) / (kNumGraphs + 1);
121cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com                fData[i].reset();
1228a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org                gen_data(y, ySpread, dataPointCount, &random, fData + i);
1234a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            }
124cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com        }
125cd7421bf3833314a400a53dda7fca5959ac7fff0bsalomon@google.com
1268a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org        SkRandom colorRand;
1278a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org        SkColor colors[kNumGraphs];
1288a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org        for (int i = 0; i < kNumGraphs; ++i) {
1298a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org            colors[i] = colorRand.nextU() | 0xff000000;
1308a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org        }
1318a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org
1323361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int frame = 0; frame < loops; ++frame) {
1334a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1344a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            canvas->clear(0xFFE0F0E0);
1354a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1364a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            SkPath plotPath;
1374a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            SkPath fillPath;
1384a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1394a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            static const SkScalar kStrokeWidth = SkIntToScalar(2);
1404a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            SkPaint plotPaint;
1414a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            SkPaint fillPaint;
1424a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            plotPaint.setAntiAlias(fAA);
1434a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            plotPaint.setStyle(SkPaint::kStroke_Style);
1444a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            plotPaint.setStrokeWidth(kStrokeWidth);
1454a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            plotPaint.setStrokeCap(SkPaint::kRound_Cap);
1464a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            plotPaint.setStrokeJoin(SkPaint::kRound_Join);
1474a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            fillPaint.setAntiAlias(fAA);
1484a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            fillPaint.setStyle(SkPaint::kFill_Style);
1494a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1504a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            SkTDArray<SkScalar>* prevData = NULL;
1514a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            for (int i = 0; i < kNumGraphs; ++i) {
1524a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                gen_paths(fData[i],
1534a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                          prevData,
1544a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                          height,
1554a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                          0,
1564a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                          SkIntToScalar(kPixelsPerTick),
1574a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                          fShift,
1584a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                          &plotPath,
1594a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                          &fillPath);
1604a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1614a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                // Make the fills partially transparent
1628a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org                fillPaint.setColor((colors[i] & 0x00ffffff) | 0x80000000);
1634a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                canvas->drawPath(fillPath, fillPaint);
1644a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1658a2151f0ae19bae6c7ce09382079fce67dc5526ccommit-bot@chromium.org                plotPaint.setColor(colors[i]);
1664a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                canvas->drawPath(plotPath, plotPaint);
1674a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1684a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com                prevData = fData + i;
1694a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            }
1704a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1714a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com            fShift += kShiftPerFrame;
1724a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        }
1734a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    }
1744a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1754a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.comprivate:
1764a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    enum {
1774a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        kNumGraphs = 5,
1784a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        kPixelsPerTick = 3,
1794a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com        kShiftPerFrame = 1,
1804a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    };
1814a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    int                 fShift;
1824a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    SkISize             fSize;
1834a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    SkTDArray<SkScalar> fData[kNumGraphs];
1844a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com    bool                fAA;
1854a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
186f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
1874a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com};
1884a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
1894a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com//////////////////////////////////////////////////////////////////////////////
1904a71997e0d2ae1c08a80c3d0e59c73b2ceb50c5cbsalomon@google.com
191410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ChartBench(true); )
192410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ChartBench(false); )
193