12cee902847a940c4bab56b42dabbb3721be3f9acmsarett/* 22cee902847a940c4bab56b42dabbb3721be3f9acmsarett * Copyright 2016 Google Inc. 32cee902847a940c4bab56b42dabbb3721be3f9acmsarett * 42cee902847a940c4bab56b42dabbb3721be3f9acmsarett * Use of this source code is governed by a BSD-style license that can be 52cee902847a940c4bab56b42dabbb3721be3f9acmsarett * found in the LICENSE file. 62cee902847a940c4bab56b42dabbb3721be3f9acmsarett */ 72cee902847a940c4bab56b42dabbb3721be3f9acmsarett 82cee902847a940c4bab56b42dabbb3721be3f9acmsarett#include "ColorCodecBench.h" 92cee902847a940c4bab56b42dabbb3721be3f9acmsarett#include "Resources.h" 102cee902847a940c4bab56b42dabbb3721be3f9acmsarett#include "SkCodec.h" 11c0444615ed76360f680619ad4d1f92cda6181a50msarett#include "SkCodecPriv.h" 129488833428e83c93a7e6002f4d056084fb57112fraftias#include "SkColorSpace_XYZ.h" 132cee902847a940c4bab56b42dabbb3721be3f9acmsarett#include "SkColorSpaceXform.h" 142cee902847a940c4bab56b42dabbb3721be3f9acmsarett#include "SkCommandLineFlags.h" 152cee902847a940c4bab56b42dabbb3721be3f9acmsarett 162cee902847a940c4bab56b42dabbb3721be3f9acmsarettDEFINE_bool(xform_only, false, "Only time the color xform, do not include the decode time"); 17d2809573deb7b99e764f7f71fe34a5b5322df0b2msarettDEFINE_bool(srgb, false, "Convert to srgb dst space"); 18f489886915034093278353d06c6f1973b2e8b7d2Matt SarettDEFINE_bool(nonstd, false, "Convert to non-standard dst space"); 196bdbf4412bd1a6fe26be1042ccf080174b13021fmsarettDEFINE_bool(half, false, "Convert to half floats"); 202cee902847a940c4bab56b42dabbb3721be3f9acmsarett 212cee902847a940c4bab56b42dabbb3721be3f9acmsarettColorCodecBench::ColorCodecBench(const char* name, sk_sp<SkData> encoded) 222cee902847a940c4bab56b42dabbb3721be3f9acmsarett : fEncoded(std::move(encoded)) 232cee902847a940c4bab56b42dabbb3721be3f9acmsarett{ 242cee902847a940c4bab56b42dabbb3721be3f9acmsarett fName.appendf("Color%s", FLAGS_xform_only ? "Xform" : "Codec"); 252cee902847a940c4bab56b42dabbb3721be3f9acmsarett fName.appendf("_%s", name); 262cee902847a940c4bab56b42dabbb3721be3f9acmsarett} 272cee902847a940c4bab56b42dabbb3721be3f9acmsarett 282cee902847a940c4bab56b42dabbb3721be3f9acmsarettconst char* ColorCodecBench::onGetName() { 292cee902847a940c4bab56b42dabbb3721be3f9acmsarett return fName.c_str(); 302cee902847a940c4bab56b42dabbb3721be3f9acmsarett} 312cee902847a940c4bab56b42dabbb3721be3f9acmsarett 322cee902847a940c4bab56b42dabbb3721be3f9acmsarettbool ColorCodecBench::isSuitableFor(Backend backend) { 332cee902847a940c4bab56b42dabbb3721be3f9acmsarett return kNonRendering_Backend == backend; 342cee902847a940c4bab56b42dabbb3721be3f9acmsarett} 352cee902847a940c4bab56b42dabbb3721be3f9acmsarett 362cee902847a940c4bab56b42dabbb3721be3f9acmsarettvoid ColorCodecBench::decodeAndXform() { 3739979d8c6b97889f600a212cfc9b063360f3de2fmsarett#ifdef SK_DEBUG 3850ce1f28ffede3fa3e38d330d4114ee52b387848msarett SkCodec::Result result = 3939979d8c6b97889f600a212cfc9b063360f3de2fmsarett#endif 40ede7bac43fbc69b9fdf1c178890ba6353f5bb140Mike Reed SkCodec::MakeFromData(fEncoded)->getPixels(fDstInfo, fDst.get(), fDstInfo.minRowBytes()); 4150ce1f28ffede3fa3e38d330d4114ee52b387848msarett SkASSERT(SkCodec::kSuccess == result); 422cee902847a940c4bab56b42dabbb3721be3f9acmsarett} 432cee902847a940c4bab56b42dabbb3721be3f9acmsarett 442cee902847a940c4bab56b42dabbb3721be3f9acmsarettvoid ColorCodecBench::xformOnly() { 45a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New(fSrcSpace.get(), 464be0e7cfe0efceeaf4c7a4d598d77c27cfd3e69bmsarett fDstSpace.get()); 472cee902847a940c4bab56b42dabbb3721be3f9acmsarett SkASSERT(xform); 482cee902847a940c4bab56b42dabbb3721be3f9acmsarett 492cee902847a940c4bab56b42dabbb3721be3f9acmsarett void* dst = fDst.get(); 502cee902847a940c4bab56b42dabbb3721be3f9acmsarett void* src = fSrc.get(); 516bdbf4412bd1a6fe26be1042ccf080174b13021fmsarett for (int y = 0; y < fSrcInfo.height(); y++) { 5231d097e865f266c8398f45114e4c75c0dfdef058msarett SkAssertResult(xform->apply(select_xform_format(fDstInfo.colorType()), dst, 5331d097e865f266c8398f45114e4c75c0dfdef058msarett SkColorSpaceXform::kRGBA_8888_ColorFormat, src, 5431d097e865f266c8398f45114e4c75c0dfdef058msarett fSrcInfo.width(), fDstInfo.alphaType())); 556bdbf4412bd1a6fe26be1042ccf080174b13021fmsarett dst = SkTAddOffset<void>(dst, fDstInfo.minRowBytes()); 566bdbf4412bd1a6fe26be1042ccf080174b13021fmsarett src = SkTAddOffset<void>(src, fSrcInfo.minRowBytes()); 572cee902847a940c4bab56b42dabbb3721be3f9acmsarett } 582cee902847a940c4bab56b42dabbb3721be3f9acmsarett} 592cee902847a940c4bab56b42dabbb3721be3f9acmsarett 602cee902847a940c4bab56b42dabbb3721be3f9acmsarettvoid ColorCodecBench::onDelayedSetup() { 61ede7bac43fbc69b9fdf1c178890ba6353f5bb140Mike Reed std::unique_ptr<SkCodec> codec = SkCodec::MakeFromData(fEncoded); 6250ce1f28ffede3fa3e38d330d4114ee52b387848msarett fSrcInfo = codec->getInfo().makeColorType(kRGBA_8888_SkColorType); 638bbcd5aab81dc0742c3367479c0c9d97363b1203msarett fDstInfo = fSrcInfo; 6450ce1f28ffede3fa3e38d330d4114ee52b387848msarett 65a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett fDstSpace = nullptr; 66a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett if (FLAGS_srgb) { 6777a7a1b57c16c97f056c1e50c03bdc954947778cMatt Sarett fDstSpace = SkColorSpace::MakeSRGB(); 68a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett } else if (FLAGS_nonstd) { 6999e3f7d6fcb7b3b4340286455733a7de9eb4ef81Matt Sarett SkColorSpaceTransferFn gamma; 7099e3f7d6fcb7b3b4340286455733a7de9eb4ef81Matt Sarett gamma.fA = 1.0f; 7199e3f7d6fcb7b3b4340286455733a7de9eb4ef81Matt Sarett gamma.fB = gamma.fC = gamma.fD = gamma.fE = gamma.fF = 0.0f; 7299e3f7d6fcb7b3b4340286455733a7de9eb4ef81Matt Sarett gamma.fG = 4.0f; 73f489886915034093278353d06c6f1973b2e8b7d2Matt Sarett SkMatrix44 matrix = SkMatrix44(SkMatrix44::kUninitialized_Constructor); 74f489886915034093278353d06c6f1973b2e8b7d2Matt Sarett matrix.set3x3(0.30f, 0.31f, 0.28f, 0.32f, 0.33f, 0.29f, 0.27f, 0.30f, 0.30f); 7599e3f7d6fcb7b3b4340286455733a7de9eb4ef81Matt Sarett fDstSpace = SkColorSpace::MakeRGB(gamma, matrix); 76a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett } else { 770933bc9b679457ef9333988fe3a1faae6a0b4126Mike Reed sk_sp<SkData> dstData = GetResourceAsData("icc_profiles/HP_ZR30w.icc"); 78a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett SkASSERT(dstData); 79a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett fDstSpace = SkColorSpace::MakeICC(dstData->data(), dstData->size()); 80f489886915034093278353d06c6f1973b2e8b7d2Matt Sarett } 81a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett SkASSERT(fDstSpace); 828bbcd5aab81dc0742c3367479c0c9d97363b1203msarett fDstInfo = fDstInfo.makeColorSpace(fDstSpace); 832ecc35ffa5feb56cd088478589ba1e48382b2e1fmsarett 84a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett if (FLAGS_half) { 85a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett fDstInfo = fDstInfo.makeColorType(kRGBA_F16_SkColorType); 8636703d9d368050a20764b5336534bd718fd00a6eBrian Osman fDstSpace = fDstSpace->makeLinearGamma(); 87a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett } 88a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett 89f0ffb8943b7be477b769db23660a80013f3332ebMike Reed fDst.reset(fDstInfo.computeMinByteSize()); 9050ce1f28ffede3fa3e38d330d4114ee52b387848msarett 9150ce1f28ffede3fa3e38d330d4114ee52b387848msarett if (FLAGS_xform_only) { 92f0ffb8943b7be477b769db23660a80013f3332ebMike Reed fSrc.reset(fSrcInfo.computeMinByteSize()); 93693fdbd6b81a860657612e7604430dd55d6e721bMike Reed fSrcSpace = codec->getInfo().refColorSpace(); 9450ce1f28ffede3fa3e38d330d4114ee52b387848msarett codec->getPixels(fSrcInfo, fSrc.get(), fSrcInfo.minRowBytes()); 9550ce1f28ffede3fa3e38d330d4114ee52b387848msarett } 962cee902847a940c4bab56b42dabbb3721be3f9acmsarett} 972cee902847a940c4bab56b42dabbb3721be3f9acmsarett 982cee902847a940c4bab56b42dabbb3721be3f9acmsarettvoid ColorCodecBench::onDraw(int n, SkCanvas*) { 992cee902847a940c4bab56b42dabbb3721be3f9acmsarett for (int i = 0; i < n; i++) { 100a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett if (FLAGS_xform_only) { 101a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett this->xformOnly(); 102a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett } else { 103a9e9bfc6e40894c0447c044a380c74061cb9e15eMatt Sarett this->decodeAndXform(); 1042cee902847a940c4bab56b42dabbb3721be3f9acmsarett } 1052cee902847a940c4bab56b42dabbb3721be3f9acmsarett } 1062cee902847a940c4bab56b42dabbb3721be3f9acmsarett} 107