1 /*******************************************************************************
2 * Copyright 2016-2019 Intel Corporation.
3 *
4 * This software and the related documents are Intel copyrighted materials, and
5 * your use of them is governed by the express license under which they were
6 * provided to you (License). Unless the License provides otherwise, you may not
7 * use, modify, copy, publish, distribute, disclose or transmit this software or
8 * the related documents without Intel's prior written permission.
9 *
10 * This software and the related documents are provided as is, with no express
11 * or implied warranties, other than those that are expressly stated in the
12 * License.
13 *******************************************************************************/
14
15 #include "iw/iw_image_op.h"
16 #include "iw_owni.h"
17
18 IW_DECL(IppStatus) llwiCopy(const void *pSrc, IwSize srcStep, void *pDst, IwSize dstStep,
19 IwiSize size, int typeSize, int channels);
20
21 IW_DECL(IppStatus) llwiCopyMakeBorder(const void *pSrc, IwSize srcStep, void *pDst, IwSize dstStep,
22 IwiSize size, IppDataType dataType, int channels, IwiBorderSize borderSize, IwiBorderType border, const Ipp64f *pBorderVal);
23
24 /**/////////////////////////////////////////////////////////////////////////////
25 // iwiCreateBorder
26 ///////////////////////////////////////////////////////////////////////////// */
iwiCreateBorder(const IwiImage * pSrcImage,IwiImage * pDstImage,IwiBorderSize borderSize,IwiBorderType border,const Ipp64f * pBorderVal,const IwiCreateBorderParams * pAuxParams,const IwiTile * pTile)27 IW_DECL(IppStatus) iwiCreateBorder(const IwiImage *pSrcImage, IwiImage *pDstImage, IwiBorderSize borderSize, IwiBorderType border, const Ipp64f *pBorderVal, const IwiCreateBorderParams *pAuxParams, const IwiTile *pTile)
28 {
29 IppStatus status;
30
31 (void)pAuxParams;
32
33 status = owniCheckImageRead(pSrcImage);
34 if(status)
35 return status;
36 status = owniCheckImageWrite(pDstImage);
37 if(status)
38 return status;
39
40 if(pSrcImage->m_typeSize != pDstImage->m_typeSize ||
41 pSrcImage->m_channels != pDstImage->m_channels)
42 return ippStsBadArgErr;
43
44 if((border&ippBorderInMem) == ippBorderInMem)
45 return ippStsNoOperation;
46
47 if(borderSize.top > pDstImage->m_inMemSize.top ||
48 borderSize.left > pDstImage->m_inMemSize.left)
49 return ippStsSizeErr;
50
51 {
52 const void *pSrc = pSrcImage->m_ptrConst;
53 void *pDst = pDstImage->m_ptr;
54 IwiSize size = owniGetMinSize(&pSrcImage->m_size, &pDstImage->m_size);
55
56 if(pDstImage->m_size.width + pDstImage->m_inMemSize.right < size.width + borderSize.right ||
57 pDstImage->m_size.height + pDstImage->m_inMemSize.bottom < size.height + borderSize.bottom)
58 return ippStsSizeErr;
59
60 if(pTile && pTile->m_initialized != ownTileInitNone)
61 {
62 if(OWN_GET_PURE_BORDER(border) == ippBorderWrap)
63 return ippStsNotSupportedModeErr;
64
65 if(pTile->m_initialized == ownTileInitSimple)
66 {
67 IwiRoi dstRoi = pTile->m_dstRoi;
68 IwiBorderSize tileBorderSize = borderSize;
69
70 if(!owniTile_BoundToSize(&dstRoi, &size))
71 return ippStsNoOperation;
72
73 if(border == ippBorderMirror)
74 {
75 tileBorderSize.left = borderSize.left+1;
76 tileBorderSize.top = borderSize.top+1;
77 tileBorderSize.right = borderSize.right+1;
78 tileBorderSize.bottom = borderSize.bottom+1;
79 }
80 owniTile_CorrectBordersOverlap(&dstRoi, &size, &border, &tileBorderSize, &tileBorderSize, &pSrcImage->m_size);
81 owniTile_GetTileBorder(&border, &dstRoi, &borderSize, &pSrcImage->m_size);
82
83 pSrc = iwiImage_GetPtrConst(pSrcImage, dstRoi.y, dstRoi.x, 0);
84 pDst = iwiImage_GetPtr(pDstImage, dstRoi.y, dstRoi.x, 0);
85 }
86 else if(pTile->m_initialized == ownTileInitPipe)
87 {
88 IwiRoi srcLim;
89 IwiRoi dstLim;
90 iwiTilePipeline_GetBoundedSrcRoi(pTile, &srcLim);
91 iwiTilePipeline_GetBoundedDstRoi(pTile, &dstLim);
92
93 pSrc = iwiImage_GetPtrConst(pSrcImage, srcLim.y, srcLim.x, 0);
94 pDst = iwiImage_GetPtr(pDstImage, dstLim.y, dstLim.x, 0);
95 iwiTilePipeline_GetTileBorder(pTile, &border);
96
97 size = owniGetMinSizeFromRect(&srcLim, &dstLim);
98 }
99 else
100 return ippStsContextMatchErr;
101 }
102
103 return llwiCopyMakeBorder(pSrc, pSrcImage->m_step, pDst, pDstImage->m_step, size, pSrcImage->m_dataType, pSrcImage->m_channels, borderSize, border, pBorderVal);
104 }
105 }
106
107
108 /**/////////////////////////////////////////////////////////////////////////////
109 // Low-Level Wrappers
110 ///////////////////////////////////////////////////////////////////////////// */
llwiCopyMakeBorder(const void * pSrc,IwSize srcStep,void * pDst,IwSize dstStep,IwiSize size,IppDataType dataType,int channels,IwiBorderSize borderSize,IwiBorderType border,const Ipp64f * pBorderVal)111 IW_DECL(IppStatus) llwiCopyMakeBorder(const void *pSrc, IwSize srcStep, void *pDst, IwSize dstStep,
112 IwiSize size, IppDataType dataType, int channels, IwiBorderSize borderSize, IwiBorderType border, const Ipp64f *pBorderVal)
113 {
114 IppStatus status;
115 Ipp64f borderVal[4] = {0};
116 int depth = iwTypeToSize(dataType);
117
118 if(border & ippBorderInMemLeft)
119 {
120 pSrc = owniShiftPtr(pSrc, srcStep, depth, channels, -((IwSize)borderSize.left), 0);
121 pDst = owniShiftPtr(pDst, dstStep, depth, channels, -((IwSize)borderSize.left), 0);
122 size.width += borderSize.left;
123 borderSize.left = 0;
124 }
125 if(border & ippBorderInMemTop)
126 {
127 pSrc = owniShiftPtr(pSrc, srcStep, depth, channels, 0, -((IwSize)borderSize.top));
128 pDst = owniShiftPtr(pDst, dstStep, depth, channels, 0, -((IwSize)borderSize.top));
129 size.height += borderSize.top;
130 borderSize.top = 0;
131 }
132 if(border & ippBorderInMemRight)
133 {
134 size.width += borderSize.right;
135 borderSize.right = 0;
136 }
137 if(border & ippBorderInMemBottom)
138 {
139 size.height += borderSize.bottom;
140 borderSize.bottom = 0;
141 }
142 if(!borderSize.left && !borderSize.right && !borderSize.top && !borderSize.bottom)
143 return llwiCopy(pSrc, srcStep, pDst, dstStep, size, depth, channels);
144
145 border = OWN_GET_PURE_BORDER(border);
146
147 if(pSrc == pDst)
148 {
149 IwiSize dstSize = size;
150 dstSize.width += (borderSize.right + borderSize.left);
151 dstSize.height += (borderSize.bottom + borderSize.top);
152
153 if(border == ippBorderConst)
154 {
155 #if IPP_VERSION_COMPLEX >= 20170002
156 switch(dataType)
157 {
158 case ipp8u:
159 switch(channels)
160 {
161 case 1: status = ippiCopyConstBorder_8u_C1IR_L((Ipp8u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VAL(8u)); break;
162 case 3: status = ippiCopyConstBorder_8u_C3IR_L((Ipp8u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(8u, 3)); break;
163 case 4: status = ippiCopyConstBorder_8u_C4IR_L((Ipp8u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(8u, 4)); break;
164 default: status = ippStsNumChannelsErr; break;
165 }
166 break;
167 case ipp16u:
168 switch(channels)
169 {
170 case 1: status = ippiCopyConstBorder_16u_C1IR_L((Ipp16u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VAL(16u)); break;
171 case 3: status = ippiCopyConstBorder_16u_C3IR_L((Ipp16u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(16u, 3)); break;
172 case 4: status = ippiCopyConstBorder_16u_C4IR_L((Ipp16u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(16u, 4)); break;
173 default: status = ippStsNumChannelsErr; break;
174 }
175 break;
176 case ipp16s:
177 switch(channels)
178 {
179 case 1: status = ippiCopyConstBorder_16s_C1IR_L((Ipp16s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VAL(16s)); break;
180 case 3: status = ippiCopyConstBorder_16s_C3IR_L((Ipp16s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(16s, 3)); break;
181 case 4: status = ippiCopyConstBorder_16s_C4IR_L((Ipp16s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(16s, 4)); break;
182 default: status = ippStsNumChannelsErr; break;
183 }
184 break;
185 case ipp32s:
186 switch(channels)
187 {
188 case 1: status = ippiCopyConstBorder_32s_C1IR_L((Ipp32s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VAL(32s)); break;
189 case 3: status = ippiCopyConstBorder_32s_C3IR_L((Ipp32s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(32s, 3)); break;
190 case 4: status = ippiCopyConstBorder_32s_C4IR_L((Ipp32s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(32s, 4)); break;
191 default: status = ippStsNumChannelsErr; break;
192 }
193 break;
194 case ipp32f:
195 switch(channels)
196 {
197 case 1: status = ippiCopyConstBorder_32f_C1IR_L((Ipp32f*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VAL(32f)); break;
198 case 3: status = ippiCopyConstBorder_32f_C3IR_L((Ipp32f*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(32f, 3)); break;
199 case 4: status = ippiCopyConstBorder_32f_C4IR_L((Ipp32f*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(32f, 4)); break;
200 default: status = ippStsNumChannelsErr; break;
201 }
202 break;
203 default: status = ippStsDataTypeErr; break;
204 }
205 #else
206 return ippStsInplaceModeNotSupportedErr;
207 #endif
208 }
209 else if(border == ippBorderRepl)
210 {
211 switch(dataType)
212 {
213 case ipp8u:
214 switch(channels)
215 {
216 case 1: status = ippiCopyReplicateBorder_8u_C1IR_L((Ipp8u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
217 case 3: status = ippiCopyReplicateBorder_8u_C3IR_L((Ipp8u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
218 case 4: status = ippiCopyReplicateBorder_8u_C4IR_L((Ipp8u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
219 default: status = ippStsNumChannelsErr; break;
220 }
221 break;
222 case ipp16u:
223 switch(channels)
224 {
225 case 1: status = ippiCopyReplicateBorder_16u_C1IR_L((Ipp16u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
226 case 3: status = ippiCopyReplicateBorder_16u_C3IR_L((Ipp16u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
227 case 4: status = ippiCopyReplicateBorder_16u_C4IR_L((Ipp16u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
228 default: status = ippStsNumChannelsErr; break;
229 }
230 break;
231 case ipp16s:
232 switch(channels)
233 {
234 case 1: status = ippiCopyReplicateBorder_16s_C1IR_L((Ipp16s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
235 case 3: status = ippiCopyReplicateBorder_16s_C3IR_L((Ipp16s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
236 case 4: status = ippiCopyReplicateBorder_16s_C4IR_L((Ipp16s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
237 default: status = ippStsNumChannelsErr; break;
238 }
239 break;
240 case ipp32s:
241 switch(channels)
242 {
243 case 1: status = ippiCopyReplicateBorder_32s_C1IR_L((Ipp32s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
244 case 3: status = ippiCopyReplicateBorder_32s_C3IR_L((Ipp32s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
245 case 4: status = ippiCopyReplicateBorder_32s_C4IR_L((Ipp32s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
246 default: status = ippStsNumChannelsErr; break;
247 }
248 break;
249 case ipp32f:
250 switch(channels)
251 {
252 case 1: status = ippiCopyReplicateBorder_32f_C1IR_L((Ipp32f*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
253 case 3: status = ippiCopyReplicateBorder_32f_C3IR_L((Ipp32f*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
254 case 4: status = ippiCopyReplicateBorder_32f_C4IR_L((Ipp32f*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
255 default: status = ippStsNumChannelsErr; break;
256 }
257 break;
258 default: status = ippStsDataTypeErr; break;
259 }
260 }
261 else if(border == ippBorderMirror)
262 {
263 switch(dataType)
264 {
265 case ipp8u:
266 switch(channels)
267 {
268 case 1: status = ippiCopyMirrorBorder_8u_C1IR_L((Ipp8u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
269 case 3: status = ippiCopyMirrorBorder_8u_C3IR_L((Ipp8u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
270 case 4: status = ippiCopyMirrorBorder_8u_C4IR_L((Ipp8u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
271 default: status = ippStsNumChannelsErr; break;
272 }
273 break;
274 case ipp16u:
275 switch(channels)
276 {
277 case 1: status = ippiCopyMirrorBorder_16u_C1IR_L((Ipp16u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
278 case 3: status = ippiCopyMirrorBorder_16u_C3IR_L((Ipp16u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
279 case 4: status = ippiCopyMirrorBorder_16u_C4IR_L((Ipp16u*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
280 default: status = ippStsNumChannelsErr; break;
281 }
282 break;
283 case ipp16s:
284 switch(channels)
285 {
286 case 1: status = ippiCopyMirrorBorder_16s_C1IR_L((Ipp16s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
287 case 3: status = ippiCopyMirrorBorder_16s_C3IR_L((Ipp16s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
288 case 4: status = ippiCopyMirrorBorder_16s_C4IR_L((Ipp16s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
289 default: status = ippStsNumChannelsErr; break;
290 }
291 break;
292 case ipp32s:
293 switch(channels)
294 {
295 case 1: status = ippiCopyMirrorBorder_32s_C1IR_L((Ipp32s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
296 case 3: status = ippiCopyMirrorBorder_32s_C3IR_L((Ipp32s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
297 case 4: status = ippiCopyMirrorBorder_32s_C4IR_L((Ipp32s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
298 default: status = ippStsNumChannelsErr; break;
299 }
300 break;
301 case ipp32f:
302 switch(channels)
303 {
304 case 1: status = ippiCopyMirrorBorder_32f_C1IR_L((Ipp32f*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
305 case 3: status = ippiCopyMirrorBorder_32f_C3IR_L((Ipp32f*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
306 case 4: status = ippiCopyMirrorBorder_32f_C4IR_L((Ipp32f*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
307 default: status = ippStsNumChannelsErr; break;
308 }
309 break;
310 default: status = ippStsDataTypeErr; break;
311 }
312 }
313 else if(border == ippBorderWrap)
314 {
315 switch(dataType)
316 {
317 case ipp32s:
318 switch(channels)
319 {
320 case 1: status = ippiCopyWrapBorder_32s_C1IR_L((Ipp32s*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
321 default: status = ippStsNumChannelsErr; break;
322 }
323 break;
324 case ipp32f:
325 switch(channels)
326 {
327 case 1: status = ippiCopyWrapBorder_32f_C1IR_L((Ipp32f*)pSrc, srcStep, size, dstSize, borderSize.top, borderSize.left); break;
328 default: status = ippStsNumChannelsErr; break;
329 }
330 break;
331 default: status = ippStsDataTypeErr; break;
332 }
333 }
334 else
335 status = ippStsBorderErr;
336 }
337 else
338 {
339 IwiSize dstSize = size;
340 pDst = owniShiftPtr(pDst, dstStep, depth, channels, -(IwSize)borderSize.left, -(IwSize)borderSize.top);
341 dstSize.width += (borderSize.right + borderSize.left);
342 dstSize.height += (borderSize.bottom + borderSize.top);
343
344 if(border == ippBorderConst)
345 {
346 switch(dataType)
347 {
348 case ipp8u:
349 switch(channels)
350 {
351 case 1: status = ippiCopyConstBorder_8u_C1R_L((Ipp8u*)pSrc, srcStep, size, (Ipp8u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VAL(8u)); break;
352 case 3: status = ippiCopyConstBorder_8u_C3R_L((Ipp8u*)pSrc, srcStep, size, (Ipp8u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(8u, 3)); break;
353 case 4: status = ippiCopyConstBorder_8u_C4R_L((Ipp8u*)pSrc, srcStep, size, (Ipp8u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(8u, 4)); break;
354 default: status = ippStsNumChannelsErr; break;
355 }
356 break;
357 case ipp16u:
358 switch(channels)
359 {
360 case 1: status = ippiCopyConstBorder_16u_C1R_L((Ipp16u*)pSrc, srcStep, size, (Ipp16u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VAL(16u)); break;
361 case 3: status = ippiCopyConstBorder_16u_C3R_L((Ipp16u*)pSrc, srcStep, size, (Ipp16u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(16u, 3)); break;
362 case 4: status = ippiCopyConstBorder_16u_C4R_L((Ipp16u*)pSrc, srcStep, size, (Ipp16u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(16u, 4)); break;
363 default: status = ippStsNumChannelsErr; break;
364 }
365 break;
366 case ipp16s:
367 switch(channels)
368 {
369 case 1: status = ippiCopyConstBorder_16s_C1R_L((Ipp16s*)pSrc, srcStep, size, (Ipp16s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VAL(16s)); break;
370 case 3: status = ippiCopyConstBorder_16s_C3R_L((Ipp16s*)pSrc, srcStep, size, (Ipp16s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(16s, 3)); break;
371 case 4: status = ippiCopyConstBorder_16s_C4R_L((Ipp16s*)pSrc, srcStep, size, (Ipp16s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(16s, 4)); break;
372 default: status = ippStsNumChannelsErr; break;
373 }
374 break;
375 case ipp32s:
376 switch(channels)
377 {
378 case 1: status = ippiCopyConstBorder_32s_C1R_L((Ipp32s*)pSrc, srcStep, size, (Ipp32s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VAL(32s)); break;
379 case 3: status = ippiCopyConstBorder_32s_C3R_L((Ipp32s*)pSrc, srcStep, size, (Ipp32s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(32s, 3)); break;
380 case 4: status = ippiCopyConstBorder_32s_C4R_L((Ipp32s*)pSrc, srcStep, size, (Ipp32s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(32s, 4)); break;
381 default: status = ippStsNumChannelsErr; break;
382 }
383 break;
384 case ipp32f:
385 switch(channels)
386 {
387 case 1: status = ippiCopyConstBorder_32f_C1R_L((Ipp32f*)pSrc, srcStep, size, (Ipp32f*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VAL(32f)); break;
388 case 3: status = ippiCopyConstBorder_32f_C3R_L((Ipp32f*)pSrc, srcStep, size, (Ipp32f*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(32f, 3)); break;
389 case 4: status = ippiCopyConstBorder_32f_C4R_L((Ipp32f*)pSrc, srcStep, size, (Ipp32f*)pDst, dstStep, dstSize, borderSize.top, borderSize.left, OWN_GET_BORDER_VALP(32f, 4)); break;
390 default: status = ippStsNumChannelsErr; break;
391 }
392 break;
393 default: status = ippStsDataTypeErr; break;
394 }
395 }
396 else if(border == ippBorderRepl)
397 {
398 switch(dataType)
399 {
400 case ipp8u:
401 switch(channels)
402 {
403 case 1: status = ippiCopyReplicateBorder_8u_C1R_L((Ipp8u*)pSrc, srcStep, size, (Ipp8u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
404 case 3: status = ippiCopyReplicateBorder_8u_C3R_L((Ipp8u*)pSrc, srcStep, size, (Ipp8u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
405 case 4: status = ippiCopyReplicateBorder_8u_C4R_L((Ipp8u*)pSrc, srcStep, size, (Ipp8u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
406 default: status = ippStsNumChannelsErr; break;
407 }
408 break;
409 case ipp16u:
410 switch(channels)
411 {
412 case 1: status = ippiCopyReplicateBorder_16u_C1R_L((Ipp16u*)pSrc, srcStep, size, (Ipp16u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
413 case 3: status = ippiCopyReplicateBorder_16u_C3R_L((Ipp16u*)pSrc, srcStep, size, (Ipp16u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
414 case 4: status = ippiCopyReplicateBorder_16u_C4R_L((Ipp16u*)pSrc, srcStep, size, (Ipp16u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
415 default: status = ippStsNumChannelsErr; break;
416 }
417 break;
418 case ipp16s:
419 switch(channels)
420 {
421 case 1: status = ippiCopyReplicateBorder_16s_C1R_L((Ipp16s*)pSrc, srcStep, size, (Ipp16s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
422 case 3: status = ippiCopyReplicateBorder_16s_C3R_L((Ipp16s*)pSrc, srcStep, size, (Ipp16s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
423 case 4: status = ippiCopyReplicateBorder_16s_C4R_L((Ipp16s*)pSrc, srcStep, size, (Ipp16s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
424 default: status = ippStsNumChannelsErr; break;
425 }
426 break;
427 case ipp32s:
428 switch(channels)
429 {
430 case 1: status = ippiCopyReplicateBorder_32s_C1R_L((Ipp32s*)pSrc, srcStep, size, (Ipp32s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
431 case 3: status = ippiCopyReplicateBorder_32s_C3R_L((Ipp32s*)pSrc, srcStep, size, (Ipp32s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
432 case 4: status = ippiCopyReplicateBorder_32s_C4R_L((Ipp32s*)pSrc, srcStep, size, (Ipp32s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
433 default: status = ippStsNumChannelsErr; break;
434 }
435 break;
436 case ipp32f:
437 switch(channels)
438 {
439 case 1: status = ippiCopyReplicateBorder_32f_C1R_L((Ipp32f*)pSrc, srcStep, size, (Ipp32f*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
440 case 3: status = ippiCopyReplicateBorder_32f_C3R_L((Ipp32f*)pSrc, srcStep, size, (Ipp32f*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
441 case 4: status = ippiCopyReplicateBorder_32f_C4R_L((Ipp32f*)pSrc, srcStep, size, (Ipp32f*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
442 default: status = ippStsNumChannelsErr; break;
443 }
444 break;
445 default: status = ippStsDataTypeErr; break;
446 }
447 }
448 else if(border == ippBorderMirror)
449 {
450 switch(dataType)
451 {
452 case ipp8u:
453 switch(channels)
454 {
455 case 1: status = ippiCopyMirrorBorder_8u_C1R_L((Ipp8u*)pSrc, srcStep, size, (Ipp8u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
456 case 3: status = ippiCopyMirrorBorder_8u_C3R_L((Ipp8u*)pSrc, srcStep, size, (Ipp8u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
457 case 4: status = ippiCopyMirrorBorder_8u_C4R_L((Ipp8u*)pSrc, srcStep, size, (Ipp8u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
458 default: status = ippStsNumChannelsErr; break;
459 }
460 break;
461 case ipp16u:
462 switch(channels)
463 {
464 case 1: status = ippiCopyMirrorBorder_16u_C1R_L((Ipp16u*)pSrc, srcStep, size, (Ipp16u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
465 case 3: status = ippiCopyMirrorBorder_16u_C3R_L((Ipp16u*)pSrc, srcStep, size, (Ipp16u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
466 case 4: status = ippiCopyMirrorBorder_16u_C4R_L((Ipp16u*)pSrc, srcStep, size, (Ipp16u*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
467 default: status = ippStsNumChannelsErr; break;
468 }
469 break;
470 case ipp16s:
471 switch(channels)
472 {
473 case 1: status = ippiCopyMirrorBorder_16s_C1R_L((Ipp16s*)pSrc, srcStep, size, (Ipp16s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
474 case 3: status = ippiCopyMirrorBorder_16s_C3R_L((Ipp16s*)pSrc, srcStep, size, (Ipp16s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
475 case 4: status = ippiCopyMirrorBorder_16s_C4R_L((Ipp16s*)pSrc, srcStep, size, (Ipp16s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
476 default: status = ippStsNumChannelsErr; break;
477 }
478 break;
479 case ipp32s:
480 switch(channels)
481 {
482 case 1: status = ippiCopyMirrorBorder_32s_C1R_L((Ipp32s*)pSrc, srcStep, size, (Ipp32s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
483 case 3: status = ippiCopyMirrorBorder_32s_C3R_L((Ipp32s*)pSrc, srcStep, size, (Ipp32s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
484 case 4: status = ippiCopyMirrorBorder_32s_C4R_L((Ipp32s*)pSrc, srcStep, size, (Ipp32s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
485 default: status = ippStsNumChannelsErr; break;
486 }
487 break;
488 case ipp32f:
489 switch(channels)
490 {
491 case 1: status = ippiCopyMirrorBorder_32f_C1R_L((Ipp32f*)pSrc, srcStep, size, (Ipp32f*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
492 case 3: status = ippiCopyMirrorBorder_32f_C3R_L((Ipp32f*)pSrc, srcStep, size, (Ipp32f*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
493 case 4: status = ippiCopyMirrorBorder_32f_C4R_L((Ipp32f*)pSrc, srcStep, size, (Ipp32f*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
494 default: status = ippStsNumChannelsErr; break;
495 }
496 break;
497 default: status = ippStsDataTypeErr; break;
498 }
499 }
500 else if(border == ippBorderWrap)
501 {
502 switch(dataType)
503 {
504 case ipp32s:
505 switch(channels)
506 {
507 case 1: status = ippiCopyWrapBorder_32s_C1R_L((Ipp32s*)pSrc, srcStep, size, (Ipp32s*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
508 default: status = ippStsNumChannelsErr; break;
509 }
510 break;
511 case ipp32f:
512 switch(channels)
513 {
514 case 1: status = ippiCopyWrapBorder_32f_C1R_L((Ipp32f*)pSrc, srcStep, size, (Ipp32f*)pDst, dstStep, dstSize, borderSize.top, borderSize.left); break;
515 default: status = ippStsNumChannelsErr; break;
516 }
517 break;
518 default: status = ippStsDataTypeErr; break;
519 }
520 }
521 else
522 status = ippStsBorderErr;
523 }
524
525 return status;
526 }
527