Home | History | Annotate | Download | only in colorchecker
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 #define LOG_NDEBUG 0
     17 
     18 #define LOG_TAG "ImageTestHandler"
     19 #include <utils/Log.h>
     20 #include <utils/Timers.h>
     21 #include <cmath>
     22 
     23 #include "vec2.h"
     24 #include "vec3.h"
     25 #include "imagetesthandler.h"
     26 
     27 void ImageTestHandler::initDebugImage() {
     28     mDebugOutput = NULL;
     29 }
     30 
     31 // Initializes the  debug image with a given height and width.
     32 void ImageTestHandler::initDebugImage(int debugHeight,
     33                                       int debugWidth) {
     34     mDebugOutput = NULL;
     35     mDebugOutput = new unsigned char[debugHeight * debugWidth * 4];
     36     memset(mDebugOutput, 0, debugHeight * debugWidth * 4);
     37 
     38     mDebugHeight = debugHeight;
     39     mDebugWidth = debugWidth;
     40 }
     41 
     42 // Copies an existing image to the debug image.
     43 void ImageTestHandler::copyDebugImage(int inputHeight, int inputWidth,
     44                                       const unsigned char* inputImage) {
     45     if ((inputHeight == mDebugHeight) && (inputWidth == mDebugWidth)) {
     46         ALOGV("Copying debug images");
     47         memcpy(mDebugOutput, inputImage, mDebugHeight * mDebugWidth * 4);
     48     }
     49 }
     50 
     51 void ImageTestHandler::clearDebugImage() {
     52     if (mDebugOutput != NULL) {
     53         delete[] mDebugOutput;
     54         mDebugOutput = new unsigned char[mDebugHeight * mDebugWidth * 4];
     55         memset(mDebugOutput, 0, mDebugHeight * mDebugWidth * 4);
     56     }
     57 }
     58 
     59 
     60 // Draws a point of a given color.
     61 void ImageTestHandler::drawPoint(int row, int column, const Vec3i &color) {
     62     if ((row >= 0) && (column >= 0) &&
     63         (column < mDebugWidth) && (row < mDebugHeight)) {
     64         mDebugOutput[(row*mDebugWidth + column) * 4] = color.r();
     65         mDebugOutput[(row*mDebugWidth + column) * 4+1] = color.g();
     66         mDebugOutput[(row*mDebugWidth + column) * 4+2] = color.b();
     67         mDebugOutput[(row*mDebugWidth + column) * 4+3] = 255;
     68     }
     69 }
     70 
     71 // Draws a point in Vec2 format of a given color.
     72 void ImageTestHandler::drawPoint(const Vec2i &point, const Vec3i &color) {
     73     drawPoint((int) point.y(), (int) point.x(), color);
     74 }
     75 
     76 // Draws a line of a given color.
     77 void ImageTestHandler::drawLine(int angle, int radius, const Vec3i &color) {
     78     const int r = color.r();
     79     const int g = color.g();
     80     const int b = color.b();
     81     const int a = 255;
     82 
     83     int shiftedMin = -113;
     84     int shiftedMax = 83;
     85 
     86     float radiusDouble = static_cast<float>(radius);
     87 
     88     float angleRad = static_cast<float>(angle) * M_PI / 180.0;
     89 
     90     //ALOGV("draw line for (%d, %d)", angle, radius);
     91     for (int i = shiftedMin; i <= shiftedMax; ++i) {
     92         float j;
     93 
     94         assert(angle != 0);
     95         j = (i - radiusDouble / sin(angleRad)) * tan(angleRad);
     96         float x = (static_cast<float>(i) + j) / sqrt(2.0);
     97         float y = (j - static_cast<float>(i)) / sqrt(2.0);
     98 
     99         drawPoint(x, y, color);
    100     }
    101 }
    102