summaryrefslogtreecommitdiff
path: root/Source/WebCore/platform/graphics/texmap/ClipStack.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/platform/graphics/texmap/ClipStack.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/platform/graphics/texmap/ClipStack.cpp')
-rw-r--r--Source/WebCore/platform/graphics/texmap/ClipStack.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/Source/WebCore/platform/graphics/texmap/ClipStack.cpp b/Source/WebCore/platform/graphics/texmap/ClipStack.cpp
new file mode 100644
index 000000000..11a00bc8a
--- /dev/null
+++ b/Source/WebCore/platform/graphics/texmap/ClipStack.cpp
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ * Copyright (C) 2012 Adobe Systems Incorporated
+ * Copyright (C) 2012, 2016 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include "ClipStack.h"
+
+#include "GraphicsContext3D.h"
+
+namespace WebCore {
+
+void ClipStack::push()
+{
+ clipStack.append(clipState);
+ clipStateDirty = true;
+}
+
+void ClipStack::pop()
+{
+ if (clipStack.isEmpty())
+ return;
+ clipState = clipStack.last();
+ clipStack.removeLast();
+ clipStateDirty = true;
+}
+
+void ClipStack::reset(const IntRect& rect, ClipStack::YAxisMode mode)
+{
+ clipStack.clear();
+ size = rect.size();
+ yAxisMode = mode;
+ clipState = State(rect);
+ clipStateDirty = true;
+}
+
+void ClipStack::intersect(const IntRect& rect)
+{
+ clipState.scissorBox.intersect(rect);
+ clipStateDirty = true;
+}
+
+void ClipStack::setStencilIndex(int stencilIndex)
+{
+ clipState.stencilIndex = stencilIndex;
+ clipStateDirty = true;
+}
+
+void ClipStack::apply(GraphicsContext3D& context)
+{
+ if (clipState.scissorBox.isEmpty())
+ return;
+
+ context.scissor(clipState.scissorBox.x(),
+ (yAxisMode == YAxisMode::Inverted) ? size.height() - clipState.scissorBox.maxY() : clipState.scissorBox.y(),
+ clipState.scissorBox.width(), clipState.scissorBox.height());
+ context.stencilOp(GraphicsContext3D::KEEP, GraphicsContext3D::KEEP, GraphicsContext3D::KEEP);
+ context.stencilFunc(GraphicsContext3D::EQUAL, clipState.stencilIndex - 1, clipState.stencilIndex - 1);
+ if (clipState.stencilIndex == 1)
+ context.disable(GraphicsContext3D::STENCIL_TEST);
+ else
+ context.enable(GraphicsContext3D::STENCIL_TEST);
+}
+
+void ClipStack::applyIfNeeded(GraphicsContext3D& context)
+{
+ if (!clipStateDirty)
+ return;
+
+ clipStateDirty = false;
+ apply(context);
+}
+
+} // namespace WebCore