// File: cloudinary[P]fuif/./import/read_gif.h
// Function: read_image(gd_GIF*)
static int
read_image(gd_GIF *gif)
{
    uint8_t fisrz;
    int interlace;

    /* Image Descriptor. */
    gif->fx = read_num(gif->fd);
    gif->fy = read_num(gif->fd);
    gif->fw = read_num(gif->fd);
    gif->fh = read_num(gif->fd);
    read(gif->fd, &fisrz, 1);
    interlace = fisrz & 0x40;
    /* Ignore Sort Flag. */
    /* Local Color Table? */
    if (fisrz & 0x80) {
        /* Read LCT */
        gif->lct.size = 1 << ((fisrz & 0x07) + 1);
        read(gif->fd, gif->lct.colors, 3 * gif->lct.size);
        gif->palette = &gif->lct;
    } else
        gif->palette = &gif->gct;
    /* Image Data. */
    if (read_image_data(gif)) return -1;
    if (interlace) {
        // reorganize rows of interlaced frame
        uint8_t *tmp = (uint8_t*) malloc(gif->width * gif->height);
        memcpy(tmp, gif->frame, gif->width * gif->height);
        int y=0, scan=0, step=8;
        for (int iy=0; iy<gif->fh; iy++) {
            memcpy(&gif->frame[(gif->fy + y) * gif->width + gif->fx], &tmp[(gif->fy + iy) * gif->width + gif->fx], gif->fw);
            y += step;
            if (y >= gif->fh) {
                scan++;
                step = 16>>scan;
                y = step>>1;
            }
        }
        free(tmp);
    }
    return 0;
}

// Assembly:
subq $0x38, %rsp
movq %rdi, 0x28(%rsp)
movq 0x28(%rsp), %rax
movl (%rax), %edi
callq 0x3b250
movw %ax, %cx
movq 0x28(%rsp), %rax
movw %cx, 0x650(%rax)
movq 0x28(%rsp), %rax
movl (%rax), %edi
callq 0x3b250
movw %ax, %cx
movq 0x28(%rsp), %rax
movw %cx, 0x652(%rax)
movq 0x28(%rsp), %rax
movl (%rax), %edi
callq 0x3b250
movw %ax, %cx
movq 0x28(%rsp), %rax
movw %cx, 0x654(%rax)
movq 0x28(%rsp), %rax
movl (%rax), %edi
callq 0x3b250
movw %ax, %cx
movq 0x28(%rsp), %rax
movw %cx, 0x656(%rax)
movq 0x28(%rsp), %rax
movl (%rax), %edi
leaq 0x27(%rsp), %rsi
movl $0x1, %edx
callq 0x3520
movzbl 0x27(%rsp), %eax
andl $0x40, %eax
movl %eax, 0x20(%rsp)
movzbl 0x27(%rsp), %eax
andl $0x80, %eax
cmpl $0x0, %eax
je 0x3b5db
movzbl 0x27(%rsp), %ecx
andl $0x7, %ecx
addl $0x1, %ecx
movl $0x1, %eax
shll %cl, %eax
movl %eax, %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0x30(%rax)
movq 0x28(%rsp), %rax
movl (%rax), %edi
movq 0x28(%rsp), %rsi
addq $0x30, %rsi
addq $0x4, %rsi
movq 0x28(%rsp), %rax
imull $0x3, 0x30(%rax), %eax
movslq %eax, %rdx
callq 0x3520
movq 0x28(%rsp), %rcx
addq $0x30, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x28(%rax)
jmp 0x3b5f0
movq 0x28(%rsp), %rcx
addq $0x334, %rcx            # imm = 0x334
movq 0x28(%rsp), %rax
movq %rcx, 0x28(%rax)
movq 0x28(%rsp), %rdi
callq 0x44ba0
cmpl $0x0, %eax
je 0x3b60c
movl $0xffffffff, 0x34(%rsp) # imm = 0xFFFFFFFF
jmp 0x3b789
cmpl $0x0, 0x20(%rsp)
je 0x3b781
movq 0x28(%rsp), %rax
movzwl 0x10(%rax), %eax
movq 0x28(%rsp), %rcx
movzwl 0x12(%rcx), %ecx
imull %ecx, %eax
movslq %eax, %rdi
callq 0x34c0
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rdi
movq 0x28(%rsp), %rax
movq 0x668(%rax), %rsi
movq 0x28(%rsp), %rax
movzwl 0x10(%rax), %eax
movq 0x28(%rsp), %rcx
movzwl 0x12(%rcx), %ecx
imull %ecx, %eax
movslq %eax, %rdx
callq 0x3300
movl $0x0, 0x14(%rsp)
movl $0x0, 0x10(%rsp)
movl $0x8, 0xc(%rsp)
movl $0x0, 0x8(%rsp)
movl 0x8(%rsp), %eax
movq 0x28(%rsp), %rcx
movzwl 0x656(%rcx), %ecx
cmpl %ecx, %eax
jge 0x3b777
movq 0x28(%rsp), %rax
movq 0x668(%rax), %rdi
movq 0x28(%rsp), %rax
movzwl 0x652(%rax), %eax
addl 0x14(%rsp), %eax
movq 0x28(%rsp), %rcx
movzwl 0x10(%rcx), %ecx
imull %ecx, %eax
movq 0x28(%rsp), %rcx
movzwl 0x650(%rcx), %ecx
addl %ecx, %eax
cltq
addq %rax, %rdi
movq 0x18(%rsp), %rsi
movq 0x28(%rsp), %rax
movzwl 0x652(%rax), %eax
addl 0x8(%rsp), %eax
movq 0x28(%rsp), %rcx
movzwl 0x10(%rcx), %ecx
imull %ecx, %eax
movq 0x28(%rsp), %rcx
movzwl 0x650(%rcx), %ecx
addl %ecx, %eax
cltq
addq %rax, %rsi
movq 0x28(%rsp), %rax
movzwl 0x654(%rax), %eax
movl %eax, %edx
callq 0x3300
movl 0xc(%rsp), %eax
addl 0x14(%rsp), %eax
movl %eax, 0x14(%rsp)
movl 0x14(%rsp), %eax
movq 0x28(%rsp), %rcx
movzwl 0x656(%rcx), %ecx
cmpl %ecx, %eax
jl 0x3b765
movl 0x10(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x10(%rsp)
movl 0x10(%rsp), %ecx
movl $0x10, %eax
sarl %cl, %eax
movl %eax, 0xc(%rsp)
movl 0xc(%rsp), %eax
sarl %eax
movl %eax, 0x14(%rsp)
jmp 0x3b767
movl 0x8(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x8(%rsp)
jmp 0x3b687
movq 0x18(%rsp), %rdi
callq 0x3470
movl $0x0, 0x34(%rsp)
movl 0x34(%rsp), %eax
addq $0x38, %rsp
retq
nopw %cs:(%rax,%rax)