476 lines
9.7 KiB
C++
476 lines
9.7 KiB
C++
|
/**************************************************************************\
|
||
|
*
|
||
|
* Copyright (c) 1999 Microsoft Corporation
|
||
|
*
|
||
|
* Module Name:
|
||
|
*
|
||
|
* ImageAttr.cpp
|
||
|
*
|
||
|
* Abstract:
|
||
|
*
|
||
|
* GpImageAttributes (recolor) methods
|
||
|
*
|
||
|
* Revision History:
|
||
|
*
|
||
|
* 14-Nov-1999 gilmanw
|
||
|
* Created it.
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
#include "precomp.hpp"
|
||
|
|
||
|
#include "..\imaging\api\comutils.hpp"
|
||
|
#include "..\imaging\api\decodedimg.hpp"
|
||
|
|
||
|
/**************************************************************************\
|
||
|
*
|
||
|
* Function Description:
|
||
|
*
|
||
|
* Create a default GpImageAttributes.
|
||
|
*
|
||
|
* Arguments:
|
||
|
*
|
||
|
* NONE
|
||
|
*
|
||
|
* Return Value:
|
||
|
*
|
||
|
* NONE
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
GpImageAttributes::GpImageAttributes()
|
||
|
{
|
||
|
SetValid(TRUE); // default is valid
|
||
|
|
||
|
recolor = new GpRecolor();
|
||
|
|
||
|
// default WrapMode settings;
|
||
|
DeviceImageAttributes.wrapMode = WrapModeClamp;
|
||
|
DeviceImageAttributes.clampColor = (ARGB)0x00000000; // Fully transparent black
|
||
|
DeviceImageAttributes.srcRectClamp = FALSE;
|
||
|
|
||
|
cachedBackground = TRUE;
|
||
|
}
|
||
|
|
||
|
/**************************************************************************\
|
||
|
*
|
||
|
* Function Description:
|
||
|
*
|
||
|
* Release GpImageAttributes.
|
||
|
*
|
||
|
* Arguments:
|
||
|
*
|
||
|
* NONE
|
||
|
*
|
||
|
* Return Value:
|
||
|
*
|
||
|
* NONE
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
VOID GpImageAttributes::Dispose()
|
||
|
{
|
||
|
delete this;
|
||
|
}
|
||
|
|
||
|
GpImageAttributes::~GpImageAttributes()
|
||
|
{
|
||
|
if (recolor)
|
||
|
recolor->Dispose();
|
||
|
}
|
||
|
|
||
|
/**************************************************************************\
|
||
|
*
|
||
|
* Function Description:
|
||
|
*
|
||
|
* Clone GpImageAttributes.
|
||
|
*
|
||
|
* Arguments:
|
||
|
*
|
||
|
* NONE
|
||
|
*
|
||
|
* Return Value:
|
||
|
*
|
||
|
* Pointer to new GpImageAttributes if successful.
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
GpImageAttributes* GpImageAttributes::Clone() const
|
||
|
{
|
||
|
GpImageAttributes* clone = new GpImageAttributes();
|
||
|
|
||
|
if (clone)
|
||
|
{
|
||
|
if ( clone->IsValid() && this->IsValid() )
|
||
|
{
|
||
|
*clone->recolor = *this->recolor;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
clone->Dispose();
|
||
|
clone = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return clone;
|
||
|
}
|
||
|
|
||
|
// Set to identity, regardless of what the default color adjustment is.
|
||
|
GpStatus
|
||
|
GpImageAttributes::SetToIdentity(
|
||
|
ColorAdjustType type
|
||
|
)
|
||
|
{
|
||
|
recolor->SetToIdentity(type);
|
||
|
UpdateUid();
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
// Remove any individual color adjustments, and go back to using the default
|
||
|
GpStatus
|
||
|
GpImageAttributes::Reset(
|
||
|
ColorAdjustType type
|
||
|
)
|
||
|
{
|
||
|
recolor->Reset(type);
|
||
|
UpdateUid();
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
GpStatus
|
||
|
GpImageAttributes::SetColorMatrix(
|
||
|
ColorAdjustType type,
|
||
|
BOOL enable,
|
||
|
ColorMatrix* colorMatrix,
|
||
|
ColorMatrix* grayMatrix,
|
||
|
ColorMatrixFlags flags)
|
||
|
{
|
||
|
HRESULT result;
|
||
|
|
||
|
if (enable)
|
||
|
result = recolor->SetColorMatrices(type, colorMatrix, grayMatrix, flags);
|
||
|
else
|
||
|
result = recolor->ClearColorMatrices(type);
|
||
|
|
||
|
UpdateUid();
|
||
|
|
||
|
if (FAILED(result))
|
||
|
{
|
||
|
if (result == E_OUTOFMEMORY)
|
||
|
return OutOfMemory;
|
||
|
else
|
||
|
return InvalidParameter;
|
||
|
}
|
||
|
else
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
GpStatus
|
||
|
GpImageAttributes::SetThreshold(
|
||
|
ColorAdjustType type,
|
||
|
BOOL enable,
|
||
|
REAL threshold)
|
||
|
{
|
||
|
HRESULT result;
|
||
|
|
||
|
if (enable)
|
||
|
result = recolor->SetThreshold(type, threshold);
|
||
|
else
|
||
|
result = recolor->ClearThreshold(type);
|
||
|
|
||
|
UpdateUid();
|
||
|
|
||
|
if (FAILED(result))
|
||
|
return InvalidParameter;
|
||
|
else
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
GpStatus
|
||
|
GpImageAttributes::SetGamma(
|
||
|
ColorAdjustType type,
|
||
|
BOOL enable,
|
||
|
REAL gamma)
|
||
|
{
|
||
|
HRESULT result;
|
||
|
|
||
|
if (enable)
|
||
|
result = recolor->SetGamma(type, gamma);
|
||
|
else
|
||
|
result = recolor->ClearGamma(type);
|
||
|
|
||
|
UpdateUid();
|
||
|
|
||
|
if (FAILED(result))
|
||
|
return InvalidParameter;
|
||
|
else
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
GpStatus GpImageAttributes::SetNoOp(
|
||
|
ColorAdjustType type,
|
||
|
BOOL enable
|
||
|
)
|
||
|
{
|
||
|
HRESULT result;
|
||
|
|
||
|
if (enable)
|
||
|
result = recolor->SetNoOp(type);
|
||
|
else
|
||
|
result = recolor->ClearNoOp(type);
|
||
|
|
||
|
UpdateUid();
|
||
|
|
||
|
if (FAILED(result))
|
||
|
return InvalidParameter;
|
||
|
else
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
GpStatus
|
||
|
GpImageAttributes::SetColorKeys(
|
||
|
ColorAdjustType type,
|
||
|
BOOL enable,
|
||
|
Color* colorLow,
|
||
|
Color* colorHigh)
|
||
|
{
|
||
|
HRESULT result;
|
||
|
|
||
|
if (enable)
|
||
|
result = recolor->SetColorKey(type, colorLow, colorHigh);
|
||
|
else
|
||
|
result = recolor->ClearColorKey(type);
|
||
|
|
||
|
UpdateUid();
|
||
|
|
||
|
if (FAILED(result))
|
||
|
return InvalidParameter;
|
||
|
else
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
GpStatus
|
||
|
GpImageAttributes::SetOutputChannel(
|
||
|
ColorAdjustType type,
|
||
|
BOOL enable,
|
||
|
ColorChannelFlags channelFlags
|
||
|
)
|
||
|
{
|
||
|
HRESULT result;
|
||
|
|
||
|
if (enable)
|
||
|
result = recolor->SetOutputChannel(type, channelFlags);
|
||
|
else
|
||
|
result = recolor->ClearOutputChannel(type);
|
||
|
|
||
|
UpdateUid();
|
||
|
|
||
|
if (FAILED(result))
|
||
|
return InvalidParameter;
|
||
|
else
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
GpStatus
|
||
|
GpImageAttributes::SetOutputChannelProfile(
|
||
|
ColorAdjustType type,
|
||
|
BOOL enable,
|
||
|
WCHAR *profile)
|
||
|
{
|
||
|
HRESULT result;
|
||
|
|
||
|
if (enable)
|
||
|
result = recolor->SetOutputChannelProfile(type, profile);
|
||
|
else
|
||
|
result = recolor->ClearOutputChannelProfile(type);
|
||
|
|
||
|
UpdateUid();
|
||
|
|
||
|
if (SUCCEEDED(result))
|
||
|
return Ok;
|
||
|
else
|
||
|
{
|
||
|
if (result == E_INVALIDARG)
|
||
|
return InvalidParameter;
|
||
|
else if (result == E_OUTOFMEMORY)
|
||
|
return OutOfMemory;
|
||
|
else
|
||
|
return Win32Error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GpStatus
|
||
|
GpImageAttributes::SetRemapTable(
|
||
|
ColorAdjustType type,
|
||
|
BOOL enable,
|
||
|
UINT mapSize,
|
||
|
ColorMap* map)
|
||
|
{
|
||
|
HRESULT result;
|
||
|
|
||
|
if (enable)
|
||
|
result = recolor->SetRemapTable(type, mapSize, map);
|
||
|
else
|
||
|
result = recolor->ClearRemapTable(type);
|
||
|
|
||
|
UpdateUid();
|
||
|
|
||
|
if (FAILED(result))
|
||
|
return InvalidParameter;
|
||
|
else
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
GpStatus
|
||
|
GpImageAttributes::SetCachedBackground(
|
||
|
BOOL enableFlag
|
||
|
)
|
||
|
{
|
||
|
if (cachedBackground != enableFlag)
|
||
|
{
|
||
|
cachedBackground = enableFlag;
|
||
|
UpdateUid();
|
||
|
}
|
||
|
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
GpImageAttributes::HasRecoloring(
|
||
|
ColorAdjustType type
|
||
|
) const
|
||
|
{
|
||
|
return (recolor) && (recolor->HasRecoloring(type) != 0);
|
||
|
}
|
||
|
|
||
|
GpStatus GpImageAttributes::SetWrapMode(WrapMode wrap, ARGB color, BOOL Clamp)
|
||
|
{
|
||
|
DeviceImageAttributes.wrapMode = wrap;
|
||
|
DeviceImageAttributes.clampColor = color;
|
||
|
DeviceImageAttributes.srcRectClamp = Clamp;
|
||
|
UpdateUid();
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
GpStatus GpImageAttributes::SetICMMode(BOOL on)
|
||
|
{
|
||
|
if( DeviceImageAttributes.ICMMode!= on)
|
||
|
{
|
||
|
DeviceImageAttributes.ICMMode = on;
|
||
|
UpdateUid();
|
||
|
}
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
VOID GpImageAttributes::GetAdjustedPalette(
|
||
|
ColorPalette * colorPalette,
|
||
|
ColorAdjustType colorAdjustType
|
||
|
)
|
||
|
{
|
||
|
ASSERT((colorPalette != NULL) && (colorPalette->Count > 0));
|
||
|
|
||
|
if (!this->HasRecoloring(colorAdjustType))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
this->recolor->Flush();
|
||
|
this->recolor->ColorAdjust(colorPalette->Entries, colorPalette->Count,
|
||
|
colorAdjustType);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Serialization
|
||
|
|
||
|
|
||
|
class ImageAttributesData : public ObjectData
|
||
|
{
|
||
|
public:
|
||
|
BOOL CachedBackground;
|
||
|
DpImageAttributes DeviceImageAttributes;
|
||
|
};
|
||
|
|
||
|
|
||
|
/**************************************************************************\
|
||
|
*
|
||
|
* Function Description:
|
||
|
*
|
||
|
* Get the data from the GpImageAttributes for serialization.
|
||
|
*
|
||
|
* Return - size of GpImageAttributes
|
||
|
*
|
||
|
* 05/15/2000 asecchia - created it.
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
GpStatus
|
||
|
GpImageAttributes::GetData(
|
||
|
IStream * stream
|
||
|
) const
|
||
|
{
|
||
|
ASSERT (stream != NULL);
|
||
|
|
||
|
ImageAttributesData imageAttributesData;
|
||
|
imageAttributesData.CachedBackground = cachedBackground;
|
||
|
imageAttributesData.DeviceImageAttributes = DeviceImageAttributes;
|
||
|
stream->Write(&imageAttributesData, sizeof(imageAttributesData), NULL);
|
||
|
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
UINT
|
||
|
GpImageAttributes::GetDataSize() const
|
||
|
{
|
||
|
return sizeof(ImageAttributesData);
|
||
|
}
|
||
|
|
||
|
/**************************************************************************\
|
||
|
*
|
||
|
* Function Description:
|
||
|
*
|
||
|
* Set the GpImageAttributes from the data buffer for serialization.
|
||
|
*
|
||
|
* 05/15/2000 asecchia - created it.
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
GpStatus
|
||
|
GpImageAttributes::SetData(
|
||
|
const BYTE * dataBuffer,
|
||
|
UINT size
|
||
|
)
|
||
|
{
|
||
|
if (dataBuffer == NULL)
|
||
|
{
|
||
|
WARNING(("dataBuffer is NULL"));
|
||
|
return InvalidParameter;
|
||
|
}
|
||
|
|
||
|
if (size < sizeof(ImageAttributesData))
|
||
|
{
|
||
|
WARNING(("size too small"));
|
||
|
return InvalidParameter;
|
||
|
}
|
||
|
|
||
|
const ImageAttributesData *imageAttributes;
|
||
|
imageAttributes = reinterpret_cast<const ImageAttributesData *>(dataBuffer);
|
||
|
|
||
|
if (!imageAttributes->MajorVersionMatches())
|
||
|
{
|
||
|
WARNING(("Version number mismatch"));
|
||
|
return InvalidParameter;
|
||
|
}
|
||
|
|
||
|
cachedBackground = imageAttributes->CachedBackground;
|
||
|
DeviceImageAttributes = imageAttributes->DeviceImageAttributes;
|
||
|
|
||
|
UpdateUid();
|
||
|
|
||
|
// Might consider resetting the recolor objects to identity, but
|
||
|
// for now don't need to since we know this method only gets called
|
||
|
// right after the object has been constructed.
|
||
|
|
||
|
return Ok;
|
||
|
}
|
||
|
|
||
|
|