/*
 * Copyright (C) 2011 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 RenderSkinNinePatch_h
#define RenderSkinNinePatch_h

#include "SkBitmap.h"
#include "utils/Asset.h"

namespace android {
    class AssetManager;
}

class SkCanvas;
class SkRect;

struct NinePatch {
    SkBitmap m_bitmap;
    void* m_serializedPatchData;
    NinePatch() {
        m_serializedPatchData = 0;
    }
    ~NinePatch() {
        if (m_serializedPatchData)
            free(m_serializedPatchData);
    }
};

class RenderSkinNinePatch {
public:
    static bool decodeAsset(android::AssetManager*, const char* fileName, NinePatch*);
    static void DrawNinePatch(SkCanvas*, const SkRect&, const NinePatch&);
};

#endif // RenderSkinNinePatch_h
