/*****************************************************************************/
// 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;
								  
	}
		
/*****************************************************************************/

