Added IMB_gamwarp and IMB_interlace (and the interlace and gamwarp wrappers

for the plugins)

Kent
This commit is contained in:
2003-04-30 18:38:50 +00:00
parent abd2a37f8a
commit c31b578d77
3 changed files with 68 additions and 6 deletions

View File

@@ -235,6 +235,16 @@ struct ImBuf *scalefastfieldImBuf(struct ImBuf *ib,
* even though they aren't in the header
*/
void interlace(struct ImBuf *ibuf)
{
IMB_interlace(ibuf);
}
void gamwarp(struct ImBuf *ibuf, double gamma)
{
IMB_gamwarp(ibuf,gamma);
}
void de_interlace(struct ImBuf *ib)
{
IMB_de_interlace(ib);
@@ -341,5 +351,7 @@ int pluginapi_force_ref(void)
(int) turbulence +
(int) turbulence1 +
(int) de_interlace +
(int) interlace +
(int) gamwarp +
(int) rectop;
}

View File

@@ -344,6 +344,8 @@ int imb_get_anim_type(char * name);
* @attention Defined in divers.c
*/
void IMB_de_interlace(struct ImBuf *ibuf);
void IMB_interlace(struct ImBuf *ibuf);
void IMB_gamwarp(struct ImBuf *ibuf, double gamma);
/**
* Change the ordering of the colour bytes pointed to by rect from

View File

@@ -88,7 +88,6 @@ void imb_checkncols(struct ImBuf *ibuf)
void IMB_de_interlace(struct ImBuf *ibuf)
{
struct ImBuf * tbuf1, * tbuf2;
/* extern rectcpy(); */
if (ibuf == 0) return;
if (ibuf->flags & IB_fields) return;
@@ -100,15 +99,10 @@ void IMB_de_interlace(struct ImBuf *ibuf)
tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
ibuf->x *= 2;
/* Functions need more args :( */
/* rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, rectcpy); */
/* rectop(tbuf2, ibuf, 0, 0, tbuf2->x, 0, 32767, 32767, rectcpy); */
IMB_rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0);
IMB_rectop(tbuf2, ibuf, 0, 0, tbuf2->x, 0, 32767, 32767, IMB_rectcpy, 0);
ibuf->x /= 2;
/* rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, rectcpy); */
/* rectop(ibuf, tbuf2, 0, tbuf2->y, 0, 0, 32767, 32767, rectcpy); */
IMB_rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0);
IMB_rectop(ibuf, tbuf2, 0, tbuf2->y, 0, 0, 32767, 32767, IMB_rectcpy, 0);
@@ -118,3 +112,57 @@ void IMB_de_interlace(struct ImBuf *ibuf)
ibuf->y /= 2;
}
void IMB_interlace(struct ImBuf *ibuf)
{
struct ImBuf * tbuf1, * tbuf2;
if (ibuf == 0) return;
ibuf->flags &= ~IB_fields;
ibuf->y *= 2;
if (ibuf->rect) {
/* make copies */
tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
IMB_rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy,
0);
IMB_rectop(tbuf2, ibuf, 0, 0, 0, tbuf2->y, 32767, 32767,
IMB_rectcpy,0);
ibuf->x *= 2;
IMB_rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy,
0);
IMB_rectop(ibuf, tbuf2, tbuf2->x, 0, 0, 0, 32767, 32767,
IMB_rectcpy,0);
ibuf->x /= 2;
IMB_freeImBuf(tbuf1);
IMB_freeImBuf(tbuf2);
}
}
void IMB_gamwarp(struct ImBuf *ibuf, double gamma)
{
uchar gam[256];
int i;
uchar *rect;
if (ibuf == 0) return;
if (ibuf->rect == 0) return;
if (gamma == 1.0) return;
gamma = 1.0 / gamma;
for (i = 255 ; i >= 0 ; i--) gam[i] = (255.0 * pow(i / 255.0 ,
gamma)) + 0.5;
rect = (uchar *) ibuf->rect;
for (i = ibuf->x * ibuf->y ; i>0 ; i--){
rect ++;
*rect ++ = gam[*rect];
*rect ++ = gam[*rect];
*rect ++ = gam[*rect];
}
}