Stencil.cpp revision 0baaac5e9adf3ee280ae1239e2e58754a9d2b099
10baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy/*
20baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Copyright (C) 2012 The Android Open Source Project
30baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy *
40baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
50baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * you may not use this file except in compliance with the License.
60baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * You may obtain a copy of the License at
70baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy *
80baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
90baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy *
100baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * Unless required by applicable law or agreed to in writing, software
110baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
120baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * See the License for the specific language governing permissions and
140baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy * limitations under the License.
150baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy */
160baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
170baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#include <GLES2/gl2.h>
180baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
190baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#include "Properties.h"
200baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#include "Stencil.h"
210baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
220baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guynamespace android {
230baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guynamespace uirenderer {
240baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
250baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain GuyStencil::Stencil(): mState(kDisabled) {
260baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}
270baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
280baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyuint32_t Stencil::getStencilSize() {
290baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    return STENCIL_BUFFER_SIZE;
300baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}
310baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
320baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyvoid Stencil::clear() {
330baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    glClearStencil(0);
340baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    glClear(GL_STENCIL_BUFFER_BIT);
350baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}
360baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
370baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyvoid Stencil::enableTest() {
380baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    if (mState != kTest) {
390baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        enable();
400baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        glStencilFunc(GL_LESS, 0x0, 0x1);
410baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        // We only want to test, let's keep everything
420baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
430baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        mState = kTest;
440baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    }
450baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}
460baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
470baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyvoid Stencil::enableWrite() {
480baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    if (mState != kWrite) {
490baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        enable();
500baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        glStencilFunc(GL_ALWAYS, 0x1, 0x1);
510baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        // The test always passes so the first two values are meaningless
520baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
530baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        mState = kWrite;
540baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    }
550baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}
560baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
570baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyvoid Stencil::enable() {
580baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    if (!mState == kDisabled) {
590baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        glEnable(GL_STENCIL_TEST);
600baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    }
610baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}
620baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
630baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guyvoid Stencil::disable() {
640baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    if (mState != kDisabled) {
650baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        glDisable(GL_STENCIL_TEST);
660baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy        mState = kDisabled;
670baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    }
680baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}
690baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
700baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}; // namespace uirenderer
710baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy}; // namespace android
72