/* * Copyright 2025 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef PipelineCallbackHandler_DEFINED #define PipelineCallbackHandler_DEFINED #include "include/core/SkData.h" #include "include/core/SkRefCnt.h" #include "src/base/SkSpinlock.h" #include "src/core/SkChecksum.h" #include "src/core/SkTHash.h" #include class SkData; namespace skiatools::graphite { // This is intended to be an example of a Precompilation Callback handler. For DM it collects // all the Android-style keys that are used by a given source (e.g., gm, or skp) and uses // them in resetAndRecreatePipelines to recreate the Pipelines. class PipelineCallBackHandler { public: static void CallBack(void* data, sk_sp androidStyleKey) { PipelineCallBackHandler* handler = reinterpret_cast(data); handler->add(std::move(androidStyleKey)); } // Add an Android-style key to the map void add(sk_sp androidStyleKey) SK_EXCLUDES(fSpinLock); // Retrieve all the unique collected keys void retrieve(std::vector>*) SK_EXCLUDES(fSpinLock); void reset() SK_EXCLUDES(fSpinLock); int numKeys() const SK_EXCLUDES(fSpinLock) { SkAutoSpinlock lock{ fSpinLock }; return fMap.count(); } private: mutable SkSpinlock fSpinLock; struct SkDataKey { static SkDataKey GetKey(sk_sp& e) { return { e.get() }; } static uint32_t Hash(const SkDataKey& k) { return k.hash(); } bool operator==(const SkDataKey& other) const { return fData->equals(other.fData); } uint32_t hash() const { return SkChecksum::Hash32(fData->data(), fData->size()); } const SkData* fData; }; skia_private::THashTable, SkDataKey, SkDataKey> fMap SK_GUARDED_BY(fSpinLock); }; } // namespace skiatools::graphite #endif // PipelineCallbackHandler_DEFINED