ReactOS 0.4.16-dev-2216-ga08d639
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:290

Definition at line 299 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:228

Definition at line 271 of file gradient.c.

◆ ENDLINE

#define ENDLINE (   a,
  b,
  line 
)     }

Definition at line 287 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 243 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:67
#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:909
_In_ SURFOBJ _In_ CLIPOBJ _In_opt_ XLATEOBJ * pxlo
Definition: winddi.h:3416
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)

Definition at line 252 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 237 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 283 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 222 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 290 of file gradient.c.

◆ NDEBUG

#define NDEBUG

Definition at line 11 of file gradient.c.

◆ NLINES

#define NLINES   3

Definition at line 311 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 196 of file gradient.c.

◆ S_ENDLINE

#define S_ENDLINE (   a,
  b,
  line 
)     }

Definition at line 209 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 190 of file gradient.c.

◆ S_GOLINE

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

Definition at line 205 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 212 of file gradient.c.

◆ SMALLER

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

Definition at line 305 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 228 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 307 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 479 of file gradient.c.

490{
491 ULONG i;
492 BOOL ret = FALSE;
493
494 /* Check for NULL clip object */
495 if (pco == NULL)
496 {
497 /* Use the trivial one instead */
498 pco = (CLIPOBJ *)&gxcoTrivial;//.coClient;
499 }
500
501 switch(ulMode)
502 {
503 case GRADIENT_FILL_RECT_H:
504 case GRADIENT_FILL_RECT_V:
505 {
507 for (i = 0; i < nMesh; i++, gr++)
508 {
509 if (!IntEngGradientFillRect(psoDest,
510 pco,
511 pxlo,
512 pVertex,
513 nVertex,
514 gr,
517 (ulMode == GRADIENT_FILL_RECT_H)))
518 {
519 break;
520 }
521 }
522 ret = TRUE;
523 break;
524 }
525 case GRADIENT_FILL_TRIANGLE:
526 {
528 for (i = 0; i < nMesh; i++, gt++)
529 {
531 {
532 /* skip empty triangles */
533 continue;
534 }
535 if (!IntEngGradientFillTriangle(psoDest,
536 pco,
537 pxlo,
538 pVertex,
539 nVertex,
540 gt,
543 {
544 break;
545 }
546 }
547 ret = TRUE;
548 break;
549 }
550 }
551
552 return ret;
553}
#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:465
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:315
_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 557 of file gradient.c.

568{
569 BOOL Ret;
570 SURFACE *psurf;
571 ASSERT(psoDest);
572
573 psurf = CONTAINING_RECORD(psoDest, SURFACE, SurfObj);
574 ASSERT(psurf);
575
576 if (psurf->flags & HOOK_GRADIENTFILL)
577 {
578 Ret = GDIDEVFUNCS(psoDest).GradientFill(psoDest,
579 pco,
580 pxlo,
581 pVertex,
582 nVertex,
583 pMesh,
584 nMesh,
587 ulMode);
588 }
589 else
590 {
591 Ret = EngGradientFill(psoDest,
592 pco,
593 pxlo,
594 pVertex,
595 nVertex,
596 pMesh,
597 nMesh,
600 ulMode);
601 }
602
603 return Ret;
604}
#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:479
#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;
75
76 if(Horizontal)
77 {
78 dy = abs(rcGradient.right - rcGradient.left);
79 }
80 else
81 {
82 dy = abs(rcGradient.bottom - rcGradient.top);
83 }
84
85 if(!IntEngEnter(&EnterLeave, psoDest, &rcSG, FALSE, &Translate, &psoOutput))
86 {
87 return FALSE;
88 }
89
90 if((v1->Red != v2->Red || v1->Green != v2->Green || v1->Blue != v2->Blue) && dy > 1)
91 {
93 do
94 {
97
98 if (Horizontal)
99 {
100 EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum);
101 for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= rcSG.bottom; i++)
102 {
103 if (RECTL_bIntersectRect(&FillRect, &RectEnum.arcl[i], &rcSG))
104 {
105 HVINITCOL(Red, 0);
106 HVINITCOL(Green, 1);
107 HVINITCOL(Blue, 2);
108
109 for (y = rcSG.left; y < FillRect.right; y++)
110 {
111 if (y >= FillRect.left)
112 {
113 Color = XLATEOBJ_iXlate(pxlo, RGB(c[0], c[1], c[2]));
115 psoOutput, y + Translate.x, FillRect.top + Translate.y, FillRect.bottom + Translate.y, Color);
116 }
117 HVSTEPCOL(0);
118 HVSTEPCOL(1);
119 HVSTEPCOL(2);
120 }
121 }
122 }
123
124 continue;
125 }
126
127 /* vertical */
128 EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum);
129 for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= rcSG.bottom; i++)
130 {
131 if (RECTL_bIntersectRect(&FillRect, &RectEnum.arcl[i], &rcSG))
132 {
133 HVINITCOL(Red, 0);
134 HVINITCOL(Green, 1);
135 HVINITCOL(Blue, 2);
136
137 for (y = rcSG.top; y < FillRect.bottom; y++)
138 {
139 if (y >= FillRect.top)
140 {
141 Color = XLATEOBJ_iXlate(pxlo, RGB(c[0], c[1], c[2]));
143 FillRect.left + Translate.x,
144 FillRect.right + Translate.x,
145 y + Translate.y,
146 Color);
147 }
148 HVSTEPCOL(0);
149 HVSTEPCOL(1);
150 HVSTEPCOL(2);
151 }
152 }
153 }
154
155 }
156 while (EnumMore);
157
158 return IntEngLeave(&EnterLeave);
159 }
160
161 /* rectangle has only one color, no calculation required */
163 do
164 {
166 ULONG Color = XLATEOBJ_iXlate(pxlo, RGB(v1->Red >> 8, v1->Green >> 8, v1->Blue >> 8));
167
168 EnumMore = CLIPOBJ_bEnum(pco, (ULONG) sizeof(RectEnum), (PVOID) &RectEnum);
169 for (i = 0; i < RectEnum.c && RectEnum.arcl[i].top <= rcSG.bottom; i++)
170 {
171 if (RECTL_bIntersectRect(&FillRect, &RectEnum.arcl[i], &rcSG))
172 {
173 for (; FillRect.top < FillRect.bottom; FillRect.top++)
174 {
176 FillRect.left + Translate.x,
177 FillRect.right + Translate.x,
178 FillRect.top + Translate.y,
179 Color);
180 }
181 }
182 }
183 }
184 while (EnumMore);
185
186 return IntEngLeave(&EnterLeave);
187}
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:130
LONG x
Definition: windef.h:129
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
#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 315 of file gradient.c.

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

466{
467 if(COMPAREVERTEX(VERTEX(Vertex1), VERTEX(Vertex2)))
468 return TRUE;
469 if(COMPAREVERTEX(VERTEX(Vertex1), VERTEX(Vertex3)))
470 return TRUE;
471 if(COMPAREVERTEX(VERTEX(Vertex2), VERTEX(Vertex3)))
472 return TRUE;
473 return FALSE;
474}
#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.