1/*
2 * Copyright (C) 2008 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
17/* ---- includes ----------------------------------------------------------- */
18
19#include "b_BasicEm/Functions.h"
20#include "b_BasicEm/Int16Arr.h"
21#include "b_BasicEm/Math.h"
22#include "b_ImageEm/HistoEq16.h"
23#include "b_ImageEm/UInt16ByteImage.h"
24
25/* ---- typedefs ----------------------------------------------------------- */
26
27/* ---- constants ---------------------------------------------------------- */
28
29/* ------------------------------------------------------------------------- */
30
31/* ========================================================================= */
32/*                                                                           */
33/* ---- \ghd{ auxiliary functions } ---------------------------------------- */
34/*                                                                           */
35/* ========================================================================= */
36
37/** Computes grey level histogram of given image. */
38void bim_createHisto16( uint16* histoPtrA,
39						const struct bim_UInt16ByteImage* imagePtrA )
40{
41	uint32 iL;
42	uint16* dstPtrL;
43	const uint16* srcPtrL;
44
45	/* init histogram array with 0 */
46	dstPtrL = histoPtrA;
47	for( iL = 256; iL > 0; iL-- )
48	{
49		*dstPtrL++ = 0;
50	}
51
52	srcPtrL = imagePtrA->arrE.arrPtrE;
53	dstPtrL = histoPtrA;
54	/* calculate histogram (assuming even image width) */
55	for( iL = imagePtrA->arrE.sizeE; iL > 0; iL-- )
56	{
57		dstPtrL[ ( *srcPtrL & 0x0FF ) ]++;
58		dstPtrL[ ( *srcPtrL >> 8 ) ]++;
59		srcPtrL++;
60	}
61}
62
63/* ------------------------------------------------------------------------- */
64
65/** Computes grey level histogram of given image. */
66void bim_createHistoOfSection16( uint16* histoPtrA,
67								 const struct bts_Int16Rect* sectionPtrA,
68								 const struct bim_UInt16ByteImage* imagePtrA )
69{
70	uint32 xL, yL;
71	const uint16* srcPtrL;
72	uint16* dstPtrL;
73	struct bts_Int16Rect sectionL = *sectionPtrA;
74	uint32 sectWidthL;
75	uint32 sectHeightL;
76	int32 imgWidthL = imagePtrA->widthE;
77	int32 imgHeightL = imagePtrA->heightE;
78
79	bbs_ERROR0( "bim_createHistoOfSection16(...): not implemented" );
80
81	/* adjustments */
82	sectionL.x1E = bbs_max( 0, sectionL.x1E );
83	sectionL.x1E = bbs_min( imgWidthL, sectionL.x1E );
84	sectionL.x2E = bbs_max( 0, sectionL.x2E );
85	sectionL.x2E = bbs_min( imgWidthL, sectionL.x2E );
86	sectionL.y1E = bbs_max( 0, sectionL.y1E );
87	sectionL.y1E = bbs_min( imgHeightL, sectionL.y1E );
88	sectionL.y2E = bbs_max( 0, sectionL.y2E );
89	sectionL.y2E = bbs_min( imgHeightL, sectionL.y2E );
90
91	sectWidthL = sectionL.x2E - sectionL.x1E;
92	sectHeightL = sectionL.y2E - sectionL.y1E;
93
94	/* init histogram with 0 */
95	dstPtrL = histoPtrA;
96	for( xL = 256; xL > 0; xL-- )
97	{
98		*dstPtrL++ = 0;
99	}
100
101	/* calculate histogram */
102	srcPtrL = imagePtrA->arrE.arrPtrE + sectionL.y1E * imgWidthL + sectionL.x1E;
103	dstPtrL = histoPtrA;
104	for( yL = 0; yL < sectHeightL; yL++ )
105	{
106		for( xL = 0; xL < sectWidthL; xL++ )
107		{
108			dstPtrL[ ( *srcPtrL & 0x0FF ) ]++;
109			dstPtrL[ ( *srcPtrL >> 8 ) ]++;
110			srcPtrL++;
111			/* dstPtrL[ *srcPtrL++ ]++;	 */
112		}
113		srcPtrL += imgWidthL - sectWidthL;
114	}
115}
116
117/* ------------------------------------------------------------------------- */
118
119/** equalize image using given histogram */
120void bim_equalize16( struct bim_UInt16ByteImage* imagePtrA,
121					 const uint16* histoPtrA )
122{
123	uint32 kL;
124	uint32 sumL = 0;
125	uint32 totalSumL = 0;
126	const uint16* histoArrPtrL;
127	uint16* dstPtrL;
128	uint16 mappingL[ 256 ];
129
130	/* determine number of counts in histogram */
131	histoArrPtrL = histoPtrA;
132	for( kL = 256; kL > 0; kL-- )
133	{
134		totalSumL += *histoArrPtrL++;
135	}
136
137	if( totalSumL == 0 ) totalSumL = 1;
138
139	/* compute transfer function (cumulative histogram) */
140	histoArrPtrL = histoPtrA;
141	for( kL = 0; kL < 256; kL++ )
142	{
143		sumL += *histoArrPtrL++;
144		mappingL[ kL ] = ( sumL * 255 ) / totalSumL;
145	}
146
147	/* remap pixel values */
148	dstPtrL = imagePtrA->arrE.arrPtrE;
149	for( kL = imagePtrA->arrE.sizeE; kL > 0; kL-- )
150	{
151		*dstPtrL = mappingL[ *dstPtrL & 0x00FF ] | ( mappingL[ *dstPtrL >> 8 ] << 8 );
152		dstPtrL++;
153	}
154}
155
156/* ------------------------------------------------------------------------- */
157
158/* ========================================================================= */
159/*                                                                           */
160/* ---- \ghd{ external functions } ----------------------------------------- */
161/*                                                                           */
162/* ========================================================================= */
163
164/* ------------------------------------------------------------------------- */
165
166void bim_UInt16ByteImage_equalize( struct bim_UInt16ByteImage* imagePtrA )
167{
168	uint16 histogramL[ 256 ];
169	bim_createHisto16( histogramL, imagePtrA );
170	bim_equalize16( imagePtrA, histogramL );
171}
172
173/* ------------------------------------------------------------------------- */
174
175void bim_UInt16ByteImage_equalizeSection( struct bim_UInt16ByteImage* imagePtrA,
176										  const struct bts_Int16Rect* sectionPtrA )
177{
178	uint16 histogramL[ 256 ];
179	bim_createHistoOfSection16( histogramL, sectionPtrA, imagePtrA );
180	bim_equalize16( imagePtrA, histogramL );
181}
182
183/* ========================================================================= */
184