MCPcopy Create free account
hub / github.com/darktable-org/rawspeed / scaleValues

Method scaleValues

src/librawspeed/common/RawImageDataFloat.cpp:148–257  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

146#if 0 // def WITH_SSE2
147
148 void RawImageDataFloat::scaleValues(int start_y, int end_y) {
149 bool WITH_SSE2;
150#ifdef _MSC_VER
151 int info[4];
152 __cpuid(info, 1);
153 WITH_SSE2 = !!(info[3]&(1 << 26));
154#else
155 WITH_SSE2 = true;
156#endif
157
158 float app_scale = 65535.0F / (whitePoint - blackLevelSeparate[0]);
159 // Check SSE2
160 if (WITH_SSE2 && app_scale < 63) {
161
162 __m128i sseround;
163 __m128i ssesub2;
164 __m128i ssesign;
165 auto* sub_mul = alignedMallocArray<uint32_t, 16, __m128i>(4);
166 if (!sub_mul)
167 ThrowRDE("Out of memory, failed to allocate 128 bytes");
168
169 uint32_t gw = pitch / 16;
170 // 10 bit fraction
171 uint32_t mul = (int)(1024.0F * 65535.0F / (float)(whitePoint - blackLevelSeparate[mOffset.x&1]));
172 mul |= ((int)(1024.0F * 65535.0F / (float)(whitePoint - blackLevelSeparate[(mOffset.x+1)&1])))<<16;
173 uint32_t b = blackLevelSeparate[mOffset.x&1] | (blackLevelSeparate[(mOffset.x+1)&1]<<16);
174
175 for (int i = 0; i< 4; i++) {
176 sub_mul[i] = b; // Subtract even lines
177 sub_mul[4+i] = mul; // Multiply even lines
178 }
179
180 mul = (int)(1024.0F * 65535.0F / (float)(whitePoint - blackLevelSeparate[2+(mOffset.x&1)]));
181 mul |= ((int)(1024.0F * 65535.0F / (float)(whitePoint - blackLevelSeparate[2+((mOffset.x+1)&1)])))<<16;
182 b = blackLevelSeparate[2+(mOffset.x&1)] | (blackLevelSeparate[2+((mOffset.x+1)&1)]<<16);
183
184 for (int i = 0; i< 4; i++) {
185 sub_mul[8+i] = b; // Subtract odd lines
186 sub_mul[12+i] = mul; // Multiply odd lines
187 }
188
189 sseround = _mm_set_epi32(512, 512, 512, 512);
190 ssesub2 = _mm_set_epi32(32768, 32768, 32768, 32768);
191 ssesign = _mm_set_epi32(0x80008000, 0x80008000, 0x80008000, 0x80008000);
192
193 for (int y = start_y; y < end_y; y++) {
194 __m128i* pixel = (__m128i*) & data[(mOffset.y+y)*pitch];
195 __m128i ssescale, ssesub;
196 if (((y+mOffset.y)&1) == 0) {
197 ssesub = _mm_load_si128((__m128i*)&sub_mul[0]);
198 ssescale = _mm_load_si128((__m128i*)&sub_mul[4]);
199 } else {
200 ssesub = _mm_load_si128((__m128i*)&sub_mul[8]);
201 ssescale = _mm_load_si128((__m128i*)&sub_mul[12]);
202 }
203
204 for (uint32_t x = 0 ; x < gw; x++) {
205 __m128i pix_high;

Callers

nothing calls this directly

Calls 2

alignedFreeFunction · 0.85
clampBitsFunction · 0.85

Tested by

no test coverage detected