/*
    Copyright 2010 Google Inc.

    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 SkGrTexturePixelRef_DEFINED
#define SkGrTexturePixelRef_DEFINED

#include "SkPixelRef.h"
#include "GrGpu.h"

class SkGrTexturePixelRef : public SkPixelRef {
public:
            SkGrTexturePixelRef(GrTexture*);
    virtual ~SkGrTexturePixelRef();

    // override from SkPixelRef
    virtual SkGpuTexture* getTexture() { return (SkGpuTexture*)fTexture; }

protected:
    // override from SkPixelRef
    virtual void* onLockPixels(SkColorTable** ptr) {
        if (ptr) {
            *ptr = NULL;
        }
        return NULL;
    }

    // override from SkPixelRef
    virtual void onUnlockPixels() {}

private:
    GrTexture*  fTexture;
    typedef SkPixelRef INHERITED;
};

#endif

