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 IW_DECL(IppStatus) llwiCopyMask(const void *pSrc, int srcStep, void *pDst, int dstStep,
21                                   IppiSize size, int typeSize, int channels, const Ipp8u *pMask, int maskStep);
22 
23 /**/////////////////////////////////////////////////////////////////////////////
24 //                   iwiCopy
25 ///////////////////////////////////////////////////////////////////////////// */
iwiCopy_NoMask(const IwiImage * pSrcImage,IwiImage * pDstImage,const IwiTile * pTile)26 static IppStatus iwiCopy_NoMask(const IwiImage *pSrcImage, IwiImage *pDstImage, const IwiTile *pTile)
27 {
28     {
29         const void *pSrc = pSrcImage->m_ptrConst;
30         void       *pDst = pDstImage->m_ptr;
31         IwiSize     size = owniGetMinSize(&pSrcImage->m_size, &pDstImage->m_size);
32         if(!size.width || !size.height)
33             return ippStsNoOperation;
34 
35         if(pTile && pTile->m_initialized != ownTileInitNone)
36         {
37             if(pTile->m_initialized == ownTileInitSimple)
38             {
39                 IwiRoi dstRoi = pTile->m_dstRoi;
40 
41                 if(!owniTile_BoundToSize(&dstRoi, &size))
42                     return ippStsNoOperation;
43 
44                 pSrc = iwiImage_GetPtrConst(pSrcImage, dstRoi.y, dstRoi.x, 0);
45                 pDst = iwiImage_GetPtr(pDstImage, dstRoi.y, dstRoi.x, 0);
46             }
47             else if(pTile->m_initialized == ownTileInitPipe)
48             {
49                 IwiRoi srcLim;
50                 IwiRoi dstLim;
51                 iwiTilePipeline_GetBoundedSrcRoi(pTile, &srcLim);
52                 iwiTilePipeline_GetBoundedDstRoi(pTile, &dstLim);
53 
54                 pSrc = iwiImage_GetPtrConst(pSrcImage, srcLim.y, srcLim.x, 0);
55                 pDst = iwiImage_GetPtr(pDstImage, dstLim.y, dstLim.x, 0);
56 
57                 size = owniGetMinSizeFromRect(&srcLim, &dstLim);
58             }
59             else
60                 return ippStsContextMatchErr;
61         }
62 
63         return llwiCopy(pSrc, pSrcImage->m_step, pDst, pDstImage->m_step, size, pSrcImage->m_typeSize, pSrcImage->m_channels);
64     }
65 }
66 
iwiCopy(const IwiImage * pSrcImage,IwiImage * pDstImage,const IwiImage * pMaskImage,const IwiCopyParams * pAuxParams,const IwiTile * pTile)67 IW_DECL(IppStatus) iwiCopy(const IwiImage *pSrcImage, IwiImage *pDstImage, const IwiImage *pMaskImage, const IwiCopyParams *pAuxParams, const IwiTile *pTile)
68 {
69     IppStatus status;
70 
71     (void)pAuxParams;
72 
73     status = owniCheckImageRead(pSrcImage);
74     if(status)
75         return status;
76     status = owniCheckImageWrite(pDstImage);
77     if(status)
78         return status;
79 
80     if(pSrcImage->m_ptrConst == pDstImage->m_ptrConst)
81         return ippStsNoOperation;
82 
83     if(pSrcImage->m_typeSize != pDstImage->m_typeSize ||
84         pSrcImage->m_channels != pDstImage->m_channels)
85         return ippStsBadArgErr;
86 
87     if(!pMaskImage || !pMaskImage->m_ptrConst)
88         return iwiCopy_NoMask(pSrcImage, pDstImage, pTile);
89 
90     status = owniCheckImageRead(pMaskImage);
91     if(status)
92         return status;
93 
94     if(pMaskImage->m_dataType != ipp8u ||
95         pMaskImage->m_channels != 1)
96         return ippStsBadArgErr;
97 
98     {
99         const void *pSrc  = pSrcImage->m_ptrConst;
100         const void *pMask = pMaskImage->m_ptrConst;
101         void       *pDst  = pDstImage->m_ptr;
102         IwiSize     size  = owniGetMinSize(&pSrcImage->m_size, &pDstImage->m_size);
103                     size  = owniGetMinSize(&size, &pMaskImage->m_size);
104 
105         if(pTile && pTile->m_initialized != ownTileInitNone)
106         {
107             if(pTile->m_initialized == ownTileInitSimple)
108             {
109                 IwiRoi dstRoi = pTile->m_dstRoi;
110 
111                 if(!owniTile_BoundToSize(&dstRoi, &size))
112                     return ippStsNoOperation;
113 
114                 pSrc  = iwiImage_GetPtrConst(pSrcImage, dstRoi.y, dstRoi.x, 0);
115                 pMask = iwiImage_GetPtrConst(pMaskImage, dstRoi.y, dstRoi.x, 0);
116                 pDst  = iwiImage_GetPtr(pDstImage, dstRoi.y, dstRoi.x, 0);
117             }
118             else if(pTile->m_initialized == ownTileInitPipe)
119             {
120                 IwiRoi srcLim;
121                 IwiRoi dstLim;
122                 iwiTilePipeline_GetBoundedSrcRoi(pTile, &srcLim);
123                 iwiTilePipeline_GetBoundedDstRoi(pTile, &dstLim);
124 
125                 pSrc  = iwiImage_GetPtrConst(pSrcImage, srcLim.y, srcLim.x, 0);
126                 pMask = iwiImage_GetPtrConst(pMaskImage, dstLim.y, dstLim.x, 0);
127                 pDst  = iwiImage_GetPtr(pDstImage, dstLim.y, dstLim.x, 0);
128 
129                 size = owniGetMinSizeFromRect(&srcLim, &dstLim);
130             }
131             else
132                 return ippStsContextMatchErr;
133         }
134 
135         // Long compatibility check
136         {
137             IppiSize _size;
138 
139             status = ownLongCompatCheckValue(pSrcImage->m_step, NULL);
140             if(status < 0)
141                 return status;
142 
143             status = ownLongCompatCheckValue(pDstImage->m_step, NULL);
144             if(status < 0)
145                 return status;
146 
147             status = ownLongCompatCheckValue(pMaskImage->m_step, NULL);
148             if(status < 0)
149                 return status;
150 
151             status = owniLongCompatCheckSize(size, &_size);
152             if(status < 0)
153                 return status;
154 
155             return llwiCopyMask(pSrc, (int)pSrcImage->m_step, pDst, (int)pDstImage->m_step, _size, pSrcImage->m_typeSize, pSrcImage->m_channels, (const Ipp8u*)pMask, (int)pMaskImage->m_step);
156         }
157     }
158 }
159 
160 
161 /**/////////////////////////////////////////////////////////////////////////////
162 //                   Low-Level Wrappers
163 ///////////////////////////////////////////////////////////////////////////// */
llwiCopy(const void * pSrc,IwSize srcStep,void * pDst,IwSize dstStep,IwiSize size,int typeSize,int channels)164 IW_DECL(IppStatus) llwiCopy(const void *pSrc, IwSize srcStep, void *pDst, IwSize dstStep,
165                               IwiSize size, int typeSize, int channels)
166 {
167     if(pSrc == pDst)
168         return ippStsNoOperation;
169 
170     size.width = size.width*channels*typeSize;
171     return ippiCopy_8u_C1R_L((const Ipp8u*)pSrc, srcStep, (Ipp8u*)pDst, dstStep, size);
172 }
173 
llwiCopyMask(const void * pSrc,int srcStep,void * pDst,int dstStep,IppiSize size,int typeSize,int channels,const Ipp8u * pMask,int maskStep)174 IW_DECL(IppStatus) llwiCopyMask(const void *pSrc, int srcStep, void *pDst, int dstStep,
175                                   IppiSize size, int typeSize, int channels, const Ipp8u *pMask, int maskStep)
176 {
177     switch(typeSize)
178     {
179 #if IW_ENABLE_DATA_DEPTH_8
180     case 1:
181         switch(channels)
182         {
183 #if IW_ENABLE_CHANNELS_C1
184         case 1:  return ippiCopy_8u_C1MR((const Ipp8u*)pSrc, srcStep, (Ipp8u*)pDst, dstStep, size, pMask, maskStep);
185 #endif
186 #if IW_ENABLE_CHANNELS_C3
187         case 3:  return ippiCopy_8u_C3MR((const Ipp8u*)pSrc, srcStep, (Ipp8u*)pDst, dstStep, size, pMask, maskStep);
188 #endif
189 #if IW_ENABLE_CHANNELS_C4
190         case 4:  return ippiCopy_8u_C4MR((const Ipp8u*)pSrc, srcStep, (Ipp8u*)pDst, dstStep, size, pMask, maskStep);
191 #endif
192         default: return ippStsNumChannelsErr;
193         }
194 #endif
195 #if IW_ENABLE_DATA_DEPTH_16
196     case 2:
197         switch(channels)
198         {
199 #if IW_ENABLE_CHANNELS_C1
200         case 1:  return ippiCopy_16u_C1MR((const Ipp16u*)pSrc, srcStep, (Ipp16u*)pDst, dstStep, size, pMask, maskStep);
201 #endif
202 #if IW_ENABLE_CHANNELS_C3
203         case 3:  return ippiCopy_16u_C3MR((const Ipp16u*)pSrc, srcStep, (Ipp16u*)pDst, dstStep, size, pMask, maskStep);
204 #endif
205 #if IW_ENABLE_CHANNELS_C4
206         case 4:  return ippiCopy_16u_C4MR((const Ipp16u*)pSrc, srcStep, (Ipp16u*)pDst, dstStep, size, pMask, maskStep);
207 #endif
208         default: return ippStsNumChannelsErr;
209         }
210 #endif
211 #if IW_ENABLE_DATA_DEPTH_32
212     case 4:
213         switch(channels)
214         {
215 #if IW_ENABLE_CHANNELS_C1
216         case 1:  return ippiCopy_32f_C1MR((const Ipp32f*)pSrc, srcStep, (Ipp32f*)pDst, dstStep, size, pMask, maskStep);
217 #endif
218 #if IW_ENABLE_CHANNELS_C3
219         case 3:  return ippiCopy_32f_C3MR((const Ipp32f*)pSrc, srcStep, (Ipp32f*)pDst, dstStep, size, pMask, maskStep);
220 #endif
221 #if IW_ENABLE_CHANNELS_C4
222         case 4:  return ippiCopy_32f_C4MR((const Ipp32f*)pSrc, srcStep, (Ipp32f*)pDst, dstStep, size, pMask, maskStep);
223 #endif
224         default: return ippStsNumChannelsErr;
225         }
226 #endif
227 #if IW_ENABLE_DATA_DEPTH_64
228     case 8:
229         switch(channels)
230         {
231 #if IW_ENABLE_CHANNELS_C1
232         case 1:  return ippiCopy_16u_C4MR((const Ipp16u*)pSrc, srcStep, (Ipp16u*)pDst, dstStep, size, pMask, maskStep);
233 #endif
234         default: return ippStsNumChannelsErr;
235         }
236 #endif
237     default: return ippStsDataTypeErr;
238     }
239 }
240