/*****************************************************************************/ // Copyright 2006-2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in // accordance with the terms of the Adobe license agreement accompanying it. /*****************************************************************************/ /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_simple_image.cpp#1 $ */ /* $DateTime: 2012/05/30 13:28:51 $ */ /* $Change: 832332 $ */ /* $Author: tknoll $ */ /*****************************************************************************/ #include "dng_simple_image.h" #include "dng_memory.h" #include "dng_orientation.h" #include "dng_tag_types.h" #include "dng_tag_values.h" /*****************************************************************************/ dng_simple_image::dng_simple_image (const dng_rect &bounds, uint32 planes, uint32 pixelType, dng_memory_allocator &allocator) : dng_image (bounds, planes, pixelType) , fMemory () , fAllocator (allocator) { uint32 bytes = ComputeBufferSize (pixelType, bounds.Size (), planes, pad16Bytes); fMemory.Reset (allocator.Allocate (bytes)); fBuffer = dng_pixel_buffer (bounds, 0, planes, pixelType, pcInterleaved, fMemory->Buffer ()); } /*****************************************************************************/ dng_simple_image::~dng_simple_image () { } /*****************************************************************************/ dng_image * dng_simple_image::Clone () const { AutoPtr<dng_simple_image> result (new dng_simple_image (Bounds (), Planes (), PixelType (), fAllocator)); result->fBuffer.CopyArea (fBuffer, Bounds (), 0, Planes ()); return result.Release (); } /*****************************************************************************/ void dng_simple_image::SetPixelType (uint32 pixelType) { dng_image::SetPixelType (pixelType); fBuffer.fPixelType = pixelType; } /*****************************************************************************/ void dng_simple_image::Trim (const dng_rect &r) { fBounds.t = 0; fBounds.l = 0; fBounds.b = r.H (); fBounds.r = r.W (); fBuffer.fData = fBuffer.DirtyPixel (r.t, r.l); fBuffer.fArea = fBounds; } /*****************************************************************************/ void dng_simple_image::Rotate (const dng_orientation &orientation) { int32 originH = fBounds.l; int32 originV = fBounds.t; int32 colStep = fBuffer.fColStep; int32 rowStep = fBuffer.fRowStep; uint32 width = fBounds.W (); uint32 height = fBounds.H (); if (orientation.FlipH ()) { originH += width - 1; colStep = -colStep; } if (orientation.FlipV ()) { originV += height - 1; rowStep = -rowStep; } if (orientation.FlipD ()) { int32 temp = colStep; colStep = rowStep; rowStep = temp; width = fBounds.H (); height = fBounds.W (); } fBuffer.fData = fBuffer.DirtyPixel (originV, originH); fBuffer.fColStep = colStep; fBuffer.fRowStep = rowStep; fBounds.r = fBounds.l + width; fBounds.b = fBounds.t + height; fBuffer.fArea = fBounds; } /*****************************************************************************/ void dng_simple_image::AcquireTileBuffer (dng_tile_buffer &buffer, const dng_rect &area, bool dirty) const { buffer.fArea = area; buffer.fPlane = fBuffer.fPlane; buffer.fPlanes = fBuffer.fPlanes; buffer.fRowStep = fBuffer.fRowStep; buffer.fColStep = fBuffer.fColStep; buffer.fPlaneStep = fBuffer.fPlaneStep; buffer.fPixelType = fBuffer.fPixelType; buffer.fPixelSize = fBuffer.fPixelSize; buffer.fData = (void *) fBuffer.ConstPixel (buffer.fArea.t, buffer.fArea.l, buffer.fPlane); buffer.fDirty = dirty; } /*****************************************************************************/