/*
    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 SkGpuDeviceFactory_DEFINED
#define SkGpuDeviceFactory_DEFINED

#include "SkDevice.h"

class GrContext;

class SK_API SkGpuDeviceFactory : public SkDeviceFactory {
public:
    /**
     *  The constructor will ref() the context, passing it to each device
     *  that it creates. It will be unref()'d in the destructor
     *  Non-layered devices created by the factory will draw to the
     *  rootRenderTarget. rootRenderTarget is ref-counted by the factory.
     *  SkGpuDevice::Current3DApiRenderTarget() can be passed as a special
     *  value that will cause the factory to create a render target object
     *  that reflects the state of the underlying 3D API at the time of
     *  construction.
     */
    SkGpuDeviceFactory(GrContext*, GrRenderTarget* rootRenderTarget);
    
    /**
     * When the root layer is both a GrRenderTarget and a GrTexture it
     * is handy to have the factory hang on to a ref to the GrTexture object.
     * This is because the GrTexture has a ref to the GrRenderTarget but not
     * vice-versa.
     */
    SkGpuDeviceFactory(GrContext*, GrTexture* rootRenderTargetTexture);

    virtual ~SkGpuDeviceFactory();

    virtual SkDevice* newDevice(SkCanvas*, SkBitmap::Config, int width,
                                int height, bool isOpaque, bool isLayer);

private:
    GrContext* fContext;
    GrRenderTarget* fRootRenderTarget;
    GrTexture* fRootTexture;
};

#endif

