// check whether a filename corresponds to a small image or a tiled tiff static bool filename_corresponds_to_tiffo(char *filename) { if (0 == strcmp(filename, "-")) return false; struct tiff_info ti[1]; disable_tiff_warnings_and_errors(); bool r = get_tiff_info_filename_e(ti, filename); if (!r) { char buf[FILENAME_MAX]; snprintf(buf, FILENAME_MAX, filename, 0); r = get_tiff_info_filename_e(ti, buf); if (!r) return false; return ti->tiled; } return ti->tiled; }
void tiff_octaves_init0(struct tiff_octaves *t, char *filepattern, double megabytes, int max_octaves) { //fprintf(stderr, "tiff octaves init \"%s\"(%gMB)\n", filepattern, megabytes); // create filenames until possible t->noctaves = 0; for (int o = 0; o < max_octaves; o++) { snprintf(t->filename[o], FILENAME_MAX, filepattern, o); if (!get_tiff_info_filename_e(t->i + o, t->filename[o])) break; if (t->i[o].bps < 8 || t->i[o].packed) fail("caching of packed samples is not supported"); if (o > 0) { // check consistency if (0 == strcmp(t->filename[o], t->filename[0])) break; if (t->i[o].bps != t->i->bps) fail("inconsistent bps"); if (t->i[o].spp != t->i->spp) fail("inconsistent spp"); if (t->i[o].fmt != t->i->fmt) fail("inconsistent fmt"); if (t->i[o].tw != t->i->tw) fail("inconsistent tw"); if (t->i[o].th != t->i->th) fail("inconsistent th"); } t->noctaves += 1; } if (t->noctaves < 1) fail("Could not get any file with pattern \"%s\"", filepattern); // set up essential data for (int o = 0; o < t->noctaves; o++) { t->c[o] = xmalloc((1 + t->i[o].ntiles) * sizeof*t->c); for (int j = 0; j < t->i[o].ntiles; j++) t->c[o][j] = 0; } // set up writing cache for setpixel (just in case) t->option_read = true; t->option_write = false; t->changed = xmalloc(t->i->ntiles * sizeof*t->changed); for (int i = 0; i < t->i->ntiles; i++) t->changed[i] = false; // set up data for old tile deletion if (megabytes) { for (int o = 0; o < t->noctaves; o++) t->a[o] = xmalloc(t->i[o].ntiles * sizeof*t->a[o]); t->ax = 0; int tilesize = t->i->tw * t->i->th * (t->i->bps/8) * t->i->spp; double mbts = tilesize / (1024.0 * 1024); t->maxtiles = megabytes / mbts; //fprintf(stderr, "maxtiles = %d\n", t->maxtiles); t->curtiles = 0; } else { // unlimited tile usage t->a[0] = NULL; } }