ReactOS 0.4.16-dev-1946-g52006dd
gradient.c File Reference
#include <win32k.h>
#include <debug.h>
Include dependency graph for gradient.c:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define VERTEX(n)   (pVertex + gt->n)
 
#define COMPAREVERTEX(a, b)   ((a)->x == (b)->x && (a)->y == (b)->y)
 
#define VCMPCLR(a, b, c, color)   (a->color == b->color && a->color == c->color)
 
#define VCMPCLRS(a, b, c)    !(VCMPCLR(a, b, c, Red) && VCMPCLR(a, b, c, Green) && VCMPCLR(a, b, c, Blue))
 
#define HVINITCOL(Col, id)
 
#define HVSTEPCOL(id)
 
#define S_FILLLINE(linefrom, lineto)
 
#define S_DOLINE(a, b, line)
 
#define S_GOLINE(a, b, line)
 
#define S_ENDLINE(a, b, line)    }
 
#define S_INITLINE(a, b, line)
 
#define INITCOL(a, b, line, col, id)
 
#define STEPCOL(a, b, line, col, id)
 
#define FINITCOL(linefrom, lineto, colid)
 
#define FDOCOL(linefrom, lineto, colid)
 
#define FILLLINE(linefrom, lineto)
 
#define DOLINE(a, b, line)
 
#define GOLINE(a, b, line)
 
#define ENDLINE(a, b, line)    }
 
#define INITLINE(a, b, line)
 
#define DOINIT(a, b, line)
 
#define SMALLER(a, b)   (a->y < b->y) || (a->y == b->y && a->x < b->x)
 
#define SWAP(a, b, c)
 
#define NLINES   3
 

Functions

BOOL FASTCALL IntEngGradientFillRect (IN SURFOBJ *psoDest, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN TRIVERTEX *pVertex, IN ULONG nVertex, IN PGRADIENT_RECT gRect, IN RECTL *prclExtents, IN POINTL *pptlDitherOrg, IN BOOL Horizontal)
 
BOOL FASTCALL IntEngGradientFillTriangle (IN SURFOBJ *psoDest, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN TRIVERTEX *pVertex, IN ULONG nVertex, IN PGRADIENT_TRIANGLE gTriangle, IN RECTL *prclExtents, IN POINTL *pptlDitherOrg)
 
static BOOL IntEngIsNULLTriangle (TRIVERTEX *pVertex, GRADIENT_TRIANGLE *gt)
 
BOOL APIENTRY EngGradientFill (_Inout_ SURFOBJ *psoDest, _In_ CLIPOBJ *pco, _In_opt_ XLATEOBJ *pxlo, _In_ TRIVERTEX *pVertex, _In_ ULONG nVertex, _In_ PVOID pMesh, _In_ ULONG nMesh, _In_ RECTL *prclExtents, _In_ POINTL *pptlDitherOrg, _In_ ULONG ulMode)
 
BOOL APIENTRY IntEngGradientFill (IN SURFOBJ *psoDest, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN TRIVERTEX *pVertex, IN ULONG nVertex, IN PVOID pMesh, IN ULONG nMesh, IN RECTL *prclExtents, IN POINTL *pptlDitherOrg, IN ULONG ulMode)
 

Variables

const LONG LINC [2] = {-1, 1}
 

Macro Definition Documentation

◆ COMPAREVERTEX

#define COMPAREVERTEX (   a,
  b 
)    ((a)->x == (b)->x && (a)->y == (b)->y)

Definition at line 19 of file gradient.c.

◆ DOINIT

#define DOINIT (   a,
  b,
  line 
)
Value:
INITLINE(a, b, line); \
INITCOL(a, b, line, Red, 0); \
INITCOL(a, b, line, Green, 1); \
INITCOL(a, b, line, Blue, 2);
@ Green
Definition: bl.h:199
@ Red
Definition: bl.h:201
@ Blue
Definition: bl.h:198
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
Definition: parser.c:49
#define INITLINE(a, b, line)
Definition: gradient.c:291

Definition at line 300 of file gradient.c.

◆ DOLINE

