コード例 #1
0
ファイル: sprcache.cpp プロジェクト: smarinel/ags-web
void SpriteCache::init()
{
  if (ff != NULL)
    fclose(ff);

  ff = NULL;
  changeMaxSize(elements);
  cachesize = 0;
  lockedSize = 0;
  liststart = -1;
  listend = -1;
  lastLoad = -2;
  maxCacheSize = DEFAULTCACHESIZE;
}
コード例 #2
0
ファイル: spritecache_engine.cpp プロジェクト: AlanDrake/ags
void SpriteCache::initFile_adjustBuffers(short numspri)
{
  // adjust the buffers to the sprite file size
  changeMaxSize(numspri + 1);
}
コード例 #3
0
ファイル: sprcache.cpp プロジェクト: smarinel/ags-web
int SpriteCache::initFile(const char *filnam)
{
  short vers;
  char buff[20];
  short numspri = 0;
  int vv, wdd, htt;
  long spr_initial_offs = 0;
  int spriteFileID = 0;

  for (vv = 0; vv < elements; vv++) {
    images[vv] = NULL;
    offsets[vv] = 0;
  }

  ff = clibfopen((char *)filnam, "rb");
  if (ff == NULL)
    return -1;

  spr_initial_offs = ftell(ff);

  fread(&vers, 2, 1, ff);
  // read the "Sprite File" signature
  fread(&buff[0], 13, 1, ff);

  if ((vers < 4) || (vers > 6)) {
    fclose(ff);
    ff = NULL;
    return -1;
  }

  // unknown version
  buff[13] = 0;
  if (strcmp(buff, spriteFileSig)) {
    fclose(ff);
    ff = NULL;
    return -1;
  }

  if (vers == 4)
    this->spritesAreCompressed = false;
  else if (vers == 5)
    this->spritesAreCompressed = true;
  else if (vers >= 6)
  {
    this->spritesAreCompressed = (fgetc(ff) == 1);
    spriteFileID = getw(ff);
  }

  if (vers < 5) {
    // skip the palette
    fseek(ff, 256 * 3, SEEK_CUR);
  }

  fread(&numspri, 2, 1, ff);

  if (vers < 4)
    numspri = 200;

#ifdef THIS_IS_THE_ENGINE
  // adjust the buffers to the sprite file size
  changeMaxSize(numspri + 1);
#endif

  // if there is a sprite index file, use it
  if (loadSpriteIndexFile(spriteFileID, spr_initial_offs, numspri))
  {
    // Succeeded
    return 0;
  }

  // failed, delete the index file because it's invalid
  unlink(spindexfilename);

  // no sprite index file, manually index it

  for (vv = 0; vv <= numspri; vv++) {

    offsets[vv] = ftell(ff);
    flags[vv] = 0;

    int coldep = getshort(ff);

    if (coldep == 0) {
      offsets[vv] = 0;
      images[vv] = NULL;

#ifdef THIS_IS_THE_ENGINE
      // make it a blue cup, to avoid crashes
      spritewidth[vv] = spritewidth[0];
      spriteheight[vv] = spriteheight[0];
      offsets[vv] = offsets[0];
      flags[vv] = SPRCACHEFLAG_DOESNOTEXIST;
#else
      // no sprite ... blank it out
      spritewidth[vv] = 0;
      spriteheight[vv] = 0;
      offsets[vv] = 0;
#endif

      if (feof(ff))
        break;

      continue;
    }

    if (feof(ff))
      break;

    if (vv >= elements)
      break;

    images[vv] = NULL;

    wdd = getshort(ff);
    htt = getshort(ff);

    spritewidth[vv] = wdd;
    spriteheight[vv] = htt;
    get_new_size_for_sprite(vv, wdd, htt, spritewidth[vv], spriteheight[vv]);

    long spriteDataSize;
    if (vers == 5) {
      spriteDataSize = getw(ff);
    }
    else {
      spriteDataSize = wdd * coldep * htt;
    }

    fseek(ff, spriteDataSize, SEEK_CUR);
  }

  sprite0InitialOffset = offsets[0];
  return 0;
}