1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Windows (Win32/Win64) device driver for Mesa
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "wmesadef.h"
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "colors.h"
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "GL/wmesa.h"
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <winuser.h>
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h"
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/extensions.h"
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/framebuffer.h"
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/renderbuffer.h"
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/driverfuncs.h"
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/meta.h"
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo/vbo.h"
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/swrast.h"
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_renderbuffer.h"
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast_setup/swrast_setup.h"
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/tnl.h"
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_context.h"
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_pipeline.h"
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* linked list of our Framebuffers (windows) */
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic WMesaFramebuffer FirstFramebuffer = NULL;
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new WMesaFramebuffer object which will correspond to the
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * given HDC (Window handle).
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic WMesaFramebuffer
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_new_framebuffer(HDC hdc, struct gl_config *visual)
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        = (WMesaFramebuffer) malloc(sizeof(struct wmesa_framebuffer));
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (pwfb) {
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        _mesa_initialize_window_framebuffer(&pwfb->Base, visual);
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        pwfb->hDC = hdc;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        /* insert at head of list */
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        pwfb->next = FirstFramebuffer;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        FirstFramebuffer = pwfb;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return pwfb;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given an hdc, free the corresponding WMesaFramebuffer
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_free_framebuffer(HDC hdc)
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb, prev;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (pwfb = FirstFramebuffer; pwfb; pwfb = pwfb->next) {
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        if (pwfb->hDC == hdc)
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	prev = pwfb;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (pwfb) {
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        struct gl_framebuffer *fb;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (pwfb == FirstFramebuffer)
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    FirstFramebuffer = pwfb->next;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    prev->next = pwfb->next;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        fb = &pwfb->Base;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        _mesa_reference_framebuffer(&fb, NULL);
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given an hdc, return the corresponding WMesaFramebuffer
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic WMesaFramebuffer
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_lookup_framebuffer(HDC hdc)
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (pwfb = FirstFramebuffer; pwfb; pwfb = pwfb->next) {
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        if (pwfb->hDC == hdc)
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return pwfb;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return NULL;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given a struct gl_framebuffer, return the corresponding WMesaFramebuffer.
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic WMesaFramebuffer wmesa_framebuffer(struct gl_framebuffer *fb)
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return (WMesaFramebuffer) fb;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given a struct gl_context, return the corresponding WMesaContext.
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic WMesaContext wmesa_context(const struct gl_context *ctx)
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return (WMesaContext) ctx;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Every driver should implement a GetString function in order to
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * return a meaningful GL_RENDERER string.
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLubyte *wmesa_get_string(struct gl_context *ctx, GLenum name)
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return (name == GL_RENDERER) ?
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	(GLubyte *) "Mesa Windows GDI Driver" : NULL;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine the pixel format based on the pixel size.
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void wmSetPixelFormat(WMesaFramebuffer pwfb, HDC hDC)
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pwfb->cColorBits = GetDeviceCaps(hDC, BITSPIXEL);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Only 16 and 32 bit targets are supported now */
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    assert(pwfb->cColorBits == 0 ||
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   pwfb->cColorBits == 16 ||
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   pwfb->cColorBits == 24 ||
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   pwfb->cColorBits == 32);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    switch(pwfb->cColorBits){
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case 8:
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pwfb->pixelformat = PF_INDEX8;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	break;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case 16:
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pwfb->pixelformat = PF_5R6G5B;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	break;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case 24:
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case 32:
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pwfb->pixelformat = PF_8R8G8B;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	break;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    default:
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pwfb->pixelformat = PF_BADFORMAT;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create DIB for back buffer.
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We write into this memory with the span routines and then blit it
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the window on a buffer swap.
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic BOOL wmCreateBackingStore(WMesaFramebuffer pwfb, long lxSize, long lySize)
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LPBITMAPINFO pbmi = &(pwfb->bmi);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    HDC          hic;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pbmi->bmiHeader.biWidth = lxSize;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pbmi->bmiHeader.biHeight= -lySize;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pbmi->bmiHeader.biPlanes = 1;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pbmi->bmiHeader.biBitCount = GetDeviceCaps(pwfb->hDC, BITSPIXEL);
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pbmi->bmiHeader.biCompression = BI_RGB;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pbmi->bmiHeader.biSizeImage = 0;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pbmi->bmiHeader.biXPelsPerMeter = 0;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pbmi->bmiHeader.biYPelsPerMeter = 0;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pbmi->bmiHeader.biClrUsed = 0;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pbmi->bmiHeader.biClrImportant = 0;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pwfb->cColorBits = pbmi->bmiHeader.biBitCount;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pwfb->ScanWidth = (lxSize * (pwfb->cColorBits / 8) + 3) & ~3;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    hic = CreateIC("display", NULL, NULL, NULL);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pwfb->dib_hDC = CreateCompatibleDC(hic);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pwfb->hbmDIB = CreateDIBSection(hic,
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   &pwfb->bmi,
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   DIB_RGB_COLORS,
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   (void **)&(pwfb->pbPixels),
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   0,
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   0);
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pwfb->hOldBitmap = SelectObject(pwfb->dib_hDC, pwfb->hbmDIB);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DeleteDC(hic);
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    wmSetPixelFormat(pwfb, pwfb->hDC);
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return TRUE;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void wmDeleteBackingStore(WMesaFramebuffer pwfb)
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (pwfb->hbmDIB) {
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	SelectObject(pwfb->dib_hDC, pwfb->hOldBitmap);
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	DeleteDC(pwfb->dib_hDC);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	DeleteObject(pwfb->hbmDIB);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Find the width and height of the window named by hdc.
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_window_size(HDC hdc, GLuint *width, GLuint *height)
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (WindowFromDC(hdc)) {
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        RECT rect;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        GetClientRect(WindowFromDC(hdc), &rect);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        *width = rect.right - rect.left;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        *height = rect.bottom - rect.top;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    else { /* Memory context */
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        /* From contributed code - use the size of the desktop
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         * for the size of a memory context (?) */
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        *width = GetDeviceCaps(hdc, HORZRES);
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        *height = GetDeviceCaps(hdc, VERTRES);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_get_buffer_size(struct gl_framebuffer *buffer, GLuint *width, GLuint *height)
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(buffer);
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    get_window_size(pwfb->hDC, width, height);
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void wmesa_flush(struct gl_context *ctx)
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->WinSysDrawBuffer);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (ctx->Visual.doubleBufferMode == 1) {
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height,
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       pwfb->dib_hDC, 0, 0, SRCCOPY);
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    else {
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Do nothing for single buffer */
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*****                   CLEAR Functions                          *****/
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Clear the color/depth/stencil buffers.
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void clear(struct gl_context *ctx, GLbitfield mask)
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLIP(Y)  (ctx->DrawBuffer->Height - (Y) - 1)
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const GLint x = ctx->DrawBuffer->_Xmin;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const GLint y = ctx->DrawBuffer->_Ymin;
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const GLint height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const GLint width  = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaContext pwc = wmesa_context(ctx);
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int done = 0;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Let swrast do all the work if the masks are not set to
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * clear all channels. */
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!ctx->Color.ColorMask[0][0] ||
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	!ctx->Color.ColorMask[0][1] ||
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	!ctx->Color.ColorMask[0][2] ||
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	!ctx->Color.ColorMask[0][3]) {
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_swrast_Clear(ctx, mask);
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (mask & BUFFER_BITS_COLOR) {
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       /* setup the clearing color */
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       const union gl_color_union color = ctx->Color.ClearColor;
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       GLubyte col[3];
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       UNCLAMPED_FLOAT_TO_UBYTE(col[0], color.f[0]);
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       UNCLAMPED_FLOAT_TO_UBYTE(col[1], color.f[1]);
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       UNCLAMPED_FLOAT_TO_UBYTE(col[2], color.f[2]);
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       pwc->clearColorRef = RGB(col[0], col[1], col[2]);
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       DeleteObject(pwc->clearPen);
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       DeleteObject(pwc->clearBrush);
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       pwc->clearPen = CreatePen(PS_SOLID, 1, pwc->clearColorRef);
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       pwc->clearBrush = CreateSolidBrush(pwc->clearColorRef);
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Back buffer */
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (mask & BUFFER_BIT_BACK_LEFT) {
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int     i, rowSize;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UINT    bytesPerPixel = pwfb->cColorBits / 8;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	LPBYTE  lpb, clearRow;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	LPWORD  lpw;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BYTE    bColor;
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	WORD    wColor;
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BYTE    r, g, b;
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	DWORD   dwColor;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	LPDWORD lpdw;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Try for a fast clear - clearing entire buffer with a single
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * byte value. */
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (width == ctx->DrawBuffer->Width &&
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            height == ctx->DrawBuffer->Height) { /* entire buffer */
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* Now check for an easy clear value */
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    switch (bytesPerPixel) {
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case 1:
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bColor = BGR8(GetRValue(pwc->clearColorRef),
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GetGValue(pwc->clearColorRef),
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GetBValue(pwc->clearColorRef));
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(pwfb->pbPixels, bColor,
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       pwfb->ScanWidth * height);
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		done = 1;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case 2:
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		wColor = BGR16(GetRValue(pwc->clearColorRef),
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GetGValue(pwc->clearColorRef),
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GetBValue(pwc->clearColorRef));
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (((wColor >> 8) & 0xff) == (wColor & 0xff)) {
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    memset(pwfb->pbPixels, wColor & 0xff,
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   pwfb->ScanWidth * height);
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    done = 1;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case 3:
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* fall through */
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case 4:
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (GetRValue(pwc->clearColorRef) ==
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    GetGValue(pwc->clearColorRef) &&
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    GetRValue(pwc->clearColorRef) ==
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    GetBValue(pwc->clearColorRef)) {
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    memset(pwfb->pbPixels,
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GetRValue(pwc->clearColorRef),
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   pwfb->ScanWidth * height);
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    done = 1;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    default:
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} /* all */
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!done) {
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* Need to clear a row at a time.  Begin by setting the first
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     * row in the area to be cleared to the clear color. */
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    clearRow = pwfb->pbPixels +
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pwfb->ScanWidth * FLIP(y) +
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bytesPerPixel * x;
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    switch (bytesPerPixel) {
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case 1:
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		lpb = clearRow;
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bColor = BGR8(GetRValue(pwc->clearColorRef),
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GetGValue(pwc->clearColorRef),
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GetBValue(pwc->clearColorRef));
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(lpb, bColor, width);
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case 2:
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		lpw = (LPWORD)clearRow;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		wColor = BGR16(GetRValue(pwc->clearColorRef),
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GetGValue(pwc->clearColorRef),
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GetBValue(pwc->clearColorRef));
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i=0; i<width; i++)
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    *lpw++ = wColor;
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case 3:
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		lpb = clearRow;
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = GetRValue(pwc->clearColorRef);
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		g = GetGValue(pwc->clearColorRef);
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		b = GetBValue(pwc->clearColorRef);
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i=0; i<width; i++) {
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    *lpb++ = b;
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    *lpb++ = g;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    *lpb++ = r;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case 4:
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		lpdw = (LPDWORD)clearRow;
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dwColor = BGR32(GetRValue(pwc->clearColorRef),
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GetGValue(pwc->clearColorRef),
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GetBValue(pwc->clearColorRef));
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i=0; i<width; i++)
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    *lpdw++ = dwColor;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    default:
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    } /* switch */
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* copy cleared row to other rows in buffer */
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    lpb = clearRow - pwfb->ScanWidth;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rowSize = width * bytesPerPixel;
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    for (i=1; i<height; i++) {
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memcpy(lpb, clearRow, rowSize);
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		lpb -= pwfb->ScanWidth;
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} /* not done */
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	mask &= ~BUFFER_BIT_BACK_LEFT;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    } /* back buffer */
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* front buffer */
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (mask & BUFFER_BIT_FRONT_LEFT) {
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	HDC DC = pwc->hDC;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	HPEN Old_Pen = SelectObject(DC, pwc->clearPen);
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	HBRUSH Old_Brush = SelectObject(DC, pwc->clearBrush);
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	Rectangle(DC,
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  x,
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  FLIP(y) + 1,
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  x + width + 1,
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  FLIP(y) - height + 1);
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	SelectObject(DC, Old_Pen);
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	SelectObject(DC, Old_Brush);
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	mask &= ~BUFFER_BIT_FRONT_LEFT;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    } /* front buffer */
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Call swrast if there is anything left to clear (like DEPTH) */
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (mask)
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_swrast_Clear(ctx, mask);
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FLIP
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*****                   PIXEL Functions                          *****/
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLIP(Y)  (rb->Height - (Y) - 1)
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** Front Buffer reading/writing
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** These are slow, but work with all non-indexed visual types.
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **/
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write a horizontal span of RGBA color pixels with a boolean mask. */
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_span_front(struct gl_context *ctx,
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  struct gl_renderbuffer *rb,
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  GLuint n, GLint x, GLint y,
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  const void *values,
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  const GLubyte *mask)
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   WMesaContext pwc = wmesa_context(ctx);
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   WMesaFramebuffer pwfb = wmesa_lookup_framebuffer(pwc->hDC);
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   HBITMAP bmp=0;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   HDC mdc=0;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   typedef union
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned i;
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct {
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned b:8, g:8, r:8, a:8;
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      };
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } BGRA;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BGRA *bgra, c;
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (n < 16) {   // the value 16 is just guessed
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y=FLIP(y);
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mask) {
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i=0; i<n; i++)
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (mask[i])
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               SetPixel(pwc->hDC, x+i, y,
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        RGB(rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]));
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i=0; i<n; i++)
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            SetPixel(pwc->hDC, x+i, y,
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     RGB(rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]));
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!pwfb) {
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_problem(NULL, "wmesa: write_rgba_span_front on unknown hdc");
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bgra=malloc(n*sizeof(BGRA));
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!bgra) {
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_problem(NULL, "wmesa: write_rgba_span_front: out of memory");
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c.a=0;
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mask) {
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i=0; i<n; i++) {
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (mask[i]) {
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               c.r=rgba[i][RCOMP];
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               c.g=rgba[i][GCOMP];
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               c.b=rgba[i][BCOMP];
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               c.a=rgba[i][ACOMP];
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               bgra[i]=c;
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               bgra[i].i=0;
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i=0; i<n; i++) {
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            c.r=rgba[i][RCOMP];
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            c.g=rgba[i][GCOMP];
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            c.b=rgba[i][BCOMP];
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            c.a=rgba[i][ACOMP];
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            bgra[i]=c;
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bmp=CreateBitmap(n, 1,  1, 32, bgra);
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mdc=CreateCompatibleDC(pwfb->hDC);
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SelectObject(mdc, bmp);
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y=FLIP(y);
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BitBlt(pwfb->hDC, x, y, n, 1, mdc, 0, 0, SRCCOPY);
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SelectObject(mdc, 0);
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DeleteObject(bmp);
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DeleteDC(mdc);
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(bgra);
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write an array of RGBA pixels with a boolean mask. */
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_pixels_front(struct gl_context *ctx,
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    struct gl_renderbuffer *rb,
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    GLuint n,
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    const GLint x[], const GLint y[],
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    const void *values,
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    const GLubyte *mask)
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values;
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaContext pwc = wmesa_context(ctx);
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    (void) ctx;
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++)
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (mask[i])
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    SetPixel(pwc->hDC, x[i], FLIP(y[i]),
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     RGB(rgba[i][RCOMP], rgba[i][GCOMP],
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 rgba[i][BCOMP]));
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read a horizontal span of color pixels. */
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_span_front(struct gl_context *ctx,
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 struct gl_renderbuffer *rb,
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GLuint n, GLint x, GLint y,
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 void *values)
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLubyte (*rgba)[4] = (GLubyte (*)[4])values;
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaContext pwc = wmesa_context(ctx);
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    COLORREF Color;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    y = FLIP(y);
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++) {
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	Color = GetPixel(pwc->hDC, x+i, y);
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][RCOMP] = GetRValue(Color);
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][GCOMP] = GetGValue(Color);
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][BCOMP] = GetBValue(Color);
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][ACOMP] = 255;
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read an array of color pixels. */
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_pixels_front(struct gl_context *ctx,
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   struct gl_renderbuffer *rb,
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   GLuint n, const GLint x[], const GLint y[],
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   void *values)
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLubyte (*rgba)[4] = (GLubyte (*)[4])values;
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaContext pwc = wmesa_context(ctx);
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    COLORREF Color;
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++) {
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        GLint y2 = FLIP(y[i]);
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        Color = GetPixel(pwc->hDC, x[i], y2);
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        rgba[i][RCOMP] = GetRValue(Color);
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        rgba[i][GCOMP] = GetGValue(Color);
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        rgba[i][BCOMP] = GetBValue(Color);
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        rgba[i][ACOMP] = 255;
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************/
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DOUBLE BUFFER 32-bit */
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define WMSETPIXEL32(pwc, y, x, r, g, b) { \
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLPDWORD lpdw = ((LPDWORD)((pwc)->pbPixels + (pwc)->ScanWidth * (y)) + (x)); \
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*lpdw = BGR32((r),(g),(b)); }
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write a horizontal span of RGBA color pixels with a boolean mask. */
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_span_32(struct gl_context *ctx,
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       struct gl_renderbuffer *rb,
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint n, GLint x, GLint y,
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       const void *values,
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       const GLubyte *mask)
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values;
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LPDWORD lpdw;
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    (void) ctx;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    y=FLIP(y);
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    lpdw = ((LPDWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (mask) {
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i=0; i<n; i++)
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (mask[i])
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                lpdw[i] = BGR32(rgba[i][RCOMP], rgba[i][GCOMP],
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				rgba[i][BCOMP]);
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    else {
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i=0; i<n; i++)
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                *lpdw++ = BGR32(rgba[i][RCOMP], rgba[i][GCOMP],
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				rgba[i][BCOMP]);
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write an array of RGBA pixels with a boolean mask. */
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_pixels_32(struct gl_context *ctx,
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 struct gl_renderbuffer *rb,
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GLuint n, const GLint x[], const GLint y[],
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 const void *values,
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 const GLubyte *mask)
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values;
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++)
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (mask[i])
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    WMSETPIXEL32(pwfb, FLIP(y[i]), x[i],
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read a horizontal span of color pixels. */
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_span_32(struct gl_context *ctx,
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      struct gl_renderbuffer *rb,
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint n, GLint x, GLint y,
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      void *values)
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLubyte (*rgba)[4] = (GLubyte (*)[4])values;
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DWORD pixel;
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LPDWORD lpdw;
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    y = FLIP(y);
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    lpdw = ((LPDWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++) {
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pixel = lpdw[i];
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][RCOMP] = (GLubyte)((pixel & 0x00ff0000) >> 16);
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][GCOMP] = (GLubyte)((pixel & 0x0000ff00) >> 8);
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][BCOMP] = (GLubyte)(pixel & 0x000000ff);
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][ACOMP] = 255;
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read an array of color pixels. */
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_pixels_32(struct gl_context *ctx,
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct gl_renderbuffer *rb,
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLuint n, const GLint x[], const GLint y[],
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				void *values)
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLubyte (*rgba)[4] = (GLubyte (*)[4])values;
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DWORD pixel;
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LPDWORD lpdw;
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++) {
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLint y2 = FLIP(y[i]);
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	lpdw = ((LPDWORD)(pwfb->pbPixels + pwfb->ScanWidth * y2)) + x[i];
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pixel = *lpdw;
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][RCOMP] = (GLubyte)((pixel & 0x00ff0000) >> 16);
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][GCOMP] = (GLubyte)((pixel & 0x0000ff00) >> 8);
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][BCOMP] = (GLubyte)(pixel & 0x000000ff);
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][ACOMP] = 255;
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************/
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DOUBLE BUFFER 24-bit */
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define WMSETPIXEL24(pwc, y, x, r, g, b) { \
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLPBYTE lpb = ((LPBYTE)((pwc)->pbPixels + (pwc)->ScanWidth * (y)) + (3 * x)); \
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglpb[0] = (b); \
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglpb[1] = (g); \
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglpb[2] = (r); }
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write a horizontal span of RGBA color pixels with a boolean mask. */
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_span_24(struct gl_context *ctx,
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       struct gl_renderbuffer *rb,
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint n, GLint x, GLint y,
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       const void *values,
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       const GLubyte *mask)
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values;
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LPBYTE lpb;
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    (void) ctx;
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    y=FLIP(y);
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    lpb = ((LPBYTE)(pwfb->pbPixels + pwfb->ScanWidth * y)) + (3 * x);
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (mask) {
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i=0; i<n; i++)
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (mask[i]) {
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                lpb[3*i] = rgba[i][BCOMP];
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                lpb[3*i+1] = rgba[i][GCOMP];
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                lpb[3*i+2] = rgba[i][RCOMP];
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    else {
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    for (i=0; i<n; i++) {
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *lpb++ = rgba[i][BCOMP];
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *lpb++ = rgba[i][GCOMP];
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *lpb++ = rgba[i][RCOMP];
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write an array of RGBA pixels with a boolean mask. */
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_pixels_24(struct gl_context *ctx,
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 struct gl_renderbuffer *rb,
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GLuint n, const GLint x[], const GLint y[],
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 const void *values,
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 const GLubyte *mask)
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values;
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++)
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (mask[i])
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    WMSETPIXEL24(pwfb, FLIP(y[i]), x[i],
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read a horizontal span of color pixels. */
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_span_24(struct gl_context *ctx,
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      struct gl_renderbuffer *rb,
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint n, GLint x, GLint y,
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      void *values)
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLubyte (*rgba)[4] = (GLubyte (*)[4])values;
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LPBYTE lpb;
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    y = FLIP(y);
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    lpb = ((LPBYTE)(pwfb->pbPixels + pwfb->ScanWidth * y)) + (3 * x);
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++) {
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][RCOMP] = lpb[3*i+2];
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][GCOMP] = lpb[3*i+1];
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][BCOMP] = lpb[3*i];
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][ACOMP] = 255;
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read an array of color pixels. */
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_pixels_24(struct gl_context *ctx,
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct gl_renderbuffer *rb,
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLuint n, const GLint x[], const GLint y[],
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				void *values)
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLubyte (*rgba)[4] = (GLubyte (*)[4])values;
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LPBYTE lpb;
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++) {
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLint y2 = FLIP(y[i]);
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	lpb = ((LPBYTE)(pwfb->pbPixels + pwfb->ScanWidth * y2)) + (3 * x[i]);
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][RCOMP] = lpb[3*i+2];
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][GCOMP] = lpb[3*i+1];
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][BCOMP] = lpb[3*i];
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][ACOMP] = 255;
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************/
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DOUBLE BUFFER 16-bit */
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define WMSETPIXEL16(pwc, y, x, r, g, b) { \
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLPWORD lpw = ((LPWORD)((pwc)->pbPixels + (pwc)->ScanWidth * (y)) + (x)); \
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*lpw = BGR16((r),(g),(b)); }
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write a horizontal span of RGBA color pixels with a boolean mask. */
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_span_16(struct gl_context *ctx,
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       struct gl_renderbuffer *rb,
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint n, GLint x, GLint y,
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       const void *values,
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       const GLubyte *mask)
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values;
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LPWORD lpw;
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    (void) ctx;
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    y=FLIP(y);
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    lpw = ((LPWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (mask) {
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i=0; i<n; i++)
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (mask[i])
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                lpw[i] = BGR16(rgba[i][RCOMP], rgba[i][GCOMP],
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       rgba[i][BCOMP]);
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    else {
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i=0; i<n; i++)
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                *lpw++ = BGR16(rgba[i][RCOMP], rgba[i][GCOMP],
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       rgba[i][BCOMP]);
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write an array of RGBA pixels with a boolean mask. */
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_pixels_16(struct gl_context *ctx,
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 struct gl_renderbuffer *rb,
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GLuint n, const GLint x[], const GLint y[],
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 const void *values,
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 const GLubyte *mask)
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values;
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i;
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    (void) ctx;
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++)
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (mask[i])
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    WMSETPIXEL16(pwfb, FLIP(y[i]), x[i],
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read a horizontal span of color pixels. */
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_span_16(struct gl_context *ctx,
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      struct gl_renderbuffer *rb,
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint n, GLint x, GLint y,
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      void *values)
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLubyte (*rgba)[4] = (GLubyte (*)[4])values;
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i, pixel;
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LPWORD lpw;
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    y = FLIP(y);
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    lpw = ((LPWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++) {
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pixel = lpw[i];
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Windows uses 5,5,5 for 16-bit */
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][RCOMP] = (pixel & 0x7c00) >> 7;
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][GCOMP] = (pixel & 0x03e0) >> 2;
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][BCOMP] = (pixel & 0x001f) << 3;
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][ACOMP] = 255;
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read an array of color pixels. */
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_pixels_16(struct gl_context *ctx,
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct gl_renderbuffer *rb,
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLuint n, const GLint x[], const GLint y[],
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				void *values)
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLubyte (*rgba)[4] = (GLubyte (*)[4])values;
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint i, pixel;
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LPWORD lpw;
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i=0; i<n; i++) {
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLint y2 = FLIP(y[i]);
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	lpw = ((LPWORD)(pwfb->pbPixels + pwfb->ScanWidth * y2)) + x[i];
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pixel = *lpw;
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Windows uses 5,5,5 for 16-bit */
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][RCOMP] = (pixel & 0x7c00) >> 7;
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][GCOMP] = (pixel & 0x03e0) >> 2;
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][BCOMP] = (pixel & 0x001f) << 3;
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rgba[i][ACOMP] = 255;
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*****                   BUFFER Functions                         *****/
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_delete_renderbuffer(ctx, rb);
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is called by Mesa whenever it determines that the window size
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * has changed.  Do whatever's needed to cope with that.
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_renderbuffer_storage(struct gl_context *ctx,
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   struct gl_renderbuffer *rb,
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLenum internalFormat,
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLuint width,
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLuint height)
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    rb->Width = width;
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    rb->Height = height;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return GL_TRUE;
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by ctx->Driver.ResizeBuffers()
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Resize the front/back colorbuffers to match the latest window size.
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_resize_buffers(struct gl_context *ctx, struct gl_framebuffer *buffer,
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLuint width, GLuint height)
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_framebuffer(buffer);
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (pwfb->Base.Width != width || pwfb->Base.Height != height) {
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Realloc back buffer */
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->Visual.doubleBufferMode == 1) {
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    wmDeleteBackingStore(pwfb);
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    wmCreateBackingStore(pwfb, width, height);
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_resize_framebuffer(ctx, buffer, width, height);
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glViewport.
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a good time for us to poll the current window size and adjust
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * our renderbuffers to match the current window size.
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Remember, we have no opportunity to respond to conventional
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * resize events since the driver has no event loop.
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Thus, we poll.
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MakeCurrent also ends up making a call here, so that ensures
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we get the viewport set correctly, even if the app does not call
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glViewport and relies on the defaults.
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void wmesa_viewport(struct gl_context *ctx,
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLint x, GLint y,
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLsizei width, GLsizei height)
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLuint new_width, new_height;
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    wmesa_get_buffer_size(ctx->WinSysDrawBuffer, &new_width, &new_height);
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /**
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * Resize buffers if the window size changed.
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     */
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    wmesa_resize_buffers(ctx, ctx->WinSysDrawBuffer, new_width, new_height);
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ctx->NewState |= _NEW_BUFFERS;  /* to update scissor / window bounds */
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called when the driver should update it's state, based on the new_state
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * flags.
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void wmesa_update_state(struct gl_context *ctx, GLuint new_state)
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _swrast_InvalidateState(ctx, new_state);
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _swsetup_InvalidateState(ctx, new_state);
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _vbo_InvalidateState(ctx, new_state);
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _tnl_InvalidateState(ctx, new_state);
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* TODO - This code is not complete yet because I
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * don't know what to do for all state updates.
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     */
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (new_state & _NEW_BUFFERS) {
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*****                   WMESA Functions                          *****/
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgWMesaContext WMesaCreateContext(HDC hDC,
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				HPALETTE* Pal,
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLboolean rgb_flag,
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLboolean db_flag,
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLboolean alpha_flag)
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaContext c;
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct dd_function_table functions;
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GLint red_bits, green_bits, blue_bits, alpha_bits;
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct gl_context *ctx;
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct gl_config *visual;
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    (void) Pal;
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Indexed mode not supported */
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!rgb_flag)
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return NULL;
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Allocate wmesa context */
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    c = CALLOC_STRUCT(wmesa_context);
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!c)
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return NULL;
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* I do not understand this contributed code */
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Support memory and device contexts */
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if(WindowFromDC(hDC) != NULL) {
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	c->hDC = GetDC(WindowFromDC(hDC)); /* huh ???? */
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    else {
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	c->hDC = hDC;
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    c->hDC = hDC;
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Get data for visual */
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Dealing with this is actually a bit of overkill because Mesa will end
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * up treating all color component size requests less than 8 by using
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * a single byte per channel.  In addition, the interface to the span
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * routines passes colors as an entire byte per channel anyway, so there
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * is nothing to be saved by telling the visual to be 16 bits if the device
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * is 16 bits.  That is, Mesa is going to compute colors down to 8 bits per
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * channel anyway.
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * But we go through the motions here anyway.
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     */
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    switch (GetDeviceCaps(c->hDC, BITSPIXEL)) {
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case 16:
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	red_bits = green_bits = blue_bits = 5;
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alpha_bits = 0;
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	break;
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    default:
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	red_bits = green_bits = blue_bits = 8;
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alpha_bits = 8;
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	break;
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Create visual based on flags */
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    visual = _mesa_create_visual(db_flag,    /* db_flag */
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GL_FALSE,   /* stereo */
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 red_bits, green_bits, blue_bits, /* color RGB */
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 alpha_flag ? alpha_bits : 0, /* color A */
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 DEFAULT_SOFTWARE_DEPTH_BITS, /* depth_bits */
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 8,          /* stencil_bits */
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 16,16,16,   /* accum RGB */
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 alpha_flag ? 16 : 0, /* accum A */
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 1);         /* num samples */
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!visual) {
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(c);
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return NULL;
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Set up driver functions */
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_init_driver_functions(&functions);
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    functions.GetString = wmesa_get_string;
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    functions.UpdateState = wmesa_update_state;
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    functions.GetBufferSize = wmesa_get_buffer_size;
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    functions.Flush = wmesa_flush;
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    functions.Clear = clear;
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    functions.ResizeBuffers = wmesa_resize_buffers;
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    functions.Viewport = wmesa_viewport;
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* initialize the Mesa context data */
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ctx = &c->gl_ctx;
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_initialize_context(ctx, API_OPENGL, visual,
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             NULL, &functions, (void *)c);
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* visual no longer needed - it was copied by _mesa_initialize_context() */
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_destroy_visual(visual);
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_enable_sw_extensions(ctx);
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_enable_1_3_extensions(ctx);
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_enable_1_4_extensions(ctx);
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_enable_1_5_extensions(ctx);
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_enable_2_0_extensions(ctx);
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_enable_2_1_extensions(ctx);
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_meta_init(ctx);
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Initialize the software rasterizer and helper modules. */
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!_swrast_CreateContext(ctx) ||
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        !_vbo_CreateContext(ctx) ||
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        !_tnl_CreateContext(ctx) ||
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	!_swsetup_CreateContext(ctx)) {
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_mesa_free_context_data(ctx);
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(c);
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return NULL;
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _swsetup_Wakeup(ctx);
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    TNL_CONTEXT(ctx)->Driver.RunPipeline = _tnl_run_pipeline;
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return c;
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid WMesaDestroyContext( WMesaContext pwc )
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct gl_context *ctx = &pwc->gl_ctx;
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb;
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GET_CURRENT_CONTEXT(cur_ctx);
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (cur_ctx == ctx) {
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        /* unbind current if deleting current context */
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        WMesaMakeCurrent(NULL, NULL);
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* clean up frame buffer resources */
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pwfb = wmesa_lookup_framebuffer(pwc->hDC);
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (pwfb) {
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->Visual.doubleBufferMode == 1)
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    wmDeleteBackingStore(pwfb);
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	wmesa_free_framebuffer(pwc->hDC);
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Release for device, not memory contexts */
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (WindowFromDC(pwc->hDC) != NULL)
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    {
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ReleaseDC(WindowFromDC(pwc->hDC), pwc->hDC);
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DeleteObject(pwc->clearPen);
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DeleteObject(pwc->clearBrush);
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_meta_free(ctx);
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _swsetup_DestroyContext(ctx);
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _tnl_DestroyContext(ctx);
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _vbo_DestroyContext(ctx);
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _swrast_DestroyContext(ctx);
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_free_context_data(ctx);
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    free(pwc);
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new color renderbuffer.
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_renderbuffer *
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_new_renderbuffer(void)
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct gl_renderbuffer *rb = CALLOC_STRUCT(gl_renderbuffer);
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!rb)
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return NULL;
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _mesa_init_renderbuffer(rb, (GLuint)0);
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    rb->_BaseFormat = GL_RGBA;
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    rb->InternalFormat = GL_RGBA;
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    rb->Delete = wmesa_delete_renderbuffer;
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    rb->AllocStorage = wmesa_renderbuffer_storage;
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return rb;
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid WMesaMakeCurrent(WMesaContext c, HDC hdc)
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb;
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    {
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        /* return if already current */
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        GET_CURRENT_CONTEXT(ctx);
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        WMesaContext pwc = wmesa_context(ctx);
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        if (pwc && c == pwc && pwc->hDC == hdc)
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return;
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pwfb = wmesa_lookup_framebuffer(hdc);
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Lazy creation of framebuffers */
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (c && !pwfb && hdc) {
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        struct gl_renderbuffer *rb;
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        struct gl_config *visual = &c->gl_ctx.Visual;
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        GLuint width, height;
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        get_window_size(hdc, &width, &height);
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	c->clearPen = CreatePen(PS_SOLID, 1, 0);
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	c->clearBrush = CreateSolidBrush(0);
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        pwfb = wmesa_new_framebuffer(hdc, visual);
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Create back buffer if double buffered */
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (visual->doubleBufferMode == 1) {
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    wmCreateBackingStore(pwfb, width, height);
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        /* make render buffers */
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        if (visual->doubleBufferMode == 1) {
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            rb = wmesa_new_renderbuffer();
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_add_renderbuffer(&pwfb->Base, BUFFER_BACK_LEFT, rb);
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        rb = wmesa_new_renderbuffer();
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        _mesa_add_renderbuffer(&pwfb->Base, BUFFER_FRONT_LEFT, rb);
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Let Mesa own the Depth, Stencil, and Accum buffers */
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        _swrast_add_soft_renderbuffers(&pwfb->Base,
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       GL_FALSE, /* color */
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       visual->depthBits > 0,
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       visual->stencilBits > 0,
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       visual->accumRedBits > 0,
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       visual->alphaBits >0,
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       GL_FALSE);
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (c && pwfb)
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_mesa_make_current(&c->gl_ctx, &pwfb->Base, &pwfb->Base);
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    else
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        _mesa_make_current(NULL, NULL, NULL);
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid WMesaSwapBuffers( HDC hdc )
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GET_CURRENT_CONTEXT(ctx);
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaContext pwc = wmesa_context(ctx);
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    WMesaFramebuffer pwfb = wmesa_lookup_framebuffer(hdc);
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!pwfb) {
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        _mesa_problem(NULL, "wmesa: swapbuffers on unknown hdc");
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return;
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* If we're swapping the buffer associated with the current context
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * we have to flush any pending rendering commands first.
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     */
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (pwc->hDC == hdc) {
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_mesa_notifySwapBuffers(ctx);
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height,
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       pwfb->dib_hDC, 0, 0, SRCCOPY);
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    else {
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        /* XXX for now only allow swapping current window */
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        _mesa_problem(NULL, "wmesa: can't swap non-current window");
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid WMesaShareLists(WMesaContext ctx_to_share, WMesaContext ctx)
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_mesa_share_state(&ctx->gl_ctx, &ctx_to_share->gl_ctx);
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1265