#define DOLINE (   a,
  b,
  line 
)
Value:
STEPCOL(a, b, line, Red, 0); \
STEPCOL(a, b, line, Green, 1); \
STEPCOL(a, b, line, Blue, 2); \
ex[line] += dx[line]; \
while(ex[line] > 0 && x[line] != destx[line]) \
{ \
x[line] += incx[line]; \
sx[line] += incx[line]; \
ex[line] -= dy[line]; \
}
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint dy
Definition: linetemp.h:97
GLint dx
Definition: linetemp.h:97
Definition: comerr.c:44
#define STEPCOL(a, b, line, col, id)
Definition: gradient.c:229

Definition at line 272 of file gradient.c.

◆ ENDLINE

#define ENDLINE (   a,
  b,
  line 
)     }

Definition at line 288 of file gradient.c.

◆ FDOCOL

#define FDOCOL (   linefrom,
  lineto,
  colid 
)
Value:
ge[colid] += gd[colid]; \
if (gx != 0) \
while(ge[colid] > 0) \
{ \
gc[colid] += gi[colid]; \
ge[colid] -= gx; \
}

Definition at line 244 of file gradient.c.

◆ FILLLINE

#define FILLLINE (   linefrom,
  lineto 
)
Value:
gx = abs(sx[lineto] - sx[linefrom]); \
gxi = LINC[sx[linefrom] < sx[lineto]]; \
FINITCOL(linefrom, lineto, 0); \
FINITCOL(linefrom, lineto, 1); \
FINITCOL(linefrom, lineto, 2); \
g_end = sx[lineto] + gxi; \
for(g = sx[linefrom]; g != g_end; g += gxi) \
{ \
if(InY && g >= FillRect.left && g < FillRect.right) \
{ \
Color = XLATEOBJ_iXlate(pxlo, RGB(gc[0], gc[1], gc[2])); \
DibFunctionsForBitmapFormat[psoOutput->iBitmapFormat].DIB_PutPixel(psoOutput, g, sy, Color); \
} \
FDOCOL(linefrom, lineto, 0); \
FDOCOL(linefrom, lineto, 1); \
FDOCOL(linefrom, lineto, 2); \
}
#define RGB(r, g, b)
Definition: precomp.h:71
#define abs(i)
Definition: fconv.c:206
GLboolean GLboolean g
Definition: glext.h:6204
PFN_DIB_PutPixel DIB_PutPixel
Definition: dib.h:45
DIB_FUNCTIONS DibFunctionsForBitmapFormat[]
Definition: dib.c:20
const LONG LINC[2]
Definition: gradient.c:16
ENGAPI ULONG APIENTRY XLATEOBJ_iXlate(_In_ XLATEOBJ *pxlo, _In_ ULONG iColor)
Definition: xlateobj.c:664
_In_ SURFOBJ _In_ CLIPOBJ _In_opt_ XLATEOBJ * pxlo
Definition: winddi.h:3416
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)

Definition at line 253 of file gradient.c.

◆ FINITCOL

#define FINITCOL (   linefrom,
  lineto,
  colid 
)
Value:
gc[colid] = c[linefrom][colid]; \
gd[colid] = abs(c[lineto][colid] - gc[colid]); \
ge[colid] = -(gx >> 1); \
gi[colid] = LINC[c[lineto][colid] > gc[colid]]
const GLubyte * c
Definition: glext.h:8905

Definition at line 238 of file gradient.c.

◆ GOLINE

#define GOLINE (   a,
  b,
  line 
)
Value:
if(y >= a->y && y <= b->y) \
{
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548

Definition at line 284 of file gradient.c.

◆ HVINITCOL

#define HVINITCOL (   Col,
  id 
)
Value:
c[id] = v1->Col >> 8; \
dc[id] = abs((v2->Col >> 8) - c[id]); \
ec[id] = -(dy >> 1); \
ic[id] = LINC[(v2->Col >> 8) > c[id]]
HDC dc
Definition: cylfrac.c:34
GLfloat GLfloat v1
Definition: glext.h:6062
GLfloat GLfloat GLfloat v2
Definition: glext.h:6063
GLuint id
Definition: glext.h:5910

Definition at line 29 of file gradient.c.

◆ HVSTEPCOL

