| Index: cc/output/shader.h
 | 
| diff --git a/cc/output/shader.h b/cc/output/shader.h
 | 
| index 21b4a70de5aaac404dc18061f6483967841dddf7..ea61c9192ccfe1c06a3ce268c511d3491f5dd685 100644
 | 
| --- a/cc/output/shader.h
 | 
| +++ b/cc/output/shader.h
 | 
| @@ -424,42 +424,53 @@ class FragmentTexColorMatrixAlphaBinding : public FragmentTexBlendMode {
 | 
|      int color_offset_location_;
 | 
|  };
 | 
|  
 | 
| -class FragmentTexOpaqueBinding : public FragmentTexBlendMode {
 | 
| +class FragmentTexQuadBase : public FragmentTexBlendMode {
 | 
|   public:
 | 
| -  FragmentTexOpaqueBinding();
 | 
| +  FragmentTexQuadBase() = default;
 | 
| +  virtual ~FragmentTexQuadBase() = default;
 | 
| +
 | 
| +  int sampler_location() const { return sampler_location_; }
 | 
| +  virtual int background_color_location() const;
 | 
| +  virtual int tex_clamp_rect_location() const;
 | 
| +
 | 
| + protected:
 | 
| +  int sampler_location_ = -1;
 | 
| +
 | 
| + private:
 | 
| +  DISALLOW_COPY_AND_ASSIGN(FragmentTexQuadBase);
 | 
| +};
 | 
| +
 | 
| +class FragmentTexClampBinding : public FragmentTexQuadBase {
 | 
| + public:
 | 
| +  FragmentTexClampBinding() = default;
 | 
|  
 | 
|    void Init(gpu::gles2::GLES2Interface* context,
 | 
|              unsigned program,
 | 
|              int* base_uniform_index);
 | 
| -  int alpha_location() const { return -1; }
 | 
| -  int fragment_tex_transform_location() const { return -1; }
 | 
| -  int background_color_location() const { return -1; }
 | 
| -  int sampler_location() const { return sampler_location_; }
 | 
| +  int tex_clamp_rect_location() const final;
 | 
|  
 | 
|   private:
 | 
| -  int sampler_location_;
 | 
| +  int tex_clamp_rect_location_ = -1;
 | 
|  
 | 
| -  DISALLOW_COPY_AND_ASSIGN(FragmentTexOpaqueBinding);
 | 
| +  DISALLOW_COPY_AND_ASSIGN(FragmentTexClampBinding);
 | 
|  };
 | 
|  
 | 
| -class FragmentTexBackgroundBinding : public FragmentTexBlendMode {
 | 
| +class FragmentTexBackgroundBinding : public FragmentTexQuadBase {
 | 
|   public:
 | 
|    FragmentTexBackgroundBinding();
 | 
|  
 | 
|    void Init(gpu::gles2::GLES2Interface* context,
 | 
|              unsigned program,
 | 
|              int* base_uniform_index);
 | 
| -  int background_color_location() const { return background_color_location_; }
 | 
| -  int sampler_location() const { return sampler_location_; }
 | 
| +  int background_color_location() const final;
 | 
|  
 | 
|   private:
 | 
|    int background_color_location_;
 | 
| -  int sampler_location_;
 | 
|  
 | 
|    DISALLOW_COPY_AND_ASSIGN(FragmentTexBackgroundBinding);
 | 
|  };
 | 
|  
 | 
| -class FragmentShaderRGBATexVaryingAlpha : public FragmentTexOpaqueBinding {
 | 
| +class FragmentShaderRGBATexClampVaryingAlpha : public FragmentTexClampBinding {
 | 
|   public:
 | 
|    std::string GetShaderString(
 | 
|        TexCoordPrecision precision, SamplerType sampler) const;
 | 
| @@ -467,7 +478,16 @@ class FragmentShaderRGBATexVaryingAlpha : public FragmentTexOpaqueBinding {
 | 
|    static std::string GetShaderBody();
 | 
|  };
 | 
|  
 | 
| -class FragmentShaderRGBATexPremultiplyAlpha : public FragmentTexOpaqueBinding {
 | 
| +class FragmentShaderRGBATexClampPremultiplyAlpha
 | 
| +    : public FragmentTexClampBinding {
 | 
| + public:
 | 
| +  std::string GetShaderString(TexCoordPrecision precision,
 | 
| +                              SamplerType sampler) const;
 | 
| +  static std::string GetShaderHead();
 | 
| +  static std::string GetShaderBody();
 | 
| +};
 | 
| +
 | 
| +class FragmentShaderRGBATexClamp : public FragmentTexClampBinding {
 | 
|   public:
 | 
|    std::string GetShaderString(
 | 
|        TexCoordPrecision precision, SamplerType sampler) const;
 | 
| @@ -512,15 +532,24 @@ class FragmentShaderRGBATexColorMatrixAlpha
 | 
|    void FillLocations(ShaderLocations* locations) const;
 | 
|  };
 | 
|  
 | 
| -class FragmentShaderRGBATexOpaque : public FragmentTexOpaqueBinding {
 | 
| +class FragmentTexOpaqueBinding : public FragmentTexBlendMode {
 | 
|   public:
 | 
| -  std::string GetShaderString(
 | 
| -      TexCoordPrecision precision, SamplerType sampler) const;
 | 
| -  static std::string GetShaderHead();
 | 
| -  static std::string GetShaderBody();
 | 
| +  FragmentTexOpaqueBinding();
 | 
| +
 | 
| +  void Init(gpu::gles2::GLES2Interface* context,
 | 
| +            unsigned program,
 | 
| +            int* base_uniform_index);
 | 
| +  int alpha_location() const { return -1; }
 | 
| +  int fragment_tex_transform_location() const { return -1; }
 | 
| +  int sampler_location() const { return sampler_location_; }
 | 
| +
 | 
| + private:
 | 
| +  int sampler_location_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(FragmentTexOpaqueBinding);
 | 
|  };
 | 
|  
 | 
| -class FragmentShaderRGBATex : public FragmentTexOpaqueBinding {
 | 
| +class FragmentShaderRGBATexOpaque : public FragmentTexOpaqueBinding {
 | 
|   public:
 | 
|    std::string GetShaderString(
 | 
|        TexCoordPrecision precision, SamplerType sampler) const;
 | 
| 
 |