396 lines
13 KiB
C++
396 lines
13 KiB
C++
/**************************************************************************\
|
|
*
|
|
* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
|
|
*
|
|
* Module Name:
|
|
*
|
|
* Image Attributes
|
|
*
|
|
* Abstract:
|
|
*
|
|
* Class for color adjustment object passed to Graphics.DrawImage
|
|
*
|
|
* Revision History:
|
|
*
|
|
* 15-Nov-1999 gilmanw
|
|
* Created it.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
#ifndef _GDIPLUSIMAGEATTRIBUTES_H
|
|
#define _GDIPLUSIMAGEATTRIBUTES_H
|
|
|
|
class GpImageAttributes;
|
|
|
|
// There are 5 possible sets of color adjustments:
|
|
// ColorAdjustDefault,
|
|
// ColorAdjustBitmap,
|
|
// ColorAdjustBrush,
|
|
// ColorAdjustPen,
|
|
// ColorAdjustText,
|
|
|
|
// Bitmaps, Brushes, Pens, and Text will all use any color adjustments
|
|
// that have been set into the default ImageAttributes until their own
|
|
// color adjustments have been set. So as soon as any "Set" method is
|
|
// called for Bitmaps, Brushes, Pens, or Text, then they start from
|
|
// scratch with only the color adjustments that have been set for them.
|
|
// Calling Reset removes any individual color adjustments for a type
|
|
// and makes it revert back to using all the default color adjustments
|
|
// (if any). The SetToIdentity method is a way to force a type to
|
|
// have no color adjustments at all, regardless of what previous adjustments
|
|
// have been set for the defaults or for that type.
|
|
|
|
class ImageAttributes : public GdiplusBase
|
|
{
|
|
friend class Graphics;
|
|
friend class TextureBrush;
|
|
|
|
public:
|
|
|
|
ImageAttributes()
|
|
{
|
|
nativeImageAttr = NULL;
|
|
lastResult = DllExports::GdipCreateImageAttributes(&nativeImageAttr);
|
|
}
|
|
|
|
~ImageAttributes()
|
|
{
|
|
DllExports::GdipDisposeImageAttributes(nativeImageAttr);
|
|
}
|
|
|
|
ImageAttributes* Clone() const
|
|
{
|
|
GpImageAttributes* clone;
|
|
|
|
SetStatus(DllExports::GdipCloneImageAttributes(
|
|
nativeImageAttr,
|
|
&clone));
|
|
|
|
return new ImageAttributes(clone, lastResult);
|
|
}
|
|
|
|
// Set to identity, regardless of what the default color adjustment is.
|
|
Status
|
|
SetToIdentity(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesToIdentity(
|
|
nativeImageAttr,
|
|
type));
|
|
}
|
|
|
|
// Remove any individual color adjustments, and go back to using the default
|
|
Status
|
|
Reset(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipResetImageAttributes(
|
|
nativeImageAttr,
|
|
type));
|
|
}
|
|
|
|
Status
|
|
SetColorMatrix(
|
|
IN const ColorMatrix *colorMatrix,
|
|
IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
|
|
nativeImageAttr,
|
|
type,
|
|
TRUE,
|
|
colorMatrix,
|
|
NULL,
|
|
mode));
|
|
}
|
|
|
|
Status ClearColorMatrix(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
|
|
nativeImageAttr,
|
|
type,
|
|
FALSE,
|
|
NULL,
|
|
NULL,
|
|
ColorMatrixFlagsDefault));
|
|
}
|
|
|
|
Status
|
|
SetColorMatrices(
|
|
IN const ColorMatrix *colorMatrix,
|
|
IN const ColorMatrix *grayMatrix,
|
|
IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
|
|
nativeImageAttr,
|
|
type,
|
|
TRUE,
|
|
colorMatrix,
|
|
grayMatrix,
|
|
mode));
|
|
}
|
|
|
|
Status ClearColorMatrices(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
|
|
nativeImageAttr,
|
|
type,
|
|
FALSE,
|
|
NULL,
|
|
NULL,
|
|
ColorMatrixFlagsDefault));
|
|
}
|
|
|
|
Status SetThreshold(
|
|
IN REAL threshold,
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesThreshold(
|
|
nativeImageAttr,
|
|
type,
|
|
TRUE,
|
|
threshold));
|
|
}
|
|
|
|
Status ClearThreshold(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesThreshold(
|
|
nativeImageAttr,
|
|
type,
|
|
FALSE,
|
|
0.0));
|
|
}
|
|
|
|
Status SetGamma(
|
|
IN REAL gamma,
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesGamma(
|
|
nativeImageAttr,
|
|
type,
|
|
TRUE,
|
|
gamma));
|
|
}
|
|
|
|
Status ClearGamma(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesGamma(
|
|
nativeImageAttr,
|
|
type,
|
|
FALSE,
|
|
0.0));
|
|
}
|
|
|
|
Status SetNoOp(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesNoOp(
|
|
nativeImageAttr,
|
|
type,
|
|
TRUE));
|
|
}
|
|
|
|
Status ClearNoOp(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesNoOp(
|
|
nativeImageAttr,
|
|
type,
|
|
FALSE));
|
|
}
|
|
|
|
Status SetColorKey(
|
|
IN const Color& colorLow,
|
|
IN const Color& colorHigh,
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesColorKeys(
|
|
nativeImageAttr,
|
|
type,
|
|
TRUE,
|
|
colorLow.GetValue(),
|
|
colorHigh.GetValue()));
|
|
}
|
|
|
|
Status ClearColorKey(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesColorKeys(
|
|
nativeImageAttr,
|
|
type,
|
|
FALSE,
|
|
NULL,
|
|
NULL));
|
|
}
|
|
|
|
Status SetOutputChannel(
|
|
IN ColorChannelFlags channelFlags,
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(
|
|
nativeImageAttr,
|
|
type,
|
|
TRUE,
|
|
channelFlags));
|
|
}
|
|
|
|
Status ClearOutputChannel(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(
|
|
nativeImageAttr,
|
|
type,
|
|
FALSE,
|
|
ColorChannelFlagsLast));
|
|
}
|
|
|
|
Status SetOutputChannelColorProfile(
|
|
IN const WCHAR *colorProfileFilename,
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
|
|
nativeImageAttr,
|
|
type,
|
|
TRUE,
|
|
colorProfileFilename));
|
|
}
|
|
|
|
Status ClearOutputChannelColorProfile(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
|
|
nativeImageAttr,
|
|
type,
|
|
FALSE,
|
|
NULL));
|
|
}
|
|
|
|
Status SetRemapTable(
|
|
IN UINT mapSize,
|
|
IN const ColorMap *map,
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesRemapTable(
|
|
nativeImageAttr,
|
|
type,
|
|
TRUE,
|
|
mapSize,
|
|
map));
|
|
}
|
|
|
|
Status ClearRemapTable(
|
|
IN ColorAdjustType type = ColorAdjustTypeDefault
|
|
)
|
|
{
|
|
return SetStatus(DllExports::GdipSetImageAttributesRemapTable(
|
|
nativeImageAttr,
|
|
type,
|
|
FALSE,
|
|
0,
|
|
NULL));
|
|
}
|
|
|
|
Status SetBrushRemapTable(IN UINT mapSize,
|
|
IN ColorMap *map)
|
|
{
|
|
return this->SetRemapTable(mapSize, map, ColorAdjustTypeBrush);
|
|
}
|
|
|
|
Status ClearBrushRemapTable()
|
|
{
|
|
return this->ClearRemapTable(ColorAdjustTypeBrush);
|
|
}
|
|
|
|
Status SetWrapMode(IN WrapMode wrap,
|
|
IN const Color& color = Color(),
|
|
IN BOOL clamp = FALSE)
|
|
{
|
|
ARGB argb = color.GetValue();
|
|
|
|
return SetStatus(DllExports::GdipSetImageAttributesWrapMode(
|
|
nativeImageAttr, wrap, argb, clamp));
|
|
}
|
|
|
|
#ifndef DCR_USE_NEW_145139
|
|
Status SetICMMode(IN BOOL on)
|
|
{
|
|
on;
|
|
// This is not implemented.
|
|
// The supported method for doing ICM conversion from the embedded
|
|
// ICC profile is to use the Bitmap constructor from a file or stream
|
|
// and specify TRUE for the useIcm parameter. This will cause the
|
|
// image to be ICM converted when it's loaded from the file/stream
|
|
// if the profile exists.
|
|
return SetStatus(NotImplemented);
|
|
// DllExports::GdipSetImageAttributesICMMode(nativeImageAttr, on)
|
|
}
|
|
#endif
|
|
|
|
// The flags of the palette are ignored.
|
|
Status GetAdjustedPalette(IN OUT ColorPalette* colorPalette,
|
|
IN ColorAdjustType colorAdjustType) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetImageAttributesAdjustedPalette(
|
|
nativeImageAttr, colorPalette, colorAdjustType));
|
|
}
|
|
|
|
Status GetLastStatus() const
|
|
{
|
|
Status lastStatus = lastResult;
|
|
lastResult = Ok;
|
|
|
|
return lastStatus;
|
|
}
|
|
|
|
|
|
protected:
|
|
ImageAttributes(GpImageAttributes* imageAttr, Status status)
|
|
{
|
|
SetNativeImageAttr(imageAttr);
|
|
lastResult = status;
|
|
}
|
|
|
|
VOID SetNativeImageAttr(GpImageAttributes* nativeImageAttr)
|
|
{
|
|
this->nativeImageAttr = nativeImageAttr;
|
|
}
|
|
|
|
Status SetStatus(Status status) const
|
|
{
|
|
if (status != Ok)
|
|
return (lastResult = status);
|
|
else
|
|
return status;
|
|
}
|
|
|
|
protected:
|
|
GpImageAttributes* nativeImageAttr;
|
|
mutable Status lastResult;
|
|
};
|
|
|
|
#endif
|