#define HVSTEPCOL (   id)
Value:
ec[id] += dc[id]; \
while(ec[id] > 0) \
{ \
c[id] += ic[id]; \
ec[id] -= dy; \
}

Definition at line 34 of file gradient.c.

◆ INITCOL

#define INITCOL (   a,
  b,
  line,
  col,
  id 
)
Value:
c[line][id] = a->col >> 8; \
dc[line][id] = abs((b->col >> 8) - c[line][id]); \
ec[line][id] = -(dy[line]>>1); \
ic[line][id] = LINC[(b->col >> 8) > c[line][id]]

Definition at line 223 of file gradient.c.

◆ INITLINE

#define INITLINE (   a,
  b,
  line 
)
Value:
x[line] = a->x; \
sx[line] = a->x + pptlDitherOrg->x - 1; \
dx[line] = abs(b->x - a->x); \
dy[line] = abs(b->y - a->y); \
incx[line] = LINC[b->x > a->x]; \
ex[line] = -(dy[line]>>1); \
destx[line] = b->x
_In_ CLIPOBJ _In_opt_ XLATEOBJ _In_ TRIVERTEX _In_ ULONG _In_ PVOID _In_ ULONG _In_ RECTL _In_ POINTL * pptlDitherOrg
Definition: winddi.h:3656

Definition at line 291 of file gradient.c.

◆ NDEBUG

#define NDEBUG

Definition at line 11 of file gradient.c.

◆ NLINES

#define NLINES   3

Definition at line 312 of file gradient.c.

◆ S_DOLINE

#define S_DOLINE (   a,
  b,
  line 
)
Value:
ex[line] += dx[line]; \
while(ex[line] > 0 && x[line] != destx[line]) \
{ \
x[line] += incx[line]; \
sx[line] += incx[line]; \
ex[line] -= dy[line]; \
}

Definition at line 197 of file gradient.c.

◆ S_ENDLINE

#define S_ENDLINE (   a,
  b,
  line 
)     }

Definition at line 210 of file gradient.c.

◆ S_FILLLINE

#define S_FILLLINE (   linefrom,
  lineto 
)
Value:
if(sx[lineto] < sx[linefrom]) \
DibFunctionsForBitmapFormat[psoOutput->iBitmapFormat].DIB_HLine(psoOutput, max(sx[lineto], FillRect.left), min(sx[linefrom], FillRect.right), sy, Color); \
else \
DibFunctionsForBitmapFormat[psoOutput->iBitmapFormat].DIB_HLine(psoOutput, max(sx[linefrom], FillRect.left), min(sx[lineto], FillRect.right), sy, Color);
#define min(a, b)
Definition: monoChain.cc:55
PFN_DIB_HLine DIB_HLine
Definition: dib.h:47
#define max(a, b)
Definition: svc.c:63

Definition at line 191 of file gradient.c.

◆ S_GOLINE

#define S_GOLINE (   a,
  b,
  line 
)
Value:
if(y >= a->y && y <= b->y) \
{

Definition at line 206 of file gradient.c.

◆ S_INITLINE

#define S_INITLINE (   a,
  b,
  line 
)
Value:
x[line] = a->x; \
sx[line] = a->x + pptlDitherOrg->x; \
dx[line] = abs(b->x - a->x); \
dy[line] = abs(b->y - a->y); \
incx[line] = LINC[b->x > a->x]; \
ex[line] = -(dy[line]>>1); \
destx[line] = b->x

Definition at line 213 of file gradient.c.

◆ SMALLER

#define SMALLER (   a,
  b 
)    (a->y < b->y) || (a->y == b->y && a->x < b->x)

Definition at line 306 of file gradient.c.

◆ STEPCOL

#define STEPCOL (   a,
  b,
  line,
  col,
  id 
)
Value:
ec[line][id] += dc[line][id]; \
if(dy[line] != 0) \
while(ec[line][id] > 0) \
{ \
c[line][id] += ic[line][id]; \
ec[line][id] -= dy[line]; \
}

Definition at line 229 of file gradient.c.

◆ SWAP

#define SWAP (   a,
  b,
  c 
)
Value:
c = a;\
a = b;\
b = c
#define a
Definition: ke_i.h:78
#define b
Definition: ke_i.h:79

