-
- /* ------------------------ / */
- /* / / */
- /* / FORMAT : BMP / */
- /* / / */
- /* /----------------------- / */
-
- case BMP_DFMT: /* BMP */
- if (img.numcomps == 3 && img.comps[0].dx == img.comps[1].dx
- && img.comps[1].dx == img.comps[2].dx
- && img.comps[0].dy == img.comps[1].dy
- && img.comps[1].dy == img.comps[2].dy
- && img.comps[0].prec == img.comps[1].prec
- && img.comps[1].prec == img.comps[2].prec) {
- /* -->> -->> -->> -->>
-
- 24 bits color
-
- <<-- <<-- <<-- <<-- */
-
- fdest = fopen(outfile, "wb");
- if (!fdest) {
- fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile);
- return 1;
- }
-
- // w = int_ceildiv(img.x1 - img.x0, img.comps[0].dx);
- // wr = int_ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), img.comps[0].dx);
- w = img.comps[0].w;
- wr = int_ceildivpow2(img.comps[0].w, img.comps[0].factor);
-
- // h = int_ceildiv(img.y1 - img.y0, img.comps[0].dy);
- // hr = int_ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[0].dy);
- h = img.comps[0].h;
- hr = int_ceildivpow2(img.comps[0].h, img.comps[0].factor);
-
- fprintf(fdest, "BM");
-
- /* FILE HEADER */
- /* ------------- */
- fprintf(fdest, "%c%c%c%c",
- (unsigned char) (hr * wr * 3 + 3 * hr * (wr % 2) +
- 54) & 0xff,
- (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
- >> 8) & 0xff,
- (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
- >> 16) & 0xff,
- (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
- >> 24) & 0xff);
- fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
- ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
- fprintf(fdest, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,
- ((54) >> 16) & 0xff, ((54) >> 24) & 0xff);
-
- /* INFO HEADER */
- /* ------------- */
- fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,
- ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
- fprintf(fdest, "%c%c%c%c", (unsigned char) ((wr) & 0xff),
- (unsigned char) ((wr) >> 8) & 0xff,
- (unsigned char) ((wr) >> 16) & 0xff,
- (unsigned char) ((wr) >> 24) & 0xff);
- fprintf(fdest, "%c%c%c%c", (unsigned char) ((hr) & 0xff),
- (unsigned char) ((hr) >> 8) & 0xff,
- (unsigned char) ((hr) >> 16) & 0xff,
- (unsigned char) ((hr) >> 24) & 0xff);
- fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
- fprintf(fdest, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff);
- fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
- ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
- fprintf(fdest, "%c%c%c%c",
- (unsigned char) (3 * hr * wr +
- 3 * hr * (wr % 2)) & 0xff,
- (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
- 8) & 0xff,
- (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
- 16) & 0xff,
- (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
- 24) & 0xff);
- fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
- ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
- fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
- ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
- fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
- ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
- fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
- ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
-
- for (i = 0; i < wr * hr; i++) {
- unsigned char R, G, B;
- /* a modifier */
- // R = img.comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
- R = img.comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
- // G = img.comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
- G = img.comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
- // B = img.comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
- B = img.comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
- fprintf(fdest, "%c%c%c", B, G, R);
-
- if ((i + 1) % wr == 0) {
- for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) /* ADD */
- fprintf(fdest, "%c", 0);
- }
- }
- fclose(fdest);
- free(img.comps[1].data);
- free(img.comps[2].data);
- } else { /* Gray-scale */
-
- /* -->> -->> -->> -->>
-
- 8 bits non code (Gray scale)
-
- <<-- <<-- <<-- <<-- */
- fdest = fopen(outfile, "wb");
- // w = int_ceildiv(img.x1 - img.x0, img.comps[0].dx);
- // wr = int_ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), img.comps[0].dx);
- w = img.comps[0].w;
- wr = int_ceildivpow2(img.comps[0].w, img.comps[0].factor);
-
- // h = int_ceildiv(img.y1 - img.y0, img.comps[0].dy);
- // hr = int_ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[0].dy);
- h = img.comps[0].h;
- hr = int_ceildivpow2(img.comps[0].h, img.comps[0].factor);
-
- fprintf(fdest, "BM");
-
- /* FILE HEADER */
- /* ------------- */
- fprintf(fdest, "%c%c%c%c",
- (unsigned char) (hr * wr + 54 + 1024 +
- hr * (wr % 2)) & 0xff,
- (unsigned char) ((hr * wr + 54 + 1024 + hr * (wr % 2))
- >> 8) & 0xff,
- (unsigned char) ((hr * wr + 54 + 1024 + hr * (wr % 2))
- >> 16) & 0xff,
- (unsigned char) ((hr * wr + 54 + 1024 + wr * (wr % 2))
- >> 24) & 0xff);
- fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
- ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
- fprintf(fdest, "%c%c%c%c", (54 + 1024) & 0xff,
- ((54 + 1024) >> 8) & 0xff, ((54 + 1024) >> 16) & 0xff,
- ((54 + 1024) >> 24) & 0xff);