14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  imeld_tr.c  *
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _RTT
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h>
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdlib.h>
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <math.h>
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h>
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef unix
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <limits.h>
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <assert.h>
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "prelib.h"
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h"
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "../cfront/sh_down.h"
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const char imeld_tr[] = "$Id: imeld_tr.c,v 1.2.10.10 2008/04/01 18:23:20 dahan Exp $";
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid linear_transform_frame(preprocessed *prep, imeldata *fram, int do_shift)
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  Note the matrix is the transpose of the transformation
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  To transform a single frame in place */
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int      ii, jj;
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  imeldata vec[MAX_DIMEN];
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int dim = prep->dim;
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(prep);
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(prep->dim < MAX_DIMEN);
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(fram);
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (ii = 0; ii < dim; ii++)
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    vec[ii] = 0;
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (jj = 0; jj < prep->dim; jj++)
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      vec[ii] += prep->matrix[ii][jj] * fram[jj];
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ASSERT(prep->imel_shift > 0);
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    vec[ii] = (imeldata) SHIFT_DOWN((int)vec[ii],
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    (unsigned int)prep->imel_shift);
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (do_shift)
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (prep->offset)
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (ii = 0; ii < dim; ii++)
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        fram[ii] = RANGE(vec[ii] + prep->offset[ii], 0, 255);
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (ii = 0; ii < dim; ii++)
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        fram[ii] = RANGE(vec[ii], 0, 255);
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (ii = 0; ii < dim; ii++)
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      fram[ii] = vec[ii];
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid inverse_transform_frame (preprocessed *prep, imeldata *fram, int do_shift)
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  Note the matrix is the transpose of the transformation
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  To transform a single frame in place */
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int	     ii, jj;
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    imeldata vec[MAX_DIMEN];
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ASSERT (prep);
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ASSERT (prep->dim < MAX_DIMEN);
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ASSERT (fram);
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (prep->offset && do_shift)
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	for (ii= 0; ii < prep->dim; ii++)
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    fram[ii] -= prep->offset[ii];
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (ii= 0; ii < prep->dim; ii++) {
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	vec[ii]= 0;
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	for (jj= 0; jj < prep->dim; jj++)
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    vec[ii] += prep->invmat[ii][jj] * fram[jj];
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	vec[ii]= SHIFT_DOWN (vec[ii], prep->inv_shift);
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //floating pt // for (jj= 0; jj < prep->dim; jj++)
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	//floating pt // vec[ii] += (imeldata)(prep->inverse[ii][jj] * fram[jj]);
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (do_shift)
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	for (ii= 0; ii < prep->dim; ii++)
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    fram[ii]= RANGE (vec[ii], 0, 255);
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	for (ii= 0; ii < prep->dim; ii++)
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    fram[ii]= vec[ii];
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return;
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
113