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/Math.h"
21 #include "b_BitFeatureEm/L01Tld1x1Ftr.h"
22 #include "b_BitFeatureEm/Functions.h"
23
24 /* ------------------------------------------------------------------------- */
25
26 /* ========================================================================= */
27 /* */
28 /* ---- \ghd{ auxiliary functions } ---------------------------------------- */
29 /* */
30 /* ========================================================================= */
31
32 /* ------------------------------------------------------------------------- */
33
34 /* ========================================================================= */
35 /* */
36 /* ---- \ghd{ constructor / destructor } ----------------------------------- */
37 /* */
38 /* ========================================================================= */
39
40 /* ------------------------------------------------------------------------- */
41
bbf_L01Tld1x1Ftr_init(struct bbs_Context * cpA,struct bbf_L01Tld1x1Ftr * ptrA)42 void bbf_L01Tld1x1Ftr_init( struct bbs_Context* cpA,
43 struct bbf_L01Tld1x1Ftr* ptrA )
44 {
45 bbf_Feature_init( cpA, &ptrA->baseE );
46 ptrA->baseE.typeE = ( uint32 )bbf_FT_L01_TLD_1X1_FTR;
47 ptrA->baseE.vpActivityE = bbf_L01Tld1x1Ftr_activity;
48 bbs_UInt32Arr_init( cpA, &ptrA->dataArrE );
49 ptrA->activityFactorE = 0;
50 }
51
52 /* ------------------------------------------------------------------------- */
53
bbf_L01Tld1x1Ftr_exit(struct bbs_Context * cpA,struct bbf_L01Tld1x1Ftr * ptrA)54 void bbf_L01Tld1x1Ftr_exit( struct bbs_Context* cpA,
55 struct bbf_L01Tld1x1Ftr* ptrA )
56 {
57 bbf_Feature_exit( cpA, &ptrA->baseE );
58 bbs_UInt32Arr_exit( cpA, &ptrA->dataArrE );
59 ptrA->activityFactorE = 0;
60 }
61
62 /* ------------------------------------------------------------------------- */
63
64 /* ========================================================================= */
65 /* */
66 /* ---- \ghd{ operators } -------------------------------------------------- */
67 /* */
68 /* ========================================================================= */
69
70 /* ------------------------------------------------------------------------- */
71
bbf_L01Tld1x1Ftr_copy(struct bbs_Context * cpA,struct bbf_L01Tld1x1Ftr * ptrA,const struct bbf_L01Tld1x1Ftr * srcPtrA)72 void bbf_L01Tld1x1Ftr_copy( struct bbs_Context* cpA,
73 struct bbf_L01Tld1x1Ftr* ptrA,
74 const struct bbf_L01Tld1x1Ftr* srcPtrA )
75 {
76 bbf_Feature_copy( cpA, &ptrA->baseE, &srcPtrA->baseE );
77 bbs_UInt32Arr_copy( cpA, &ptrA->dataArrE, &srcPtrA->dataArrE );
78 ptrA->activityFactorE = srcPtrA->activityFactorE;
79 }
80
81 /* ------------------------------------------------------------------------- */
82
bbf_L01Tld1x1Ftr_equal(struct bbs_Context * cpA,const struct bbf_L01Tld1x1Ftr * ptrA,const struct bbf_L01Tld1x1Ftr * srcPtrA)83 flag bbf_L01Tld1x1Ftr_equal( struct bbs_Context* cpA,
84 const struct bbf_L01Tld1x1Ftr* ptrA,
85 const struct bbf_L01Tld1x1Ftr* srcPtrA )
86 {
87 if( !bbf_Feature_equal( cpA, &ptrA->baseE, &srcPtrA->baseE ) ) return FALSE;
88 if( !bbs_UInt32Arr_equal( cpA, &ptrA->dataArrE, &srcPtrA->dataArrE ) ) return FALSE;
89 if( ptrA->activityFactorE != srcPtrA->activityFactorE ) return FALSE;
90 return TRUE;
91 }
92
93 /* ------------------------------------------------------------------------- */
94
95 /* ========================================================================= */
96 /* */
97 /* ---- \ghd{ query functions } -------------------------------------------- */
98 /* */
99 /* ========================================================================= */
100
101 /* ------------------------------------------------------------------------- */
102
103 /* ========================================================================= */
104 /* */
105 /* ---- \ghd{ modify functions } ------------------------------------------- */
106 /* */
107 /* ========================================================================= */
108
109 /* ------------------------------------------------------------------------- */
110
111 /* ========================================================================= */
112 /* */
113 /* ---- \ghd{ I/O } -------------------------------------------------------- */
114 /* */
115 /* ========================================================================= */
116
117 /* ------------------------------------------------------------------------- */
118
bbf_L01Tld1x1Ftr_memSize(struct bbs_Context * cpA,const struct bbf_L01Tld1x1Ftr * ptrA)119 uint32 bbf_L01Tld1x1Ftr_memSize( struct bbs_Context* cpA,
120 const struct bbf_L01Tld1x1Ftr* ptrA )
121 {
122 uint32 memSizeL = bbs_SIZEOF16( uint32 ) +
123 bbs_SIZEOF16( uint32 ); /* version */
124
125 memSizeL += bbf_Feature_memSize( cpA, &ptrA->baseE );
126 memSizeL += bbs_UInt32Arr_memSize( cpA, &ptrA->dataArrE );
127 memSizeL += bbs_SIZEOF16( ptrA->activityFactorE );
128
129 return memSizeL;
130 }
131
132 /* ------------------------------------------------------------------------- */
133
bbf_L01Tld1x1Ftr_memWrite(struct bbs_Context * cpA,const struct bbf_L01Tld1x1Ftr * ptrA,uint16 * memPtrA)134 uint32 bbf_L01Tld1x1Ftr_memWrite( struct bbs_Context* cpA,
135 const struct bbf_L01Tld1x1Ftr* ptrA,
136 uint16* memPtrA )
137 {
138 uint32 memSizeL = bbf_L01Tld1x1Ftr_memSize( cpA, ptrA );
139 memPtrA += bbs_memWrite32( &memSizeL, memPtrA );
140 memPtrA += bbs_memWriteUInt32( bbf_L01_TLD_1X1_FTR_VERSION, memPtrA );
141 memPtrA += bbf_Feature_memWrite( cpA, &ptrA->baseE, memPtrA );
142 memPtrA += bbs_UInt32Arr_memWrite( cpA, &ptrA->dataArrE, memPtrA );
143 memPtrA += bbs_memWrite32( &ptrA->activityFactorE, memPtrA );
144 return memSizeL;
145 }
146
147 /* ------------------------------------------------------------------------- */
148
bbf_L01Tld1x1Ftr_memRead(struct bbs_Context * cpA,struct bbf_L01Tld1x1Ftr * ptrA,const uint16 * memPtrA,struct bbs_MemTbl * mtpA)149 uint32 bbf_L01Tld1x1Ftr_memRead( struct bbs_Context* cpA,
150 struct bbf_L01Tld1x1Ftr* ptrA,
151 const uint16* memPtrA,
152 struct bbs_MemTbl* mtpA )
153 {
154 uint32 memSizeL, versionL;
155 struct bbs_MemTbl memTblL = *mtpA;
156 struct bbs_MemSeg* espL = bbs_MemTbl_fastestSegPtr( cpA, &memTblL, 0 );
157 if( bbs_Context_error( cpA ) ) return 0;
158 memPtrA += bbs_memRead32( &memSizeL, memPtrA );
159 memPtrA += bbs_memReadVersion32( cpA, &versionL, bbf_L01_TLD_1X1_FTR_VERSION, memPtrA );
160 memPtrA += bbf_Feature_memRead( cpA, &ptrA->baseE, memPtrA );
161 memPtrA += bbs_UInt32Arr_memRead( cpA, &ptrA->dataArrE, memPtrA, espL );
162 memPtrA += bbs_memRead32( &ptrA->activityFactorE, memPtrA );
163 if( memSizeL != bbf_L01Tld1x1Ftr_memSize( cpA, ptrA ) )
164 {
165 bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bbf_L01Tld1x1Ftr_memRead( struct bem_ScanGradientMove* ptrA, const uint16* memPtrA ):\n"
166 "size mismatch" );
167 return 0;
168 }
169
170 return memSizeL;
171 }
172
173 /* ------------------------------------------------------------------------- */
174
175 /* ========================================================================= */
176 /* */
177 /* ---- \ghd{ exec functions } --------------------------------------------- */
178 /* */
179 /* ========================================================================= */
180
181 /* ------------------------------------------------------------------------- */
182
bbf_L01Tld1x1Ftr_activity(const struct bbf_Feature * ptrA,const uint32 * patchA)183 int32 bbf_L01Tld1x1Ftr_activity( const struct bbf_Feature* ptrA, const uint32* patchA )
184 {
185 const struct bbf_L01Tld1x1Ftr* ptrL = ( struct bbf_L01Tld1x1Ftr* )ptrA;
186
187 int32 iL;
188
189 const uint32* dataPtrL = ptrL->dataArrE.arrPtrE;
190 const uint32* patchL = patchA;
191
192 uint32 bsL = 0;
193
194 for( iL = ptrL->baseE.patchWidthE >> 2; iL > 0; iL-- )
195 {
196 uint32 vL;
197 vL = ( patchL[ 0 ] ^ dataPtrL[ 0 ] ) & dataPtrL[ 1 ];
198 bsL += bbf_BIT_SUM_32( vL );
199
200 vL = ( patchL[ 1 ] ^ dataPtrL[ 2 ] ) & dataPtrL[ 3 ];
201 bsL += bbf_BIT_SUM_32( vL );
202
203 vL = ( patchL[ 2 ] ^ dataPtrL[ 4 ] ) & dataPtrL[ 5 ];
204 bsL += bbf_BIT_SUM_32( vL );
205
206 vL = ( patchL[ 3 ] ^ dataPtrL[ 6 ] ) & dataPtrL[ 7 ];
207 bsL += bbf_BIT_SUM_32( vL );
208
209 dataPtrL += 8;
210 patchL += 4;
211 }
212
213 return bsL * ptrL->activityFactorE;
214 }
215
216 /* ------------------------------------------------------------------------- */
217
218 /* ========================================================================= */
219
220