1e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*
2e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Copyright (C) 2011 The Android Open Source Project
3e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen *
4e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Licensed under the Apache License, Version 2.0 (the "License");
5e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * you may not use this file except in compliance with the License.
6e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * You may obtain a copy of the License at
7e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen *
8e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen *      http://www.apache.org/licenses/LICENSE-2.0
9e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen *
10e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Unless required by applicable law or agreed to in writing, software
11e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * distributed under the License is distributed on an "AS IS" BASIS,
12e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * See the License for the specific language governing permissions and
14e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * limitations under the License.
15e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
16e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
17e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/* $Id: db_utilities.cpp,v 1.4 2011/06/17 14:03:31 mbansal Exp $ */
18e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
19e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities.h"
20e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include <string.h>
21e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include <stdio.h>
22e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
23e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenfloat** db_SetupImageReferences_f(float *im,int w,int h)
24e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
25e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    int i;
26e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    float **img;
27e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    assert(im);
28e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    img=new float* [h];
29e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    for(i=0;i<h;i++)
30e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    {
31e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        img[i]=im+w*i;
32e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    }
33e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(img);
34e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
35e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
36e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenunsigned char** db_SetupImageReferences_u(unsigned char *im,int w,int h)
37e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
38e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    int i;
39e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    unsigned char **img;
40e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
41e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    assert(im);
42e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
43e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    img=new unsigned char* [h];
44e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    for(i=0;i<h;i++)
45e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    {
46e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        img[i]=im+w*i;
47e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    }
48e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(img);
49e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
50e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenfloat** db_AllocImage_f(int w,int h,int over_allocation)
51e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
52e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    float **img,*im;
53e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
54e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    im=new float [w*h+over_allocation];
55e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    img=db_SetupImageReferences_f(im,w,h);
56e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
57e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(img);
58e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
59e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
60e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenunsigned char** db_AllocImage_u(int w,int h,int over_allocation)
61e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
62e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    unsigned char **img,*im;
63e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
64e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    im=new unsigned char [w*h+over_allocation];
65e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    img=db_SetupImageReferences_u(im,w,h);
66e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
67e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(img);
68e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
69e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
70e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid db_FreeImage_f(float **img,int h)
71e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
72e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    delete [] (img[0]);
73e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    delete [] img;
74e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
75e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
76e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid db_FreeImage_u(unsigned char **img,int h)
77e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
78e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    delete [] (img[0]);
79e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    delete [] img;
80e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
81e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
82e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// ----------------------------------------------------------------------------------------------------------- ;
83e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen//
84e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// copy image (source to destination)
85e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// ---> must be a 2D image array with the same image size
86e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// ---> the size of the input and output images must be same
87e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen//
88e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// ------------------------------------------------------------------------------------------------------------ ;
89e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid db_CopyImage_u(unsigned char **d,const unsigned char * const *s, int w, int h, int over_allocation)
90e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
91e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    int i;
92e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
93e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    for (i=0;i<h;i++)
94e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    {
95e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        memcpy(d[i],s[i],w*sizeof(unsigned char));
96e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    }
97e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
98e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    memcpy(&d[h],&d[h],over_allocation);
99e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
100e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
101e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
102e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_WarpImageLutFast_u(const unsigned char * const * src, unsigned char ** dst, int w, int h,
103e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen                                  const float * const * lut_x, const float * const * lut_y)
104e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
105e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    assert(src && dst);
106e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    int xd=0, yd=0;
107e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
108e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    for ( int i = 0; i < w; ++i )
109e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        for ( int j = 0; j < h; ++j )
110e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        {
111e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            //xd = static_cast<unsigned int>(lut_x[j][i]);
112e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            //yd = static_cast<unsigned int>(lut_y[j][i]);
113e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            xd = (unsigned int)(lut_x[j][i]);
114e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            yd = (unsigned int)(lut_y[j][i]);
115e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            if ( xd >= w || yd >= h ||
116e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen                 xd < 0 || yd < 0)
117e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen                dst[j][i] = 0;
118e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            else
119e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen                dst[j][i] = src[yd][xd];
120e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        }
121e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
122e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
123e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_WarpImageLutBilinear_u(const unsigned char * const * src, unsigned char ** dst, int w, int h,
124e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen                                      const float * const * lut_x,const float * const* lut_y)
125e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
126e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    assert(src && dst);
127e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    double xd=0.0, yd=0.0;
128e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
129e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    for ( int i = 0; i < w; ++i )
130e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        for ( int j = 0; j < h; ++j )
131e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        {
132e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            xd = static_cast<double>(lut_x[j][i]);
133e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            yd = static_cast<double>(lut_y[j][i]);
134e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            if ( xd > w   || yd > h ||
135e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen                 xd < 0.0 || yd < 0.0)
136e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen                dst[j][i] = 0;
137e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            else
138e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen                dst[j][i] = db_BilinearInterpolation(yd, xd, src);
139e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        }
140e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
141e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
142e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
143e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid db_WarpImageLut_u(const unsigned char * const * src, unsigned char ** dst, int w, int h,
144e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen                       const float * const * lut_x,const float * const * lut_y, int type)
145e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
146e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    switch (type)
147e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    {
148e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    case DB_WARP_FAST:
149e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        db_WarpImageLutFast_u(src,dst,w,h,lut_x,lut_y);
150e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        break;
151e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    case DB_WARP_BILINEAR:
152e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        db_WarpImageLutBilinear_u(src,dst,w,h,lut_x,lut_y);
153e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        break;
154e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    default:
155e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        break;
156e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    }
157e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
158e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
159e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
160e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid db_PrintDoubleVector(double *a,long size)
161e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
162e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    printf("[ ");
163e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    for(long i=0;i<size;i++) printf("%lf ",a[i]);
164e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    printf("]");
165e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
166e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
167e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid db_PrintDoubleMatrix(double *a,long rows,long cols)
168e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
169e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    printf("[\n");
170e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    for(long i=0;i<rows;i++)
171e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    {
172e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        for(long j=0;j<cols;j++) printf("%lf ",a[i*cols+j]);
173e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        printf("\n");
174e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    }
175e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    printf("]");
176e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
177