1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.1
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/format_pack.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_context.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_span.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_stencil.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_zoom.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute the bounds of the region resulting from zooming a pixel span.
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The resulting region will be entirely inside the window/scissor bounds
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * so no additional clipping is needed.
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param imageX, imageY  position of the mage being drawn (gl WindowPos)
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param spanX, spanY  position of span being drawing
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width  number of pixels in span
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param x0, x1  returned X bounds of zoomed region [x0, x1)
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param y0, y1  returned Y bounds of zoomed region [y0, y1)
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if any zoomed pixels visible, GL_FALSE if totally clipped
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompute_zoomed_bounds(struct gl_context *ctx, GLint imageX, GLint imageY,
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GLint spanX, GLint spanY, GLint width,
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GLint *x0, GLint *x1, GLint *y0, GLint *y1)
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_framebuffer *fb = ctx->DrawBuffer;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint c0, c1, r0, r1;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(spanX >= imageX);
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(spanY >= imageY);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Compute destination columns: [c0, c1)
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c0 = imageX + (GLint) ((spanX - imageX) * ctx->Pixel.ZoomX);
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c1 = imageX + (GLint) ((spanX + width - imageX) * ctx->Pixel.ZoomX);
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c1 < c0) {
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* swap */
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint tmp = c1;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c1 = c0;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c0 = tmp;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c0 = CLAMP(c0, fb->_Xmin, fb->_Xmax);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c1 = CLAMP(c1, fb->_Xmin, fb->_Xmax);
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c0 == c1) {
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE; /* no width */
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Compute destination rows: [r0, r1)
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r0 = imageY + (GLint) ((spanY - imageY) * ctx->Pixel.ZoomY);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r1 = imageY + (GLint) ((spanY + 1 - imageY) * ctx->Pixel.ZoomY);
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (r1 < r0) {
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* swap */
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint tmp = r1;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r1 = r0;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r0 = tmp;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r0 = CLAMP(r0, fb->_Ymin, fb->_Ymax);
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r1 = CLAMP(r1, fb->_Ymin, fb->_Ymax);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (r0 == r1) {
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE; /* no height */
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *x0 = c0;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *x1 = c1;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *y0 = r0;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *y1 = r1;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert a zoomed x image coordinate back to an unzoomed x coord.
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 'zx' is screen position of a pixel in the zoomed image, who's left edge
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is at 'imageX'.
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * return corresponding x coord in the original, unzoomed image.
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This can use this for unzooming X or Y values.
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLint
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunzoom_x(GLfloat zoomX, GLint imageX, GLint zx)
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zx = imageX + (x - imageX) * zoomX;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zx - imageX = (x - imageX) * zoomX;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (zx - imageX) / zoomX = x - imageX;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   */
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint x;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (zoomX < 0.0)
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zx++;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x = imageX + (GLint) ((zx - imageX) / zoomX);
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return x;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper function called from _swrast_write_zoomed_rgba/rgb/
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * index/depth_span().
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgzoom_span( struct gl_context *ctx, GLint imgX, GLint imgY, const SWspan *span,
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           const GLvoid *src, GLenum format )
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SWcontext *swrast = SWRAST_CONTEXT(ctx);
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SWspan zoomed;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint x0, x1, y0, y1;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint zoomedWidth;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!compute_zoomed_bounds(ctx, imgX, imgY, span->x, span->y, span->end,
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              &x0, &x1, &y0, &y1)) {
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;  /* totally clipped */
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!swrast->ZoomedArrays) {
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* allocate on demand */
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      swrast->ZoomedArrays = (SWspanarrays *) CALLOC(sizeof(SWspanarrays));
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!swrast->ZoomedArrays)
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomedWidth = x1 - x0;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(zoomedWidth > 0);
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(zoomedWidth <= SWRAST_MAX_WIDTH);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* no pixel arrays! must be horizontal spans. */
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT((span->arrayMask & SPAN_XY) == 0);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(span->primitive == GL_BITMAP);
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT_SPAN(zoomed, GL_BITMAP);
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomed.x = x0;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomed.end = zoomedWidth;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomed.array = swrast->ZoomedArrays;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomed.array->ChanType = span->array->ChanType;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (zoomed.array->ChanType == GL_UNSIGNED_BYTE)
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.array->rgba = (GLchan (*)[4]) zoomed.array->rgba8;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (zoomed.array->ChanType == GL_UNSIGNED_SHORT)
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.array->rgba = (GLchan (*)[4]) zoomed.array->rgba16;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.array->rgba = (GLchan (*)[4]) zoomed.array->attribs[FRAG_ATTRIB_COL0];
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   COPY_4V(zoomed.attrStart[FRAG_ATTRIB_WPOS], span->attrStart[FRAG_ATTRIB_WPOS]);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   COPY_4V(zoomed.attrStepX[FRAG_ATTRIB_WPOS], span->attrStepX[FRAG_ATTRIB_WPOS]);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   COPY_4V(zoomed.attrStepY[FRAG_ATTRIB_WPOS], span->attrStepY[FRAG_ATTRIB_WPOS]);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomed.attrStart[FRAG_ATTRIB_FOGC][0] = span->attrStart[FRAG_ATTRIB_FOGC][0];
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomed.attrStepX[FRAG_ATTRIB_FOGC][0] = span->attrStepX[FRAG_ATTRIB_FOGC][0];
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomed.attrStepY[FRAG_ATTRIB_FOGC][0] = span->attrStepY[FRAG_ATTRIB_FOGC][0];
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (format == GL_RGBA || format == GL_RGB) {
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* copy Z info */
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.z = span->z;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.zStep = span->zStep;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* we'll generate an array of colorss */
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.interpMask = span->interpMask & ~SPAN_RGBA;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.arrayMask |= SPAN_RGBA;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.arrayAttribs |= FRAG_BIT_COL0;  /* we'll produce these values */
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(span->arrayMask & SPAN_RGBA);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (format == GL_DEPTH_COMPONENT) {
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Copy color info */
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.red = span->red;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.green = span->green;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.blue = span->blue;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.alpha = span->alpha;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.redStep = span->redStep;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.greenStep = span->greenStep;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.blueStep = span->blueStep;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.alphaStep = span->alphaStep;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* we'll generate an array of depth values */
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.interpMask = span->interpMask & ~SPAN_Z;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomed.arrayMask |= SPAN_Z;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(span->arrayMask & SPAN_Z);
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(ctx, "Bad format in zoom_span");
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* zoom the span horizontally */
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (format == GL_RGBA) {
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (zoomed.array->ChanType == GL_UNSIGNED_BYTE) {
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) src;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint i;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < zoomedWidth; i++) {
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j >= 0);
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j < (GLint) span->end);
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            COPY_4UBV(zoomed.array->rgba8[i], rgba[j]);
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (zoomed.array->ChanType == GL_UNSIGNED_SHORT) {
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLushort (*rgba)[4] = (const GLushort (*)[4]) src;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint i;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < zoomedWidth; i++) {
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j >= 0);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j < (GLint) span->end);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            COPY_4V(zoomed.array->rgba16[i], rgba[j]);
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLfloat (*rgba)[4] = (const GLfloat (*)[4]) src;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint i;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < zoomedWidth; i++) {
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j >= 0);
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j < span->end);
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            COPY_4V(zoomed.array->attribs[FRAG_ATTRIB_COL0][i], rgba[j]);
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (format == GL_RGB) {
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (zoomed.array->ChanType == GL_UNSIGNED_BYTE) {
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) src;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint i;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < zoomedWidth; i++) {
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j >= 0);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j < (GLint) span->end);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->rgba8[i][0] = rgb[j][0];
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->rgba8[i][1] = rgb[j][1];
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->rgba8[i][2] = rgb[j][2];
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->rgba8[i][3] = 0xff;
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (zoomed.array->ChanType == GL_UNSIGNED_SHORT) {
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLushort (*rgb)[3] = (const GLushort (*)[3]) src;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint i;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < zoomedWidth; i++) {
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j >= 0);
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j < (GLint) span->end);
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->rgba16[i][0] = rgb[j][0];
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->rgba16[i][1] = rgb[j][1];
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->rgba16[i][2] = rgb[j][2];
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->rgba16[i][3] = 0xffff;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLfloat (*rgb)[3] = (const GLfloat (*)[3]) src;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint i;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < zoomedWidth; i++) {
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j >= 0);
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ASSERT(j < span->end);
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->attribs[FRAG_ATTRIB_COL0][i][0] = rgb[j][0];
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->attribs[FRAG_ATTRIB_COL0][i][1] = rgb[j][1];
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->attribs[FRAG_ATTRIB_COL0][i][2] = rgb[j][2];
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            zoomed.array->attribs[FRAG_ATTRIB_COL0][i][3] = 1.0F;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (format == GL_DEPTH_COMPONENT) {
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *zValues = (const GLuint *) src;
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint i;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < zoomedWidth; i++) {
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ASSERT(j >= 0);
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ASSERT(j < (GLint) span->end);
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         zoomed.array->z[i] = zValues[j];
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Now, fall into the RGB path below */
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format = GL_RGBA;
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* write the span in rows [r0, r1) */
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (format == GL_RGBA || format == GL_RGB) {
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Writing the span may modify the colors, so make a backup now if we're
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * going to call _swrast_write_zoomed_span() more than once.
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Also, clipping may change the span end value, so store it as well.
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLint end = zoomed.end; /* save */
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *rgbaSave;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLint pixelSize =
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (zoomed.array->ChanType == GL_UNSIGNED_BYTE) ? 4 * sizeof(GLubyte) :
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ((zoomed.array->ChanType == GL_UNSIGNED_SHORT) ? 4 * sizeof(GLushort)
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          : 4 * sizeof(GLfloat));
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rgbaSave = malloc(zoomed.end * pixelSize);
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!rgbaSave) {
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (y1 - y0 > 1) {
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memcpy(rgbaSave, zoomed.array->rgba, zoomed.end * pixelSize);
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (zoomed.y = y0; zoomed.y < y1; zoomed.y++) {
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _swrast_write_rgba_span(ctx, &zoomed);
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         zoomed.end = end;  /* restore */
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (y1 - y0 > 1) {
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* restore the colors */
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            memcpy(zoomed.array->rgba, rgbaSave, zoomed.end * pixelSize);
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(rgbaSave);
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_write_zoomed_rgba_span(struct gl_context *ctx, GLint imgX, GLint imgY,
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               const SWspan *span, const GLvoid *rgba)
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoom_span(ctx, imgX, imgY, span, rgba, GL_RGBA);
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_write_zoomed_rgb_span(struct gl_context *ctx, GLint imgX, GLint imgY,
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              const SWspan *span, const GLvoid *rgb)
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoom_span(ctx, imgX, imgY, span, rgb, GL_RGB);
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_write_zoomed_depth_span(struct gl_context *ctx, GLint imgX, GLint imgY,
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                const SWspan *span)
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoom_span(ctx, imgX, imgY, span,
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             (const GLvoid *) span->array->z, GL_DEPTH_COMPONENT);
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Zoom/write stencil values.
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * No per-fragment operations are applied.
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_write_zoomed_stencil_span(struct gl_context *ctx, GLint imgX, GLint imgY,
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  GLint width, GLint spanX, GLint spanY,
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const GLubyte stencil[])
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte *zoomedVals;
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint x0, x1, y0, y1, y;
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i, zoomedWidth;
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!compute_zoomed_bounds(ctx, imgX, imgY, spanX, spanY, width,
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              &x0, &x1, &y0, &y1)) {
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;  /* totally clipped */
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomedWidth = x1 - x0;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(zoomedWidth > 0);
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(zoomedWidth <= SWRAST_MAX_WIDTH);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomedVals = (GLubyte *) malloc(zoomedWidth * sizeof(GLubyte));
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!zoomedVals)
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* zoom the span horizontally */
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < zoomedWidth; i++) {
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - spanX;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(j >= 0);
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(j < width);
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomedVals[i] = stencil[j];
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* write the zoomed spans */
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (y = y0; y < y1; y++) {
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _swrast_write_stencil_span(ctx, zoomedWidth, x0, y, zoomedVals);
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(zoomedVals);
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3983f79f50967bbf4fdaba7507a8d1526aa24eefd91scottmg@chromium.org// http://crbug.com/348397
3993f79f50967bbf4fdaba7507a8d1526aa24eefd91scottmg@chromium.org#ifdef _MSC_VER
4003f79f50967bbf4fdaba7507a8d1526aa24eefd91scottmg@chromium.org#pragma optimize("", off)
4013f79f50967bbf4fdaba7507a8d1526aa24eefd91scottmg@chromium.org#endif
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Zoom/write 32-bit Z values.
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * No per-fragment operations are applied.
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_write_zoomed_z_span(struct gl_context *ctx, GLint imgX, GLint imgY,
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLint width, GLint spanX, GLint spanY,
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const GLuint *zVals)
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_renderbuffer *rb =
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint *zoomedVals;
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint x0, x1, y0, y1, y;
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i, zoomedWidth;
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!compute_zoomed_bounds(ctx, imgX, imgY, spanX, spanY, width,
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              &x0, &x1, &y0, &y1)) {
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;  /* totally clipped */
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomedWidth = x1 - x0;
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(zoomedWidth > 0);
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(zoomedWidth <= SWRAST_MAX_WIDTH);
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   zoomedVals = (GLuint *) malloc(zoomedWidth * sizeof(GLuint));
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!zoomedVals)
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* zoom the span horizontally */
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < zoomedWidth; i++) {
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - spanX;
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(j >= 0);
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(j < width);
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zoomedVals[i] = zVals[j];
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* write the zoomed spans */
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (y = y0; y < y1; y++) {
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte *dst = _swrast_pixel_address(rb, x0, y);
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_pack_uint_z_row(rb->Format, zoomedWidth, zoomedVals, dst);
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(zoomedVals);
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4473f79f50967bbf4fdaba7507a8d1526aa24eefd91scottmg@chromium.org
4483f79f50967bbf4fdaba7507a8d1526aa24eefd91scottmg@chromium.org#ifdef _MSC_VER
4493f79f50967bbf4fdaba7507a8d1526aa24eefd91scottmg@chromium.org#pragma optimize("", off)
4503f79f50967bbf4fdaba7507a8d1526aa24eefd91scottmg@chromium.org#endif
451