1bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita/*
2bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita * Copyright 2016 Google Inc.
3bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita *
4bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita * Use of this source code is governed by a BSD-style license that can be
5bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita * found in the LICENSE file.
6bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita */
7bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
8bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita#ifndef Sk4fGradientBase_DEFINED
9bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita#define Sk4fGradientBase_DEFINED
10bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
11bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita#include "SkColor.h"
12bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita#include "SkGradientShaderPriv.h"
13bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita#include "SkMatrix.h"
14bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita#include "SkNx.h"
15bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita#include "SkPM4f.h"
16bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita#include "SkShader.h"
17bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita#include "SkTArray.h"
18bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
19bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalitaclass SkGradientShaderBase::
20bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalitaGradientShaderBase4fContext : public SkShader::Context {
21bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalitapublic:
22bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    GradientShaderBase4fContext(const SkGradientShaderBase&,
23bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita                                const ContextRec&);
24bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
25bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    uint32_t getFlags() const override { return fFlags; }
26bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
27bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalitaprotected:
28bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    struct Interval {
29bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita        Interval(SkPMColor c0, SkScalar p0,
30bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita                 SkPMColor c1, SkScalar p1,
31bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita                 const Sk4f& componentScale);
32bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita        Interval(const Sk4f& c0, const Sk4f& dc,
33bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita                 SkScalar p0, SkScalar p1);
34bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
35bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita        bool isZeroRamp() const { return fZeroRamp; }
36bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
37bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita        // true when fx is in [p0,p1)
38bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita        bool contains(SkScalar fx) const;
39bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
40bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita        SkPM4f   fC0, fDc;
41bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita        SkScalar fP0, fP1;
42bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita        bool     fZeroRamp;
43bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    };
44bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
45bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    const Interval* findInterval(SkScalar fx) const;
46bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
47bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    SkSTArray<8, Interval, true> fIntervals;
48bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    SkMatrix                     fDstToPos;
49bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    SkMatrix::MapXYProc          fDstToPosProc;
50bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    uint8_t                      fDstToPosClass;
51bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    uint8_t                      fFlags;
52bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    bool                         fDither;
53bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    bool                         fColorsArePremul;
54bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
55bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalitaprivate:
56bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    using INHERITED = SkShader::Context;
57bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
58bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita    mutable const Interval*      fCachedInterval;
59bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita};
60bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita
61bc590c01b00ef79e1e1f30058e7a70a29419f2a9fmalita#endif // Sk4fGradientBase_DEFINED
62