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