imagecore/formats/internal/raw.cpp (70 lines of code) (raw):
/*
* MIT License
*
* Copyright (c) 2017 Twitter
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "raw.h"
#include "imagecore/image/interleaved.h"
namespace imagecore {
REGISTER_IMAGE_WRITER(ImageWriterRAW);
bool ImageWriterRAW::Factory::matchesExtension(const char *extension)
{
return strcasecmp(extension, "raw") == 0 || strcasecmp(extension, "bin") == 0;
}
bool ImageWriterRAW::Factory::appropriateForInputFormat(EImageFormat format)
{
return false;
}
bool ImageWriterRAW::Factory::supportsInputColorModel(EImageColorModel colorModel)
{
return Image::colorModelIsInterleaved(colorModel);
}
EImageFormat ImageWriterRAW::Factory::getFormat()
{
return kImageFormat_RAW;
}
ImageWriterRAW::ImageWriterRAW()
: m_Storage(NULL)
{
}
ImageWriterRAW::~ImageWriterRAW()
{
}
bool ImageWriterRAW::initWithStorage(ImageWriter::Storage* output)
{
m_Storage = output;
return true;
}
bool ImageWriterRAW::beginWrite(unsigned int width, unsigned int height, EImageColorModel colorModel)
{
return true;
}
unsigned int ImageWriterRAW::writeRows(Image* source, unsigned int sourceRow, unsigned int numRows)
{
if( Image::colorModelIsInterleaved(source->getColorModel()) ) {
ImageInterleaved* sourceImage = source->asInterleaved();
unsigned int sourcePitch = sourceImage->getPitch();
uint8_t* sourceBuffer = (uint8_t*)sourceImage->getBytes();
unsigned int finalRow = sourceRow + numRows;
unsigned int rowSize = sourceImage->getWidth() * sourceImage->getComponentSize();
for( unsigned int y = sourceRow; y < finalRow; y++ ) {
m_Storage->write(sourceBuffer + sourcePitch * y, rowSize);
}
}
return numRows;
}
bool ImageWriterRAW::endWrite()
{
return true;
}
bool ImageWriterRAW::writeImage(Image* sourceImage)
{
unsigned int sourceWidth = sourceImage->getWidth();
unsigned int sourceHeight = sourceImage->getHeight();
if( !beginWrite(sourceWidth, sourceHeight, sourceImage->getColorModel()) ) {
return false;
}
if( writeRows(sourceImage, 0, sourceHeight) != sourceHeight ) {
return false;
}
if( !endWrite() ) {
return false;
}
return true;
}
}