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
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
|