/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * 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 ANDROID_LAYER_BITMAP_H
#define ANDROID_LAYER_BITMAP_H

#include <stdint.h>
#include <sys/types.h>

#include <utils/Atomic.h>
#include <ui/PixelFormat.h>
#include <ui/Rect.h>
#include <private/ui/SharedState.h>
#include <pixelflinger/pixelflinger.h>
#include <EGL/eglnatives.h>

class copybit_image_t;

namespace android {

// ---------------------------------------------------------------------------

class IMemory;
class MemoryDealer;
class LayerBitmap;

// ---------------------------------------------------------------------------

class LayerBitmap : public egl_native_pixmap_t
{
public:

    enum {
        // erase memory to ensure security when necessary
        SECURE_BITS = 0x00000001
    };

                LayerBitmap();
                ~LayerBitmap();
    status_t    init(const sp<MemoryDealer>& allocator);

    status_t    setBits(uint32_t w, uint32_t h, uint32_t alignment,
                        PixelFormat format, uint32_t flags = 0);
    void        clear();

    status_t    getInfo(surface_info_t* info) const;
    status_t    resize(uint32_t w, uint32_t h);

    const GGLSurface& surface() const   { return mSurface; }
    Rect bounds() const                 { return Rect(width(), height()); }
    uint32_t width() const              { return surface().width; }
    uint32_t height() const             { return surface().height; }
    uint32_t stride() const             { return surface().stride; }
    PixelFormat pixelFormat() const     { return surface().format; }
    void* serverBits() const            { return surface().data; }
    size_t size() const;
    const sp<MemoryDealer>& getAllocator() const { return mAllocator; }
    void getBitmapSurface(copybit_image_t* img) const;

    int setCPUDomain(void);

private:
    sp<MemoryDealer>        mAllocator;
    sp<IMemory>             mBitsMemory;
    uint32_t                mAllocFlags;
    ssize_t                 mOffset;
    GGLSurface              mSurface;
    size_t                  mSize;
    uint32_t                mAlignment;
};

}; // namespace android

#endif // ANDROID_LAYER_BITMAP_H
