Fix for IMB_(un)premultiply_rect_float() not doing right business
- Made them receive number of channels rather than number of planes. This matches to how ImBuf structure stored planes and channels. - IMB_premultiply_rect_float() was called with channels passed instead of planes already :S.
This commit is contained in:
parent
cbdedc169d
commit
898498c800
Notes:
blender-bot
2023-02-14 11:16:57 +01:00
Referenced by issue #38363, Transform hotkeys for rotating and scaling the object permanently stop working in rare instances.
|
@ -39,10 +39,10 @@ struct ImBuf;
|
|||
void imb_filterx(struct ImBuf *ibuf);
|
||||
|
||||
void IMB_premultiply_rect(unsigned int *rect, char planes, int w, int h);
|
||||
void IMB_premultiply_rect_float(float *rect_float, char planes, int w, int h);
|
||||
void IMB_premultiply_rect_float(float *rect_float, int channels, int w, int h);
|
||||
|
||||
void IMB_unpremultiply_rect(unsigned int *rect, char planes, int w, int h);
|
||||
void IMB_unpremultiply_rect_float(float *rect_float, char planes, int w, int h);
|
||||
void IMB_unpremultiply_rect_float(float *rect_float, int channels, int w, int h);
|
||||
|
||||
void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1);
|
||||
|
||||
|
|
|
@ -552,8 +552,7 @@ void IMB_rect_from_float(ImBuf *ibuf)
|
|||
IMB_colormanagement_transform(buffer, ibuf->x, ibuf->y, ibuf->channels, from_colorspace, ibuf->rect_colorspace->name, true);
|
||||
|
||||
/* convert from float's premul alpha to byte's straight alpha */
|
||||
if (ibuf->channels == 4)
|
||||
IMB_unpremultiply_rect_float(buffer, ibuf->planes, ibuf->x, ibuf->y);
|
||||
IMB_unpremultiply_rect_float(buffer, ibuf->channels, ibuf->x, ibuf->y);
|
||||
|
||||
/* convert float to byte */
|
||||
IMB_buffer_byte_from_float((unsigned char *) ibuf->rect, buffer, ibuf->channels, ibuf->dither, IB_PROFILE_SRGB, IB_PROFILE_SRGB,
|
||||
|
@ -647,7 +646,6 @@ void IMB_float_from_rect(ImBuf *ibuf)
|
|||
/* byte buffer is straight alpha, float should always be premul */
|
||||
IMB_premultiply_rect_float(rect_float, ibuf->channels, ibuf->x, ibuf->y);
|
||||
|
||||
|
||||
if (ibuf->rect_float == NULL) {
|
||||
ibuf->rect_float = rect_float;
|
||||
ibuf->mall |= IB_rectfloat;
|
||||
|
|
|
@ -565,19 +565,12 @@ void IMB_premultiply_rect(unsigned int *rect, char planes, int w, int h)
|
|||
}
|
||||
}
|
||||
|
||||
void IMB_premultiply_rect_float(float *rect_float, char planes, int w, int h)
|
||||
void IMB_premultiply_rect_float(float *rect_float, int channels, int w, int h)
|
||||
{
|
||||
float val, *cp;
|
||||
int x, y;
|
||||
|
||||
if (planes == 24) { /* put alpha at 1.0 */
|
||||
cp = rect_float;
|
||||
|
||||
for (y = 0; y < h; y++)
|
||||
for (x = 0; x < w; x++, cp += 4)
|
||||
cp[3] = 1.0;
|
||||
}
|
||||
else {
|
||||
if (channels == 4) {
|
||||
cp = rect_float;
|
||||
for (y = 0; y < h; y++) {
|
||||
for (x = 0; x < w; x++, cp += 4) {
|
||||
|
@ -600,7 +593,7 @@ void IMB_premultiply_alpha(ImBuf *ibuf)
|
|||
IMB_premultiply_rect(ibuf->rect, ibuf->planes, ibuf->x, ibuf->y);
|
||||
|
||||
if (ibuf->rect_float)
|
||||
IMB_premultiply_rect_float(ibuf->rect_float, ibuf->planes, ibuf->x, ibuf->y);
|
||||
IMB_premultiply_rect_float(ibuf->rect_float, ibuf->channels, ibuf->x, ibuf->y);
|
||||
}
|
||||
|
||||
void IMB_unpremultiply_rect(unsigned int *rect, char planes, int w, int h)
|
||||
|
@ -630,19 +623,12 @@ void IMB_unpremultiply_rect(unsigned int *rect, char planes, int w, int h)
|
|||
}
|
||||
}
|
||||
|
||||
void IMB_unpremultiply_rect_float(float *rect_float, char planes, int w, int h)
|
||||
void IMB_unpremultiply_rect_float(float *rect_float, int channels, int w, int h)
|
||||
{
|
||||
float val, *fp;
|
||||
int x, y;
|
||||
|
||||
if (planes == 24) { /* put alpha at 1.0 */
|
||||
fp = rect_float;
|
||||
|
||||
for (y = 0; y < h; y++)
|
||||
for (x = 0; x < w; x++, fp += 4)
|
||||
fp[3] = 1.0;
|
||||
}
|
||||
else {
|
||||
if (channels == 4) {
|
||||
fp = rect_float;
|
||||
for (y = 0; y < h; y++) {
|
||||
for (x = 0; x < w; x++, fp += 4) {
|
||||
|
@ -665,5 +651,5 @@ void IMB_unpremultiply_alpha(ImBuf *ibuf)
|
|||
IMB_unpremultiply_rect(ibuf->rect, ibuf->planes, ibuf->x, ibuf->y);
|
||||
|
||||
if (ibuf->rect_float)
|
||||
IMB_unpremultiply_rect_float(ibuf->rect_float, ibuf->planes, ibuf->x, ibuf->y);
|
||||
IMB_unpremultiply_rect_float(ibuf->rect_float, ibuf->channels, ibuf->x, ibuf->y);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue