android skia 解析gif图片

SkMovie*    fMovie;
FILE    *fp;
int flen;
int frame;
GifFileType* fGIF;

static int Decode(GifFileType* fileType, GifByteType* out, int size)
{
    SkStream* stream = (SkStream*) fileType->UserData;
    return (int) stream->read(out, size);
}


void Java_SkiaView_drawGIF(JNIEnv *env,
        jobject thizz, jobject canvas)
{
    if (fMovie)
    {
        if (fMovie->duration())
        {
            fMovie->setTime(SkTime::GetMSecs() % fMovie->duration());
        }
        else
        {
            fMovie->setTime(0);
        }
        SkCanvas* canv = GraphicsJNI::getNativeCanvas(env, canvas );
        canv->drawBitmap(fMovie->bitmap(), 0,  0);
    }
    else
    {
        LOGE("SkMovie::DecodeFile\n");
        fp=fopen("/sdcard/back.gif","r");
        fseek(fp, 0L, SEEK_END);   //把位置指针移到文件末尾
        flen = ftell(fp);             //求出文件的总字节数
        rewind(fp);
        unsigned char* buffer = new unsigned char[flen];

        fread(buffer,flen,1,fp);
        fclose(fp);

        frame = 0;
        SkMemoryStream* stream = new SkMemoryStream(buffer, flen, false);
        fGIF = DGifOpen( stream, Decode );
        if (DGifSlurp(fGIF) != GIF_OK)
        {
            DGifCloseFile(fGIF);
            fGIF = NULL;
        }
        frame = fGIF->ImageCount;

        fMovie = SkMovie::DecodeMemory(((SkStream*)(fGIF->UserData))->getMemoryBase(), flen);
        delete []buffer;
        delete stream;
        LOGE("/sdcard/loading.gif  frame: %d", frame);
    }

}

你可能感兴趣的:(java,android,Stream,delete,buffer,FP)