diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-11-13 00:16:53 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-11-13 00:16:53 +0300 |
commit | bdfe7d89e2f1292644577972c716931b4ce3c6c3 (patch) | |
tree | d00eb50b749cb001e2b08272c91791e66740b05d /extern/libredcode/debayer.c | |
parent | 78a1c27c4a6abe0ed31ca93ad21910f3df04da56 (diff) | |
parent | 7e4db234cee71ead34ee81a12e27da4bd548eb4b (diff) |
Merge of trunk into blender 2.5:
svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r12987:17416
Issues:
* GHOST/X11 had conflicting changes. Some code was added in 2.5, which was
later added in trunk also, but reverted partially, specifically revision
16683. I have left out this reversion in the 2.5 branch since I think it is
needed there.
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16683
* Scons had various conflicting changes, I decided to go with trunk version
for everything except priorities and some library renaming.
* In creator.c, there were various fixes and fixes for fixes related to the -w
-W and -p options. In 2.5 -w and -W is not coded yet, and -p is done
differently. Since this is changed so much, and I don't think those fixes
would be needed in 2.5, I've left them out.
* Also in creator.c: there was code for a python bugfix where the screen was not
initialized when running with -P. The code that initializes the screen there
I had to disable, that can't work in 2.5 anymore but left it commented as a
reminder.
Further I had to disable some new function calls. using src/ and python/, as
was done already in this branch, disabled function calls:
* bpath.c: error reporting
* BME_conversions.c: editmesh conversion functions.
* SHD_dynamic: disabled almost completely, there is no python/.
* KX_PythonInit.cpp and Ketsji/ build files: Mathutils is not there, disabled.
* text.c: clipboard copy call.
* object.c: OB_SUPPORT_MATERIAL.
* DerivedMesh.c and subsurf_ccg, stipple_quarttone.
Still to be done:
* Go over files and functions that were moved to a different location but could
still use changes that were done in trunk.
Diffstat (limited to 'extern/libredcode/debayer.c')
-rw-r--r-- | extern/libredcode/debayer.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/extern/libredcode/debayer.c b/extern/libredcode/debayer.c new file mode 100644 index 00000000000..de7bec510cb --- /dev/null +++ b/extern/libredcode/debayer.c @@ -0,0 +1,123 @@ +#include "debayer.h" + +/* pretty simple but astonishingly very effective "debayer" function + */ + +void redcode_ycbcr2rgb_fullscale( + int ** planes, int width, int height, float * out) +{ + int x,y; + int pix_max = 4096; + int mask = pix_max - 1; + float *o; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + int i = x + y*width; + int i_p = (y > 0) ? i-width : i; + int i_n = (y < (height-1)) ? i + width : i; + float y1n = planes[0][i_n] & mask; + float y1 = planes[0][i] & mask; + float cb = (planes[1][i] & mask) - pix_max/2; + float cr = (planes[2][i] & mask) - pix_max/2; + float y2 = (planes[3][i] & mask); + float y2p = (planes[3][i_p] & mask); + + float b_ = cb /(pix_max/2); + float r_ = cr /(pix_max/2); + float g_ = 0.0; + + float y_[4] = {y1 / pix_max, + (y2 + y2p)/2 / pix_max, + (y1 + y1n)/2 / pix_max, + y2 / pix_max}; + + int j; + int yc = 0; + + o = out + (2*height-1-2*y)*2*4*width + + x*2*4; + + for (j = 0; j < 8; j += 4) { + o[j+0] = r_ + y_[yc]; + o[j+1] = g_ + y_[yc]; + o[j+2] = b_ + y_[yc]; + o[j+3] = 1.0; + yc++; + } + + o = out + (2*height-1-2*y)*2*4*width + + x*2*4 - 2*4*width; + + for (j = 0; j < 8; j += 4) { + o[j+0] = r_ + y_[yc]; + o[j+1] = g_ + y_[yc]; + o[j+2] = b_ + y_[yc]; + o[j+3] = 1.0; + yc++; + } + } + } +} + +void redcode_ycbcr2rgb_halfscale( + int ** planes, int width, int height, float * out) +{ + int x,y; + int pix_max = 4096; + int mask = pix_max - 1; + + for (y = 0; y < height; y++) { + float *o = out + width * (height - y - 1); + for (x = 0; x < width; x++) { + int i = y*height + x; + float y1 = (planes[0][i] & mask); + float cb = (planes[1][i] & mask) - pix_max/2; + float cr = (planes[2][i] & mask) - pix_max/2; + float y2 = (planes[3][i] & mask); + + float b_ = cb /(pix_max/2); + float r_ = cr /(pix_max/2); + float g_ = 0.0; + + float y = (y1 + y2)/2 / pix_max; + + *o++ = r_ + y; + *o++ = g_ + y; + *o++ = b_ + y; + *o++ = 1.0; + } + } +} + + +void redcode_ycbcr2rgb_quarterscale( + int ** planes, int width, int height, float * out) +{ + int x,y; + int pix_max = 4096; + int mask = pix_max - 1; + + for (y = 0; y < height; y += 2) { + float *o = out + (width/2) * (height/2 - y/2 - 1); + for (x = 0; x < width; x += 2) { + int i = y * width + x; + float y1 = planes[0][i] & mask; + float cb = (planes[1][i] & mask) - pix_max/2; + float cr = (planes[2][i] & mask) - pix_max/2; + float y2 = planes[3][i] & mask; + + float b_ = cb /(pix_max/2); + float r_ = cr /(pix_max/2); + float g_ = 0.0; + + float y = (y1 + y2)/2 / pix_max; + + *o++ = r_ + y; + *o++ = g_ + y; + *o++ = b_ + y; + *o++ = 1.0; + } + } +} + |