1/* 2 * Copyright 2007 The Android Open Source Project 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#ifndef SkColorMatrixFilter_DEFINED 9#define SkColorMatrixFilter_DEFINED 10 11#include "SkColorFilter.h" 12#include "SkColorMatrix.h" 13 14class SK_API SkColorMatrixFilter : public SkColorFilter { 15public: 16 static SkColorMatrixFilter* Create(const SkColorMatrix& cm) { 17 return SkNEW_ARGS(SkColorMatrixFilter, (cm)); 18 } 19 static SkColorMatrixFilter* Create(const SkScalar array[20]) { 20 return SkNEW_ARGS(SkColorMatrixFilter, (array)); 21 } 22 23 // overrides from SkColorFilter 24 virtual void filterSpan(const SkPMColor src[], int count, SkPMColor[]) const SK_OVERRIDE; 25 virtual void filterSpan16(const uint16_t src[], int count, uint16_t[]) const SK_OVERRIDE; 26 virtual uint32_t getFlags() const SK_OVERRIDE; 27 virtual bool asColorMatrix(SkScalar matrix[20]) const SK_OVERRIDE; 28#if SK_SUPPORT_GPU 29 virtual GrFragmentProcessor* asFragmentProcessor(GrContext*) const SK_OVERRIDE; 30#endif 31 32 struct State { 33 int32_t fArray[20]; 34 int fShift; 35 }; 36 37 SK_TO_STRING_OVERRIDE() 38 39 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorMatrixFilter) 40 41protected: 42 explicit SkColorMatrixFilter(const SkColorMatrix&); 43 explicit SkColorMatrixFilter(const SkScalar array[20]); 44#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING 45 explicit SkColorMatrixFilter(SkReadBuffer& buffer); 46#endif 47 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; 48 49private: 50 SkColorMatrix fMatrix; 51 52 typedef void (*Proc)(const State&, unsigned r, unsigned g, unsigned b, 53 unsigned a, int32_t result[4]); 54 55 Proc fProc; 56 State fState; 57 uint32_t fFlags; 58 59 void initState(const SkScalar array[20]); 60 61 typedef SkColorFilter INHERITED; 62}; 63 64#endif 65