// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_RENDERER_RASTERIZER_SKIA_SKIA_SRC_EFFECTS_SKNV122RGBSHADER_H_
#define COBALT_RENDERER_RASTERIZER_SKIA_SKIA_SRC_EFFECTS_SKNV122RGBSHADER_H_

#include "SkShader.h"

class SkNV122RGBShader : public SkShader {
 public:
  SkNV122RGBShader(SkYUVColorSpace color_space, const SkBitmap& y_bitmap,
                   const SkMatrix& y_matrix, const SkBitmap& uv_bitmap,
                   const SkMatrix& uv_matrix);
  virtual ~SkNV122RGBShader();

  virtual size_t contextSize() const SK_OVERRIDE;

  class NV122RGBShaderContext : public SkShader::Context {
   public:
    // Takes ownership of shaderContext and calls its destructor.
    NV122RGBShaderContext(SkYUVColorSpace color_space,
                          const SkNV122RGBShader& yuv2rgb_shader,
                          SkShader::Context* y_shader_context,
                          SkShader::Context* uv_shader_context,
                          const ContextRec& rec);
    virtual ~NV122RGBShaderContext();

    virtual uint32_t getFlags() const SK_OVERRIDE;

    virtual void shadeSpan(int x, int y, SkPMColor[], int count) SK_OVERRIDE;
    virtual void shadeSpan16(int x, int y, uint16_t[], int count) SK_OVERRIDE;

    virtual void set3DMask(const SkMask* mask) SK_OVERRIDE {
      // forward to our proxy
      y_shader_context_->set3DMask(mask);
      uv_shader_context_->set3DMask(mask);
    }

   private:
    SkYUVColorSpace color_space_;

    SkShader::Context* y_shader_context_;
    SkShader::Context* uv_shader_context_;

    typedef SkShader::Context INHERITED;
  };

#if SK_SUPPORT_GPU
  bool asFragmentProcessor(GrContext*, const SkPaint&, const SkMatrix*,
                           GrColor*, GrFragmentProcessor**) const SK_OVERRIDE;
#endif

  SK_TO_STRING_OVERRIDE()
  SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkNV122RGBShader)

 protected:
#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
  explicit SkNV122RGBShader(SkReadBuffer&);
#endif
  virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
  virtual Context* onCreateContext(const ContextRec&,
                                   void* storage) const SK_OVERRIDE;

 private:
  void InitializeShaders();

  SkYUVColorSpace color_space_;

  SkBitmap y_bitmap_;
  SkMatrix y_matrix_;
  SkShader* y_shader_;

  SkBitmap uv_bitmap_;
  SkMatrix uv_matrix_;
  SkShader* uv_shader_;

  typedef SkShader INHERITED;
};

#endif  // COBALT_RENDERER_RASTERIZER_SKIA_SKIA_SRC_EFFECTS_SKNV122RGBSHADER_H_
