Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  * Version:  7.1
  4.  *
  5.  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included
  15.  * in all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  21.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  22.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25. /**
  26.  * \file pixelstore.c
  27.  * glPixelStore functions.
  28.  */
  29.  
  30.  
  31. #include "glheader.h"
  32. #include "bufferobj.h"
  33. #include "context.h"
  34. #include "pixelstore.h"
  35. #include "mtypes.h"
  36.  
  37.  
  38. void GLAPIENTRY
  39. _mesa_PixelStorei( GLenum pname, GLint param )
  40. {
  41.    /* NOTE: this call can't be compiled into the display list */
  42.    GET_CURRENT_CONTEXT(ctx);
  43.    ASSERT_OUTSIDE_BEGIN_END(ctx);
  44.  
  45.    switch (pname) {
  46.       case GL_PACK_SWAP_BYTES:
  47.          if (param == (GLint)ctx->Pack.SwapBytes)
  48.             return;
  49.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  50.          ctx->Pack.SwapBytes = param ? GL_TRUE : GL_FALSE;
  51.          break;
  52.       case GL_PACK_LSB_FIRST:
  53.          if (param == (GLint)ctx->Pack.LsbFirst)
  54.             return;
  55.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  56.          ctx->Pack.LsbFirst = param ? GL_TRUE : GL_FALSE;
  57.          break;
  58.       case GL_PACK_ROW_LENGTH:
  59.          if (param<0) {
  60.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
  61.             return;
  62.          }
  63.          if (ctx->Pack.RowLength == param)
  64.             return;
  65.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  66.          ctx->Pack.RowLength = param;
  67.          break;
  68.       case GL_PACK_IMAGE_HEIGHT:
  69.          if (param<0) {
  70.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
  71.             return;
  72.          }
  73.          if (ctx->Pack.ImageHeight == param)
  74.             return;
  75.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  76.          ctx->Pack.ImageHeight = param;
  77.          break;
  78.       case GL_PACK_SKIP_PIXELS:
  79.          if (param<0) {
  80.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
  81.             return;
  82.          }
  83.          if (ctx->Pack.SkipPixels == param)
  84.             return;
  85.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  86.          ctx->Pack.SkipPixels = param;
  87.          break;
  88.       case GL_PACK_SKIP_ROWS:
  89.          if (param<0) {
  90.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
  91.             return;
  92.          }
  93.          if (ctx->Pack.SkipRows == param)
  94.             return;
  95.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  96.          ctx->Pack.SkipRows = param;
  97.          break;
  98.       case GL_PACK_SKIP_IMAGES:
  99.          if (param<0) {
  100.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
  101.             return;
  102.          }
  103.          if (ctx->Pack.SkipImages == param)
  104.             return;
  105.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  106.          ctx->Pack.SkipImages = param;
  107.          break;
  108.       case GL_PACK_ALIGNMENT:
  109.          if (param!=1 && param!=2 && param!=4 && param!=8) {
  110.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
  111.             return;
  112.          }
  113.          if (ctx->Pack.Alignment == param)
  114.             return;
  115.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  116.          ctx->Pack.Alignment = param;
  117.          break;
  118.       case GL_PACK_INVERT_MESA:
  119.          if (!ctx->Extensions.MESA_pack_invert) {
  120.             _mesa_error( ctx, GL_INVALID_ENUM, "glPixelstore(pname)" );
  121.             return;
  122.          }
  123.          if (ctx->Pack.Invert == param)
  124.             return;
  125.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  126.          ctx->Pack.Invert = param;
  127.          break;
  128.  
  129.       case GL_UNPACK_SWAP_BYTES:
  130.          if (param == (GLint)ctx->Unpack.SwapBytes)
  131.             return;
  132.          if ((GLint)ctx->Unpack.SwapBytes == param)
  133.             return;
  134.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  135.          ctx->Unpack.SwapBytes = param ? GL_TRUE : GL_FALSE;
  136.          break;
  137.       case GL_UNPACK_LSB_FIRST:
  138.          if (param == (GLint)ctx->Unpack.LsbFirst)
  139.             return;
  140.          if ((GLint)ctx->Unpack.LsbFirst == param)
  141.             return;
  142.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  143.          ctx->Unpack.LsbFirst = param ? GL_TRUE : GL_FALSE;
  144.          break;
  145.       case GL_UNPACK_ROW_LENGTH:
  146.          if (param<0) {
  147.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
  148.             return;
  149.          }
  150.          if (ctx->Unpack.RowLength == param)
  151.             return;
  152.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  153.          ctx->Unpack.RowLength = param;
  154.          break;
  155.       case GL_UNPACK_IMAGE_HEIGHT:
  156.          if (param<0) {
  157.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
  158.             return;
  159.          }
  160.          if (ctx->Unpack.ImageHeight == param)
  161.             return;
  162.  
  163.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  164.          ctx->Unpack.ImageHeight = param;
  165.          break;
  166.       case GL_UNPACK_SKIP_PIXELS:
  167.          if (param<0) {
  168.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
  169.             return;
  170.          }
  171.          if (ctx->Unpack.SkipPixels == param)
  172.             return;
  173.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  174.          ctx->Unpack.SkipPixels = param;
  175.          break;
  176.       case GL_UNPACK_SKIP_ROWS:
  177.          if (param<0) {
  178.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
  179.             return;
  180.          }
  181.          if (ctx->Unpack.SkipRows == param)
  182.             return;
  183.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  184.          ctx->Unpack.SkipRows = param;
  185.          break;
  186.       case GL_UNPACK_SKIP_IMAGES:
  187.          if (param < 0) {
  188.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
  189.             return;
  190.          }
  191.          if (ctx->Unpack.SkipImages == param)
  192.             return;
  193.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  194.          ctx->Unpack.SkipImages = param;
  195.          break;
  196.       case GL_UNPACK_ALIGNMENT:
  197.          if (param!=1 && param!=2 && param!=4 && param!=8) {
  198.             _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore" );
  199.             return;
  200.          }
  201.          if (ctx->Unpack.Alignment == param)
  202.             return;
  203.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  204.          ctx->Unpack.Alignment = param;
  205.          break;
  206.       case GL_UNPACK_CLIENT_STORAGE_APPLE:
  207.          if (param == (GLint)ctx->Unpack.ClientStorage)
  208.             return;
  209.          FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
  210.          ctx->Unpack.ClientStorage = param ? GL_TRUE : GL_FALSE;
  211.          break;
  212.       default:
  213.          _mesa_error( ctx, GL_INVALID_ENUM, "glPixelStore" );
  214.          return;
  215.    }
  216. }
  217.  
  218.  
  219. void GLAPIENTRY
  220. _mesa_PixelStoref( GLenum pname, GLfloat param )
  221. {
  222.    _mesa_PixelStorei( pname, (GLint) param );
  223. }
  224.  
  225.  
  226.  
  227. /**
  228.  * Initialize the context's pixel store state.
  229.  */
  230. void
  231. _mesa_init_pixelstore( struct gl_context *ctx )
  232. {
  233.    /* Pixel transfer */
  234.    ctx->Pack.Alignment = 4;
  235.    ctx->Pack.RowLength = 0;
  236.    ctx->Pack.ImageHeight = 0;
  237.    ctx->Pack.SkipPixels = 0;
  238.    ctx->Pack.SkipRows = 0;
  239.    ctx->Pack.SkipImages = 0;
  240.    ctx->Pack.SwapBytes = GL_FALSE;
  241.    ctx->Pack.LsbFirst = GL_FALSE;
  242.    ctx->Pack.ClientStorage = GL_FALSE;
  243.    ctx->Pack.Invert = GL_FALSE;
  244. #if FEATURE_EXT_pixel_buffer_object
  245.    _mesa_reference_buffer_object(ctx, &ctx->Pack.BufferObj,
  246.                                  ctx->Shared->NullBufferObj);
  247. #endif
  248.    ctx->Unpack.Alignment = 4;
  249.    ctx->Unpack.RowLength = 0;
  250.    ctx->Unpack.ImageHeight = 0;
  251.    ctx->Unpack.SkipPixels = 0;
  252.    ctx->Unpack.SkipRows = 0;
  253.    ctx->Unpack.SkipImages = 0;
  254.    ctx->Unpack.SwapBytes = GL_FALSE;
  255.    ctx->Unpack.LsbFirst = GL_FALSE;
  256.    ctx->Unpack.ClientStorage = GL_FALSE;
  257.    ctx->Unpack.Invert = GL_FALSE;
  258. #if FEATURE_EXT_pixel_buffer_object
  259.    _mesa_reference_buffer_object(ctx, &ctx->Unpack.BufferObj,
  260.                                  ctx->Shared->NullBufferObj);
  261. #endif
  262.  
  263.    /*
  264.     * _mesa_unpack_image() returns image data in this format.  When we
  265.     * execute image commands (glDrawPixels(), glTexImage(), etc) from
  266.     * within display lists we have to be sure to set the current
  267.     * unpacking parameters to these values!
  268.     */
  269.    ctx->DefaultPacking.Alignment = 1;
  270.    ctx->DefaultPacking.RowLength = 0;
  271.    ctx->DefaultPacking.SkipPixels = 0;
  272.    ctx->DefaultPacking.SkipRows = 0;
  273.    ctx->DefaultPacking.ImageHeight = 0;
  274.    ctx->DefaultPacking.SkipImages = 0;
  275.    ctx->DefaultPacking.SwapBytes = GL_FALSE;
  276.    ctx->DefaultPacking.LsbFirst = GL_FALSE;
  277.    ctx->DefaultPacking.ClientStorage = GL_FALSE;
  278.    ctx->DefaultPacking.Invert = GL_FALSE;
  279. #if FEATURE_EXT_pixel_buffer_object
  280.    _mesa_reference_buffer_object(ctx, &ctx->DefaultPacking.BufferObj,
  281.                                  ctx->Shared->NullBufferObj);
  282. #endif
  283. }
  284.