1d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul/**************************************************************************
2d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul *
3d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
4d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * All Rights Reserved.
5d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul *
6d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
7d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * copy of this software and associated documentation files (the
8d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * "Software"), to deal in the Software without restriction, including
9d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * without limitation the rights to use, copy, modify, merge, publish,
10d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * distribute, sub license, and/or sell copies of the Software, and to
11d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * permit persons to whom the Software is furnished to do so, subject to
12d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * the following conditions:
13d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul *
14d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * The above copyright notice and this permission notice (including the
15d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * next paragraph) shall be included in all copies or substantial portions
16d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * of the Software.
17d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul *
18d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul *
26d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul **************************************************************************/
27d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul
28d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul
29d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul#include "main/glheader.h"
30d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul#include "main/context.h"
31d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul#include "main/macros.h"
32d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul#include "main/enums.h"
33d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul#include "main/colormac.h"
34d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul#include "main/dd.h"
35d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul
36d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul#include "intel_screen.h"
37d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul#include "intel_context.h"
38d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul
39d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paulint
40d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paulintel_translate_shadow_compare_func(GLenum func)
41d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul{
42d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   switch (func) {
43d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_NEVER:
44d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul       return COMPAREFUNC_ALWAYS;
45d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_LESS:
46d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul       return COMPAREFUNC_LEQUAL;
47d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_LEQUAL:
48d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul       return COMPAREFUNC_LESS;
49d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_GREATER:
50d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul       return COMPAREFUNC_GEQUAL;
51d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_GEQUAL:
52d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return COMPAREFUNC_GREATER;
53d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_NOTEQUAL:
54d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return COMPAREFUNC_EQUAL;
55d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_EQUAL:
56d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return COMPAREFUNC_NOTEQUAL;
57d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_ALWAYS:
58d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul       return COMPAREFUNC_NEVER;
59d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   }
60d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul
61d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, func);
62d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   return COMPAREFUNC_NEVER;
63d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul}
64d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul
65d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paulint
66d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paulintel_translate_compare_func(GLenum func)
67d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul{
68d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   switch (func) {
69d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_NEVER:
70d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return COMPAREFUNC_NEVER;
71d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_LESS:
72d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return COMPAREFUNC_LESS;
73d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_LEQUAL:
74d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return COMPAREFUNC_LEQUAL;
75d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_GREATER:
76d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return COMPAREFUNC_GREATER;
77d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_GEQUAL:
78d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return COMPAREFUNC_GEQUAL;
79d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_NOTEQUAL:
80d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return COMPAREFUNC_NOTEQUAL;
81d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_EQUAL:
82d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return COMPAREFUNC_EQUAL;
83d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_ALWAYS:
84d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return COMPAREFUNC_ALWAYS;
85d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   }
86d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul
87d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, func);
88d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   return COMPAREFUNC_ALWAYS;
89d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul}
90d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul
91d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paulint
92d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paulintel_translate_stencil_op(GLenum op)
93d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul{
94d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   switch (op) {
95d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_KEEP:
96d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return STENCILOP_KEEP;
97d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_ZERO:
98d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return STENCILOP_ZERO;
99d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_REPLACE:
100d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return STENCILOP_REPLACE;
101d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_INCR:
102d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return STENCILOP_INCRSAT;
103d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_DECR:
104d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return STENCILOP_DECRSAT;
105d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_INCR_WRAP:
106d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return STENCILOP_INCR;
107d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_DECR_WRAP:
108d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return STENCILOP_DECR;
109d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_INVERT:
110d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return STENCILOP_INVERT;
111d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   default:
112d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return STENCILOP_ZERO;
113d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   }
114d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul}
115d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul
116d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paulint
117d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paulintel_translate_blend_factor(GLenum factor)
118d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul{
119d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   switch (factor) {
120d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_ZERO:
121d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_ZERO;
122d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_SRC_ALPHA:
123d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_SRC_ALPHA;
124d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_ONE:
125d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_ONE;
126d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_SRC_COLOR:
127d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_SRC_COLR;
128d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_ONE_MINUS_SRC_COLOR:
129d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_INV_SRC_COLR;
130d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_DST_COLOR:
131d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_DST_COLR;
132d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_ONE_MINUS_DST_COLOR:
133d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_INV_DST_COLR;
134d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_ONE_MINUS_SRC_ALPHA:
135d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_INV_SRC_ALPHA;
136d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_DST_ALPHA:
137d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_DST_ALPHA;
138d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_ONE_MINUS_DST_ALPHA:
139d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_INV_DST_ALPHA;
140d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_SRC_ALPHA_SATURATE:
141d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_SRC_ALPHA_SATURATE;
142d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_CONSTANT_COLOR:
143d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_CONST_COLOR;
144d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_ONE_MINUS_CONSTANT_COLOR:
145d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_INV_CONST_COLOR;
146d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_CONSTANT_ALPHA:
147d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_CONST_ALPHA;
148d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_ONE_MINUS_CONSTANT_ALPHA:
149d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return BLENDFACT_INV_CONST_ALPHA;
150d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   }
151d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul
152d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, factor);
153d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   return BLENDFACT_ZERO;
154d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul}
155d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul
156d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paulint
157d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paulintel_translate_logic_op(GLenum opcode)
158d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul{
159d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   switch (opcode) {
160d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_CLEAR:
161d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_CLEAR;
162d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_AND:
163d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_AND;
164d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_AND_REVERSE:
165d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_AND_RVRSE;
166d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_COPY:
167d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_COPY;
168d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_COPY_INVERTED:
169d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_COPY_INV;
170d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_AND_INVERTED:
171d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_AND_INV;
172d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_NOOP:
173d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_NOOP;
174d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_XOR:
175d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_XOR;
176d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_OR:
177d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_OR;
178d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_OR_INVERTED:
179d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_OR_INV;
180d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_NOR:
181d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_NOR;
182d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_EQUIV:
183d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_EQUIV;
184d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_INVERT:
185d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_INV;
186d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_OR_REVERSE:
187d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_OR_RVRSE;
188d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_NAND:
189d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_NAND;
190d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   case GL_SET:
191d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_SET;
192d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   default:
193d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul      return LOGICOP_SET;
194d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul   }
195d0c8ed73cc6f2b08906a18a8d60e3bc364e5e48fBrian Paul}
196