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