Changeset View
Changeset View
Standalone View
Standalone View
source/blender/imbuf/intern/scaling.c
| Show First 20 Lines • Show All 1,189 Lines • ▼ Show 20 Lines | static ImBuf *scaledowny(struct ImBuf *ibuf, int newy) | ||||
| ibuf->y = newy; | ibuf->y = newy; | ||||
| return ibuf; | return ibuf; | ||||
| } | } | ||||
| static ImBuf *scaleupx(struct ImBuf *ibuf, int newx) | static ImBuf *scaleupx(struct ImBuf *ibuf, int newx) | ||||
| { | { | ||||
| uchar *rect, *_newrect = NULL, *newrect; | uchar *rect, *_newrect = NULL, *newrect; | ||||
| float *rectf, *_newrectf = NULL, *newrectf; | float *rectf, *_newrectf = NULL, *newrectf; | ||||
| float sample, add; | |||||
| float val_a, nval_a, diff_a; | |||||
| float val_b, nval_b, diff_b; | |||||
| float val_g, nval_g, diff_g; | |||||
| float val_r, nval_r, diff_r; | |||||
| float val_af, nval_af, diff_af; | |||||
| float val_bf, nval_bf, diff_bf; | |||||
| float val_gf, nval_gf, diff_gf; | |||||
| float val_rf, nval_rf, diff_rf; | |||||
| int x, y; | int x, y; | ||||
| bool do_rect = false, do_float = false; | bool do_rect = false, do_float = false; | ||||
| val_a = nval_a = diff_a = val_b = nval_b = diff_b = 0; | |||||
| val_g = nval_g = diff_g = val_r = nval_r = diff_r = 0; | |||||
| val_af = nval_af = diff_af = val_bf = nval_bf = diff_bf = 0; | |||||
| val_gf = nval_gf = diff_gf = val_rf = nval_rf = diff_rf = 0; | |||||
| if (ibuf == NULL) { | if (ibuf == NULL) { | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| if (ibuf->rect == NULL && ibuf->rect_float == NULL) { | if (ibuf->rect == NULL && ibuf->rect_float == NULL) { | ||||
| return ibuf; | return ibuf; | ||||
| } | } | ||||
| if (ibuf->rect) { | if (ibuf->rect) { | ||||
| Show All 9 Lines | if (ibuf->rect_float) { | ||||
| if (_newrectf == NULL) { | if (_newrectf == NULL) { | ||||
| if (_newrect) { | if (_newrect) { | ||||
| MEM_freeN(_newrect); | MEM_freeN(_newrect); | ||||
| } | } | ||||
| return ibuf; | return ibuf; | ||||
| } | } | ||||
| } | } | ||||
| add = (ibuf->x - 1.001) / (newx - 1.0); | |||||
| rect = (uchar *)ibuf->rect; | rect = (uchar *)ibuf->rect; | ||||
| rectf = (float *)ibuf->rect_float; | rectf = (float *)ibuf->rect_float; | ||||
| newrect = _newrect; | newrect = _newrect; | ||||
| newrectf = _newrectf; | newrectf = _newrectf; | ||||
| /* Special case, copy all columns, needed since the scaling logic assumes there is at least | |||||
| * two rows to interpolate between causing out of bounds read for 1px images, see T70356. */ | |||||
| if (UNLIKELY(ibuf->x == 1)) { | |||||
| if (do_rect) { | |||||
| for (y = ibuf->y; y > 0; y--) { | |||||
| for (x = newx; x > 0; x--) { | |||||
| memcpy(newrect, rect, sizeof(char[4])); | |||||
| newrect += 4; | |||||
| } | |||||
| rect += 4; | |||||
| } | |||||
| } | |||||
| if (do_float) { | |||||
| for (y = ibuf->y; y > 0; y--) { | |||||
| for (x = newx; x > 0; x--) { | |||||
| memcpy(newrectf, rectf, sizeof(float[4])); | |||||
| newrectf += 4; | |||||
| } | |||||
| rectf += 4; | |||||
| } | |||||
| } | |||||
| } | |||||
| else { | |||||
| const float add = (ibuf->x - 1.001) / (newx - 1.0); | |||||
| float sample; | |||||
| float val_a, nval_a, diff_a; | |||||
| float val_b, nval_b, diff_b; | |||||
| float val_g, nval_g, diff_g; | |||||
| float val_r, nval_r, diff_r; | |||||
| float val_af, nval_af, diff_af; | |||||
| float val_bf, nval_bf, diff_bf; | |||||
| float val_gf, nval_gf, diff_gf; | |||||
| float val_rf, nval_rf, diff_rf; | |||||
| val_a = nval_a = diff_a = val_b = nval_b = diff_b = 0; | |||||
| val_g = nval_g = diff_g = val_r = nval_r = diff_r = 0; | |||||
| val_af = nval_af = diff_af = val_bf = nval_bf = diff_bf = 0; | |||||
| val_gf = nval_gf = diff_gf = val_rf = nval_rf = diff_rf = 0; | |||||
| for (y = ibuf->y; y > 0; y--) { | for (y = ibuf->y; y > 0; y--) { | ||||
| sample = 0; | sample = 0; | ||||
| if (do_rect) { | if (do_rect) { | ||||
| val_a = rect[0]; | val_a = rect[0]; | ||||
| nval_a = rect[4]; | nval_a = rect[4]; | ||||
| diff_a = nval_a - val_a; | diff_a = nval_a - val_a; | ||||
| val_a += 0.5f; | val_a += 0.5f; | ||||
| val_b = rect[1]; | val_b = rect[1]; | ||||
| nval_b = rect[5]; | nval_b = rect[5]; | ||||
| diff_b = nval_b - val_b; | diff_b = nval_b - val_b; | ||||
| val_b += 0.5f; | val_b += 0.5f; | ||||
| val_g = rect[2]; | val_g = rect[2]; | ||||
| nval_g = rect[6]; | nval_g = rect[6]; | ||||
| diff_g = nval_g - val_g; | diff_g = nval_g - val_g; | ||||
| val_g += 0.5f; | val_g += 0.5f; | ||||
| val_r = rect[3]; | val_r = rect[3]; | ||||
| nval_r = rect[7]; | nval_r = rect[7]; | ||||
| diff_r = nval_r - val_r; | diff_r = nval_r - val_r; | ||||
| val_r += 0.5f; | val_r += 0.5f; | ||||
| rect += 8; | rect += 8; | ||||
| } | } | ||||
| if (do_float) { | if (do_float) { | ||||
| val_af = rectf[0]; | val_af = rectf[0]; | ||||
| nval_af = rectf[4]; | nval_af = rectf[4]; | ||||
| diff_af = nval_af - val_af; | diff_af = nval_af - val_af; | ||||
| val_bf = rectf[1]; | val_bf = rectf[1]; | ||||
| nval_bf = rectf[5]; | nval_bf = rectf[5]; | ||||
| diff_bf = nval_bf - val_bf; | diff_bf = nval_bf - val_bf; | ||||
| val_gf = rectf[2]; | val_gf = rectf[2]; | ||||
| nval_gf = rectf[6]; | nval_gf = rectf[6]; | ||||
| diff_gf = nval_gf - val_gf; | diff_gf = nval_gf - val_gf; | ||||
| val_rf = rectf[3]; | val_rf = rectf[3]; | ||||
| nval_rf = rectf[7]; | nval_rf = rectf[7]; | ||||
| diff_rf = nval_rf - val_rf; | diff_rf = nval_rf - val_rf; | ||||
| rectf += 8; | rectf += 8; | ||||
| } | } | ||||
| for (x = newx; x > 0; x--) { | for (x = newx; x > 0; x--) { | ||||
| if (sample >= 1.0f) { | if (sample >= 1.0f) { | ||||
| sample -= 1.0f; | sample -= 1.0f; | ||||
| if (do_rect) { | if (do_rect) { | ||||
| val_a = nval_a; | val_a = nval_a; | ||||
| nval_a = rect[0]; | nval_a = rect[0]; | ||||
| diff_a = nval_a - val_a; | diff_a = nval_a - val_a; | ||||
| val_a += 0.5f; | val_a += 0.5f; | ||||
| val_b = nval_b; | val_b = nval_b; | ||||
| nval_b = rect[1]; | nval_b = rect[1]; | ||||
| diff_b = nval_b - val_b; | diff_b = nval_b - val_b; | ||||
| val_b += 0.5f; | val_b += 0.5f; | ||||
| val_g = nval_g; | val_g = nval_g; | ||||
| nval_g = rect[2]; | nval_g = rect[2]; | ||||
| diff_g = nval_g - val_g; | diff_g = nval_g - val_g; | ||||
| val_g += 0.5f; | val_g += 0.5f; | ||||
| val_r = nval_r; | val_r = nval_r; | ||||
| nval_r = rect[3]; | nval_r = rect[3]; | ||||
| diff_r = nval_r - val_r; | diff_r = nval_r - val_r; | ||||
| val_r += 0.5f; | val_r += 0.5f; | ||||
| rect += 4; | rect += 4; | ||||
| } | } | ||||
| if (do_float) { | if (do_float) { | ||||
| val_af = nval_af; | val_af = nval_af; | ||||
| nval_af = rectf[0]; | nval_af = rectf[0]; | ||||
| diff_af = nval_af - val_af; | diff_af = nval_af - val_af; | ||||
| val_bf = nval_bf; | val_bf = nval_bf; | ||||
| nval_bf = rectf[1]; | nval_bf = rectf[1]; | ||||
| diff_bf = nval_bf - val_bf; | diff_bf = nval_bf - val_bf; | ||||
| val_gf = nval_gf; | val_gf = nval_gf; | ||||
| nval_gf = rectf[2]; | nval_gf = rectf[2]; | ||||
| diff_gf = nval_gf - val_gf; | diff_gf = nval_gf - val_gf; | ||||
| val_rf = nval_rf; | val_rf = nval_rf; | ||||
| nval_rf = rectf[3]; | nval_rf = rectf[3]; | ||||
| diff_rf = nval_rf - val_rf; | diff_rf = nval_rf - val_rf; | ||||
| rectf += 4; | rectf += 4; | ||||
| } | } | ||||
| } | } | ||||
| if (do_rect) { | if (do_rect) { | ||||
| newrect[0] = val_a + sample * diff_a; | newrect[0] = val_a + sample * diff_a; | ||||
| newrect[1] = val_b + sample * diff_b; | newrect[1] = val_b + sample * diff_b; | ||||
| newrect[2] = val_g + sample * diff_g; | newrect[2] = val_g + sample * diff_g; | ||||
| newrect[3] = val_r + sample * diff_r; | newrect[3] = val_r + sample * diff_r; | ||||
| newrect += 4; | newrect += 4; | ||||
| } | } | ||||
| if (do_float) { | if (do_float) { | ||||
| newrectf[0] = val_af + sample * diff_af; | newrectf[0] = val_af + sample * diff_af; | ||||
| newrectf[1] = val_bf + sample * diff_bf; | newrectf[1] = val_bf + sample * diff_bf; | ||||
| newrectf[2] = val_gf + sample * diff_gf; | newrectf[2] = val_gf + sample * diff_gf; | ||||
| newrectf[3] = val_rf + sample * diff_rf; | newrectf[3] = val_rf + sample * diff_rf; | ||||
| newrectf += 4; | newrectf += 4; | ||||
| } | } | ||||
| sample += add; | sample += add; | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| if (do_rect) { | if (do_rect) { | ||||
| imb_freerectImBuf(ibuf); | imb_freerectImBuf(ibuf); | ||||
| ibuf->mall |= IB_rect; | ibuf->mall |= IB_rect; | ||||
| ibuf->rect = (unsigned int *)_newrect; | ibuf->rect = (unsigned int *)_newrect; | ||||
| } | } | ||||
| if (do_float) { | if (do_float) { | ||||
| imb_freerectfloatImBuf(ibuf); | imb_freerectfloatImBuf(ibuf); | ||||
| ibuf->mall |= IB_rectfloat; | ibuf->mall |= IB_rectfloat; | ||||
| ibuf->rect_float = (float *)_newrectf; | ibuf->rect_float = (float *)_newrectf; | ||||
| } | } | ||||
| ibuf->x = newx; | ibuf->x = newx; | ||||
| return ibuf; | return ibuf; | ||||
| } | } | ||||
| static ImBuf *scaleupy(struct ImBuf *ibuf, int newy) | static ImBuf *scaleupy(struct ImBuf *ibuf, int newy) | ||||
| { | { | ||||
| uchar *rect, *_newrect = NULL, *newrect; | uchar *rect, *_newrect = NULL, *newrect; | ||||
| float *rectf, *_newrectf = NULL, *newrectf; | float *rectf, *_newrectf = NULL, *newrectf; | ||||
| float sample, add; | |||||
| float val_a, nval_a, diff_a; | |||||
| float val_b, nval_b, diff_b; | |||||
| float val_g, nval_g, diff_g; | |||||
| float val_r, nval_r, diff_r; | |||||
| float val_af, nval_af, diff_af; | |||||
| float val_bf, nval_bf, diff_bf; | |||||
| float val_gf, nval_gf, diff_gf; | |||||
| float val_rf, nval_rf, diff_rf; | |||||
| int x, y, skipx; | int x, y, skipx; | ||||
| bool do_rect = false, do_float = false; | bool do_rect = false, do_float = false; | ||||
| val_a = nval_a = diff_a = val_b = nval_b = diff_b = 0; | |||||
| val_g = nval_g = diff_g = val_r = nval_r = diff_r = 0; | |||||
| val_af = nval_af = diff_af = val_bf = nval_bf = diff_bf = 0; | |||||
| val_gf = nval_gf = diff_gf = val_rf = nval_rf = diff_rf = 0; | |||||
| if (ibuf == NULL) { | if (ibuf == NULL) { | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| if (ibuf->rect == NULL && ibuf->rect_float == NULL) { | if (ibuf->rect == NULL && ibuf->rect_float == NULL) { | ||||
| return ibuf; | return ibuf; | ||||
| } | } | ||||
| if (ibuf->rect) { | if (ibuf->rect) { | ||||
| Show All 9 Lines | if (ibuf->rect_float) { | ||||
| if (_newrectf == NULL) { | if (_newrectf == NULL) { | ||||
| if (_newrect) { | if (_newrect) { | ||||
| MEM_freeN(_newrect); | MEM_freeN(_newrect); | ||||
| } | } | ||||
| return ibuf; | return ibuf; | ||||
| } | } | ||||
| } | } | ||||
| add = (ibuf->y - 1.001) / (newy - 1.0); | |||||
| skipx = 4 * ibuf->x; | |||||
| rect = (uchar *)ibuf->rect; | rect = (uchar *)ibuf->rect; | ||||
| rectf = (float *)ibuf->rect_float; | rectf = (float *)ibuf->rect_float; | ||||
| newrect = _newrect; | newrect = _newrect; | ||||
| newrectf = _newrectf; | newrectf = _newrectf; | ||||
| for (x = ibuf->x; x > 0; x--) { | skipx = 4 * ibuf->x; | ||||
| /* Special case, copy all rows, needed since the scaling logic assumes there is at least | |||||
| * two rows to interpolate between causing out of bounds read for 1px images, see T70356. */ | |||||
| if (UNLIKELY(ibuf->y == 1)) { | |||||
| if (do_rect) { | |||||
| for (y = newy; y > 0; y--) { | |||||
| memcpy(newrect, rect, sizeof(char) * skipx); | |||||
| newrect += skipx; | |||||
| } | |||||
| } | |||||
| if (do_float) { | |||||
| for (y = newy; y > 0; y--) { | |||||
| memcpy(newrectf, rectf, sizeof(float) * skipx); | |||||
| newrectf += skipx; | |||||
| } | |||||
| } | |||||
| } | |||||
| else { | |||||
| const float add = (ibuf->y - 1.001) / (newy - 1.0); | |||||
| float sample; | |||||
| float val_a, nval_a, diff_a; | |||||
| float val_b, nval_b, diff_b; | |||||
| float val_g, nval_g, diff_g; | |||||
| float val_r, nval_r, diff_r; | |||||
| float val_af, nval_af, diff_af; | |||||
| float val_bf, nval_bf, diff_bf; | |||||
| float val_gf, nval_gf, diff_gf; | |||||
| float val_rf, nval_rf, diff_rf; | |||||
| val_a = nval_a = diff_a = val_b = nval_b = diff_b = 0; | |||||
| val_g = nval_g = diff_g = val_r = nval_r = diff_r = 0; | |||||
| val_af = nval_af = diff_af = val_bf = nval_bf = diff_bf = 0; | |||||
| val_gf = nval_gf = diff_gf = val_rf = nval_rf = diff_rf = 0; | |||||
| for (x = ibuf->x; x > 0; x--) { | |||||
| sample = 0; | sample = 0; | ||||
| if (do_rect) { | if (do_rect) { | ||||
| rect = ((uchar *)ibuf->rect) + 4 * (x - 1); | rect = ((uchar *)ibuf->rect) + 4 * (x - 1); | ||||
| newrect = _newrect + 4 * (x - 1); | newrect = _newrect + 4 * (x - 1); | ||||
| val_a = rect[0]; | val_a = rect[0]; | ||||
| nval_a = rect[skipx]; | nval_a = rect[skipx]; | ||||
| diff_a = nval_a - val_a; | diff_a = nval_a - val_a; | ||||
| val_a += 0.5f; | val_a += 0.5f; | ||||
| val_b = rect[1]; | val_b = rect[1]; | ||||
| nval_b = rect[skipx + 1]; | nval_b = rect[skipx + 1]; | ||||
| diff_b = nval_b - val_b; | diff_b = nval_b - val_b; | ||||
| val_b += 0.5f; | val_b += 0.5f; | ||||
| val_g = rect[2]; | val_g = rect[2]; | ||||
| nval_g = rect[skipx + 2]; | nval_g = rect[skipx + 2]; | ||||
| diff_g = nval_g - val_g; | diff_g = nval_g - val_g; | ||||
| val_g += 0.5f; | val_g += 0.5f; | ||||
| val_r = rect[3]; | val_r = rect[3]; | ||||
| nval_r = rect[skipx + 3]; | nval_r = rect[skipx + 3]; | ||||
| diff_r = nval_r - val_r; | diff_r = nval_r - val_r; | ||||
| val_r += 0.5f; | val_r += 0.5f; | ||||
| rect += 2 * skipx; | rect += 2 * skipx; | ||||
| } | } | ||||
| if (do_float) { | if (do_float) { | ||||
| rectf = ibuf->rect_float + 4 * (x - 1); | rectf = ibuf->rect_float + 4 * (x - 1); | ||||
| newrectf = _newrectf + 4 * (x - 1); | newrectf = _newrectf + 4 * (x - 1); | ||||
| val_af = rectf[0]; | val_af = rectf[0]; | ||||
| nval_af = rectf[skipx]; | nval_af = rectf[skipx]; | ||||
| diff_af = nval_af - val_af; | diff_af = nval_af - val_af; | ||||
| val_bf = rectf[1]; | val_bf = rectf[1]; | ||||
| nval_bf = rectf[skipx + 1]; | nval_bf = rectf[skipx + 1]; | ||||
| diff_bf = nval_bf - val_bf; | diff_bf = nval_bf - val_bf; | ||||
| val_gf = rectf[2]; | val_gf = rectf[2]; | ||||
| nval_gf = rectf[skipx + 2]; | nval_gf = rectf[skipx + 2]; | ||||
| diff_gf = nval_gf - val_gf; | diff_gf = nval_gf - val_gf; | ||||
| val_rf = rectf[3]; | val_rf = rectf[3]; | ||||
| nval_rf = rectf[skipx + 3]; | nval_rf = rectf[skipx + 3]; | ||||
| diff_rf = nval_rf - val_rf; | diff_rf = nval_rf - val_rf; | ||||
| rectf += 2 * skipx; | rectf += 2 * skipx; | ||||
| } | } | ||||
| for (y = newy; y > 0; y--) { | for (y = newy; y > 0; y--) { | ||||
| if (sample >= 1.0f) { | if (sample >= 1.0f) { | ||||
| sample -= 1.0f; | sample -= 1.0f; | ||||
| if (do_rect) { | if (do_rect) { | ||||
| val_a = nval_a; | val_a = nval_a; | ||||
| nval_a = rect[0]; | nval_a = rect[0]; | ||||
| diff_a = nval_a - val_a; | diff_a = nval_a - val_a; | ||||
| val_a += 0.5f; | val_a += 0.5f; | ||||
| val_b = nval_b; | val_b = nval_b; | ||||
| nval_b = rect[1]; | nval_b = rect[1]; | ||||
| diff_b = nval_b - val_b; | diff_b = nval_b - val_b; | ||||
| val_b += 0.5f; | val_b += 0.5f; | ||||
| val_g = nval_g; | val_g = nval_g; | ||||
| nval_g = rect[2]; | nval_g = rect[2]; | ||||
| diff_g = nval_g - val_g; | diff_g = nval_g - val_g; | ||||
| val_g += 0.5f; | val_g += 0.5f; | ||||
| val_r = nval_r; | val_r = nval_r; | ||||
| nval_r = rect[3]; | nval_r = rect[3]; | ||||
| diff_r = nval_r - val_r; | diff_r = nval_r - val_r; | ||||
| val_r += 0.5f; | val_r += 0.5f; | ||||
| rect += skipx; | rect += skipx; | ||||
| } | } | ||||
| if (do_float) { | if (do_float) { | ||||
| val_af = nval_af; | val_af = nval_af; | ||||
| nval_af = rectf[0]; | nval_af = rectf[0]; | ||||
| diff_af = nval_af - val_af; | diff_af = nval_af - val_af; | ||||
| val_bf = nval_bf; | val_bf = nval_bf; | ||||
| nval_bf = rectf[1]; | nval_bf = rectf[1]; | ||||
| diff_bf = nval_bf - val_bf; | diff_bf = nval_bf - val_bf; | ||||
| val_gf = nval_gf; | val_gf = nval_gf; | ||||
| nval_gf = rectf[2]; | nval_gf = rectf[2]; | ||||
| diff_gf = nval_gf - val_gf; | diff_gf = nval_gf - val_gf; | ||||
| val_rf = nval_rf; | val_rf = nval_rf; | ||||
| nval_rf = rectf[3]; | nval_rf = rectf[3]; | ||||
| diff_rf = nval_rf - val_rf; | diff_rf = nval_rf - val_rf; | ||||
| rectf += skipx; | rectf += skipx; | ||||
| } | } | ||||
| } | } | ||||
| if (do_rect) { | if (do_rect) { | ||||
| newrect[0] = val_a + sample * diff_a; | newrect[0] = val_a + sample * diff_a; | ||||
| newrect[1] = val_b + sample * diff_b; | newrect[1] = val_b + sample * diff_b; | ||||
| newrect[2] = val_g + sample * diff_g; | newrect[2] = val_g + sample * diff_g; | ||||
| newrect[3] = val_r + sample * diff_r; | newrect[3] = val_r + sample * diff_r; | ||||
| newrect += skipx; | newrect += skipx; | ||||
| } | } | ||||
| if (do_float) { | if (do_float) { | ||||
| newrectf[0] = val_af + sample * diff_af; | newrectf[0] = val_af + sample * diff_af; | ||||
| newrectf[1] = val_bf + sample * diff_bf; | newrectf[1] = val_bf + sample * diff_bf; | ||||
| newrectf[2] = val_gf + sample * diff_gf; | newrectf[2] = val_gf + sample * diff_gf; | ||||
| newrectf[3] = val_rf + sample * diff_rf; | newrectf[3] = val_rf + sample * diff_rf; | ||||
| newrectf += skipx; | newrectf += skipx; | ||||
| } | } | ||||
| sample += add; | sample += add; | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| if (do_rect) { | if (do_rect) { | ||||
| imb_freerectImBuf(ibuf); | imb_freerectImBuf(ibuf); | ||||
| ibuf->mall |= IB_rect; | ibuf->mall |= IB_rect; | ||||
| ibuf->rect = (unsigned int *)_newrect; | ibuf->rect = (unsigned int *)_newrect; | ||||
| } | } | ||||
| if (do_float) { | if (do_float) { | ||||
| imb_freerectfloatImBuf(ibuf); | imb_freerectfloatImBuf(ibuf); | ||||
| ▲ Show 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | static void scalefast_Z_ImBuf(ImBuf *ibuf, int newx, int newy) | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * Return true if \a ibuf is modified. | * Return true if \a ibuf is modified. | ||||
| */ | */ | ||||
| bool IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy) | bool IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy) | ||||
| { | { | ||||
| BLI_assert(newx > 0 && newy > 0); | |||||
| if (ibuf == NULL) { | if (ibuf == NULL) { | ||||
| return false; | return false; | ||||
| } | } | ||||
| if (ibuf->rect == NULL && ibuf->rect_float == NULL) { | if (ibuf->rect == NULL && ibuf->rect_float == NULL) { | ||||
| return false; | return false; | ||||
| } | } | ||||
| if (newx == ibuf->x && newy == ibuf->y) { | if (newx == ibuf->x && newy == ibuf->y) { | ||||
| Show All 30 Lines | struct imbufRGBA { | ||||
| float r, g, b, a; | float r, g, b, a; | ||||
| }; | }; | ||||
| /** | /** | ||||
| * Return true if \a ibuf is modified. | * Return true if \a ibuf is modified. | ||||
| */ | */ | ||||
| bool IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy) | bool IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy) | ||||
| { | { | ||||
| BLI_assert(newx > 0 && newy > 0); | |||||
| unsigned int *rect, *_newrect, *newrect; | unsigned int *rect, *_newrect, *newrect; | ||||
| struct imbufRGBA *rectf, *_newrectf, *newrectf; | struct imbufRGBA *rectf, *_newrectf, *newrectf; | ||||
| int x, y; | int x, y; | ||||
| bool do_float = false, do_rect = false; | bool do_float = false, do_rect = false; | ||||
| size_t ofsx, ofsy, stepx, stepy; | size_t ofsx, ofsy, stepx, stepy; | ||||
| rect = NULL; | rect = NULL; | ||||
| _newrect = NULL; | _newrect = NULL; | ||||
| ▲ Show 20 Lines • Show All 156 Lines • ▼ Show 20 Lines | for (i = 0; i < data->tot_line; i++) { | ||||
| } | } | ||||
| } | } | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| void IMB_scaleImBuf_threaded(ImBuf *ibuf, unsigned int newx, unsigned int newy) | void IMB_scaleImBuf_threaded(ImBuf *ibuf, unsigned int newx, unsigned int newy) | ||||
| { | { | ||||
| BLI_assert(newx > 0 && newy > 0); | |||||
| ScaleTreadInitData init_data = {NULL}; | ScaleTreadInitData init_data = {NULL}; | ||||
| /* prepare initialization data */ | /* prepare initialization data */ | ||||
| init_data.ibuf = ibuf; | init_data.ibuf = ibuf; | ||||
| init_data.newx = newx; | init_data.newx = newx; | ||||
| init_data.newy = newy; | init_data.newy = newy; | ||||
| Show All 30 Lines | |||||