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_APIEm/DCR.h"
20#include "b_BasicEm/Functions.h"
21
22/* ------------------------------------------------------------------------- */
23
24/* ========================================================================= */
25/*                                                                           */
26/* ---- \ghd{ auxiliary functions } ---------------------------------------- */
27/*                                                                           */
28/* ========================================================================= */
29
30/* ------------------------------------------------------------------------- */
31
32/* ========================================================================= */
33/*                                                                           */
34/* ---- \ghd{ constructor / destructor } ----------------------------------- */
35/*                                                                           */
36/* ========================================================================= */
37
38/* ------------------------------------------------------------------------- */
39
40void bpi_DCR_init( struct bbs_Context* cpA,
41				   struct bpi_DCR* ptrA )
42{
43	ptrA->maxImageWidthE = 0;
44	ptrA->maxImageHeightE = 0;
45	ptrA->imageDataPtrE = NULL;
46	ptrA->imageWidthE = 0;
47	ptrA->imageHeightE = 0;
48	bts_Int16Vec2D_init( &ptrA->offsE );
49	bts_IdCluster2D_init( cpA, &ptrA->mainClusterE );
50	bts_IdCluster2D_init( cpA, &ptrA->sdkClusterE );
51	ptrA->confidenceE = 0;
52	ptrA->approvedE = FALSE;
53	ptrA->idE = 0;
54	ptrA->roiRectE = bts_Int16Rect_create( 0, 0, 0, 0 );
55	bbs_UInt16Arr_init( cpA, &ptrA->cueDataE );
56}
57
58/* ------------------------------------------------------------------------- */
59
60void bpi_DCR_exit( struct bbs_Context* cpA,
61				   struct bpi_DCR* ptrA )
62{
63	ptrA->maxImageWidthE = 0;
64	ptrA->maxImageHeightE = 0;
65	ptrA->imageDataPtrE = NULL;
66	ptrA->imageWidthE = 0;
67	ptrA->imageHeightE = 0;
68	bts_Int16Vec2D_exit( &ptrA->offsE );
69	bts_IdCluster2D_exit( cpA, &ptrA->mainClusterE );
70	bts_IdCluster2D_exit( cpA, &ptrA->sdkClusterE );
71	ptrA->confidenceE = 0;
72	ptrA->approvedE = FALSE;
73	ptrA->idE = 0;
74	bbs_UInt16Arr_exit( cpA, &ptrA->cueDataE );
75}
76
77/* ------------------------------------------------------------------------- */
78
79/* ========================================================================= */
80/*                                                                           */
81/* ---- \ghd{ operators } -------------------------------------------------- */
82/*                                                                           */
83/* ========================================================================= */
84
85/* ------------------------------------------------------------------------- */
86
87/* ========================================================================= */
88/*                                                                           */
89/* ---- \ghd{ query functions } -------------------------------------------- */
90/*                                                                           */
91/* ========================================================================= */
92
93/* ------------------------------------------------------------------------- */
94
95/* ========================================================================= */
96/*                                                                           */
97/* ---- \ghd{ modify functions } ------------------------------------------- */
98/*                                                                           */
99/* ========================================================================= */
100
101/* ------------------------------------------------------------------------- */
102
103void bpi_DCR_create( struct bbs_Context* cpA,
104					 struct bpi_DCR* ptrA,
105					 uint32 imageWidthA,
106					 uint32 imageHeightA,
107					 uint32 cueSizeA,
108					 struct bbs_MemTbl* mtpA )
109{
110	struct bbs_MemTbl memTblL = *mtpA;
111	struct bbs_MemSeg* espL =
112            bbs_MemTbl_fastestSegPtr( cpA, &memTblL,
113                                      bpi_DCR_MAX_CLUSTER_SIZE * bbs_SIZEOF16( struct bts_Int16Vec2D ) );
114	if( bbs_Context_error( cpA ) ) return;
115
116	bts_IdCluster2D_create( cpA, &ptrA->mainClusterE, bpi_DCR_MAX_CLUSTER_SIZE, espL );
117	bts_IdCluster2D_size( cpA, &ptrA->mainClusterE, 0 );
118	if( bbs_Context_error( cpA ) ) return;
119	bts_IdCluster2D_create( cpA, &ptrA->sdkClusterE, bpi_DCR_MAX_SDK_CLUSTER_SIZE, espL );
120	bts_IdCluster2D_size( cpA, &ptrA->sdkClusterE, 0 );
121	if( bbs_Context_error( cpA ) ) return;
122	if( bbs_Context_error( cpA ) ) return;
123	bbs_UInt16Arr_create( cpA, &ptrA->cueDataE, cueSizeA, espL );
124	bbs_UInt16Arr_size( cpA, &ptrA->cueDataE, 0 );
125
126	ptrA->maxImageWidthE = imageWidthA;
127	ptrA->maxImageHeightE = imageHeightA;
128}
129
130/* ------------------------------------------------------------------------- */
131
132/* ========================================================================= */
133/*                                                                           */
134/* ---- \ghd{ I/O } -------------------------------------------------------- */
135/*                                                                           */
136/* ========================================================================= */
137
138/* ------------------------------------------------------------------------- */
139
140/* ========================================================================= */
141/*                                                                           */
142/* ---- \ghd{ exec functions } --------------------------------------------- */
143/*                                                                           */
144/* ========================================================================= */
145
146/* ------------------------------------------------------------------------- */
147
148void bpi_DCR_assignGrayByteImage( struct bbs_Context* cpA,
149								  struct bpi_DCR* ptrA,
150								  const void* bufferPtrA,
151								  uint32 widthA,
152								  uint32 heightA )
153{
154	bbs_DEF_fNameL( "void bpi_DCR_assignGrayByteImage( struct bbs_Context* cpA, struct bpi_DCR* ptrA, const void* bufferPtrA, uint32 widthA, uint32 heightA )" )
155
156	if( widthA > ptrA->maxImageWidthE || heightA > ptrA->maxImageHeightE )
157	{
158		bbs_ERROR5( "%s:\nSize of assigned image (%ix%i) exceeds maximum size defined at DCR initialization (%ix%i).",
159				    fNameL,
160					widthA, heightA,
161					ptrA->maxImageWidthE, ptrA->maxImageHeightE	);
162		return;
163	}
164
165	if( ( widthA & 1 ) != 0 )
166	{
167		bbs_ERROR1( "%s:\nWidth of image must be even.\n", fNameL );
168		return;
169	}
170
171	ptrA->imageDataPtrE = ( void* )bufferPtrA;
172	ptrA->imageWidthE = widthA;
173	ptrA->imageHeightE = heightA;
174
175	/* reset some data */
176	ptrA->roiRectE = bts_Int16Rect_create( 0, 0, widthA, heightA );
177	bts_IdCluster2D_size( cpA, &ptrA->mainClusterE, 0 );
178	bts_IdCluster2D_size( cpA, &ptrA->sdkClusterE, 0 );
179	bbs_UInt16Arr_size( cpA, &ptrA->cueDataE, 0 );
180}
181
182/* ------------------------------------------------------------------------- */
183
184void bpi_DCR_assignGrayByteImageROI( struct bbs_Context* cpA,
185									 struct bpi_DCR* ptrA,
186									 const void* bufferPtrA,
187									 uint32 widthA,
188									 uint32 heightA,
189									 const struct bts_Int16Rect* pRectA )
190{
191	bbs_DEF_fNameL( "void bpi_DCR_assignGrayByteImageROI( struct bpi_DCR* ptrA, const void* bufferPtrA, uint32 widthA, uint32 heightA )" )
192
193	if( widthA > ptrA->maxImageWidthE || heightA > ptrA->maxImageHeightE )
194	{
195		bbs_ERROR5( "%s:\nSize of assigned image (%ix%i) exceeds maximum size defined at DCR initialization (%ix%i).",
196				    fNameL,
197					widthA, heightA,
198					ptrA->maxImageWidthE, ptrA->maxImageHeightE	);
199		return;
200	}
201
202	if( ( widthA & 1 ) != 0 )
203	{
204		bbs_ERROR1( "%s:\nWidth of image must be even.\n",
205				    fNameL );
206		return;
207	}
208
209	if( pRectA->x2E < pRectA->x1E || pRectA->y2E < pRectA->y1E ||
210		pRectA->x1E < 0           || pRectA->y1E < 0 ||
211		pRectA->x2E > ( int32 )widthA || pRectA->y2E > ( int32 )heightA )
212	{
213		bbs_ERROR1( "%s:\nInvalid ROI rectangle.\n", fNameL );
214		return;
215	}
216
217	ptrA->imageDataPtrE = ( void* )bufferPtrA;
218	ptrA->imageWidthE = widthA;
219	ptrA->imageHeightE = heightA;
220
221	/* reset some data */
222	ptrA->roiRectE = *pRectA;
223	bts_IdCluster2D_size( cpA, &ptrA->mainClusterE, 0 );
224	bts_IdCluster2D_size( cpA, &ptrA->sdkClusterE, 0 );
225	bbs_UInt16Arr_size( cpA, &ptrA->cueDataE, 0 );
226}
227
228/* ------------------------------------------------------------------------- */
229
230int32 bpi_DCR_confidence( struct bbs_Context* cpA,
231						  const struct bpi_DCR* ptrA )
232{
233	return ptrA->confidenceE;
234}
235
236/* ------------------------------------------------------------------------- */
237
238/* ========================================================================= */
239