WindowsXP-SP1/windows/advcore/gdiplus/engine/render/scanoperationinternal.hpp
2020-09-30 16:53:49 +02:00

192 lines
10 KiB
C++

/**************************************************************************\
*
* Copyright (c) 1999-2000 Microsoft Corporation
*
* Module Name:
*
* Scan operations
*
* Abstract:
*
* The internal portion of the ScanOperation namespace.
*
* This is kept separate from ScanOperation.hpp so that files which use
* AlphaBlender.hpp or FormatConvert.hpp don't end up including all these
* implementation details.
*
* See Gdiplus\Specs\ScanOperation.doc for an overview of scan operations.
*
* Created:
*
* 07/16/1999 agodfrey
*
\**************************************************************************/
#ifndef _SCANOPERATIONINTERNAL_HPP
#define _SCANOPERATIONINTERNAL_HPP
#include "ScanOperation.hpp"
#include "CPUSpecificOps.hpp"
namespace ScanOperation
{
// Helper macros for defining scan operations
#define DEFINE_POINTERS(srctype, dsttype) \
const srctype* s = static_cast<const srctype *>(src); \
dsttype* d = static_cast<dsttype *>(dst);
#define DEFINE_BLEND_POINTER(type) \
const type* bl = static_cast<const type *>(otherParams->BlendingScan);
// Convert: Convert to a higher-precision format
VOID FASTCALL Convert_1_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Convert_4_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Convert_8_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Convert_555_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Convert_565_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Convert_1555_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Convert_24_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Convert_24BGR_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Convert_32RGB_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Convert_48_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
// Quantize: Quickly convert to a lower-precision format
VOID FASTCALL Quantize_sRGB_555(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Quantize_sRGB_565(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Quantize_sRGB_1555(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Quantize_sRGB_24(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Quantize_sRGB_24BGR(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Quantize_sRGB_32RGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Quantize_sRGB64_48(VOID *, const VOID *, INT, const OtherParams *);
// Halftone: Halftone to a palettized screen format
VOID FASTCALL HalftoneToScreen_sRGB_8_216(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL HalftoneToScreen_sRGB_8_16(VOID *, const VOID *, INT, const OtherParams *);
// Dither: Dither to a 16bpp format
VOID FASTCALL Dither_sRGB_565(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Dither_sRGB_555(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Dither_sRGB_565_MMX(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Dither_sRGB_555_MMX(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Dither_Blend_sRGB_565(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Dither_Blend_sRGB_555(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Dither_Blend_sRGB_565_MMX(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Dither_Blend_sRGB_555_MMX(VOID *, const VOID *, INT, const OtherParams *);
// Copy: Copy a scan, in the same format
VOID FASTCALL Copy_1(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Copy_4(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Copy_8(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Copy_16(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Copy_24(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Copy_32(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Copy_48(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Copy_64(VOID *, const VOID *, INT, const OtherParams *);
// GammaConvert: Convert between formats with differing gamma ramps
VOID FASTCALL GammaConvert_sRGB64_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL GammaConvert_sRGB_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
// Blend: An alpha-blend 'SourceOver' operation.
VOID FASTCALL Blend_sRGB_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Blend_sRGB_sRGB_MMX(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Blend_sRGB64_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Blend_sRGB64_sRGB64_MMX(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Blend_sRGB_555(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Blend_sRGB_565(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Blend_sRGB_24(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL Blend_sRGB_24BGR(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL BlendLinear_sRGB_32RGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL BlendLinear_sRGB_32RGB_MMX(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL BlendLinear_sRGB_565(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL BlendLinear_sRGB_565_MMX(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL BlendLinear_sRGB_555(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL BlendLinear_sRGB_555_MMX(VOID *, const VOID *, INT, const OtherParams *);
// ReadRMW: For each pixel in "otherParams->blendingScan" that is
// translucent (i.e. has (0 < alpha < 1)), copy the
// corresponding pixel from "src" to "dst".
VOID FASTCALL ReadRMW_8_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL ReadRMW_8_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL ReadRMW_16_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL ReadRMW_16_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL ReadRMW_24_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL ReadRMW_24_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL ReadRMW_32_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL ReadRMW_32_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
// WriteRMW: For each pixel in "otherParams->blendingScan" that is not
// completely transparent (i.e. has (alpha != 0)), copy the
// corresponding pixel from "src" to "dst".
VOID FASTCALL WriteRMW_8_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL WriteRMW_8_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL WriteRMW_16_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL WriteRMW_16_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL WriteRMW_24_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL WriteRMW_24_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL WriteRMW_32_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL WriteRMW_32_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
// AlphaMultiply: Multiply each component by the alpha value
VOID FASTCALL AlphaMultiply_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL AlphaMultiply_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
// AlphaDivide: Divide each component by the alpha value
VOID FASTCALL AlphaDivide_sRGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL AlphaDivide_sRGB64(VOID *, const VOID *, INT, const OtherParams *);
// ClearType blend
// solid brush case
VOID FASTCALL CTBlendSolid(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL ReadRMW_16_CT_Solid(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL WriteRMW_16_CT_Solid(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL ReadRMW_24_CT_Solid(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL WriteRMW_24_CT_Solid(VOID *, const VOID *, INT, const OtherParams *);
// arbitrary brush case
VOID FASTCALL CTBlendCARGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL ReadRMW_16_CT_CARGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL WriteRMW_16_CT_CARGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL ReadRMW_24_CT_CARGB(VOID *, const VOID *, INT, const OtherParams *);
VOID FASTCALL WriteRMW_24_CT_CARGB(VOID *, const VOID *, INT, const OtherParams *);
// These arrays organize the operations according to their use,
// indexed by a pixel format:
//
// ConvertCopyOps: Copy pixels of the given format
// ConvertIntoCanonicalOps: Convert from the given format into the
// closest canonical format.
extern ScanOpFunc CopyOps[PIXFMT_MAX];
extern ScanOpFunc ConvertIntoCanonicalOps[PIXFMT_MAX];
// These are specific to EpAlphaBlender, and can't be used by
// EpFormatConverter (not without changing its logic).
//
// All 16bpp/15bpp functions must fully support OtherParams::DoingDither.
//
// ABConvertFromCanonicalOps: Convert to the given format from the closest
// canonical format.
// BlendOpsLowQuality: Blend directly to the given format.
// BlendOpsHighQuality: Gamma-corrected blend directly to the given format
// (with the source data in 32BPP_PARGB format).
extern ScanOpFunc ABConvertFromCanonicalOps[PIXFMT_MAX];
extern ScanOpFunc BlendOpsLowQuality[PIXFMT_MAX];
extern ScanOpFunc BlendOpsHighQuality[PIXFMT_MAX];
};
#endif