SkTableMaskFilter.h revision 8b0e8ac5f582de80356019406e2975079bf0829d
12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/*
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * Copyright 2006 The Android Open Source Project
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * Use of this source code is governed by a BSD-style license that can be
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * found in the LICENSE file.
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines */
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifndef SkTableMaskFilter_DEFINED
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define SkTableMaskFilter_DEFINED
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "SkMaskFilter.h"
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "SkScalar.h"
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/** \class SkTableMaskFilter
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    Applies a table lookup on each of the alpha values in the mask.
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    Helper methods create some common tables (e.g. gamma, clipping)
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines */
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesclass SK_API SkTableMaskFilter : public SkMaskFilter {
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinespublic:
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    SkTableMaskFilter();
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    SkTableMaskFilter(const uint8_t table[256]);
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    virtual ~SkTableMaskFilter();
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    /** Utility that sets the gamma table
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines     */
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    static void MakeGammaTable(uint8_t table[256], SkScalar gamma);
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    /** Utility that creates a clipping table: clamps values below min to 0
302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        and above max to 255, and rescales the remaining into 0..255
312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines     */
322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    static void MakeClipTable(uint8_t table[256], uint8_t min, uint8_t max);
332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    static SkTableMaskFilter* CreateGamma(SkScalar gamma) {
352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        uint8_t table[256];
362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        MakeGammaTable(table, gamma);
372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        return SkNEW_ARGS(SkTableMaskFilter, (table));
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    }
395d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    static SkTableMaskFilter* CreateClip(uint8_t min, uint8_t max) {
415d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines        uint8_t table[256];
425d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines        MakeClipTable(table, min, max);
435d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines        return SkNEW_ARGS(SkTableMaskFilter, (table));
445d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    }
455d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
465d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    virtual SkMask::Format getFormat() const SK_OVERRIDE;
475d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    virtual bool filterMask(SkMask*, const SkMask&, const SkMatrix&,
485d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines                            SkIPoint*) const SK_OVERRIDE;
495d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
505d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    SkDEVCODE(virtual void toString(SkString* str) const SK_OVERRIDE;)
512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTableMaskFilter)
525d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
535d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesprotected:
545d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    SkTableMaskFilter(SkReadBuffer& rb);
552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
575d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesprivate:
585d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    uint8_t fTable[256];
595d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
605d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines    typedef SkMaskFilter INHERITED;
615d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines};
625d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
635d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#endif
645d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines