Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

195 lines
5.7 KiB

/**************************************************************************\
*
* Copyright (c) 1999-2000 Microsoft Corporation
*
* Module Name:
*
* Alpha-blender
*
* Abstract:
*
* A class which alpha-blends a source scanline in either sRGB or
* sRGB64 format, to a destination of arbitrary format.
*
* The operation can be either a SrcOver or a SrcCopy.
* A quality hint can be used to make the "SrcOver using sRGB source" case
* do a higher-quality blend in the sRGB64 color space.
*
* Created:
*
* 01/03/2000 agodfrey
* Created it.
* 02/22/2001 agodfrey
* Expanded it for different scan types (needed for ClearType).
* Simplified the Initialize() parameters by adding a
* DpContext parameter.
*
\**************************************************************************/
#ifndef _ALPHABLENDER_HPP
#define _ALPHABLENDER_HPP
//--------------------------------------------------------------------------
// The different Scan types:
//
// Blend: The typical alpha-blending operation.
// Context->CompositingMode specifies the blend mode.
//
// Opaque: Opaque can be used in place of Blend, when all the input pixels
// are opaque. This applies to both SrcCopy and SrcOver blends.
// (But right now, EpAlphaBlender doesn't distinguish properly
// between Opaque and SrcCopy. See bug #127412.)
//
// OpaqueSolidFill is a further specialized version of Opaque, in which all
// the input pixels are the same color. Disabled until the back-end supports
// these kinds of scan.
//
// CT and CTSolidFill are the ClearType blends - with an arbitrary brush,
// or a solid (single-color) one, respectively.
//
// Note: We depend on these values starting at 0 and being consecutive -
// we use them as array indices.
//
// Max: Counts the number of "real" scan types.
// Unknown: Used where we don't know the type. This allows us to specify
// the scan type either in Start(), or in NextBuffer(), depending on
// the situation.
//
//--------------------------------------------------------------------------
enum EpScanType
{
EpScanTypeBlend,
EpScanTypeOpaque,
// EpScanTypeOpaqueSolidFill,
EpScanTypeCT,
EpScanTypeCTSolidFill,
// End of "real" scan types.
EpScanTypeMax,
EpScanTypeUnknown = EpScanTypeMax
};
#include "ScanOperation.hpp"
// !!! [asecchia] This include needs to be cleaned up when we fix
// the imaging.h mess.
#include "..\..\privinc\pixelformats.h"
class EpAlphaBlender
{
public:
EpAlphaBlender()
{
Initialized = FALSE;
ConvertBlendingScan = FALSE;
}
~EpAlphaBlender() {}
// Right now, everyone sets "dither16bpp" to TRUE.
// I can see it being useful, perhaps renamed to "shouldDither",
// to support an API to make us quantize & dither the way GDI does.
VOID
Initialize(
EpScanType scanType,
PixelFormatID dstFormat,
PixelFormatID srcFormat,
const DpContext *context,
const ColorPalette *dstpal,
VOID **tempBuffers,
BOOL dither16bpp,
BOOL useRMW,
ARGB solidColor
);
VOID Blend(
VOID *dst,
VOID *src,
UINT width,
INT dither_x,
INT dither_y,
BYTE *ctBuffer
);
VOID UpdatePalette(const ColorPalette *dstpal, const EpPaletteMap *paletteMap);
// Returns true if EpAlphaBlender knows how to convert
// the specified pixelFormat.
static BOOL IsSupportedPixelFormat(PixelFormatID pixelFormat)
{
return (
pixelFormat != PixelFormatUndefined &&
pixelFormat != PixelFormatMulti &&
pixelFormat != PixelFormat1bppIndexed &&
pixelFormat != PixelFormat4bppIndexed &&
pixelFormat != PixelFormat16bppGrayScale &&
pixelFormat != PixelFormat16bppARGB1555
);
}
private:
// Records whether Initialize() has been called yet
BOOL Initialized;
ScanOperation::OtherParams OperationParameters;
// An internal helper class, used only by Initialize().
class Builder;
// The IA64 compiler seems to need some convincing:
friend class Builder;
// ConvertBlendingScan:
// TRUE: The pipeline will convert the blending scan to another
// format before using it
// FALSE: The pipeline will use the original passed-in blending scan
// (this is the common case).
BOOL ConvertBlendingScan;
// We represent the pipeline with an array of PipelineItem structures.
// Src - the source buffer for the operation. Can also be
// BLENDER_USE_SOURCE or BLENDER_USE_DESTINATION. (q.v.)
// Dst - the destination buffer for the operation. For the final
// operation of the pipeline, and only then,
// Dst == BLENDER_USE_DESTINATION.
struct PipelineItem
{
ScanOperation::ScanOpFunc Op;
VOID *Src;
VOID *Dst;
PipelineItem() {}
PipelineItem(
ScanOperation::ScanOpFunc op,
VOID *src,
VOID *dst
)
{
Op = op;
Src = src;
Dst = dst;
}
};
enum
{
MAX_ITEMS = 20
};
// !!! [agodfrey]: MAX_ITEMS was 8. I'm boosting it until we know what the
// maximum really should be, so that I can hack in the meantime.
PipelineItem Pipeline[MAX_ITEMS]; // the scan operation pipeline
};
#endif