| |
| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| #include "SkGLDevice_FBO.h" |
| #include "SkRegion.h" |
| |
| SkGLDevice_FBO::SkGLDevice_FBO(const SkBitmap& bitmap, bool offscreen) |
| : SkGLDevice(bitmap, offscreen) { |
| fFBO = 0; |
| fTextureID = 0; |
| |
| if (offscreen) { |
| int nw = SkNextPow2(bitmap.rowBytesAsPixels()); |
| int nh = SkNextPow2(bitmap.height()); |
| |
| glGenFramebuffersEXT(1, &fFBO); |
| glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fFBO); |
| |
| glGenTextures(1, &fTextureID); |
| glBindTexture(GL_TEXTURE_2D, fTextureID); |
| SkGL::SetTexParamsClamp(false); |
| glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nw, nh, 0, |
| GL_RGBA, GL_UNSIGNED_BYTE, NULL); |
| |
| glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, |
| GL_TEXTURE_2D, fTextureID, 0); |
| GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); |
| if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { |
| SkDebugf("-- glCheckFramebufferStatusEXT %x\n", status); |
| } |
| |
| // now reset back to "normal" drawing target |
| glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); |
| } |
| } |
| |
| SkGLDevice_FBO::~SkGLDevice_FBO() { |
| if (fTextureID) { |
| glDeleteTextures(1, &fTextureID); |
| } |
| if (fFBO) { |
| glDeleteFramebuffersEXT(1, &fFBO); |
| } |
| } |
| |
| SkGLDevice::TexOrientation SkGLDevice_FBO::bindDeviceAsTexture() { |
| if (fTextureID) { |
| glBindTexture(GL_TEXTURE_2D, fTextureID); |
| return kBottomToTop_TexOrientation; |
| } |
| return kNo_TexOrientation; |
| } |
| |
| void SkGLDevice_FBO::gainFocus(SkCanvas* canvas) { |
| glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fFBO); |
| |
| // now we're ready for the viewport and projection matrix |
| this->INHERITED::gainFocus(canvas); |
| } |
| |