/******************************Module*Header*******************************\
*
*                           *******************
*                           * GDI SAMPLE CODE *
*                           *******************
*
* Module Name: brush.h
*
* Contains all the brush related stuff
*
* Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
* Copyright (c) 1995-1999 Microsoft Corporation.  All rights reserved.
\**************************************************************************/
#ifndef __BRUSH__H__
#define __BRUSH__H__

//
// Brush stuff
//
// 'Slow' brushes are used when we don't have hardware pattern capability,
// and we have to handle patterns using screen-to-screen blts:
//
#define SLOW_BRUSH_CACHE_DIM_X  8
#define SLOW_BRUSH_CACHE_DIM_Y  1   // Controls the number of brushes cached
                                    // in off-screen memory, when we don't have
                                    // the hardware pattern support. We
                                    // allocate 3 x 3 brushes, so we can cache
                                    // a total of 9 brushes:

#define SLOW_BRUSH_COUNT  (SLOW_BRUSH_CACHE_DIM_X * SLOW_BRUSH_CACHE_DIM_Y)
#define SLOW_BRUSH_DIMENSION    40  // After alignment is taken care of, every
                                    // off-screen brush cache entry will be 48
                                    // pels in both dimensions

#define SLOW_BRUSH_ALLOCATION   (SLOW_BRUSH_DIMENSION + 8)
                                    // Actually allocate 72x72 pels for each
                                    // pattern, using the 8 extra for brush
                                    // alignment

//
// 'Fast' brushes are used when we have hardware pattern capability:
//
#define FAST_BRUSH_COUNT        16  // Total number of non-hardware brushes
                                    // cached off-screen
#define FAST_BRUSH_DIMENSION    8   // Every off-screen brush cache entry is
                                    // 8 pels in both dimensions
#define FAST_BRUSH_ALLOCATION   8   // We have to align ourselves, so this is
                                    // the dimension of each brush allocation

//
// Common to both implementations:
//
#define RBRUSH_2COLOR           1   // For RBRUSH flags

#define TOTAL_BRUSH_COUNT       max(FAST_BRUSH_COUNT, SLOW_BRUSH_COUNT)
                                    // This is the maximum number of brushes
                                    //   we can possibly have cached off-screen
#define TOTAL_BRUSH_SIZE        64  // We'll only ever handle 8x8 patterns,
                                    //   and this is the number of pels

//
// New brush support
//

#define NUM_CACHED_BRUSHES      16

#define CACHED_BRUSH_WIDTH_LOG2 6
#define CACHED_BRUSH_WIDTH      (1 << CACHED_BRUSH_WIDTH_LOG2)
#define CACHED_BRUSH_HEIGHT_LOG2 6
#define CACHED_BRUSH_HEIGHT     (1 << CACHED_BRUSH_HEIGHT_LOG2)
#define CACHED_BRUSH_SIZE       (CACHED_BRUSH_WIDTH * CACHED_BRUSH_HEIGHT)

typedef struct _BrushEntry BrushEntry;

//
// NOTE: Changes to the RBRUSH or BRUSHENTRY structures must be reflected
// in i386/strucs.inc!
//
typedef struct _RBrush
{
    FLONG       fl;                 // Type flags
    DWORD       areaStippleMode;    // area stipple mode if 1bpp.

    //
    //??? get rid of bTransparent later. We need it now so everything
    // compiles OK
    //
    BOOL        bTransparent;       // TRUE if brush was realized for a
                                    // transparent blt (meaning colours are
                                    // white and black).
                                    // FALSE if not (meaning it's already been
                                    // colour-expanded to the correct colours).
                                    // Value is undefined if the brush isn't
                                    // 2 colour.
    ULONG       ulForeColor;        // Foreground colour if 1bpp
    ULONG       ulBackColor;        // Background colour if 1bpp
    POINTL      ptlBrushOrg;        // Brush origin of cached pattern.  Initial
                                    // value should be -1
    BrushEntry* pbe;                // Points to brush-entry that keeps track
                                    // of the cached off-screen brush bits
    ULONG       aulPattern[1];      // Open-ended array for keeping copy of the
                                    // actual pattern bits in case the brush
                                    // origin changes, or someone else steals
                                    // our brush entry (declared as a ULONG
                                    // for proper dword alignment)
    //
    // Don't put anything after here
    //
} RBrush;                           /* rb, prb */

typedef struct _BrushEntry
{
    RBrush*     prbVerify;          // We never dereference this pointer to
                                    // find a brush realization; it is only
                                    // ever used in a compare to verify that
                                    // for a given realized brush, our
                                    // off-screen brush entry is still valid.
    ULONG       ulPixelOffset;      // pixel offset in video memory to brush
                                    // partial product for this stride is
                                    // ppdev->ulBrushPackedPP
} BrushEntry;                       /* be, pbe */

typedef union _RBrushColor
{
    RBrush*     prb;
    ULONG       iSolidColor;
} RBrushColor;                     /* rbc, prbc */

BOOL    bEnableBrushCache(PDev* ppdev);
VOID    vAssertModeBrushCache(PDev* ppdev, BOOL bEnable);
VOID    vDisableBrushCache(PDev* ppdev);
VOID    vRealizeDitherPattern(HDEV hdev, RBrush* prb, ULONG ulRGBToDither);

#endif

