13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the "Software"), 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * to deal in the Software without restriction, including without limitation 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Software is furnished to do so, subject to the following conditions: 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice including the dates of first publication and 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * either this permission notice or a reference to 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * http://oss.sgi.com/projects/FreeB/ 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * shall be included in all copies or substantial portions of the Software. 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SOFTWARE. 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Except as contained in this notice, the name of Silicon Graphics, Inc. 263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * shall not be used in advertising or otherwise to promote the sale, use or 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * other dealings in this Software without prior written authorization from 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Silicon Graphics, Inc. 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "glxclient.h" 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "indirect.h" 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "indirect_vertex_array.h" 343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*****************************************************************************/ 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \name Vertex array pointer bridge functions 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * When EXT_vertex_array was moved into the core GL spec, the \c count 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * parameter was lost. This libGL really only wants to implement the GL 1.1 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * version, but we need to support applications that were written to the old 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * interface. These bridge functions are part of the glue that makes this 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * happen. 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*@{*/ 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glColorPointerEXT(GLint size, GLenum type, GLsizei stride, 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GLsizei count, const GLvoid * pointer) 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (void) count; 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glColorPointer(size, type, stride, pointer); 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glEdgeFlagPointerEXT(GLsizei stride, 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GLsizei count, const GLboolean * pointer) 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (void) count; 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glEdgeFlagPointer(stride, pointer); 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glIndexPointerEXT(GLenum type, GLsizei stride, 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GLsizei count, const GLvoid * pointer) 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (void) count; 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glIndexPointer(type, stride, pointer); 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glNormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const GLvoid * pointer) 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (void) count; 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glNormalPointer(type, stride, pointer); 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glTexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GLsizei count, const GLvoid * pointer) 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (void) count; 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glTexCoordPointer(size, type, stride, pointer); 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glVertexPointerEXT(GLint size, GLenum type, GLsizei stride, 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GLsizei count, const GLvoid * pointer) 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (void) count; 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glVertexPointer(size, type, stride, pointer); 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*@}*/ 973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*****************************************************************************/ 993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__indirect_glInterleavedArrays(GLenum format, GLsizei stride, 1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const GLvoid * pointer) 1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 104760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org struct glx_context *gc = __glXGetCurrentContext(); 1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __GLXattribute *state = (__GLXattribute *) (gc->client_state_private); 1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define NONE {0, 0, 0} 1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define F(x) {GL_FLOAT, x, x * sizeof(GLfloat)} 1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define UB4 {GL_UNSIGNED_BYTE, 4, 4 * sizeof(GLubyte)} 1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* Each row in this array describes the elements of a particular 1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * interleaved array mode. Each column describes, in the order in which 1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * they appear in the interleaved arrays, one of the four possible types 1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * of vertex data that can appear in an interleaved array. 1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct 1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org { 1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /** 1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The enum describing the GL type, as would be passed to the 1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * appropriate gl*Pointer function. 1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GLushort type; 1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /** 1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Number of elements in the subarray, as would be passed (as the 1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \c size parameter) to the appropriate gl*Pointer function. 1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GLubyte count; 1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /** 1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * True size of a single element in the subarray, as would be passed 1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * (as the \c stride parameter) to the appropriate gl*Pointer 1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * function. 1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GLubyte size; 1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org static const modes[14][4] = { 1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* texture color normal vertex */ 1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {NONE, NONE, NONE, F(2)}, /* GL_V2F */ 1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {NONE, NONE, NONE, F(3)}, /* GL_V3F */ 1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {NONE, UB4, NONE, F(2)}, /* GL_C4UB_V2F */ 1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {NONE, UB4, NONE, F(3)}, /* GL_C4UB_V3F */ 1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {NONE, F(3), NONE, F(3)}, /* GL_C3F_V3F */ 1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {NONE, NONE, F(3), F(3)}, /* GL_N3F_V3F */ 1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {NONE, F(4), F(3), F(3)}, /* GL_C4F_N3F_V3F */ 1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {F(2), NONE, NONE, F(3)}, /* GL_T2F_V3F */ 1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {F(4), NONE, NONE, F(4)}, /* GL_T4F_V4F */ 1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {F(2), UB4, NONE, F(3)}, /* GL_T2F_C4UB_V3F */ 1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {F(2), F(3), NONE, F(3)}, /* GL_T2F_C3F_V3F */ 1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {F(2), NONE, F(3), F(3)}, /* GL_T2F_N3F_V3F */ 1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {F(2), F(4), F(3), F(3)}, /* GL_T2F_C4F_N3F_V3F */ 1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org {F(4), F(4), F(3), F(4)}, /* GL_T4F_C4F_N3F_V4F */ 1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org }; 1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#undef NONE 1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#undef F 1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#undef UB4 1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GLint trueStride, size; 1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org int offsets[4]; 1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned i; 1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const int idx = format - GL_V2F; 1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* All valid formats are on the range [GL_V2F, GL_V2F+0x0D]. Since idx 1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * is just the format biased by -GL_V2F, all valid idx values are on the 1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * range [0, 0x0D]. 1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if ((idx < 0) || (idx > 0x0D)) { 1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_ENUM); 1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (stride < 0) { 1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXSetError(gc, GL_INVALID_VALUE); 1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* If the 'count' for a subarray is non-zero, then the offset of its 1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * first element is at the currently accumulated 'size'. 1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org size = 0; 1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org for (i = 0; i < 4; i++) { 1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org offsets[i] = (modes[idx][i].count != 0) ? size : -1; 1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org size += modes[idx][i].size; 1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org trueStride = (stride == 0) ? size : stride; 1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __glXArrayDisableAll(state); 1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (offsets[0] >= 0) { 1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glEnableClientState(GL_TEXTURE_COORD_ARRAY); 1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glTexCoordPointer(modes[idx][0].count, GL_FLOAT, 1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org trueStride, (const char *) pointer); 1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (offsets[1] >= 0) { 1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glEnableClientState(GL_COLOR_ARRAY); 1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glColorPointer(modes[idx][1].count, modes[idx][1].type, 2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org trueStride, 2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (const char *) pointer + offsets[1]); 2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (offsets[2] >= 0) { 2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glEnableClientState(GL_NORMAL_ARRAY); 2053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glNormalPointer(GL_FLOAT, trueStride, 2063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (const char *) pointer + offsets[2]); 2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glEnableClientState(GL_VERTEX_ARRAY); 2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org __indirect_glVertexPointer(modes[idx][3].count, GL_FLOAT, 2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org trueStride, 2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (const char *) pointer + offsets[3]); 2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 213