12bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com/*
22bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com * Copyright 2013 Google Inc.
32bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com *
42bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com * Use of this source code is governed by a BSD-style license that can be
52bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com * found in the LICENSE file.
62bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com */
72bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
92bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkBitmap.h"
102bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkData.h"
112bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkForceLinking.h"
122bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkImageDecoder.h"
132bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkOSFile.h"
142bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkStream.h"
152bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkString.h"
162bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com
172bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com__SK_FORCE_IMAGE_DECODER_LINKING;
182bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com
192bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.comclass SkCanvas;
202bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com
21f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ImageDecodeBench : public Benchmark {
222bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.compublic:
232bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    ImageDecodeBench(void* p, const char* filename)
24410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    : fName("image_decode_")
252bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    , fFilename(filename)
262bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    , fStream()
272bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    , fValid(false) {
282bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com        fName.append(SkOSPath::SkBasename(filename));
29644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
30644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
31644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
32644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
332bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    }
342bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com
352bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.comprotected:
362bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    virtual const char* onGetName() SK_OVERRIDE {
372bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com        return fName.c_str();
382bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    }
392bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com
402bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    virtual void onPreDraw() SK_OVERRIDE {
412bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com        SkFILEStream fileStream(fFilename.c_str());
422bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com        fValid = fileStream.isValid() && fileStream.getLength() > 0;
432bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com        if (fValid) {
442bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            const size_t size = fileStream.getLength();
452bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            void* data = sk_malloc_throw(size);
462bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            if (fileStream.read(data, size) < size) {
472bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com                fValid = false;
482bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            } else {
492bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com                SkAutoTUnref<SkData> skdata(SkData::NewFromMalloc(data, size));
502bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com                fStream.setData(skdata.get());
512bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            }
522bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com        }
532bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    }
542bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com
553361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
562bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#ifdef SK_DEBUG
572bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com        if (!fValid) {
582bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            SkDebugf("stream was invalid: %s\n", fName.c_str());
592bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            return;
602bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com        }
612bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#endif
622bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com        // Decode a bunch of times
632bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com        SkBitmap bm;
643361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
652bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            SkDEBUGCODE(bool success =) SkImageDecoder::DecodeStream(&fStream, &bm);
662bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#ifdef SK_DEBUG
672bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            if (!success) {
682bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com                SkDebugf("failed to decode %s\n", fName.c_str());
692bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com                return;
702bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            }
712bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#endif
722bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            SkDEBUGCODE(success =) fStream.rewind();
732bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#ifdef SK_DEBUG
742bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            if (!success) {
752bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com                SkDebugf("failed to rewind %s\n", fName.c_str());
762bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com                return;
772bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com            }
782bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#endif
792bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com        }
802bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    }
812bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com
822bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.comprivate:
832bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    SkString        fName;
842bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    const SkString  fFilename;
852bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    SkMemoryStream  fStream;
862bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com    bool            fValid;
872bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com
88f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
892bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com};
902bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com
912bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com// These are files which call decodePalette
92410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com//DEF_BENCH( return SkNEW_ARGS(ImageDecodeBench, ("/usr/local/google/home/scroggo/Downloads/images/hal_163x90.png")); )
93410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com//DEF_BENCH( return SkNEW_ARGS(ImageDecodeBench, ("/usr/local/google/home/scroggo/Downloads/images/box_19_top-left.png")); )
94