Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_sequencer/sequencer_scopes.c
| Show First 20 Lines • Show All 441 Lines • ▼ Show 20 Lines | for (i = 0; i < barh; i++) { | ||||
| p += ibuf->x * 4; | p += ibuf->x * 4; | ||||
| } | } | ||||
| } | } | ||||
| #define HIS_STEPS 512 | #define HIS_STEPS 512 | ||||
| typedef struct MakeHistogramViewData { | typedef struct MakeHistogramViewData { | ||||
| const ImBuf *ibuf; | const ImBuf *ibuf; | ||||
| uint32_t (*bins)[HIS_STEPS]; | |||||
| } MakeHistogramViewData; | } MakeHistogramViewData; | ||||
| static void make_histogram_view_from_ibuf_byte_fn(void *__restrict userdata, | static void make_histogram_view_from_ibuf_byte_fn(void *__restrict userdata, | ||||
| const int y, | const int y, | ||||
| const TaskParallelTLS *__restrict tls) | const TaskParallelTLS *__restrict tls) | ||||
| { | { | ||||
| MakeHistogramViewData *data = userdata; | MakeHistogramViewData *data = userdata; | ||||
| const ImBuf *ibuf = data->ibuf; | const ImBuf *ibuf = data->ibuf; | ||||
| const uchar *src = (uchar *)ibuf->rect; | const uchar *src = (uchar *)ibuf->rect; | ||||
| uint32_t(*cur_bins)[HIS_STEPS] = tls->userdata_chunk; | uint32_t(*cur_bins)[HIS_STEPS] = tls->userdata_chunk; | ||||
| for (int x = 0; x < ibuf->x; x++) { | for (int x = 0; x < ibuf->x; x++) { | ||||
| const uchar *pixel = src + (y * ibuf->x + x) * 4; | const uchar *pixel = src + (y * ibuf->x + x) * 4; | ||||
| for (int j = 3; j--;) { | for (int j = 3; j--;) { | ||||
| cur_bins[j][pixel[j]]++; | cur_bins[j][pixel[j]]++; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void make_histogram_view_from_ibuf_finalize(void *__restrict userdata, | static void make_histogram_view_from_ibuf_reduce(const void *__restrict UNUSED(userdata), | ||||
| void *__restrict userdata_chunk) | void *__restrict chunk_join, | ||||
| void *__restrict chunk) | |||||
| { | { | ||||
| MakeHistogramViewData *data = userdata; | uint32_t(*join_bins)[HIS_STEPS] = chunk_join; | ||||
| uint32_t(*bins)[HIS_STEPS] = data->bins; | uint32_t(*bins)[HIS_STEPS] = chunk; | ||||
| uint32_t(*cur_bins)[HIS_STEPS] = userdata_chunk; | |||||
| for (int j = 3; j--;) { | for (int j = 3; j--;) { | ||||
| for (int i = 0; i < HIS_STEPS; i++) { | for (int i = 0; i < HIS_STEPS; i++) { | ||||
| bins[j][i] += cur_bins[j][i]; | join_bins[j][i] += bins[j][i]; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static ImBuf *make_histogram_view_from_ibuf_byte(ImBuf *ibuf) | static ImBuf *make_histogram_view_from_ibuf_byte(ImBuf *ibuf) | ||||
| { | { | ||||
| ImBuf *rval = IMB_allocImBuf(515, 128, 32, IB_rect); | ImBuf *rval = IMB_allocImBuf(515, 128, 32, IB_rect); | ||||
| int x; | int x; | ||||
| uint nr, ng, nb; | uint nr, ng, nb; | ||||
| uint bins[3][HIS_STEPS]; | uint bins[3][HIS_STEPS]; | ||||
| memset(bins, 0, sizeof(bins)); | memset(bins, 0, sizeof(bins)); | ||||
| MakeHistogramViewData data = { | MakeHistogramViewData data = { | ||||
| .ibuf = ibuf, | .ibuf = ibuf, | ||||
| .bins = bins, | |||||
| }; | }; | ||||
| TaskParallelSettings settings; | TaskParallelSettings settings; | ||||
| BLI_parallel_range_settings_defaults(&settings); | BLI_parallel_range_settings_defaults(&settings); | ||||
| settings.use_threading = (ibuf->y >= 256); | settings.use_threading = (ibuf->y >= 256); | ||||
| settings.userdata_chunk = bins; | settings.userdata_chunk = bins; | ||||
| settings.userdata_chunk_size = sizeof(bins); | settings.userdata_chunk_size = sizeof(bins); | ||||
| settings.func_finalize = make_histogram_view_from_ibuf_finalize; | settings.func_reduce = make_histogram_view_from_ibuf_reduce; | ||||
| BLI_task_parallel_range(0, ibuf->y, &data, make_histogram_view_from_ibuf_byte_fn, &settings); | BLI_task_parallel_range(0, ibuf->y, &data, make_histogram_view_from_ibuf_byte_fn, &settings); | ||||
| nr = nb = ng = 0; | nr = nb = ng = 0; | ||||
| for (x = 0; x < HIS_STEPS; x++) { | for (x = 0; x < HIS_STEPS; x++) { | ||||
| if (bins[0][x] > nr) { | if (bins[0][x] > nr) { | ||||
| nr = bins[0][x]; | nr = bins[0][x]; | ||||
| } | } | ||||
| if (bins[1][x] > ng) { | if (bins[1][x] > ng) { | ||||
| ▲ Show 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | static ImBuf *make_histogram_view_from_ibuf_float(ImBuf *ibuf) | ||||
| int x; | int x; | ||||
| uint bins[3][HIS_STEPS]; | uint bins[3][HIS_STEPS]; | ||||
| memset(bins, 0, sizeof(bins)); | memset(bins, 0, sizeof(bins)); | ||||
| MakeHistogramViewData data = { | MakeHistogramViewData data = { | ||||
| .ibuf = ibuf, | .ibuf = ibuf, | ||||
| .bins = bins, | |||||
| }; | }; | ||||
| TaskParallelSettings settings; | TaskParallelSettings settings; | ||||
| BLI_parallel_range_settings_defaults(&settings); | BLI_parallel_range_settings_defaults(&settings); | ||||
| settings.use_threading = (ibuf->y >= 256); | settings.use_threading = (ibuf->y >= 256); | ||||
| settings.userdata_chunk = bins; | settings.userdata_chunk = bins; | ||||
| settings.userdata_chunk_size = sizeof(bins); | settings.userdata_chunk_size = sizeof(bins); | ||||
| settings.func_finalize = make_histogram_view_from_ibuf_finalize; | settings.func_reduce = make_histogram_view_from_ibuf_reduce; | ||||
| BLI_task_parallel_range(0, ibuf->y, &data, make_histogram_view_from_ibuf_float_fn, &settings); | BLI_task_parallel_range(0, ibuf->y, &data, make_histogram_view_from_ibuf_float_fn, &settings); | ||||
| nr = nb = ng = 0; | nr = nb = ng = 0; | ||||
| for (x = 0; x < HIS_STEPS; x++) { | for (x = 0; x < HIS_STEPS; x++) { | ||||
| if (bins[0][x] > nr) { | if (bins[0][x] > nr) { | ||||
| nr = bins[0][x]; | nr = bins[0][x]; | ||||
| } | } | ||||
| if (bins[1][x] > ng) { | if (bins[1][x] > ng) { | ||||
| ▲ Show 20 Lines • Show All 167 Lines • Show Last 20 Lines | |||||