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:
Sergey Sharybin 2014-01-23 16:51:32 +06:00
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.
3 changed files with 9 additions and 25 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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);
}