blob: 8b6e8572a2cd07c59e6fc49f9646ab23ad9f0511 [file] [log] [blame]
chudy@google.comea5488b2012-07-26 19:38:22 +00001
2/*
3 * Copyright 2012 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10#include "SkGLWidget.h"
11
chudy@google.com607357f2012-08-07 16:12:23 +000012SkGLWidget::SkGLWidget(SkDebugger* debugger) : QGLWidget() {
chudy@google.comea5488b2012-07-26 19:38:22 +000013 this->setStyleSheet("QWidget {background-color: white; border: 1px solid #cccccc;}");
chudy@google.com607357f2012-08-07 16:12:23 +000014 fDebugger = debugger;
chudy@google.com2d537a12012-07-31 12:49:52 +000015 fCurIntf = NULL;
16 fCurContext = NULL;
17 fGpuDevice = NULL;
chudy@google.com830b8792012-08-01 15:57:52 +000018 fCanvas = NULL;
chudy@google.comea5488b2012-07-26 19:38:22 +000019}
20
21SkGLWidget::~SkGLWidget() {
22 SkSafeUnref(fCurIntf);
23 SkSafeUnref(fCurContext);
24 SkSafeUnref(fGpuDevice);
chudy@google.com830b8792012-08-01 15:57:52 +000025 SkSafeUnref(fCanvas);
chudy@google.comea5488b2012-07-26 19:38:22 +000026}
27
28void SkGLWidget::initializeGL() {
29 fCurIntf = GrGLCreateNativeInterface();
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000030 fCurContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) fCurIntf);
31 GrBackendRenderTargetDesc desc = this->getDesc(this->width(), this->height());
32 GrRenderTarget* curRenderTarget = fCurContext->wrapBackendRenderTarget(desc);
chudy@google.comea5488b2012-07-26 19:38:22 +000033 fGpuDevice = new SkGpuDevice(fCurContext, curRenderTarget);
chudy@google.com830b8792012-08-01 15:57:52 +000034 fCanvas = new SkCanvas(fGpuDevice);
chudy@google.comea5488b2012-07-26 19:38:22 +000035 curRenderTarget->unref();
36
37 glClearColor(1, 1, 1, 0);
38 glClearStencil(0);
39 glClear(GL_STENCIL_BUFFER_BIT);
40}
41
42void SkGLWidget::resizeGL(int w, int h) {
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000043 GrBackendRenderTargetDesc desc = this->getDesc(w, h);
44 GrRenderTarget* curRenderTarget = fCurContext->wrapBackendRenderTarget(desc);
chudy@google.comea5488b2012-07-26 19:38:22 +000045 SkSafeUnref(fGpuDevice);
chudy@google.com830b8792012-08-01 15:57:52 +000046 SkSafeUnref(fCanvas);
chudy@google.comea5488b2012-07-26 19:38:22 +000047 fGpuDevice = new SkGpuDevice(fCurContext, curRenderTarget);
chudy@google.com830b8792012-08-01 15:57:52 +000048 fCanvas = new SkCanvas(fGpuDevice);
chudy@google.com607357f2012-08-07 16:12:23 +000049 fDebugger->resize(w, h);
50 draw();
chudy@google.comea5488b2012-07-26 19:38:22 +000051}
52
53void SkGLWidget::paintGL() {
chudy@google.com607357f2012-08-07 16:12:23 +000054 if (!this->isHidden()) {
chudy@google.com607357f2012-08-07 16:12:23 +000055 fDebugger->draw(fCanvas);
56 // TODO(chudy): Implement an optional flush button in Gui.
57 fCanvas->flush();
58 emit drawComplete();
59 }
chudy@google.comea5488b2012-07-26 19:38:22 +000060}
61
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000062GrBackendRenderTargetDesc SkGLWidget::getDesc(int w, int h) {
63 GrBackendRenderTargetDesc desc;
chudy@google.comea5488b2012-07-26 19:38:22 +000064 desc.fWidth = SkScalarRound(this->width());
65 desc.fHeight = SkScalarRound(this->height());
66 desc.fConfig = kSkia8888_PM_GrPixelConfig;
67 GR_GL_GetIntegerv(fCurIntf, GR_GL_SAMPLES, &desc.fSampleCnt);
68 GR_GL_GetIntegerv(fCurIntf, GR_GL_STENCIL_BITS, &desc.fStencilBits);
69 GrGLint buffer;
70 GR_GL_GetIntegerv(fCurIntf, GR_GL_FRAMEBUFFER_BINDING, &buffer);
71 desc.fRenderTargetHandle = buffer;
72
73 return desc;
74}