Skip to content

Commit 7fcd3c3

Browse files
committed
Check if fbo is srgb
1 parent e29a6d2 commit 7fcd3c3

5 files changed

Lines changed: 33 additions & 0 deletions

File tree

kivy/graphics/cgl.pxd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ cdef extern from "gl_redirect.h":
177177
int GL_ALPHA
178178
int GL_RGB
179179
int GL_RGBA
180+
int GL_SRGB
180181
int GL_LUMINANCE
181182
int GL_LUMINANCE_ALPHA
182183

@@ -342,6 +343,7 @@ cdef extern from "gl_redirect.h":
342343
int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
343344
int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL
344345
int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE
346+
int GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
345347

346348
int GL_COLOR_ATTACHMENT0
347349
int GL_DEPTH_ATTACHMENT

kivy/graphics/fbo.pyx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ if platform == "darwin":
9898
# Adding it to headers can be complicated because it doesn't exists in gl2.h
9999
cdef int GL_DEPTH_STENCIL_ATTACHMENT = 0x821A
100100

101+
cdef srgb_to_linear(c):
102+
if (c <= 0.04045):
103+
return c / 12.92
104+
else:
105+
return pow((c + 0.055) / 1.055, 2.4)
106+
101107

102108
cdef class Fbo(RenderContext):
103109
'''Fbo class for wrapping the OpenGL Framebuffer extension. The Fbo support
@@ -493,12 +499,31 @@ cdef class Fbo(RenderContext):
493499
494500
.. versionadded:: 1.8.0
495501
"""
502+
cdef GLint encoding
503+
496504
if wx > self._width or wy > self._height:
497505
# window coordinates should not exceed the
498506
# frame buffer size
499507
return (0, 0, 0, 0)
508+
500509
self.bind()
510+
501511
data = py_glReadPixels(wx, wy, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE)
512+
513+
cgl.glGetFramebufferAttachmentParameteriv(
514+
GL_FRAMEBUFFER,
515+
GL_COLOR_ATTACHMENT0,
516+
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING,
517+
&encoding
518+
)
519+
520+
if encoding == GL_SRGB:
521+
# convert from sRGB to linear RGB
522+
data[0] = srgb_to_linear(data[0] / 255.0)
523+
data[1] = srgb_to_linear(data[1] / 255.0)
524+
data[2] = srgb_to_linear(data[2] / 255.0)
525+
data[3] = data[3] / 255.0
526+
502527
self.release()
503528

504529
return [i for i in data]

kivy/graphics/opengl.pyx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ GL_DEPTH_COMPONENT = cgldef.GL_DEPTH_COMPONENT
171171
GL_ALPHA = cgldef.GL_ALPHA
172172
GL_RGB = cgldef.GL_RGB
173173
GL_RGBA = cgldef.GL_RGBA
174+
GL_SRGB = cgldef.GL_SRGB
174175
GL_LUMINANCE = cgldef.GL_LUMINANCE
175176
GL_LUMINANCE_ALPHA = cgldef.GL_LUMINANCE_ALPHA
176177
GL_UNSIGNED_SHORT_4_4_4_4 = cgldef.GL_UNSIGNED_SHORT_4_4_4_4
@@ -312,6 +313,7 @@ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = cgldef.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_
312313
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = cgldef.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
313314
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = cgldef.GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL
314315
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = cgldef.GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE
316+
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = cgldef.GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
315317
GL_COLOR_ATTACHMENT0 = cgldef.GL_COLOR_ATTACHMENT0
316318
GL_DEPTH_ATTACHMENT = cgldef.GL_DEPTH_ATTACHMENT
317319
GL_STENCIL_ATTACHMENT = cgldef.GL_STENCIL_ATTACHMENT

kivy/include/common_subset.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ typedef khronos_ssize_t GLsizeiptr;
154154
#define GL_ALPHA 0x1906
155155
#define GL_RGB 0x1907
156156
#define GL_RGBA 0x1908
157+
#define GL_SRGB 0x8C40
157158
#define GL_LUMINANCE 0x1909
158159
#define GL_LUMINANCE_ALPHA 0x190A
159160
#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
@@ -450,6 +451,7 @@ GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width,
450451
#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
451452
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
452453
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
454+
#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
453455
#define GL_COLOR_ATTACHMENT0 0x8CE0
454456
#define GL_DEPTH_ATTACHMENT 0x8D00
455457
#define GL_STENCIL_ATTACHMENT 0x8D20

kivy/tools/gles_compat/gl2.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ typedef khronos_ssize_t GLsizeiptr;
246246
#define GL_ALPHA 0x1906
247247
#define GL_RGB 0x1907
248248
#define GL_RGBA 0x1908
249+
#define GL_SRGB 0x8C40
249250
#define GL_LUMINANCE 0x1909
250251
#define GL_LUMINANCE_ALPHA 0x190A
251252

@@ -448,6 +449,7 @@ typedef khronos_ssize_t GLsizeiptr;
448449
#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
449450
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
450451
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
452+
#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
451453

452454
#define GL_COLOR_ATTACHMENT0 0x8CE0
453455
#define GL_DEPTH_ATTACHMENT 0x8D00

0 commit comments

Comments
 (0)