Definition at line 308 of file gradient.c.

◆ VCMPCLR

#define VCMPCLR (   a,
  b,
  c,
  color 
)    (a->color == b->color && a->color == c->color)

Definition at line 22 of file gradient.c.

◆ VCMPCLRS

#define VCMPCLRS (   a,
  b,
  c 
)     !(VCMPCLR(a, b, c, Red) && VCMPCLR(a, b, c, Green) && VCMPCLR(a, b, c, Blue))

Definition at line 25 of file gradient.c.

◆ VERTEX

#define VERTEX (   n)    (pVertex + gt->n)

Definition at line 18 of file gradient.c.

Function Documentation

◆ EngGradientFill()

BOOL APIENTRY EngGradientFill ( _Inout_ SURFOBJ psoDest,
_In_ CLIPOBJ pco,
_In_opt_ XLATEOBJ pxlo,
_In_ TRIVERTEX pVertex,
_In_ ULONG  nVertex,
_In_ PVOID  pMesh,
_In_ ULONG  nMesh,
_In_ RECTL prclExtents,
_In_ POINTL pptlDitherOrg,
_In_ ULONG  ulMode 
)

Definition at line 480 of file gradient.c.

491{
492 ULONG i;
493 BOOL ret = FALSE;
494
495 /* Check for NULL clip object */
496 if (pco == NULL)
497 {
498 /* Use the trivial one instead */
499 pco = (CLIPOBJ *)&gxcoTrivial;//.coClient;
500 }
501
502 switch(ulMode)
503 {
504 case GRADIENT_FILL_RECT_H:
505 case GRADIENT_FILL_RECT_V:
506 {
508 for (i = 0; i < nMesh; i++, gr++)
509 {
510 if (!IntEngGradientFillRect(psoDest,
511 pco,
512 pxlo,
513 pVertex,
514 nVertex,
515 gr,
518 (ulMode == GRADIENT_FILL_RECT_H)))
519 {
520 break;
521 }
522 }
523 ret = TRUE;
524 break;
525 }
526 case GRADIENT_FILL_TRIANGLE:
527 {
529 for (i = 0; i < nMesh; i++, gt++)
530 {
532 {
533 /* skip empty triangles */
534 continue;
535 }
536 if (!IntEngGradientFillTriangle(psoDest,
537 pco,
538 pxlo,
539 pVertex,
540 nVertex,
541 gt,
544 {
545 break;
546 }
547 }
548 ret = TRUE;
549 break;
550 }
551 }
552
553 return ret;
554}
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
return ret
Definition: mutex.c:146
unsigned int BOOL
Definition: ntddk_ex.h:94
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
uint32_t ULONG
Definition: typedefs.h:59
XCLIPOBJ gxcoTrivial
Definition: bitblt.c:20
static BOOL IntEngIsNULLTriangle(TRIVERTEX *pVertex, GRADIENT_TRIANGLE *gt)
Definition: gradient.c:466
BOOL FASTCALL IntEngGradientFillRect(IN SURFOBJ *psoDest, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN TRIVERTEX *pVertex, IN ULONG nVertex, IN PGRADIENT_RECT gRect, IN RECTL *prclExtents, IN POINTL *pptlDitherOrg, IN BOOL Horizontal)
Definition: gradient.c:46
BOOL FASTCALL IntEngGradientFillTriangle(IN SURFOBJ *psoDest, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN TRIVERTEX *pVertex, IN ULONG nVertex, IN PGRADIENT_TRIANGLE gTriangle, IN RECTL *prclExtents, IN POINTL *pptlDitherOrg)
Definition: gradient.c:316
_In_ CLIPOBJ _In_opt_ XLATEOBJ _In_ TRIVERTEX _In_ ULONG _In_ PVOID pMesh
Definition: winddi.h:3653
_In_ CLIPOBJ _In_opt_ XLATEOBJ _In_ TRIVERTEX _In_ ULONG nVertex
Definition: winddi.h:3652
_In_ CLIPOBJ _In_opt_ XLATEOBJ _In_ TRIVERTEX _In_ ULONG _In_ PVOID _In_ ULONG _In_ RECTL * prclExtents
Definition: winddi.h:3655
_In_ CLIPOBJ _In_opt_ XLATEOBJ _In_ TRIVERTEX _In_ ULONG _In_ PVOID _In_ ULONG _In_ RECTL _In_ POINTL _In_ ULONG ulMode
Definition: winddi.h:3657
_In_ CLIPOBJ _In_opt_ XLATEOBJ _In_ TRIVERTEX * pVertex
Definition: winddi.h:3651
_In_ CLIPOBJ _In_opt_ XLATEOBJ _In_ TRIVERTEX _In_ ULONG _In_ PVOID _In_ ULONG nMesh
Definition: winddi.h:3654
_In_ SURFOBJ _In_ CLIPOBJ * pco
Definition: winddi.h:3415
struct _GRADIENT_RECT * PGRADIENT_RECT
struct _GRADIENT_TRIANGLE * PGRADIENT_TRIANGLE

Referenced by IntEngGradientFill(), and PanGradientFill().

◆ IntEngGradientFill()

BOOL APIENTRY IntEngGradientFill ( IN SURFOBJ psoDest,
IN CLIPOBJ pco,
IN XLATEOBJ pxlo,
IN TRIVERTEX pVertex,
IN ULONG  nVertex,
IN PVOID  pMesh,
IN ULONG  nMesh,
IN RECTL prclExtents,
IN POINTL pptlDitherOrg,
IN ULONG  ulMode 
)

Definition at line 558 of file gradient.c.

569{
570 BOOL Ret;
571 SURFACE *psurf;
572 ASSERT(psoDest);
573
574 psurf = CONTAINING_RECORD(psoDest, SURFACE, SurfObj);
575 ASSERT(psurf);
576
577 if (psurf->flags & HOOK_GRADIENTFILL)
578 {
579 Ret = GDIDEVFUNCS(psoDest).GradientFill(psoDest,
580 pco,
581 pxlo,
582 pVertex,
583 nVertex,
584 pMesh,
585 nMesh,
588 ulMode);
589 }
590 else
591 {
592 Ret = EngGradientFill(psoDest,
593 pco,
594 pxlo,
595 pVertex,
596 nVertex,
597 pMesh,
598 nMesh,
601 ulMode);
602 }
603
604 return Ret;
605}
#define ASSERT(a)
Definition: mode.c:44
FLONG flags
Definition: surface.h:10
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
BOOL APIENTRY EngGradientFill(_Inout_ SURFOBJ *psoDest, _In_ CLIPOBJ *pco, _In_opt_ XLATEOBJ *pxlo, _In_ TRIVERTEX *pVertex, _In_ ULONG nVertex, _In_ PVOID pMesh, _In_ ULONG nMesh, _In_ RECTL *prclExtents, _In_ POINTL *pptlDitherOrg, _In_ ULONG ulMode)
Definition: gradient.c:480
#define GDIDEVFUNCS(SurfObj)
Definition: surface.h:106
#define HOOK_GRADIENTFILL
Definition: winddi.h:1436

Referenced by GreGradientFill().

◆ IntEngGradientFillRect()

BOOL FASTCALL IntEngGradientFillRect ( IN SURFOBJ psoDest,
IN CLIPOBJ pco,
IN XLATEOBJ pxlo,
IN TRIVERTEX pVertex,
IN ULONG  nVertex,
IN PGRADIENT_RECT  gRect,
IN RECTL prclExtents,
IN POINTL pptlDitherOrg,
IN BOOL  Horizontal 
)

Definition at line 46 of file gradient.c.

56{
57 SURFOBJ *psoOutput;
58 TRIVERTEX *v1, *v2;
59 RECTL rcGradient, rcSG;
60 RECT_ENUM RectEnum;
61 BOOL EnumMore;
62 ULONG i;
63 POINTL Translate;
64 INTENG_ENTER_LEAVE EnterLeave;
65 LONG y, dy, c[3], dc[3], ec[3], ic[3];
66
67 v1 = (pVertex + gRect->UpperLeft);
68 v2 = (pVertex + gRect->LowerRight);
69
70 rcGradient.left = min(v1->x, v2->x);
71 rcGradient.right = max(v1->x, v2->x);
72 rcGradient.top = min(v1->y, v2->y);
73 rcGradient.bottom = max(v1->y, v2->y);
74 rcSG = rcGradient;
76
77 if(Horizontal)
78 {
79 dy = abs(rcGradient.right - rcGradient.left);
80 }
81 else
82 {
83 dy = abs(rcGradient.bottom - rcGradient.top);
84 }
85
86 if(!IntEngEnter(&EnterLeave, psoDest, &rcSG, FALSE, &Translate, &psoOutput))
87 {
88 return FALSE;
89 }
90
91 if((v1->Red != v2->Red || v1->Green != v2->Green || v1->Blue != v2->Blue) && dy > 1)
92 {
94 do
95 {
98
99 if (Horizontal)
100 {
101 EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum);
102 for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= rcSG.bottom; i++)
103 {
104 if (RECTL_bIntersectRect(&FillRect, &RectEnum.arcl[i], &rcSG))
105 {
106 HVINITCOL(Red, 0);
107 HVINITCOL(Green, 1);
108 HVINITCOL(Blue, 2);
109
110 for (y = rcSG.left; y < FillRect.right; y++)
111 {
112 if (y >= FillRect.left)
113 {
114 Color = XLATEOBJ_iXlate(pxlo, RGB(c[0], c[1], c[2]));
116 psoOutput, y + Translate.x, FillRect.top + Translate.y, FillRect.bottom + Translate.y, Color);
117 }
118 HVSTEPCOL(0);
119 HVSTEPCOL(1);
120 HVSTEPCOL(2);
121 }
122 }
123 }
124
125 continue;
126 }
127
128 /* vertical */
129 EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum);
130 for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= rcSG.bottom; i++)
131 {
132 if (RECTL_bIntersectRect(&FillRect, &RectEnum.arcl[i], &rcSG))
133 {
134 HVINITCOL(Red, 0);
135 HVINITCOL(Green, 1);
136 HVINITCOL(Blue, 2);
137
138 for (y = rcSG.top; y < FillRect.bottom; y++)
139 {
140 if (y >= FillRect.top)
141 {
142 Color = XLATEOBJ_iXlate(pxlo, RGB(c[0], c[1], c[2]));
144 FillRect.left + Translate.x,
145 FillRect.right + Translate.x,
146 y + Translate.y,
147 Color);
148 }
149 HVSTEPCOL(0);
150 HVSTEPCOL(1);
151 HVSTEPCOL(2);
152 }
153 }
154 }
155
156 }
157 while (EnumMore);
158
159 return IntEngLeave(&EnterLeave);
160 }
161
162 /* rectangle has only one color, no calculation required */
164 do
165 {
167 ULONG Color = XLATEOBJ_iXlate(pxlo, RGB(v1->Red >> 8, v1->Green >> 8, v1->Blue >> 8));
168
169 EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum);
170 for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= rcSG.bottom; i++)
171 {
172 if (RECTL_bIntersectRect(&FillRect, &RectEnum.arcl[i], &rcSG))
173 {
174 for (; FillRect.top < FillRect.bottom; FillRect.top++)
175 {
177 FillRect.left + Translate.x,
178 FillRect.right + Translate.x,
179 FillRect.top + Translate.y,
180 Color);
181 }
182 }
183 }
184 }
185 while (EnumMore);
186
187 return IntEngLeave(&EnterLeave);
188}
BOOL APIENTRY IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave, SURFOBJ *psoDest, RECTL *DestRect, BOOL ReadOnly, POINTL *Translate, SURFOBJ **ppsoOutput)
Definition: engmisc.c:15
BOOL APIENTRY IntEngLeave(PINTENG_ENTER_LEAVE EnterLeave)
Definition: engmisc.c:162
long LONG
Definition: pedump.c:60
PFN_DIB_VLine DIB_VLine
Definition: dib.h:48
long bottom
Definition: polytest.cpp:53
long right
Definition: polytest.cpp:53
long top
Definition: polytest.cpp:53
long left
Definition: polytest.cpp:53
LONG y
Definition: windef.h:124
LONG x
Definition: windef.h:123
ULONG c
Definition: vgaddi.h:78
RECTL arcl[ENUM_RECT_LIMIT]
Definition: vgaddi.h:79
ULONG iBitmapFormat
Definition: winddi.h:1215
#define HVINITCOL(Col, id)
Definition: gradient.c:29
#define HVSTEPCOL(id)
Definition: gradient.c:34
BOOL FASTCALL RECTL_bIntersectRect(_Out_ RECTL *prclDst, _In_ const RECTL *prcl1, _In_ const RECTL *prcl2)
Definition: rect.c:55
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
#define CT_RECTANGLES
Definition: winddi.h:1317
ENGAPI BOOL APIENTRY CLIPOBJ_bEnum(_In_ CLIPOBJ *pco, _In_ ULONG cj, _Out_bytecap_(cj) ULONG *pul)
Definition: clip.c:319
ENGAPI ULONG APIENTRY CLIPOBJ_cEnumStart(_Inout_ CLIPOBJ *pco, _In_ BOOL bAll, _In_ ULONG iType, _In_ ULONG iDirection, _In_ ULONG cLimit)
Definition: clip.c:255
#define CD_RIGHTDOWN
Definition: winddi.h:1320

