|
|
/**************************************************************************\
* * 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
|