⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xm_dd.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 3 页
字号:
         GLint j;         for (j=0;j<height;j++) {            bgr_t *ptr3 = PIXEL_ADDR3(xrb, x, y + j);            MEMSET(ptr3, r, 3 * width);         }      }      else {         /* non-gray clear color */         GLint i, j;         for (j = 0; j < height; j++) {            bgr_t *ptr3 = PIXEL_ADDR3(xrb, x, y + j);            for (i = 0; i < width; i++) {               ptr3->r = r;               ptr3->g = g;               ptr3->b = b;               ptr3++;            }         }      }   }}static voidclear_32bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,                   GLboolean all, GLint x, GLint y, GLint width, GLint height){   const XMesaContext xmesa = XMESA_CONTEXT(ctx);   register GLuint pixel = (GLuint) xmesa->clearpixel;   if (!xrb->ximage)      return;   if (xmesa->swapbytes) {      pixel = ((pixel >> 24) & 0x000000ff)            | ((pixel >> 8)  & 0x0000ff00)            | ((pixel << 8)  & 0x00ff0000)            | ((pixel << 24) & 0xff000000);   }   if (all) {      const GLuint n = xrb->Base.Width * xrb->Base.Height;      GLuint *ptr4 = (GLuint *) xrb->ximage->data;      if (pixel == 0) {         _mesa_memset(ptr4, pixel, 4 * n);      }      else {         GLuint i;         for (i = 0; i < n; i++)            ptr4[i] = pixel;      }   }   else {      GLint i, j;      for (j = 0; j < height; j++) {         GLuint *ptr4 = PIXEL_ADDR4(xrb, x, y + j);         for (i = 0; i < width; i++) {            ptr4[i] = pixel;         }      }   }}static voidclear_nbit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,                  GLboolean all, GLint x, GLint y, GLint width, GLint height){   const XMesaContext xmesa = XMESA_CONTEXT(ctx);   XMesaImage *img = xrb->ximage;   GLint i, j;   /* We can ignore 'all' here - x, y, width, height are always right */   (void) all;   /* TODO: optimize this */   y = YFLIP(xrb, y);   for (j = 0; j < height; j++) {      for (i = 0; i < width; i++) {         XMesaPutPixel(img, x+i, y-j, xmesa->clearpixel);      }   }}static voidclear_buffers( GLcontext *ctx, GLbitfield mask,               GLboolean all, GLint x, GLint y, GLint width, GLint height ){   if (ctx->DrawBuffer->Name == 0) {      /* this is a window system framebuffer */      const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask;      XMesaBuffer b = (XMesaBuffer) ctx->DrawBuffer;      /* we can't handle color or index masking */      if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) {         if (mask & BUFFER_BIT_FRONT_LEFT) {            /* clear front color buffer */            if (b->frontxrb == (struct xmesa_renderbuffer *)                ctx->DrawBuffer->Attachment[BUFFER_FRONT_LEFT].Renderbuffer) {               /* renderbuffer is not wrapped - great! */               b->frontxrb->clearFunc(ctx, b->frontxrb, all, x, y,                                      width, height);               mask &= ~BUFFER_BIT_FRONT_LEFT;            }            else {               /* we can't directly clear an alpha-wrapped color buffer */            }         }         if (mask & BUFFER_BIT_BACK_LEFT) {            /* clear back color buffer */            if (b->backxrb == (struct xmesa_renderbuffer *)                ctx->DrawBuffer->Attachment[BUFFER_BACK_LEFT].Renderbuffer) {               /* renderbuffer is not wrapped - great! */               b->backxrb->clearFunc(ctx, b->backxrb, all, x, y,                                     width, height);               mask &= ~BUFFER_BIT_BACK_LEFT;            }         }      }   }   if (mask)      _swrast_Clear( ctx, mask, all, x, y, width, height );}/** * Called by ctx->Driver.ResizeBuffers() * Resize the front/back colorbuffers to match the latest window size. */voidxmesa_resize_buffers(GLcontext *ctx, GLframebuffer *buffer,                     GLuint width, GLuint height){   /* We can do this cast because the first field in the XMesaBuffer    * struct is a GLframebuffer struct.  If this weren't true, we'd    * need a pointer from the GLframebuffer to the XMesaBuffer.    */   XMesaBuffer xmBuffer = (XMesaBuffer) buffer;   xmesa_alloc_back_buffer(xmBuffer, width, height);   _mesa_resize_framebuffer(ctx, buffer, width, height);}#ifndef XFree86Server/* XXX this was never tested in the Xserver environment *//** * This function implements glDrawPixels() with an XPutImage call when * drawing to the front buffer (X Window drawable). * The image format must be GL_BGRA to match the PF_8R8G8B pixel format. */static voidxmesa_DrawPixels_8R8G8B( GLcontext *ctx,                         GLint x, GLint y, GLsizei width, GLsizei height,                         GLenum format, GLenum type,                         const struct gl_pixelstore_attrib *unpack,                         const GLvoid *pixels ){   struct xmesa_renderbuffer *xrb      = (struct xmesa_renderbuffer *) ctx->DrawBuffer->_ColorDrawBuffers[0][0];   const XMesaContext xmesa = XMESA_CONTEXT(ctx);   const SWcontext *swrast = SWRAST_CONTEXT( ctx );   XMesaDisplay *dpy = xmesa->xm_visual->display;   XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);   const XMesaGC gc = xmbuf->gc;   ASSERT(dpy);   ASSERT(gc);   ASSERT(xmesa->xm_visual->dithered_pf == PF_8R8G8B);   ASSERT(xmesa->xm_visual->undithered_pf == PF_8R8G8B);   if (swrast->NewState)      _swrast_validate_derived( ctx );   if (xrb->pixmap &&       format == GL_BGRA &&       type == GL_UNSIGNED_BYTE &&       (swrast->_RasterMask & ~CLIP_BIT) == 0 && /* no blend, z-test, etc */       ctx->_ImageTransferState == 0 &&  /* no color tables, scale/bias, etc */       ctx->Pixel.ZoomX == 1.0 &&        /* no zooming */       ctx->Pixel.ZoomY == 1.0) {      int dstX = x;      int dstY = y;      int w = width;      int h = height;      struct gl_pixelstore_attrib clippedUnpack = *unpack;      if (unpack->BufferObj->Name) {         /* unpack from PBO */         GLubyte *buf;         if (!_mesa_validate_pbo_access(2, unpack, width, height, 1,                                        format, type, pixels)) {            _mesa_error(ctx, GL_INVALID_OPERATION,                        "glDrawPixels(invalid PBO access)");            return;         }         buf = (GLubyte *) ctx->Driver.MapBuffer(ctx,                                                 GL_PIXEL_UNPACK_BUFFER_EXT,                                                 GL_READ_ONLY_ARB,                                                 unpack->BufferObj);         if (!buf) {            /* buffer is already mapped - that's an error */            _mesa_error(ctx, GL_INVALID_OPERATION,                        "glDrawPixels(PBO is mapped)");            return;         }         pixels = ADD_POINTERS(buf, pixels);      }      if (_mesa_clip_drawpixels(ctx, &dstX, &dstY, &w, &h, &clippedUnpack)) {         /* This is a little tricky since all coordinates up to now have          * been in the OpenGL bottom-to-top orientation.  X is top-to-bottom          * so we have to carefully compute the Y coordinates/addresses here.          */         int srcX = clippedUnpack.SkipPixels;         int srcY = clippedUnpack.SkipRows;         int rowLength = clippedUnpack.RowLength;         XMesaImage ximage;         MEMSET(&ximage, 0, sizeof(XMesaImage));         ximage.width = width;         ximage.height = height;         ximage.format = ZPixmap;         ximage.data = (char *) pixels            + ((srcY + h - 1) * rowLength + srcX) * 4;         ximage.byte_order = LSBFirst;         ximage.bitmap_unit = 32;         ximage.bitmap_bit_order = LSBFirst;         ximage.bitmap_pad = 32;         ximage.depth = 24;         ximage.bytes_per_line = -rowLength * 4; /* negative to flip image */         ximage.bits_per_pixel = 32;         /* it seems we don't need to set the ximage.red/green/blue_mask fields */         /* flip Y axis for dest position */         dstY = YFLIP(xrb, dstY) - h + 1;         XPutImage(dpy, xrb->pixmap, gc, &ximage, 0, 0, dstX, dstY, w, h);      }      if (unpack->BufferObj->Name) {         ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,                                 unpack->BufferObj);      }   }   else {      /* software fallback */      _swrast_DrawPixels(ctx, x, y, width, height,                         format, type, unpack, pixels);   }}/** * This function implements glDrawPixels() with an XPutImage call when * drawing to the front buffer (X Window drawable).  The image format * must be GL_RGB and image type must be GL_UNSIGNED_SHORT_5_6_5 to * match the PF_5R6G5B pixel format. */static voidxmesa_DrawPixels_5R6G5B( GLcontext *ctx,                         GLint x, GLint y, GLsizei width, GLsizei height,                         GLenum format, GLenum type,                         const struct gl_pixelstore_attrib *unpack,                         const GLvoid *pixels ){   struct xmesa_renderbuffer *xrb      = (struct xmesa_renderbuffer *) ctx->DrawBuffer->_ColorDrawBuffers[0][0];   const XMesaContext xmesa = XMESA_CONTEXT(ctx);   const SWcontext *swrast = SWRAST_CONTEXT( ctx );   XMesaDisplay *dpy = xmesa->xm_visual->display;   XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);   const XMesaGC gc = xmbuf->gc;   ASSERT(dpy);   ASSERT(gc);   ASSERT(xmesa->xm_visual->undithered_pf == PF_5R6G5B);   if (swrast->NewState)      _swrast_validate_derived( ctx );   if (xrb->pixmap &&       format == GL_RGB &&       type == GL_UNSIGNED_SHORT_5_6_5 &&       !ctx->Color.DitherFlag &&  /* no dithering */       (swrast->_RasterMask & ~CLIP_BIT) == 0 && /* no blend, z-test, etc */       ctx->_ImageTransferState == 0 &&  /* no color tables, scale/bias, etc */       ctx->Pixel.ZoomX == 1.0 &&        /* no zooming */       ctx->Pixel.ZoomY == 1.0) {      int dstX = x;      int dstY = y;      int w = width;      int h = height;      struct gl_pixelstore_attrib clippedUnpack = *unpack;      if (unpack->BufferObj->Name) {         /* unpack from PBO */         GLubyte *buf;         if (!_mesa_validate_pbo_access(2, unpack, width, height, 1,                                        format, type, pixels)) {            _mesa_error(ctx, GL_INVALID_OPERATION,                        "glDrawPixels(invalid PBO access)");            return;         }         buf = (GLubyte *) ctx->Driver.MapBuffer(ctx,                                                 GL_PIXEL_UNPACK_BUFFER_EXT,                                                 GL_READ_ONLY_ARB,                                                 unpack->BufferObj);         if (!buf) {            /* buffer is already mapped - that's an error */            _mesa_error(ctx, GL_INVALID_OPERATION,                        "glDrawPixels(PBO is mapped)");            return;         }         pixels = ADD_POINTERS(buf, pixels);      }      if (_mesa_clip_drawpixels(ctx, &dstX, &dstY, &w, &h, &clippedUnpack)) {         /* This is a little tricky since all coordinates up to now have          * been in the OpenGL bottom-to-top orientation.  X is top-to-bottom          * so we have to carefully compute the Y coordinates/addresses here.          */         int srcX = clippedUnpack.SkipPixels;         int srcY = clippedUnpack.SkipRows;         int rowLength = clippedUnpack.RowLength;         XMesaImage ximage;         MEMSET(&ximage, 0, sizeof(XMesaImage));         ximage.width = width;         ximage.height = height;         ximage.format = ZPixmap;         ximage.data = (char *) pixels            + ((srcY + h - 1) * rowLength + srcX) * 2;         ximage.byte_order = LSBFirst;         ximage.bitmap_unit = 16;         ximage.bitmap_bit_order = LSBFirst;         ximage.bitmap_pad = 16;         ximage.depth = 16;         ximage.bytes_per_line = -rowLength * 2; /* negative to flip image */         ximage.bits_per_pixel = 16;         /* it seems we don't need to set the ximage.red/green/blue_mask fields */         /* flip Y axis for dest position */         dstY = YFLIP(xrb, dstY) - h + 1;         XPutImage(dpy, xrb->pixmap, gc, &ximage, 0, 0, dstX, dstY, w, h);      }      if (unpack->BufferObj->Name) {         ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,                                 unpack->BufferObj);      }   }   else {      /* software fallback */      _swrast_DrawPixels(ctx, x, y, width, height,                         format, type, unpack, pixels);   }}/** * Implement glCopyPixels for the front color buffer (or back buffer Pixmap) * for the color buffer.  Don't support zooming, pixel transfer, etc. * We do support copying from one window to another, ala glXMakeCurrentRead. */static voidxmesa_CopyPixels( GLcontext *ctx,                  GLint srcx, GLint srcy, GLsizei width, GLsizei height,                  GLint destx, GLint desty, GLenum type ){   const XMesaContext xmesa = XMESA_CONTEXT(ctx);   const SWcontext *swrast = SWRAST_CONTEXT( ctx );   XMesaDisplay *dpy = xmesa->xm_visual->display;   const XMesaGC gc = ((XMesaBuffer) ctx->DrawBuffer)->gc;   struct xmesa_renderbuffer *srcXrb = (struct xmesa_renderbuffer *)      ctx->ReadBuffer->_ColorReadBuffer;   struct xmesa_renderbuffer *dstXrb = (struct xmesa_renderbuffer *)      ctx->DrawBuffer->_ColorDrawBuffers[0][0];   ASSERT(dpy);   ASSERT(gc);   if (swrast->NewState)      _swrast_validate_derived( ctx );   if (ctx->Color.DrawBuffer[0] == GL_FRONT &&       ctx->Pixel.ReadBuffer == GL_FRONT &&       srcXrb->pixmap &&       dstXrb->pixmap &&       type == GL_COLOR &&       (swrast->_RasterMask & ~CLIP_BIT) == 0 && /* no blend, z-test, etc */       ctx->_ImageTransferState == 0 &&  /* no color tables, scale/bias, etc */       ctx->Pixel.ZoomX == 1.0 &&        /* no zooming */       ctx->Pixel.ZoomY == 1.0) {      /* Note: we don't do any special clipping work here.  We could,       * but X will do it for us.       */      srcy = YFLIP(srcXrb, srcy) - height + 1;      desty = YFLIP(dstXrb, desty) - height + 1;      XCopyArea(dpy, srcXrb->pixmap, dstXrb->pixmap, gc,                srcx, srcy, width, height, destx, desty);   }   else {      _swrast_CopyPixels(ctx, srcx, srcy, width, height, destx, desty, type );   }}#endif /* XFree86Server *//* * Every driver should implement a GetString function in order to * return a meaningful GL_RENDERER string. */static const GLubyte *get_string( GLcontext *ctx, GLenum name ){   (void) ctx;   switch (name) {      case GL_RENDERER:#ifdef XFree86Server         return (const GLubyte *) "Mesa GLX Indirect";#else         return (const GLubyte *) "Mesa X11";#endif      case GL_VENDOR:#ifdef XFree86Server         return (const GLubyte *) "Mesa project: www.mesa3d.org";#else         return NULL;#endif      default:         return NULL;   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -