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