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_ImageEm/UInt32Image.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 bim_UInt32Image_init( struct bbs_Context* cpA,
41						   struct bim_UInt32Image* ptrA )
42{
43	bbs_UInt32Arr_init( cpA, &ptrA->arrE );
44	ptrA->widthE = 0;
45	ptrA->heightE = 0;
46}
47
48/* ------------------------------------------------------------------------- */
49
50void bim_UInt32Image_exit( struct bbs_Context* cpA,
51						   struct bim_UInt32Image* ptrA )
52{
53	bbs_UInt32Arr_exit( cpA, &ptrA->arrE );
54	ptrA->widthE = 0;
55	ptrA->heightE = 0;
56}
57
58/* ------------------------------------------------------------------------- */
59
60/* ========================================================================= */
61/*                                                                           */
62/* ---- \ghd{ operators } -------------------------------------------------- */
63/*                                                                           */
64/* ========================================================================= */
65
66/* ------------------------------------------------------------------------- */
67
68void bim_UInt32Image_copy( struct bbs_Context* cpA,
69						   struct bim_UInt32Image* ptrA,
70						   const struct bim_UInt32Image* srcPtrA )
71{
72#ifdef DEBUG1
73	if( ptrA->arrE.allocatedSizeE < srcPtrA->arrE.allocatedSizeE )
74	{
75		bbs_ERROR0( "void bim_UInt32Image_copy(...):\n"
76				   "Unsufficient allocated memory in destination image." );
77		return;
78	}
79#endif
80	ptrA->widthE  = srcPtrA->widthE;
81	ptrA->heightE = srcPtrA->heightE;
82	bbs_UInt32Arr_copy( cpA, &ptrA->arrE, &srcPtrA->arrE );
83}
84
85/* ------------------------------------------------------------------------- */
86
87flag bim_UInt32Image_equal( struct bbs_Context* cpA,
88						    const struct bim_UInt32Image* ptrA,
89							const struct bim_UInt32Image* srcPtrA )
90{
91	if( ptrA->widthE  != srcPtrA->widthE ) return FALSE;
92	if( ptrA->heightE != srcPtrA->heightE ) return FALSE;
93	return bbs_UInt32Arr_equal( cpA, &ptrA->arrE, &srcPtrA->arrE );
94}
95
96/* ------------------------------------------------------------------------- */
97
98/* ========================================================================= */
99/*                                                                           */
100/* ---- \ghd{ query functions } -------------------------------------------- */
101/*                                                                           */
102/* ========================================================================= */
103
104/* ------------------------------------------------------------------------- */
105
106uint32 bim_UInt32Image_heapSize( struct bbs_Context* cpA,
107								 const struct bim_UInt32Image* ptrA,
108								 uint32 widthA,
109								 uint32 heightA )
110{
111	return bbs_UInt32Arr_heapSize( cpA, &ptrA->arrE, widthA * heightA );
112}
113
114/* ------------------------------------------------------------------------- */
115
116uint32 bim_UInt32Image_checkSum( struct bbs_Context* cpA,
117								 const struct bim_UInt32Image* ptrA )
118{
119	uint32 sumL =0 ;
120	uint32 iL;
121	uint32 sizeL = ptrA->arrE.sizeE;
122	const uint32* ptrL = ptrA->arrE.arrPtrE;
123	for( iL =0; iL < sizeL; iL++ )
124	{
125		sumL += *ptrL++;
126	}
127	return sumL;
128}
129
130/* ------------------------------------------------------------------------- */
131
132/* ========================================================================= */
133/*                                                                           */
134/* ---- \ghd{ modify functions } ------------------------------------------- */
135/*                                                                           */
136/* ========================================================================= */
137
138/* ------------------------------------------------------------------------- */
139
140void bim_UInt32Image_create( struct bbs_Context* cpA,
141							 struct bim_UInt32Image* ptrA,
142						    uint32 widthA,
143							uint32 heightA,
144 					        struct bbs_MemSeg* mspA )
145{
146	if( bbs_Context_error( cpA ) ) return;
147	if( ptrA->arrE.arrPtrE != 0 )
148	{
149		bim_UInt32Image_size( cpA, ptrA, widthA, heightA );
150	}
151	else
152	{
153		bbs_UInt32Arr_create( cpA, &ptrA->arrE, widthA * heightA, mspA );
154		ptrA->widthE  = widthA;
155		ptrA->heightE = heightA;
156	}
157}
158
159/* ------------------------------------------------------------------------- */
160
161void bim_UInt32Image_assignExternalImage( struct bbs_Context* cpA,
162										  struct bim_UInt32Image* ptrA,
163										  struct bim_UInt32Image* srcPtrA )
164{
165	struct bbs_MemSeg sharedSegL = bbs_MemSeg_createShared( cpA, srcPtrA->arrE.arrPtrE, srcPtrA->widthE * srcPtrA->heightE );
166
167	if( ptrA->arrE.arrPtrE != 0 )
168	{
169		bbs_ERROR0( "void bim_UInt32Image_assignExternalImage( ... ): image was already created once" );
170		return;
171	}
172
173	bim_UInt32Image_create( cpA,
174							ptrA,
175					        srcPtrA->widthE,
176						    srcPtrA->heightE,
177						    &sharedSegL );
178}
179
180/* ------------------------------------------------------------------------- */
181
182void bim_UInt32Image_size( struct bbs_Context* cpA,
183						   struct bim_UInt32Image* ptrA,
184						   uint32 widthA,
185						   uint32 heightA )
186{
187	if( ptrA->arrE.allocatedSizeE < widthA * heightA )
188	{
189		bbs_ERROR0( "void bim_UInt32Image_size( struct bim_UInt32Image*, uint32 sizeA ):\n"
190				   "Unsufficient allocated memory" );
191		return;
192	}
193	ptrA->widthE  = widthA;
194	ptrA->heightE = heightA;
195	bbs_UInt32Arr_size( cpA, &ptrA->arrE, widthA * heightA );
196}
197
198/* ------------------------------------------------------------------------- */
199
200/* ========================================================================= */
201/*                                                                           */
202/* ---- \ghd{ I/O } -------------------------------------------------------- */
203/*                                                                           */
204/* ========================================================================= */
205
206/* ------------------------------------------------------------------------- */
207
208uint32 bim_UInt32Image_memSize( struct bbs_Context* cpA,
209							    const struct bim_UInt32Image* ptrA )
210{
211	return  bbs_SIZEOF16( uint32 )
212		  + bbs_SIZEOF16( uint32 ) /* version */
213		  + bbs_SIZEOF16( ptrA->widthE )
214		  + bbs_SIZEOF16( ptrA->heightE )
215		  + bbs_UInt32Arr_memSize( cpA, &ptrA->arrE );
216}
217
218/* ------------------------------------------------------------------------- */
219
220uint32 bim_UInt32Image_memWrite( struct bbs_Context* cpA,
221								 const struct bim_UInt32Image* ptrA,
222								 uint16* memPtrA )
223{
224	uint32 memSizeL = bim_UInt32Image_memSize( cpA, ptrA );
225	memPtrA += bbs_memWrite32( &memSizeL, memPtrA );
226	memPtrA += bbs_memWriteUInt32( bim_UINT32_IMAGE_VERSION, memPtrA );
227	memPtrA += bbs_memWrite32( &ptrA->widthE, memPtrA );
228	memPtrA += bbs_memWrite32( &ptrA->heightE, memPtrA );
229	bbs_UInt32Arr_memWrite( cpA, &ptrA->arrE, memPtrA );
230	return memSizeL;
231}
232
233/* ------------------------------------------------------------------------- */
234
235uint32 bim_UInt32Image_memRead( struct bbs_Context* cpA,
236							    struct bim_UInt32Image* ptrA,
237							   const uint16* memPtrA,
238 					           struct bbs_MemSeg* mspA )
239{
240	uint32 memSizeL, versionL;
241	if( bbs_Context_error( cpA ) ) return 0;
242	memPtrA += bbs_memRead32( &memSizeL, memPtrA );
243	memPtrA += bbs_memReadVersion32( cpA, &versionL, bim_UINT32_IMAGE_VERSION, memPtrA );
244	memPtrA += bbs_memRead32( &ptrA->widthE, memPtrA );
245	memPtrA += bbs_memRead32( &ptrA->heightE, memPtrA );
246	bbs_UInt32Arr_memRead( cpA, &ptrA->arrE, memPtrA, mspA );
247
248	if( memSizeL != bim_UInt32Image_memSize( cpA, ptrA ) )
249	{
250		bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bim_UInt32Image_memRead( const struct bim_UInt32Image* ptrA, const void* memPtrA ):\n"
251                   "size mismatch" );
252		return 0;
253	}
254	return memSizeL;
255}
256
257/* ------------------------------------------------------------------------- */
258
259/* ========================================================================= */
260/*                                                                           */
261/* ---- \ghd{ exec functions } --------------------------------------------- */
262/*                                                                           */
263/* ========================================================================= */
264
265/* ------------------------------------------------------------------------- */
266
267void bim_UInt32Image_setAllPixels( struct bbs_Context* cpA,
268								   struct bim_UInt32Image* ptrA,
269								   uint32 valueA,
270								   int32 bbpA )
271{
272	long iL;
273	uint32* ptrL = ptrA->arrE.arrPtrE;
274	for( iL = ptrA->widthE * ptrA->heightE; iL > 0; iL-- )
275	{
276		*ptrL++ = valueA;
277	}
278}
279
280/* ------------------------------------------------------------------------- */
281
282/* ========================================================================= */
283
284
285