/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkRasterPipeline_DEFINED #define SkRasterPipeline_DEFINED #include "include/core/SkColor.h" #include "include/core/SkTypes.h" #include "include/private/base/SkMacros.h" #include "include/private/base/SkSpan_impl.h" #include "include/private/base/SkTArray.h" #include "src/base/SkArenaAlloc.h" #include "src/core/SkRasterPipelineOpContexts.h" #include <cstddef> #include <cstdint> #include <functional> class SkMatrix; enum class SkRasterPipelineOp; enum SkColorType : int; struct SkImageInfo; struct skcms_TransferFunction; #if __has_cpp_attribute(clang::musttail) && !defined(__EMSCRIPTEN__) && !defined(SK_CPU_ARM32) && \ !defined(SK_CPU_LOONGARCH) #define SK_HAS_MUSTTAIL … #else #define SK_HAS_MUSTTAIL … #endif /** * SkRasterPipeline provides a cheap way to chain together a pixel processing pipeline. * * It's particularly designed for situations where the potential pipeline is extremely * combinatoric: {N dst formats} x {M source formats} x {K mask formats} x {C transfer modes} ... * No one wants to write specialized routines for all those combinations, and if we did, we'd * end up bloating our code size dramatically. SkRasterPipeline stages can be chained together * at runtime, so we can scale this problem linearly rather than combinatorically. * * Each stage is represented by a function conforming to a common interface and by an * arbitrary context pointer. The stage function arguments and calling convention are * designed to maximize the amount of data we can pass along the pipeline cheaply, and * vary depending on CPU feature detection. */ // Raster pipeline programs are stored as a contiguous array of SkRasterPipelineStages. SK_BEGIN_REQUIRE_DENSE struct SkRasterPipelineStage { … }; SK_END_REQUIRE_DENSE class SkRasterPipeline { … }; template <size_t bytes> class SkRasterPipeline_ : public SkRasterPipeline { … }; #endif//SkRasterPipeline_DEFINED