blob: a9a625ac709a55cace59bd62849fa641fba81424 [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();
30 fCurContext = GrContext::Create(kOpenGL_Shaders_GrEngine, (GrPlatform3DContext) fCurIntf);
31 GrRenderTarget* curRenderTarget = fCurContext->createPlatformRenderTarget(getDesc(this->width(), this->height()));
32 fGpuDevice = new SkGpuDevice(fCurContext, curRenderTarget);
chudy@google.com830b8792012-08-01 15:57:52 +000033 fCanvas = new SkCanvas(fGpuDevice);
chudy@google.comea5488b2012-07-26 19:38:22 +000034 curRenderTarget->unref();
35
36 glClearColor(1, 1, 1, 0);
37 glClearStencil(0);
38 glClear(GL_STENCIL_BUFFER_BIT);
39}
40
41void SkGLWidget::resizeGL(int w, int h) {
42 GrRenderTarget* curRenderTarget = fCurContext->createPlatformRenderTarget(getDesc(w,h));
43 SkSafeUnref(fGpuDevice);
chudy@google.com830b8792012-08-01 15:57:52 +000044 SkSafeUnref(fCanvas);
chudy@google.comea5488b2012-07-26 19:38:22 +000045 fGpuDevice = new SkGpuDevice(fCurContext, curRenderTarget);
chudy@google.com830b8792012-08-01 15:57:52 +000046 fCanvas = new SkCanvas(fGpuDevice);
chudy@google.com607357f2012-08-07 16:12:23 +000047 fDebugger->resize(w, h);
48 draw();
chudy@google.comea5488b2012-07-26 19:38:22 +000049}
50
51void SkGLWidget::paintGL() {
chudy@google.com607357f2012-08-07 16:12:23 +000052 if (!this->isHidden()) {
chudy@google.com607357f2012-08-07 16:12:23 +000053 fDebugger->draw(fCanvas);
54 // TODO(chudy): Implement an optional flush button in Gui.
55 fCanvas->flush();
56 emit drawComplete();
57 }
chudy@google.comea5488b2012-07-26 19:38:22 +000058}
59
60GrPlatformRenderTargetDesc SkGLWidget::getDesc(int w, int h) {
61 GrPlatformRenderTargetDesc desc;
62 desc.fWidth = SkScalarRound(this->width());
63 desc.fHeight = SkScalarRound(this->height());
64 desc.fConfig = kSkia8888_PM_GrPixelConfig;
65 GR_GL_GetIntegerv(fCurIntf, GR_GL_SAMPLES, &desc.fSampleCnt);
66 GR_GL_GetIntegerv(fCurIntf, GR_GL_STENCIL_BITS, &desc.fStencilBits);
67 GrGLint buffer;
68 GR_GL_GetIntegerv(fCurIntf, GR_GL_FRAMEBUFFER_BINDING, &buffer);
69 desc.fRenderTargetHandle = buffer;
70
71 return desc;
72}