CStr qCtx::ParseStr(const CStr &str) { qStrBuf myTmp; qStrReadBuf myIn(str); Parse(&myIn, &myTmp); return myTmp ? (CStr) myTmp : CStr::Empty; }
Codec::DecodeResult EXRCodec::decode(DataStreamPtr& input) const { ImageData * imgData = new ImageData; MemoryDataStreamPtr output; try { // Make a mutable clone of input to be able to change file pointer MemoryDataStream myIn(input); // Now we can simulate an OpenEXR file with that O_IStream str(myIn, "SomeChunk.exr"); InputFile file(str); Box2i dw = file.header().dataWindow(); int width = dw.max.x - dw.min.x + 1; int height = dw.max.y - dw.min.y + 1; int components = 3; // Alpha channel present? const ChannelList &channels = file.header().channels(); if(channels.findChannel("A")) components = 4; // Allocate memory output.bind(new MemoryDataStream(width*height*components*4)); // Construct frame buffer uchar *pixels = output->getPtr(); FrameBuffer frameBuffer; frameBuffer.insert("R", // name Slice (FLOAT, // type ((char *) pixels)+0, // base 4 * components, // xStride 4 * components * width)); // yStride frameBuffer.insert("G", // name Slice (FLOAT, // type ((char *) pixels)+4, // base 4 * components, // xStride 4 * components * width)); // yStride frameBuffer.insert("B", // name Slice (FLOAT, // type ((char *) pixels)+8, // base 4 * components, // xStride 4 * components * width)); // yStride if(components==4) { frameBuffer.insert("A", // name Slice (FLOAT, // type ((char *) pixels)+12, // base 4 * components, // xStride 4 * components * width)); // yStride } file.setFrameBuffer (frameBuffer); file.readPixels (dw.min.y, dw.max.y); imgData->format = components==3 ? PF_FLOAT32_RGB : PF_FLOAT32_RGBA; imgData->width = width; imgData->height = height; imgData->depth = 1; imgData->size = width*height*components*4; imgData->num_mipmaps = 0; imgData->flags = 0; } catch (const std::exception &exc) { delete imgData; throw(Exception(Exception::ERR_INTERNAL_ERROR, "OpenEXR Error", exc.what())); } DecodeResult ret; ret.first = output; ret.second = CodecDataPtr(imgData); return ret; }