示例#1
0
main ()
{
  int ii = return_1 ();
  if (ii != 1)
    abort_because ("wrong value returned");
  int j = return_arg (42);
  if (j != 42)
    abort_because ("wrong value returned");
  int k = return_sum (-69, 69);
  if (k != 0)
    abort_because ("wrong value returned");
  foo f1 = return_named_foo ();
  if (foo::si != 1)
    abort_because ("wrong number of foos");
  f1.i = 5;
  int l = foo_parm_returns_i (f1);
  if (l != 5)
    abort_because ("l != 5");
  foo f2 = foo_parm_returns_foo (f1);
  if (foo::si != 2)
    abort_because ("wrong number of foos");
  if (f2.i != 5)
    abort_because ("f2.i != 5");
  foo f3 = return_foo ();
  if (foo::si != 3)
    abort_because ("wrong number of foos");
  printf("PASS\n");
  return 0;
}
示例#2
0
void s3d_gl_load_dds(unsigned *tex_id, const char *path) {
    int file_len;
    char *file_data = s3d_read_file(path, 0, &file_len);

    if(strncmp(file_data, "DDS ", 4)) {
        abort_because("%s is not a DDS file.", path);
    }

    static const int header_len = 128;

    if(file_len < header_len) {
        abort_because("%s is corrupt.", path);
    }

    unsigned h = *(unsigned *)(&file_data[12]);
    unsigned w = *(unsigned *)(&file_data[16]);
    unsigned linear_len = *(unsigned *)(&file_data[20]);
    unsigned num_mipmaps = *(unsigned *)(&file_data[28]);
    char *fmt = &file_data[84];

    unsigned gl_fmt;
    unsigned block_len;

    if(strncmp(fmt, "DXT1", 4) == 0) {
        gl_fmt = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
        block_len = 8;
    }
    else
    if(strncmp(fmt, "DXT3", 4) == 0) {
        gl_fmt = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
        block_len = 16;
    }
    else
    if(strncmp(fmt, "DXT5", 4) == 0) {
        gl_fmt = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
        block_len = 16;
    }
    else {
        abort_because("%s: Unknown format: %s", path, fmt);
    }

    unsigned tex_id_;

    glGenTextures(1, &tex_id_);
    glBindTexture(GL_TEXTURE_2D, tex_id_);

    unsigned offset = header_len;

    for(int i = 0; i < num_mipmaps && (w || h); ++i) {
        unsigned len = ((w + 3) / 4) * ((h + 3) / 4) * block_len;

        if(offset + len > file_len) {
            abort_because("%s is corrupt.", path);
        }

        glCompressedTexImage2D(
            GL_TEXTURE_2D, i, gl_fmt, w, h, 0, len, file_data + offset
        );

        offset += len;

        w /= 2;
        h /= 2;
    }

    free(file_data);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

    if(tex_id) {
        *tex_id = tex_id_;
    }
}