Referenced by EngGradientFill().

◆ IntEngGradientFillTriangle()

BOOL FASTCALL IntEngGradientFillTriangle ( IN SURFOBJ psoDest,
IN CLIPOBJ pco,
IN XLATEOBJ pxlo,
IN TRIVERTEX pVertex,
IN ULONG  nVertex,
IN PGRADIENT_TRIANGLE  gTriangle,
IN RECTL prclExtents,
IN POINTL pptlDitherOrg 
)

Definition at line 316 of file gradient.c.

325{
326 SURFOBJ *psoOutput;
327 PTRIVERTEX v1, v2, v3;
328 RECT_ENUM RectEnum;
329 BOOL EnumMore;
330 ULONG i;
331 POINTL Translate;
332 INTENG_ENTER_LEAVE EnterLeave;
333 RECTL FillRect = { 0, 0, 0, 0 };
334 ULONG Color;
335
336 BOOL sx[NLINES];
337 LONG x[NLINES], dx[NLINES], dy[NLINES], incx[NLINES], ex[NLINES], destx[NLINES];
338 LONG c[NLINES][3], dc[NLINES][3], ec[NLINES][3], ic[NLINES][3]; /* colors on lines */
339 LONG g, gx, gxi, gc[3], gd[3], ge[3], gi[3]; /* colors in triangle */
340 LONG sy, y, bt, g_end;
341
342 v1 = (pVertex + gTriangle->Vertex1);
343 v2 = (pVertex + gTriangle->Vertex2);
344 v3 = (pVertex + gTriangle->Vertex3);
345
346 /* bubble sort */
347 if (SMALLER(v2, v1))
348 {
349 TRIVERTEX *t;
350 SWAP(v1, v2, t);
351 }
352
353 if (SMALLER(v3, v2))
354 {
355 TRIVERTEX *t;
356 SWAP(v2, v3, t);
357 if (SMALLER(v2, v1))
358 {
359 SWAP(v1, v2, t);
360 }
361 }
362
363 DPRINT("Triangle: (%i,%i) (%i,%i) (%i,%i)\n", v1->x, v1->y, v2->x, v2->y, v3->x, v3->y);
364
365 if (!IntEngEnter(&EnterLeave, psoDest, &FillRect, FALSE, &Translate, &psoOutput))
366 {
367 return FALSE;
368 }
369
370 if (VCMPCLRS(v1, v2, v3))
371 {
373 do
374 {
375 EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum);
376 for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= prclExtents->bottom; i++)
377 {
379 {
380 BOOL InY;
381
382 DOINIT(v1, v3, 0);
383 DOINIT(v1, v2, 1);
384 DOINIT(v2, v3, 2);
385
386 y = v1->y;
387 sy = v1->y + pptlDitherOrg->y;
388 bt = min(v3->y + pptlDitherOrg->y, FillRect.bottom);
389
390 while (sy < bt)
391 {
392 InY = !(sy < FillRect.top || sy >= FillRect.bottom);
393 GOLINE(v1, v3, 0);
394 DOLINE(v1, v3, 0);
395 ENDLINE(v1, v3, 0);
396
397 GOLINE(v1, v2, 1);
398 DOLINE(v1, v2, 1);
399 FILLLINE(0, 1);
400 ENDLINE(v1, v2, 1);
401
402 GOLINE(v2, v3, 2);
403 FILLLINE(0, 2);
404 DOLINE(v2, v3, 2);
405 FILLLINE(0, 2);
406 ENDLINE(23, v3, 2);
407
408 y++;
409 sy++;
410 }
411 }
412 }
413 } while (EnumMore);
414
415 return IntEngLeave(&EnterLeave);
416 }
417
418 /* fill triangle with one solid color */
419
420 Color = XLATEOBJ_iXlate(pxlo, RGB(v1->Red >> 8, v1->Green >> 8, v1->Blue >> 8));
422 do
423 {
424 EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum);
425 for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= prclExtents->bottom; i++)
426 {
428 {
429 S_INITLINE(v1, v3, 0);
430 S_INITLINE(v1, v2, 1);
431 S_INITLINE(v2, v3, 2);
432
433 y = v1->y;
434 sy = v1->y + pptlDitherOrg->y;
435 bt = min(v3->y + pptlDitherOrg->y, FillRect.bottom);
436
437 while (sy < bt)
438 {
439 S_GOLINE(v1, v3, 0);
440 S_DOLINE(v1, v3, 0);
441 S_ENDLINE(v1, v3, 0);
442
443 S_GOLINE(v1, v2, 1);
444 S_DOLINE(v1, v2, 1);
445 S_FILLLINE(0, 1);
446 S_ENDLINE(v1, v2, 1);
447
448 S_GOLINE(v2, v3, 2);
449 S_DOLINE(v2, v3, 2);
450 S_FILLLINE(0, 2);
451 S_ENDLINE(23, v3, 2);
452
453 y++;
454 sy++;
455 }
456 }
457 }
458 } while (EnumMore);
459
460 return IntEngLeave(&EnterLeave);
461}
GLdouble GLdouble t
Definition: gl.h:2047
GLfloat GLfloat GLfloat GLfloat v3
Definition: glext.h:6064
#define DPRINT
Definition: sndvol32.h:73
#define S_DOLINE(a, b, line)
Definition: gradient.c:197
#define SMALLER(a, b)
Definition: gradient.c:306
#define S_ENDLINE(a, b, line)
Definition: gradient.c:210
#define ENDLINE(a, b, line)
Definition: gradient.c:288
#define SWAP(a, b, c)
Definition: gradient.c:308
#define S_INITLINE(a, b, line)
Definition: gradient.c:213
#define NLINES
Definition: gradient.c:312
#define DOLINE(a, b, line)
Definition: gradient.c:272
#define S_FILLLINE(linefrom, lineto)
Definition: gradient.c:191
#define S_GOLINE(a, b, line)
Definition: gradient.c:206
#define GOLINE(a, b, line)
Definition: gradient.c:284
#define DOINIT(a, b, line)
Definition: gradient.c:300
#define FILLLINE(linefrom, lineto)
Definition: gradient.c:253
#define VCMPCLRS(a, b, c)
Definition: gradient.c:25

Referenced by EngGradientFill().

◆ IntEngIsNULLTriangle()

static BOOL IntEngIsNULLTriangle ( TRIVERTEX pVertex,
GRADIENT_TRIANGLE gt 
)
static

Definition at line 466 of file gradient.c.

467{
468 if(COMPAREVERTEX(VERTEX(Vertex1), VERTEX(Vertex2)))
469 return TRUE;
470 if(COMPAREVERTEX(VERTEX(Vertex1), VERTEX(Vertex3)))
471 return TRUE;
472 if(COMPAREVERTEX(VERTEX(Vertex2), VERTEX(Vertex3)))
473 return TRUE;
474 return FALSE;
475}
#define VERTEX(n)
Definition: gradient.c:18
#define COMPAREVERTEX(a, b)
Definition: gradient.c:19

Referenced by EngGradientFill().

Variable Documentation

◆ LINC

const LONG LINC[2] = {-1, 1}

Definition at line 16 of file gradient.c.