| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "ColorConvert.h" |
| |
| #ifndef max |
| #define max(a,b) ((a) > (b) ? (a) : (b)) |
| #endif |
| #ifndef min |
| #define min(a,b) ((a) < (b) ? (a) : (b)) |
| #endif |
| |
| namespace android { |
| |
| void YUVToRGB( |
| int32_t y, int32_t u, int32_t v, |
| int32_t* r, int32_t* g, int32_t* b) { |
| y -= 16; |
| u -= 128; |
| v -= 128; |
| |
| *b = 1192 * y + 2066 * u; |
| *g = 1192 * y - 833 * v - 400 * u; |
| *r = 1192 * y + 1634 * v; |
| |
| *r = min(262143, max(0, *r)); |
| *g = min(262143, max(0, *g)); |
| *b = min(262143, max(0, *b)); |
| |
| *r >>= 10; |
| *g >>= 10; |
| *b >>= 10; |
| } |
| |
| void convertYUV420spToARGB( |
| uint8_t *pY, uint8_t *pUV, int32_t width, int32_t height, |
| uint8_t *dest) { |
| const int32_t bytes_per_pixel = 2; |
| |
| for (int32_t i = 0; i < height; i++) { |
| for (int32_t j = 0; j < width; j++) { |
| int32_t y = *(pY + i * width + j); |
| int32_t u = *(pUV + (i/2) * width + bytes_per_pixel * (j/2)); |
| int32_t v = *(pUV + (i/2) * width + bytes_per_pixel * (j/2) + 1); |
| |
| int32_t r, g, b; |
| YUVToRGB(y, u, v, &r, &g, &b); |
| |
| *dest++ = 0xFF; |
| *dest++ = r; |
| *dest++ = g; |
| *dest++ = b; |
| } |
| } |
| } |
| |
| void convertYUV420spToRGB888( |
| uint8_t *pY, uint8_t *pUV, int32_t width, int32_t height, |
| uint8_t *dest) { |
| const int32_t bytes_per_pixel = 2; |
| |
| for (int32_t i = 0; i < height; i++) { |
| for (int32_t j = 0; j < width; j++) { |
| int32_t y = *(pY + i * width + j); |
| int32_t u = *(pUV + (i/2) * width + bytes_per_pixel * (j/2)); |
| int32_t v = *(pUV + (i/2) * width + bytes_per_pixel * (j/2) + 1); |
| |
| int32_t r, g, b; |
| YUVToRGB(y, u, v, &r, &g, &b); |
| |
| *dest++ = r; |
| *dest++ = g; |
| *dest++ = b; |
| } |
| } |
| } |
| |
| // HACK - not even slightly optimized |
| // TODO: remove when RGBA support is added to SoftwareRenderer |
| void convertRGBAToARGB( |
| uint8_t *src, int32_t width, int32_t height, uint32_t stride, |
| uint8_t *dest) { |
| for (int32_t i = 0; i < height; ++i) { |
| for (int32_t j = 0; j < width; ++j) { |
| uint8_t r = *src++; |
| uint8_t g = *src++; |
| uint8_t b = *src++; |
| uint8_t a = *src++; |
| *dest++ = a; |
| *dest++ = r; |
| *dest++ = g; |
| *dest++ = b; |
| } |
| src += (stride - width) * 4; |
| } |
| } |
| |
| } // namespace android |