blob: 552d61902e97296d0496b7ffc9609b4a49956237 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#include "SkGLDevice_FBO.h"
2#include "SkRegion.h"
3
4SkGLDevice_FBO::SkGLDevice_FBO(const SkBitmap& bitmap, bool offscreen)
5 : SkGLDevice(bitmap, offscreen) {
6 fFBO = 0;
7 fTextureID = 0;
8
9 if (offscreen) {
10 int nw = SkNextPow2(bitmap.rowBytesAsPixels());
11 int nh = SkNextPow2(bitmap.height());
12
13 glGenFramebuffersEXT(1, &fFBO);
14 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fFBO);
15
16 glGenTextures(1, &fTextureID);
17 glBindTexture(GL_TEXTURE_2D, fTextureID);
18 SkGL::SetTexParamsClamp(false);
19 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nw, nh, 0,
20 GL_RGBA, GL_UNSIGNED_BYTE, NULL);
21
22 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
23 GL_TEXTURE_2D, fTextureID, 0);
24 GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
25 if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
26 SkDebugf("-- glCheckFramebufferStatusEXT %x\n", status);
27 }
28
29 // now reset back to "normal" drawing target
30 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
31 }
32}
33
34SkGLDevice_FBO::~SkGLDevice_FBO() {
35 if (fTextureID) {
36 glDeleteTextures(1, &fTextureID);
37 }
38 if (fFBO) {
39 glDeleteFramebuffersEXT(1, &fFBO);
40 }
41}
42
43SkGLDevice::TexOrientation SkGLDevice_FBO::bindDeviceAsTexture() {
44 if (fTextureID) {
45 glBindTexture(GL_TEXTURE_2D, fTextureID);
46 return kBottomToTop_TexOrientation;
47 }
48 return kNo_TexOrientation;
49}
50
51void SkGLDevice_FBO::gainFocus(SkCanvas* canvas) {
52 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fFBO);
53
54 // now we're ready for the viewport and projection matrix
55 this->INHERITED::gainFocus(canvas);
56}
57