Path: blob/master/thirdparty/msdfgen/core/save-bmp.cpp
9902 views
1#ifndef _CRT_SECURE_NO_WARNINGS2#define _CRT_SECURE_NO_WARNINGS3#endif45#include "save-bmp.h"67#include <cstdio>89#ifdef MSDFGEN_USE_CPP1110#include <cstdint>11#else12namespace msdfgen {13typedef int int32_t;14typedef unsigned uint32_t;15typedef unsigned short uint16_t;16typedef unsigned char uint8_t;17}18#endif1920#include "pixel-conversion.hpp"2122namespace msdfgen {2324template <typename T>25static bool writeValue(FILE *file, T value) {26#ifdef __BIG_ENDIAN__27T reverse = 0;28for (int i = 0; i < sizeof(T); ++i) {29reverse <<= 8;30reverse |= value&T(0xff);31value >>= 8;32}33return fwrite(&reverse, sizeof(T), 1, file) == 1;34#else35return fwrite(&value, sizeof(T), 1, file) == 1;36#endif37}3839static bool writeBmpHeader(FILE *file, int width, int height, int &paddedWidth) {40paddedWidth = (3*width+3)&~3;41const uint32_t bitmapStart = 54;42const uint32_t bitmapSize = paddedWidth*height;43const uint32_t fileSize = bitmapStart+bitmapSize;4445writeValue<uint16_t>(file, 0x4d42u);46writeValue<uint32_t>(file, fileSize);47writeValue<uint16_t>(file, 0);48writeValue<uint16_t>(file, 0);49writeValue<uint32_t>(file, bitmapStart);5051writeValue<uint32_t>(file, 40);52writeValue<int32_t>(file, width);53writeValue<int32_t>(file, height);54writeValue<uint16_t>(file, 1);55writeValue<uint16_t>(file, 24);56writeValue<uint32_t>(file, 0);57writeValue<uint32_t>(file, bitmapSize);58writeValue<uint32_t>(file, 2835);59writeValue<uint32_t>(file, 2835);60writeValue<uint32_t>(file, 0);61writeValue<uint32_t>(file, 0);6263return true;64}6566bool saveBmp(const BitmapConstRef<byte, 1> &bitmap, const char *filename) {67FILE *file = fopen(filename, "wb");68if (!file)69return false;7071int paddedWidth;72writeBmpHeader(file, bitmap.width, bitmap.height, paddedWidth);7374const uint8_t padding[4] = { };75int padLength = paddedWidth-3*bitmap.width;76for (int y = 0; y < bitmap.height; ++y) {77for (int x = 0; x < bitmap.width; ++x) {78uint8_t px = (uint8_t) *bitmap(x, y);79fwrite(&px, sizeof(uint8_t), 1, file);80fwrite(&px, sizeof(uint8_t), 1, file);81fwrite(&px, sizeof(uint8_t), 1, file);82}83fwrite(padding, 1, padLength, file);84}8586return !fclose(file);87}8889bool saveBmp(const BitmapConstRef<byte, 3> &bitmap, const char *filename) {90FILE *file = fopen(filename, "wb");91if (!file)92return false;9394int paddedWidth;95writeBmpHeader(file, bitmap.width, bitmap.height, paddedWidth);9697const uint8_t padding[4] = { };98int padLength = paddedWidth-3*bitmap.width;99for (int y = 0; y < bitmap.height; ++y) {100for (int x = 0; x < bitmap.width; ++x) {101uint8_t bgr[3] = {102(uint8_t) bitmap(x, y)[2],103(uint8_t) bitmap(x, y)[1],104(uint8_t) bitmap(x, y)[0]105};106fwrite(bgr, sizeof(uint8_t), 3, file);107}108fwrite(padding, 1, padLength, file);109}110111return !fclose(file);112}113114bool saveBmp(const BitmapConstRef<byte, 4> &bitmap, const char *filename) {115// RGBA not supported by the BMP format116return false;117}118119bool saveBmp(const BitmapConstRef<float, 1> &bitmap, const char *filename) {120FILE *file = fopen(filename, "wb");121if (!file)122return false;123124int paddedWidth;125writeBmpHeader(file, bitmap.width, bitmap.height, paddedWidth);126127const uint8_t padding[4] = { };128int padLength = paddedWidth-3*bitmap.width;129for (int y = 0; y < bitmap.height; ++y) {130for (int x = 0; x < bitmap.width; ++x) {131uint8_t px = (uint8_t) pixelFloatToByte(*bitmap(x, y));132fwrite(&px, sizeof(uint8_t), 1, file);133fwrite(&px, sizeof(uint8_t), 1, file);134fwrite(&px, sizeof(uint8_t), 1, file);135}136fwrite(padding, 1, padLength, file);137}138139return !fclose(file);140}141142bool saveBmp(const BitmapConstRef<float, 3> &bitmap, const char *filename) {143FILE *file = fopen(filename, "wb");144if (!file)145return false;146147int paddedWidth;148writeBmpHeader(file, bitmap.width, bitmap.height, paddedWidth);149150const uint8_t padding[4] = { };151int padLength = paddedWidth-3*bitmap.width;152for (int y = 0; y < bitmap.height; ++y) {153for (int x = 0; x < bitmap.width; ++x) {154uint8_t bgr[3] = {155(uint8_t) pixelFloatToByte(bitmap(x, y)[2]),156(uint8_t) pixelFloatToByte(bitmap(x, y)[1]),157(uint8_t) pixelFloatToByte(bitmap(x, y)[0])158};159fwrite(bgr, sizeof(uint8_t), 3, file);160}161fwrite(padding, 1, padLength, file);162}163164return !fclose(file);165}166167bool saveBmp(const BitmapConstRef<float, 4> &bitmap, const char *filename) {168// RGBA not supported by the BMP format169return false;170}171172}173174175