blob: a8d5dd26ebdf7437251002813a3f23c19bc64b1a [file] [log] [blame]
/*
* 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