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

#include "vec2.h"
#include "vec3.h"

class ImageTestHandler{
  public:
    ImageTestHandler() {
        initDebugImage();
    }
    ImageTestHandler(int debugHeight, int debugWidth) {
        initDebugImage(debugHeight, debugWidth);
    }
    virtual ~ImageTestHandler() { delete[] mDebugOutput; }

    virtual void processData() {}

    int getDebugWidth() const { return mDebugWidth; }
    int getDebugHeight() const { return mDebugHeight; }
    const unsigned char* debug_output() const { return mDebugOutput; }
    void copyDebugImage(int inputHeight, int inputWidth,
                        const unsigned char* inputImage);

    void drawPoint(const Vec2i &point, const Vec3i &color);
    void drawPoint(int row, int column, const Vec3i &color);
    void drawLine(int angle, int radius, const Vec3i &color);

  protected:
    void clearDebugImage();

  private:
    void initDebugImage();
    void initDebugImage(int debugHeight, int debugWidth);

    unsigned char* mDebugOutput;
    int mDebugWidth;
    int mDebugHeight;
};

#endif
