1 #include "SkGLDevice_FBO.h"
2 #include "SkRegion.h"
3
SkGLDevice_FBO(const SkBitmap & bitmap,bool offscreen)4 SkGLDevice_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
~SkGLDevice_FBO()34 SkGLDevice_FBO::~SkGLDevice_FBO() {
35 if (fTextureID) {
36 glDeleteTextures(1, &fTextureID);
37 }
38 if (fFBO) {
39 glDeleteFramebuffersEXT(1, &fFBO);
40 }
41 }
42
bindDeviceAsTexture()43 SkGLDevice::TexOrientation SkGLDevice_FBO::bindDeviceAsTexture() {
44 if (fTextureID) {
45 glBindTexture(GL_TEXTURE_2D, fTextureID);
46 return kBottomToTop_TexOrientation;
47 }
48 return kNo_TexOrientation;
49 }
50
gainFocus(SkCanvas * canvas)51 void 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
58