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

📄 fxdd.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 5 页
字号:
   struct gl_pixelstore_attrib scissoredUnpack;   if (ctx->Pixel.ZoomX != 1.0F ||       ctx->Pixel.ZoomY != 1.0F ||       (ctx->_ImageTransferState & (IMAGE_SCALE_BIAS_BIT|				    IMAGE_MAP_COLOR_BIT)) ||       (swrast->_RasterMask & (ALPHATEST_BIT |			      /*BLEND_BIT |*/   /* blending ok, through pixpipe */			      DEPTH_BIT |       /* could be done with RGB:DEPTH */			      FOG_BIT |         /* could be done with RGB:DEPTH */			      LOGIC_OP_BIT |			      /*CLIP_BIT |*/    /* clipping ok, below */			      STENCIL_BIT |			      MASKING_BIT |			      MULTI_DRAW_BIT |			      OCCLUSION_BIT |   /* nope! at least not yet */			      TEXTURE_BIT |			      FRAGPROG_BIT)) ||       fxMesa->fallback)   {      _swrast_DrawPixels( ctx, x, y, width, height, format, type,			  unpack, pixels );      return;   }   /* make sure the pixelpipe is configured correctly */   fxSetupFXUnits(ctx);   /* FIXME! _RasterMask & CLIP_BIT gets set if we're out of Viewport, also! */   if (ctx->Scissor.Enabled) {      /* This is a bit tricky, but by carefully adjusting the px, py,       * width, height, skipPixels and skipRows values we can do       * scissoring without special code in the rendering loop.       */      /* we'll construct a new pixelstore struct */      finalUnpack = &scissoredUnpack;      scissoredUnpack = *unpack;      if (scissoredUnpack.RowLength == 0)	 scissoredUnpack.RowLength = width;      /* clip left */      if (x < ctx->Scissor.X) {	 scissoredUnpack.SkipPixels += (ctx->Scissor.X - x);	 width -= (ctx->Scissor.X - x);	 x = ctx->Scissor.X;      }      /* clip right */      if (x + width >= ctx->Scissor.X + ctx->Scissor.Width) {	 width -= (x + width - (ctx->Scissor.X + ctx->Scissor.Width));      }      /* clip bottom */      if (y < ctx->Scissor.Y) {	 scissoredUnpack.SkipRows += (ctx->Scissor.Y - y);	 height -= (ctx->Scissor.Y - y);	 y = ctx->Scissor.Y;      }      /* clip top */      if (y + height >= ctx->Scissor.Y + ctx->Scissor.Height) {	 height -= (y + height - (ctx->Scissor.Y + ctx->Scissor.Height));      }      if (width <= 0 || height <= 0)	 return;   }   else {      finalUnpack = unpack;   }   info.size = sizeof(info);   if (!grLfbLock(GR_LFB_WRITE_ONLY,                  fxMesa->currentFB,                  GR_LFBWRITEMODE_565,                  GR_ORIGIN_LOWER_LEFT, FXTRUE, &info)) {      _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels);      return;   }   {      const GLint winX = 0;      const GLint winY = 0;      const GLint dstStride = info.strideInBytes / 2;	/* stride in GLushorts */      GLushort *dst = (GLushort *) info.lfbPtr + (winY + y) * dstStride + (winX + x);      if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) {         GLint row;         for (row = 0; row < height; row++) {	     GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack,                                  pixels, width, height, format, type, row, 0);	     GLint col;	     for (col = 0; col < width; col++) {                 dst[col] = TDFXPACKCOLOR565(src[2], src[1], src[0]);                 src += 4;             }             dst += dstStride;         }      }      else if (format == GL_RGB && type == GL_UNSIGNED_BYTE) {         GLint row;         for (row = 0; row < height; row++) {	     GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack,                                  pixels, width, height, format, type, row, 0);	     GLint col;	     for (col = 0; col < width; col++) {                 dst[col] = TDFXPACKCOLOR565(src[2], src[1], src[0]);                 src += 3;             }             dst += dstStride;         }      }      else {         grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB);         _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels);         return;      }   }   grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB);}static voidfxDDDrawPixels565_rev (GLcontext * ctx, GLint x, GLint y,                   GLsizei width, GLsizei height,                   GLenum format, GLenum type,                   const struct gl_pixelstore_attrib *unpack,                   const GLvoid * pixels){   fxMesaContext fxMesa = FX_CONTEXT(ctx);   SWcontext *swrast = SWRAST_CONTEXT(ctx);   GrLfbInfo_t info;   const struct gl_pixelstore_attrib *finalUnpack;   struct gl_pixelstore_attrib scissoredUnpack;   if (ctx->Pixel.ZoomX != 1.0F ||       ctx->Pixel.ZoomY != 1.0F ||       (ctx->_ImageTransferState & (IMAGE_SCALE_BIAS_BIT|				    IMAGE_MAP_COLOR_BIT)) ||       (swrast->_RasterMask & (ALPHATEST_BIT |			      /*BLEND_BIT |*/   /* blending ok, through pixpipe */			      DEPTH_BIT |       /* could be done with RGB:DEPTH */			      FOG_BIT |         /* could be done with RGB:DEPTH */			      LOGIC_OP_BIT |			      /*CLIP_BIT |*/    /* clipping ok, below */			      STENCIL_BIT |			      MASKING_BIT |			      MULTI_DRAW_BIT |			      OCCLUSION_BIT |   /* nope! at least not yet */			      TEXTURE_BIT |			      FRAGPROG_BIT)) ||       fxMesa->fallback)   {      _swrast_DrawPixels( ctx, x, y, width, height, format, type,			  unpack, pixels );      return;   }   /* make sure the pixelpipe is configured correctly */   fxSetupFXUnits(ctx);   /* FIXME! _RasterMask & CLIP_BIT gets set if we're out of Viewport, also! */   if (ctx->Scissor.Enabled) {      /* This is a bit tricky, but by carefully adjusting the px, py,       * width, height, skipPixels and skipRows values we can do       * scissoring without special code in the rendering loop.       */      /* we'll construct a new pixelstore struct */      finalUnpack = &scissoredUnpack;      scissoredUnpack = *unpack;      if (scissoredUnpack.RowLength == 0)	 scissoredUnpack.RowLength = width;      /* clip left */      if (x < ctx->Scissor.X) {	 scissoredUnpack.SkipPixels += (ctx->Scissor.X - x);	 width -= (ctx->Scissor.X - x);	 x = ctx->Scissor.X;      }      /* clip right */      if (x + width >= ctx->Scissor.X + ctx->Scissor.Width) {	 width -= (x + width - (ctx->Scissor.X + ctx->Scissor.Width));      }      /* clip bottom */      if (y < ctx->Scissor.Y) {	 scissoredUnpack.SkipRows += (ctx->Scissor.Y - y);	 height -= (ctx->Scissor.Y - y);	 y = ctx->Scissor.Y;      }      /* clip top */      if (y + height >= ctx->Scissor.Y + ctx->Scissor.Height) {	 height -= (y + height - (ctx->Scissor.Y + ctx->Scissor.Height));      }      if (width <= 0 || height <= 0)	 return;   }   else {      finalUnpack = unpack;   }   info.size = sizeof(info);   if (!grLfbLock(GR_LFB_WRITE_ONLY,                  fxMesa->currentFB,                  GR_LFBWRITEMODE_565,                  GR_ORIGIN_LOWER_LEFT, FXTRUE, &info)) {      _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels);      return;   }   {      const GLint winX = 0;      const GLint winY = 0;      const GLint dstStride = info.strideInBytes / 2;	/* stride in GLushorts */      GLushort *dst = (GLushort *) info.lfbPtr + (winY + y) * dstStride + (winX + x);      if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) {         GLint row;         for (row = 0; row < height; row++) {	     GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack,                                  pixels, width, height, format, type, row, 0);	     GLint col;	     for (col = 0; col < width; col++) {                 dst[col] = TDFXPACKCOLOR565(src[0], src[1], src[2]);                 src += 4;             }             dst += dstStride;         }      }      else if (format == GL_RGB && type == GL_UNSIGNED_BYTE) {         GLint row;         for (row = 0; row < height; row++) {	     GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack,                                  pixels, width, height, format, type, row, 0);	     GLint col;	     for (col = 0; col < width; col++) {                 dst[col] = TDFXPACKCOLOR565(src[0], src[1], src[2]);                 src += 3;             }             dst += dstStride;         }      }      else {         grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB);         _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels);         return;      }   }   grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB);}static voidfxDDDrawPixels8888 (GLcontext * ctx, GLint x, GLint y,                    GLsizei width, GLsizei height,                    GLenum format, GLenum type,                    const struct gl_pixelstore_attrib *unpack,                    const GLvoid * pixels){   fxMesaContext fxMesa = FX_CONTEXT(ctx);   SWcontext *swrast = SWRAST_CONTEXT(ctx);   GrLfbInfo_t info;   const struct gl_pixelstore_attrib *finalUnpack;   struct gl_pixelstore_attrib scissoredUnpack;   if (ctx->Pixel.ZoomX != 1.0F ||       ctx->Pixel.ZoomY != 1.0F ||       (ctx->_ImageTransferState & (IMAGE_SCALE_BIAS_BIT|				    IMAGE_MAP_COLOR_BIT)) ||       (swrast->_RasterMask & (/*ALPHATEST_BIT |*/			      /*BLEND_BIT |*/   /* blending ok, through pixpipe */			      DEPTH_BIT |       /* could be done with RGB:DEPTH */			      FOG_BIT |         /* could be done with RGB:DEPTH */			      LOGIC_OP_BIT |			      /*CLIP_BIT |*/    /* clipping ok, below */			      STENCIL_BIT |			      /*MASKING_BIT |*/ /* masking ok, we're in 32bpp */			      MULTI_DRAW_BIT |			      OCCLUSION_BIT |   /* nope! at least not yet */			      TEXTURE_BIT |			      FRAGPROG_BIT)) ||       fxMesa->fallback)   {      _swrast_DrawPixels( ctx, x, y, width, height, format, type,			  unpack, pixels );      return;   }   /* make sure the pixelpipe is configured correctly */   fxSetupFXUnits(ctx);   /* FIXME! _RasterMask & CLIP_BIT gets set if we're out of Viewport, also! */   if (ctx->Scissor.Enabled) {      /* This is a bit tricky, but by carefully adjusting the px, py,       * width, height, skipPixels and skipRows values we can do       * scissoring without special code in the rendering loop.       */      /* we'll construct a new pixelstore struct */      finalUnpack = &scissoredUnpack;      scissoredUnpack = *unpack;      if (scissoredUnpack.RowLength == 0)	 scissoredUnpack.RowLength = width;      /* clip left */      if (x < ctx->Scissor.X) {	 scissoredUnpack.SkipPixels += (ctx->Scissor.X - x);	 width -= (ctx->Scissor.X - x);	 x = ctx->Scissor.X;      }      /* clip right */      if (x + width >= ctx->Scissor.X + ctx->Scissor.Width) {	 width -= (x + width - (ctx->Scissor.X + ctx->Scissor.Width));      }      /* clip bottom */      if (y < ctx->Scissor.Y) {	 scissoredUnpack.SkipRows += (ctx->Scissor.Y - y);	 height -= (ctx->Scissor.Y - y);	 y = ctx->Scissor.Y;      }      /* clip top */      if (y + height >= ctx->Scissor.Y + ctx->Scissor.Height) {	 height -= (y + height - (ctx->Scissor.Y + ctx->Scissor.Height));      }      if (width <= 0 || height <= 0)	 return;   }   else {      finalUnpack = unpack;   }   info.size = sizeof(info);   if (!grLfbLock(GR_LFB_WRITE_ONLY,                  fxMesa->currentFB,                  GR_LFBWRITEMODE_8888,                  GR_ORIGIN_LOWER_LEFT, FXTRUE, &info)) {      _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels);      return;   }   {      const GLint winX = 0;      const GLint winY = 0;      const GLint dstStride = info.strideInBytes / 4;	/* stride in GLuints */      GLuint *dst = (GLuint *) info.lfbPtr + (winY + y) * dstStride + (winX + x);      if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) {         /* directly memcpy 8A8R8G8B pixels to screen */         const GLint widthInBytes = width * 4;         GLint row;         for (row = 0; row < height; row++) {	     GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack,                                  pixels, width, height, format, type, row, 0);             MEMCPY(dst, src, widthInBytes);             dst += dstStride;         }      }      else if (format == GL_RGB && type == GL_UNSIGNED_BYTE) {         GLint row;         for (row = 0; row < height; row++) {	     GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack,                               pixels, width, height, format, type, row, 0);	     GLint col;	     for (col = 0; col < width; col++) {                 dst[col] = TDFXPACKCOLOR8888(src[2], src[1], src[0], 255);                 src += 3;             }             dst += dstStride;         }      }      else {         grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB);         _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels);         return;      }   }   grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB);}static voidfxDDFinish(GLcontext * ctx){   grFlush();}/* KW: Put the word Mesa in the render string because quakeworld * checks for this rather than doing a glGet(GL_MAX_TEXTURE_SIZE). * Why? */

⌨️ 快捷键说明

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