/******************************Module*Header*******************************\
* Module Name: rops.c
*
*
* Utility routines to manilpulate rop codes.
*
* Copyright (c) 1998 Microsoft Corporation
*
\**************************************************************************/

#include "precomp.h"

//
// The gaMix table converts a mix code (1-16) and converts it to a rop3
// Note that we also define mix code 0 == code 16 to allow for the masking
// of the mix code by 0xff to produce the correct result.
// 

ULONG gaMix[] =
{
    ROP3_WHITENESS,     // (R2_WHITE & 0xff)
    ROP3_BLACKNESS,     // R2_BLACK
    0x05,               // R2_NOTMERGEPEN
    0x0A,               // R2_MASKNOTPEN
    0x0F,               // R2_NOTCOPYPEN
    0x50,               // R2_MASKPENNOT
    ROP3_DSTINVERT,     // R2_NOT
    ROP3_PATINVERT,     // R2_XORPEN
    0x5F,               // R2_NOTMASKPEN
    0xA0,               // R2_MASKPEN
    0xA5,               // R2_NOTXORPEN
    0xAA,               // R2_NOP
    0xAF,               // R2_MERGENOTPEN
    ROP3_PATCOPY,       // R2_COPYPEN
    0xF5,               // R2_MERGEPENNOT
    0xFA,               // R2_MERGEPEN
    ROP3_WHITENESS      // R2_WHITE
};

//
// Convert a rop2 code to a hardware specific logical operation code
//

ULONG gRop2ToLogicop[] =
{
    K_LOGICOP_CLEAR,        // 0
    K_LOGICOP_NOR,          // DSon
    K_LOGICOP_AND_INVERTED, // DSna
    K_LOGICOP_COPY_INVERT,  // Sn
    K_LOGICOP_AND_REVERSE,  // SDna
    K_LOGICOP_INVERT,       // Dn
    K_LOGICOP_XOR,          // DSx
    K_LOGICOP_NAND,         // DSan
    K_LOGICOP_AND,          // DSa
    K_LOGICOP_EQUIV,        // DSxn
    K_LOGICOP_NOOP,         // D
    K_LOGICOP_OR_INVERT,    // DSno
    K_LOGICOP_COPY,         // S
    K_LOGICOP_OR_REVERSE,   // SDno
    K_LOGICOP_OR,           // DSo
    K_LOGICOP_SET
};

//------------------------------------------------------------------------------
//
// ULONG ulRop3ToLogicop
//
//
// Convert a source invariant rop3 code into a hardware specific logical 
// operation.
// Note we could instead define this routine as a macro.
//
//------------------------------------------------------------------------------

ULONG
ulRop3ToLogicop(ULONG ulRop3)
{
    ASSERTDD(ulRop3 <= 0xFF, "ulRop3ToLogicop: unexpected rop3 code");
    
    ULONG ulRop2;

    ulRop2 = ((ulRop3 & 0x3) | ((ulRop3 & 0xC0) >> 4));

    return gRop2ToLogicop[ulRop2];
}

//------------------------------------------------------------------------------
//
// ULONG ulRop2ToLogicop
//
// Convert a rop2 code into a hardware dependent logical operation.
// Note we could instead define this routine as a macro.
//
//------------------------------------------------------------------------------

ULONG
ulRop2ToLogicop(ULONG ulRop2)
{
    ASSERTDD(ulRop2 <= 0xF, "ulRop2ToLogicop: unexpected rop2 code");

    return (ULONG)(gRop2ToLogicop[ulRop2]);
}



