summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/skia/debugger/QT/SkGLWidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/debugger/QT/SkGLWidget.cpp')
-rw-r--r--chromium/third_party/skia/debugger/QT/SkGLWidget.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/chromium/third_party/skia/debugger/QT/SkGLWidget.cpp b/chromium/third_party/skia/debugger/QT/SkGLWidget.cpp
new file mode 100644
index 00000000000..019654fe0d2
--- /dev/null
+++ b/chromium/third_party/skia/debugger/QT/SkGLWidget.cpp
@@ -0,0 +1,98 @@
+
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+
+#include "SkGLWidget.h"
+
+#if SK_SUPPORT_GPU
+
+SkGLWidget::SkGLWidget(SkDebugger* debugger) : QGLWidget() {
+ fDebugger = debugger;
+ fCurIntf = NULL;
+ fCurContext = NULL;
+ fGpuDevice = NULL;
+ fCanvas = NULL;
+}
+
+SkGLWidget::~SkGLWidget() {
+ SkSafeUnref(fCurIntf);
+ SkSafeUnref(fCurContext);
+ SkSafeUnref(fGpuDevice);
+ SkSafeUnref(fCanvas);
+}
+
+void SkGLWidget::setSampleCount(int sampleCount)
+{
+ QGLFormat currentFormat = format();
+ currentFormat.setSampleBuffers(sampleCount > 0);
+ currentFormat.setSamples(sampleCount);
+ setFormat(currentFormat);
+}
+
+void SkGLWidget::initializeGL() {
+ fCurIntf = GrGLCreateNativeInterface();
+ if (!fCurIntf) {
+ return;
+ }
+ glStencilMask(0xffffffff);
+ glClearStencil(0);
+ glClear(GL_STENCIL_BUFFER_BIT);
+
+ fCurContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) fCurIntf);
+ GrBackendRenderTargetDesc desc = this->getDesc(this->width(), this->height());
+ desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
+ GrRenderTarget* curRenderTarget = fCurContext->wrapBackendRenderTarget(desc);
+ fGpuDevice = new SkGpuDevice(fCurContext, curRenderTarget);
+ fCanvas = new SkCanvas(fGpuDevice);
+ curRenderTarget->unref();
+}
+
+void SkGLWidget::resizeGL(int w, int h) {
+ if (fCurContext) {
+ glDisable(GL_SCISSOR_TEST);
+ glStencilMask(0xffffffff);
+ glClearStencil(0);
+ glClear(GL_STENCIL_BUFFER_BIT);
+ fCurContext->resetContext();
+
+ GrBackendRenderTargetDesc desc = this->getDesc(w, h);
+ desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
+ GrRenderTarget* curRenderTarget = fCurContext->wrapBackendRenderTarget(desc);
+ SkSafeUnref(fGpuDevice);
+ SkSafeUnref(fCanvas);
+ fGpuDevice = new SkGpuDevice(fCurContext, curRenderTarget);
+ fCanvas = new SkCanvas(fGpuDevice);
+ }
+ fDebugger->resize(w, h);
+ draw();
+}
+
+void SkGLWidget::paintGL() {
+ if (!this->isHidden() && fCanvas) {
+ fDebugger->draw(fCanvas);
+ // TODO(chudy): Implement an optional flush button in Gui.
+ fCanvas->flush();
+ emit drawComplete();
+ }
+}
+
+GrBackendRenderTargetDesc SkGLWidget::getDesc(int w, int h) {
+ GrBackendRenderTargetDesc desc;
+ desc.fWidth = SkScalarRoundToInt(this->width());
+ desc.fHeight = SkScalarRoundToInt(this->height());
+ desc.fConfig = kSkia8888_GrPixelConfig;
+ GR_GL_GetIntegerv(fCurIntf, GR_GL_SAMPLES, &desc.fSampleCnt);
+ GR_GL_GetIntegerv(fCurIntf, GR_GL_STENCIL_BITS, &desc.fStencilBits);
+ GrGLint buffer;
+ GR_GL_GetIntegerv(fCurIntf, GR_GL_FRAMEBUFFER_BINDING, &buffer);
+ desc.fRenderTargetHandle = buffer;
+
+ return desc;
+}
+
+#endif