blob: b18f7f275a10025863f9c3d1e5beff7114444754 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#include <fstream>
#include <iostream>
// Converts from RGBA straight alpha into BGRA premultiplied alpha.
int main(int argc, char* argv[]) {
if (argc != 3) {
std::cerr << "Usage: " << argv[0] << " INPUT OUTPUT" << std::endl;
return EXIT_FAILURE;
}
std::ifstream src(argv[1], std::ios::in | std::ios::binary);
if (!src.is_open()) {
std::cerr << "Failed to open " << argv[1] << " for reading." << std::endl;
return EXIT_FAILURE;
}
std::ofstream dest(argv[2], std::ios::out | std::ios::binary);
if (!dest.is_open()) {
std::cerr << "Failed to open " << argv[2] << " for writing." << std::endl;
return EXIT_FAILURE;
}
char pixel[4]{};
while (src.read(pixel, sizeof(pixel))) {
uint32_t r = static_cast<uint8_t>(pixel[0]);
uint32_t g = static_cast<uint8_t>(pixel[1]);
uint32_t b = static_cast<uint8_t>(pixel[2]);
uint32_t a = static_cast<uint8_t>(pixel[3]);
pixel[0] = static_cast<char>((b * a + 127) / 255);
pixel[1] = static_cast<char>((g * a + 127) / 255);
pixel[2] = static_cast<char>((r * a + 127) / 255);
if (dest.write(pixel, sizeof(pixel)).bad()) {
std::cerr << "Failed writing data to " << argv[2] << "." << std::endl;
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}