Mercurial > hg > octave-nkf
diff libinterp/corefcn/gl-render.cc @ 18838:44f0d1a53ead
Add support for integer data types for image cdata.
* gl-render.cc (draw_image): Add support for 'single' data type by
converting FloatNDArray to GLfloat.
* graphics.cc (convert_cdata_2): Change function signature to add is_real
parameter. Convert data from 1-based indexing to 0-based indexing only
if is_real is true.
* graphics.cc (convert_cdata_1): Change function signature to add is_real
parameter. Pass is_real through to convert_cdata_2.
* graphics.cc (convert_cdata): Change CONVERT_CDATA_1 macro to support IS_REAL
argument. Pass IS_REAL through to convert_cdata_1. Add support for uint16
data type.
* image.m: Remove hack converting all integer cdata to single data type.
author | Rik <rik@octave.org> |
---|---|
date | Sat, 26 Apr 2014 16:39:20 -0700 |
parents | 8c537222f1e5 |
children | 8969bd721448 |
line wrap: on
line diff
--- a/libinterp/corefcn/gl-render.cc +++ b/libinterp/corefcn/gl-render.cc @@ -2692,7 +2692,7 @@ glRasterPos3d (im_xmin + nor_dx*j0, im_ymin + nor_dy*i0, 0); // by default this is 4 - glPixelStorei (GL_UNPACK_ALIGNMENT,1); + glPixelStorei (GL_UNPACK_ALIGNMENT, 1); // Expect RGB data if (dv.length () == 3 && dv(2) == 3) @@ -2716,6 +2716,44 @@ draw_pixels (j1-j0, i1-i0, GL_RGB, GL_FLOAT, a); } + else if (cdata.is_single_type ()) + { + const FloatNDArray xcdata = cdata.float_array_value (); + + OCTAVE_LOCAL_BUFFER (GLfloat, a, 3*(j1-j0)*(i1-i0)); + + for (int i = i0; i < i1; i++) + { + for (int j = j0, idx = (i-i0)*(j1-j0)*3; j < j1; j++, idx += 3) + { + a[idx] = xcdata(i,j,0); + a[idx+1] = xcdata(i,j,1); + a[idx+2] = xcdata(i,j,2); + } + } + + draw_pixels (j1-j0, i1-i0, GL_RGB, GL_FLOAT, a); + + } + else if (cdata.is_uint8_type ()) + { + const uint8NDArray xcdata = cdata.uint8_array_value (); + + OCTAVE_LOCAL_BUFFER (GLubyte, a, 3*(j1-j0)*(i1-i0)); + + for (int i = i0; i < i1; i++) + { + for (int j = j0, idx = (i-i0)*(j1-j0)*3; j < j1; j++, idx += 3) + { + a[idx] = xcdata(i,j,0); + a[idx+1] = xcdata(i,j,1); + a[idx+2] = xcdata(i,j,2); + } + } + + draw_pixels (j1-j0, i1-i0, GL_RGB, GL_UNSIGNED_BYTE, a); + + } else if (cdata.is_uint16_type ()) { const uint16NDArray xcdata = cdata.uint16_array_value (); @@ -2735,26 +2773,8 @@ draw_pixels (j1-j0, i1-i0, GL_RGB, GL_UNSIGNED_SHORT, a); } - else if (cdata.is_uint8_type ()) - { - const uint8NDArray xcdata = cdata.uint8_array_value (); - - OCTAVE_LOCAL_BUFFER (GLubyte, a, 3*(j1-j0)*(i1-i0)); - - for (int i = i0; i < i1; i++) - { - for (int j = j0, idx = (i-i0)*(j1-j0)*3; j < j1; j++, idx += 3) - { - a[idx] = xcdata(i,j,0); - a[idx+1] = xcdata(i,j,1); - a[idx+2] = xcdata(i,j,2); - } - } - - draw_pixels (j1-j0, i1-i0, GL_RGB, GL_UNSIGNED_BYTE, a); - } else - warning ("opengl_renderer: invalid image data type (expected double, uint8, or uint16)"); + warning ("opengl_renderer: invalid image data type (expected double, single, uint8, or uint16)"); } else warning ("opengl_renderer: invalid image size (expected MxNx3 or MxN)");