Files
danbooru/lib/danbooru_image_resizer/GIFReader.cpp
2010-02-08 01:40:39 -05:00

59 lines
1.1 KiB
C++

#include <string.h>
#include <gd.h>
#include "GIFReader.h"
#include "RowBuffer.h"
#include "Resize.h"
bool GIF::Read(FILE *f, Resizer *resizer, char error[1024])
{
RowBuffer Rows;
bool Ret = false;
gdImage *image = gdImageCreateFromGif(f);
if(!image)
{
strcpy(error, "couldn't read GIF");
return false;
}
if(!Rows.Init(image->sx, image->sy, 3))
{
strcpy(error, "out of memory");
goto cleanup;
}
resizer->SetSource(image->sx, image->sy, 3);
for(int y = 0; y < image->sy; ++y)
{
uint8_t *p = Rows.GetRow(y);
if(p == NULL)
{
strcpy(error, "out of memory");
goto cleanup;
}
for(int x = 0; x < image->sx; ++x)
{
int c = gdImageGetTrueColorPixel(image, x, y);
(*p++) = gdTrueColorGetRed(c);
(*p++) = gdTrueColorGetGreen(c);
(*p++) = gdTrueColorGetBlue(c);
}
int DiscardRow;
if(!resizer->Run(Rows.GetRows(), Rows.GetStartRow(), Rows.GetEndRow(), DiscardRow))
{
strcpy(error, resizer->GetError());
goto cleanup;
}
Rows.DiscardRows(DiscardRow);
}
Ret = true;
cleanup:
gdImageDestroy(image);
return Ret;
}