1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/graphics/m3g/m3gcore11/src/m3g_compositingmode.c Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,436 @@
1.4 +/*
1.5 +* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
1.6 +* All rights reserved.
1.7 +* This component and the accompanying materials are made available
1.8 +* under the terms of the License "Eclipse Public License v1.0"
1.9 +* which accompanies this distribution, and is available
1.10 +* at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.11 +*
1.12 +* Initial Contributors:
1.13 +* Nokia Corporation - initial contribution.
1.14 +*
1.15 +* Contributors:
1.16 +*
1.17 +* Description: CompositingMode implementation
1.18 +*
1.19 +*/
1.20 +
1.21 +
1.22 +/*!
1.23 + * \internal
1.24 + * \file
1.25 + * \brief CompositingMode implementation
1.26 + */
1.27 +
1.28 +#ifndef M3G_CORE_INCLUDE
1.29 +# error included by m3g_core.c; do not compile separately.
1.30 +#endif
1.31 +
1.32 +#include "m3g_compositingmode.h"
1.33 +#include "m3g_interface.h"
1.34 +
1.35 +/*----------------------------------------------------------------------
1.36 + * Internal functions
1.37 + *--------------------------------------------------------------------*/
1.38 +
1.39 +/*!
1.40 + * \internal
1.41 + * \brief Applies default CompositingMode to OpenGL.
1.42 + */
1.43 +static void m3gApplyDefaultCompositingMode(M3Gbool alphaWrite)
1.44 +{
1.45 + /* depth write = true */
1.46 + glDepthFunc(GL_LEQUAL);
1.47 + glDepthMask(GL_TRUE);
1.48 +
1.49 + /* colorWrite = true */
1.50 + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, alphaWrite);
1.51 +
1.52 + /* threshold = 0.0 */
1.53 + glAlphaFunc(GL_GEQUAL, 0.0f);
1.54 + glDisable(GL_ALPHA_TEST);
1.55 +
1.56 + /* blend = REPLACE */
1.57 + glDisable(GL_BLEND);
1.58 +
1.59 + /* factor = 0 && units = 0 */
1.60 + glDisable(GL_POLYGON_OFFSET_FILL);
1.61 +}
1.62 +
1.63 +/*!
1.64 + * \internal
1.65 + * \brief Applies CompositingMode to OpenGL.
1.66 + *
1.67 + * \param compositingMode CompositingMode object
1.68 + */
1.69 +static void m3gApplyCompositingMode(CompositingMode *compositingMode, RenderContext *ctx)
1.70 +{
1.71 + M3Gbool alphaWrite = m3gGetAlphaWrite(ctx);
1.72 +
1.73 + if (compositingMode != NULL) {
1.74 +
1.75 + glDepthFunc(compositingMode->depthTest ? GL_LEQUAL : GL_ALWAYS);
1.76 + glDepthMask(compositingMode->depthWrite);
1.77 +
1.78 + if (m3gGetColorMaskWorkaround(M3G_INTERFACE(compositingMode))) {
1.79 + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
1.80 + }
1.81 + else {
1.82 + glColorMask(compositingMode->colorWrite,
1.83 + compositingMode->colorWrite,
1.84 + compositingMode->colorWrite,
1.85 + alphaWrite & compositingMode->alphaWrite);
1.86 + }
1.87 +
1.88 + if (compositingMode->alphaThreshold == 0.0f) {
1.89 + glDisable(GL_ALPHA_TEST);
1.90 + }
1.91 + else {
1.92 + glAlphaFunc(GL_GEQUAL, compositingMode->alphaThreshold);
1.93 + glEnable(GL_ALPHA_TEST);
1.94 + }
1.95 +
1.96 + if (compositingMode->blendingMode == M3G_REPLACE) {
1.97 + glDisable(GL_BLEND);
1.98 + }
1.99 + else {
1.100 + M3Gint src = GL_ONE;
1.101 + M3Gint dst = GL_ZERO;
1.102 + switch (compositingMode->blendingMode) {
1.103 + case M3G_ALPHA_ADD:
1.104 + src = GL_SRC_ALPHA;
1.105 + dst = GL_ONE;
1.106 + break;
1.107 + case M3G_ALPHA_BLEND:
1.108 + src = GL_SRC_ALPHA;
1.109 + dst = GL_ONE_MINUS_SRC_ALPHA;
1.110 + break;
1.111 + case M3G_MODULATE:
1.112 + src = GL_ZERO;
1.113 + dst = GL_SRC_COLOR;
1.114 + break;
1.115 + case M3G_MODULATE_X2:
1.116 + src = GL_DST_COLOR;
1.117 + dst = GL_SRC_COLOR;
1.118 + break;
1.119 + }
1.120 + glBlendFunc(src, dst);
1.121 + glEnable(GL_BLEND);
1.122 + }
1.123 +
1.124 + glPolygonOffset(compositingMode->factor, compositingMode->units);
1.125 + if (compositingMode->factor != 0 || compositingMode->units != 0) {
1.126 + glEnable(GL_POLYGON_OFFSET_FILL);
1.127 + }
1.128 + else {
1.129 + glDisable(GL_POLYGON_OFFSET_FILL);
1.130 + }
1.131 + }
1.132 + else {
1.133 + m3gApplyDefaultCompositingMode(alphaWrite);
1.134 + }
1.135 + M3G_ASSERT_GL;
1.136 +}
1.137 +
1.138 +/*!
1.139 + * \internal
1.140 + * \brief Duplicates a CompositingMode object.
1.141 + *
1.142 + * \param originalObj original CompositingMode object
1.143 + * \param cloneObj pointer to cloned CompositingMode object
1.144 + * \param pairs array for all object-duplicate pairs
1.145 + * \param numPairs number of pairs
1.146 + */
1.147 +static M3Gbool m3gCompositingModeDuplicate(const Object *originalObj,
1.148 + Object **cloneObj,
1.149 + Object **pairs,
1.150 + M3Gint *numPairs)
1.151 +{
1.152 + CompositingMode *original = (CompositingMode *)originalObj;
1.153 + CompositingMode *clone =
1.154 + (CompositingMode *)m3gCreateCompositingMode(originalObj->interface);
1.155 + *cloneObj = (Object *)clone;
1.156 + if (*cloneObj == NULL) {
1.157 + return M3G_FALSE;
1.158 + }
1.159 +
1.160 + if(m3gObjectDuplicate(originalObj, cloneObj, pairs, numPairs)) {
1.161 + clone->blendingMode = original->blendingMode;
1.162 + clone->alphaThreshold = original->alphaThreshold;
1.163 + clone->depthTest = original->depthTest;
1.164 + clone->depthWrite = original->depthWrite;
1.165 + clone->colorWrite = original->colorWrite;
1.166 + clone->alphaWrite = original->alphaWrite;
1.167 + clone->factor = original->factor;
1.168 + clone->units = original->units;
1.169 + return M3G_TRUE;
1.170 + }
1.171 + else {
1.172 + return M3G_FALSE;
1.173 + }
1.174 +}
1.175 +
1.176 +/*----------------------------------------------------------------------
1.177 + * Virtual function table
1.178 + *--------------------------------------------------------------------*/
1.179 +
1.180 +static const ObjectVFTable m3gvf_CompositingMode = {
1.181 + m3gObjectApplyAnimation,
1.182 + m3gObjectIsCompatible,
1.183 + m3gObjectUpdateProperty,
1.184 + m3gObjectDoGetReferences,
1.185 + m3gObjectFindID,
1.186 + m3gCompositingModeDuplicate,
1.187 + m3gDestroyObject
1.188 +};
1.189 +
1.190 +
1.191 +/*----------------------------------------------------------------------
1.192 + * Public API functions
1.193 + *--------------------------------------------------------------------*/
1.194 +
1.195 +/*!
1.196 + * \brief Creates a new CompositingMode object.
1.197 + *
1.198 + * \param interface M3G interface
1.199 + * \retval CompositingMode new CompositingMode object
1.200 + * \retval NULL CompositingMode creating failed
1.201 + */
1.202 +M3G_API M3GCompositingMode m3gCreateCompositingMode(M3GInterface interface)
1.203 +{
1.204 + Interface *m3g = (Interface *) interface;
1.205 + M3G_VALIDATE_INTERFACE(m3g);
1.206 +
1.207 + {
1.208 + CompositingMode *compositingMode = m3gAllocZ(m3g, sizeof(CompositingMode));
1.209 +
1.210 + if (compositingMode != NULL) {
1.211 + m3gInitObject(&compositingMode->object, m3g,
1.212 + M3G_CLASS_COMPOSITING_MODE);
1.213 +
1.214 + compositingMode->blendingMode = M3G_REPLACE;
1.215 + compositingMode->alphaThreshold = 0.0f;
1.216 + compositingMode->depthTest = GL_TRUE;
1.217 + compositingMode->depthTest = GL_TRUE;
1.218 + compositingMode->depthWrite = GL_TRUE;
1.219 + compositingMode->colorWrite = GL_TRUE;
1.220 + compositingMode->alphaWrite = GL_TRUE;
1.221 + compositingMode->factor = 0.0f;
1.222 + compositingMode->units = 0.0f;
1.223 + }
1.224 +
1.225 + return (M3GCompositingMode) compositingMode;
1.226 + }
1.227 +}
1.228 +
1.229 +/*!
1.230 + * \brief Set blending mode.
1.231 + *
1.232 + * \param handle CompositingMode object
1.233 + * \param mode blending mode
1.234 + */
1.235 +M3G_API void m3gSetBlending(M3GCompositingMode handle, M3Gint mode)
1.236 +{
1.237 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.238 + if (mode != M3G_REPLACE && mode != M3G_ALPHA_BLEND && mode != M3G_MODULATE && mode != M3G_MODULATE_X2 && mode != M3G_ALPHA_ADD) {
1.239 + m3gRaiseError(M3G_INTERFACE(compositingMode), M3G_INVALID_VALUE);
1.240 + return;
1.241 + }
1.242 + M3G_VALIDATE_OBJECT(compositingMode);
1.243 + compositingMode->blendingMode = mode;
1.244 +}
1.245 +
1.246 +/*!
1.247 + * \brief Get blending mode.
1.248 + *
1.249 + * \param handle CompositingMode object
1.250 + * \return blending mode
1.251 + */
1.252 +M3G_API M3Gint m3gGetBlending(M3GCompositingMode handle)
1.253 +{
1.254 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.255 + M3G_VALIDATE_OBJECT(compositingMode);
1.256 + return compositingMode->blendingMode;
1.257 +}
1.258 +
1.259 +/*!
1.260 + * \brief Set alpha threshold [0, 1].
1.261 + *
1.262 + * \param handle CompositingMode object
1.263 + * \param threshold alpha threshold [0, 1]
1.264 + */
1.265 +M3G_API void m3gSetAlphaThreshold(M3GCompositingMode handle,
1.266 + M3Gfloat threshold)
1.267 +{
1.268 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.269 + M3G_VALIDATE_OBJECT(compositingMode);
1.270 + if (!m3gInRangef(threshold, 0.0f, 1.0f)) {
1.271 + m3gRaiseError(M3G_INTERFACE(compositingMode), M3G_INVALID_VALUE);
1.272 + return;
1.273 + }
1.274 + compositingMode->alphaThreshold = threshold;
1.275 +}
1.276 +
1.277 +/*!
1.278 + * \brief Get alpha threshold.
1.279 + *
1.280 + * \param handle CompositingMode object
1.281 + * \return alpha threshold
1.282 + */
1.283 +M3G_API M3Gfloat m3gGetAlphaThreshold(M3GCompositingMode handle)
1.284 +{
1.285 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.286 + M3G_VALIDATE_OBJECT(compositingMode);
1.287 + return compositingMode->alphaThreshold;
1.288 +}
1.289 +
1.290 +/*!
1.291 + * \brief Set depth test enable.
1.292 + *
1.293 + * \param handle CompositingMode object
1.294 + * \param enable depth test enable
1.295 + */
1.296 +M3G_API void m3gEnableDepthTest(M3GCompositingMode handle, M3Gbool enable)
1.297 +{
1.298 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.299 + M3G_VALIDATE_OBJECT(compositingMode);
1.300 + compositingMode->depthTest = (GLboolean) enable;
1.301 +}
1.302 +
1.303 +/*!
1.304 + * \brief Set depth write enable.
1.305 + *
1.306 + * \param handle CompositingMode object
1.307 + * \param enable depth write enable
1.308 + */
1.309 +M3G_API void m3gEnableDepthWrite(M3GCompositingMode handle, M3Gbool enable)
1.310 +{
1.311 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.312 + M3G_VALIDATE_OBJECT(compositingMode);
1.313 + compositingMode->depthWrite = (GLboolean) enable;
1.314 +}
1.315 +
1.316 +/*!
1.317 + * \brief Set color write enable.
1.318 + *
1.319 + * \param handle CompositingMode object
1.320 + * \param enable color write enable
1.321 + */
1.322 +M3G_API void m3gEnableColorWrite(M3GCompositingMode handle, M3Gbool enable)
1.323 +{
1.324 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.325 + M3G_VALIDATE_OBJECT(compositingMode);
1.326 + compositingMode->colorWrite = (GLboolean) enable;
1.327 +}
1.328 +
1.329 +/*!
1.330 + * \brief Set depth offset with factor and units.
1.331 + *
1.332 + * \param handle CompositingMode object
1.333 + * \param factor slope dependent depth offset
1.334 + * \param units constant depth offset
1.335 + */
1.336 +M3G_API void m3gSetDepthOffset(M3GCompositingMode handle,
1.337 + M3Gfloat factor, M3Gfloat units)
1.338 +{
1.339 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.340 + M3G_VALIDATE_OBJECT(compositingMode);
1.341 + compositingMode->factor = factor;
1.342 + compositingMode->units = units;
1.343 +}
1.344 +
1.345 +/*!
1.346 + * \brief Get depth offset factor.
1.347 + *
1.348 + * \param handle CompositingMode object
1.349 + * \return slope dependent depth offset
1.350 + */
1.351 +M3G_API M3Gfloat m3gGetDepthOffsetFactor(M3GCompositingMode handle)
1.352 +{
1.353 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.354 + M3G_VALIDATE_OBJECT(compositingMode);
1.355 + return compositingMode->factor;
1.356 +}
1.357 +
1.358 +/*!
1.359 + * \brief Get depth offset units.
1.360 + *
1.361 + * \param handle CompositingMode object
1.362 + * \return constant depth offset
1.363 + */
1.364 +M3G_API M3Gfloat m3gGetDepthOffsetUnits(M3GCompositingMode handle)
1.365 +{
1.366 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.367 + M3G_VALIDATE_OBJECT(compositingMode);
1.368 + return compositingMode->units;
1.369 +}
1.370 +
1.371 +/*!
1.372 + * \brief Get alpha write enable.
1.373 + *
1.374 + * \param handle CompositingMode object
1.375 + * \retval M3G_TRUE alpha write enabled
1.376 + * \retval M3G_FALSE alpha write disabled
1.377 + */
1.378 +M3G_API M3Gbool m3gIsAlphaWriteEnabled(M3GCompositingMode handle)
1.379 +{
1.380 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.381 + M3G_VALIDATE_OBJECT(compositingMode);
1.382 + return compositingMode->alphaWrite;
1.383 +}
1.384 +
1.385 +/*!
1.386 + * \brief Get color write enable.
1.387 + *
1.388 + * \param handle CompositingMode object
1.389 + * \retval M3G_TRUE color write enabled
1.390 + * \retval M3G_FALSE color write disabled
1.391 + */
1.392 +M3G_API M3Gbool m3gIsColorWriteEnabled(M3GCompositingMode handle)
1.393 +{
1.394 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.395 + M3G_VALIDATE_OBJECT(compositingMode);
1.396 + return compositingMode->colorWrite;
1.397 +}
1.398 +
1.399 +/*!
1.400 + * \brief Get depth test enable.
1.401 + *
1.402 + * \param handle CompositingMode object
1.403 + * \retval M3G_TRUE depth test enabled
1.404 + * \retval M3G_FALSE depth test disabled
1.405 + */
1.406 +M3G_API M3Gbool m3gIsDepthTestEnabled(M3GCompositingMode handle)
1.407 +{
1.408 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.409 + M3G_VALIDATE_OBJECT(compositingMode);
1.410 + return compositingMode->depthTest;
1.411 +}
1.412 +
1.413 +/*!
1.414 + * \brief Get depth write enable.
1.415 + *
1.416 + * \param handle CompositingMode object
1.417 + * \retval M3G_TRUE depth write enabled
1.418 + * \retval M3G_FALSE depth write disabled
1.419 + */
1.420 +M3G_API M3Gbool m3gIsDepthWriteEnabled(M3GCompositingMode handle)
1.421 +{
1.422 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.423 + M3G_VALIDATE_OBJECT(compositingMode);
1.424 + return compositingMode->depthWrite;
1.425 +}
1.426 +
1.427 +/*!
1.428 + * \brief Set alpha write enable.
1.429 + *
1.430 + * \param handle CompositingMode object
1.431 + * \param enable alpha write enable
1.432 + */
1.433 +M3G_API void m3gSetAlphaWriteEnable(M3GCompositingMode handle, M3Gbool enable)
1.434 +{
1.435 + CompositingMode *compositingMode = (CompositingMode*)handle;
1.436 + M3G_VALIDATE_OBJECT(compositingMode);
1.437 + compositingMode->alphaWrite = (GLboolean) enable;
1.438 +}
1.439 +