-----------------------------------------------------------------------* * Scale for maximum dynamic range * *-----------------------------------------------------------------------*/ ! * \brief pixMaxDynamicRange() * * \param[in] pixs 4, 8, 16 or 32 bpp source * \param[in] type L_LINEAR_SCALE or L_LOG_SCALE * \return pixd 8 bpp, or NULL on e
| 1152 | * </pre> |
| 1153 | */ |
| 1154 | PIX * |
| 1155 | pixMaxDynamicRange(PIX *pixs, |
| 1156 | l_int32 type) |
| 1157 | { |
| 1158 | l_uint8 dval; |
| 1159 | l_int32 i, j, w, h, d, wpls, wpld, max; |
| 1160 | l_uint32 *datas, *datad; |
| 1161 | l_uint32 word, sval; |
| 1162 | l_uint32 *lines, *lined; |
| 1163 | l_float32 factor; |
| 1164 | l_float32 *tab; |
| 1165 | PIX *pixd; |
| 1166 | |
| 1167 | PROCNAME("pixMaxDynamicRange"); |
| 1168 | |
| 1169 | if (!pixs) |
| 1170 | return (PIX *)ERROR_PTR("pixs not defined", procName, NULL); |
| 1171 | pixGetDimensions(pixs, &w, &h, &d); |
| 1172 | if (d != 4 && d != 8 && d != 16 && d != 32) |
| 1173 | return (PIX *)ERROR_PTR("pixs not in {4,8,16,32} bpp", procName, NULL); |
| 1174 | if (type != L_LINEAR_SCALE && type != L_LOG_SCALE) |
| 1175 | return (PIX *)ERROR_PTR("invalid type", procName, NULL); |
| 1176 | |
| 1177 | if ((pixd = pixCreate(w, h, 8)) == NULL) |
| 1178 | return (PIX *)ERROR_PTR("pixd not made", procName, NULL); |
| 1179 | pixCopyResolution(pixd, pixs); |
| 1180 | datas = pixGetData(pixs); |
| 1181 | datad = pixGetData(pixd); |
| 1182 | wpls = pixGetWpl(pixs); |
| 1183 | wpld = pixGetWpl(pixd); |
| 1184 | |
| 1185 | /* Get max */ |
| 1186 | max = 0; |
| 1187 | for (i = 0; i < h; i++) { |
| 1188 | lines = datas + i * wpls; |
| 1189 | for (j = 0; j < wpls; j++) { |
| 1190 | word = *(lines + j); |
| 1191 | if (d == 4) { |
| 1192 | max = L_MAX(max, word >> 28); |
| 1193 | max = L_MAX(max, (word >> 24) & 0xf); |
| 1194 | max = L_MAX(max, (word >> 20) & 0xf); |
| 1195 | max = L_MAX(max, (word >> 16) & 0xf); |
| 1196 | max = L_MAX(max, (word >> 12) & 0xf); |
| 1197 | max = L_MAX(max, (word >> 8) & 0xf); |
| 1198 | max = L_MAX(max, (word >> 4) & 0xf); |
| 1199 | max = L_MAX(max, word & 0xf); |
| 1200 | } else if (d == 8) { |
| 1201 | max = L_MAX(max, word >> 24); |
| 1202 | max = L_MAX(max, (word >> 16) & 0xff); |
| 1203 | max = L_MAX(max, (word >> 8) & 0xff); |
| 1204 | max = L_MAX(max, word & 0xff); |
| 1205 | } else if (d == 16) { |
| 1206 | max = L_MAX(max, word >> 16); |
| 1207 | max = L_MAX(max, word & 0xffff); |
| 1208 | } else { /* d == 32 (rgb) */ |
| 1209 | max = L_MAX(max, word); |
| 1210 | } |
| 1211 | } |
no test coverage detected