165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/*
265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project
365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License");
565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License.
665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at
765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *      http://www.apache.org/licenses/LICENSE-2.0
965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software
1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS,
1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and
1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License.
1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <stdlib.h>
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
19e5160e7e59f96aa457e7a4217197150086e8b7caAndreas Gampe#define ATTRIBUTE_UNUSED __attribute__((unused))
20e5160e7e59f96aa457e7a4217197150086e8b7caAndreas Gampe
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint gray_to_rgb_process(const char** inputs,
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        const int* input_sizes,
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        int input_count,
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        char* output,
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        int output_size,
26e5160e7e59f96aa457e7a4217197150086e8b7caAndreas Gampe                        void* user_data ATTRIBUTE_UNUSED) {
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Make sure we have exactly one input
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (input_count != 1)
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Make sure sizes match up
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (input_sizes[0] != output_size/3)
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Get the input and output pointers
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  const char* input_ptr = inputs[0];
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  char* output_ptr = output;
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (!input_ptr || !output_ptr)
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Run the conversion
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  int i;
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (i = 0; i < input_sizes[0]; ++i) {
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr);
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr);
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr++);
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return 1;
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint rgba_to_rgb_process(const char** inputs,
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        const int* input_sizes,
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        int input_count,
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        char* output,
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        int output_size,
57e5160e7e59f96aa457e7a4217197150086e8b7caAndreas Gampe                        void* user_data ATTRIBUTE_UNUSED) {
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Make sure we have exactly one input
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (input_count != 1)
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Make sure sizes match up
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (input_sizes[0]/4 != output_size/3)
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Get the input and output pointers
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  const char* input_ptr = inputs[0];
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  char* output_ptr = output;
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (!input_ptr || !output_ptr)
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Run the conversion
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  int i;
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (i = 0; i < input_sizes[0] / 4; ++i) {
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr++);
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr++);
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr++);
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ++input_ptr;
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return 1;
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint gray_to_rgba_process(const char** inputs,
8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                         const int* input_sizes,
8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                         int input_count,
8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                         char* output,
8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                         int output_size,
89e5160e7e59f96aa457e7a4217197150086e8b7caAndreas Gampe                         void* user_data ATTRIBUTE_UNUSED) {
9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Make sure we have exactly one input
9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (input_count != 1)
9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Make sure sizes match up
9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (input_sizes[0] != output_size/4)
9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Get the input and output pointers
9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  const char* input_ptr = inputs[0];
10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  char* output_ptr = output;
10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (!input_ptr || !output_ptr)
10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Run the conversion
10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  int i;
10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (i = 0; i < input_sizes[0]; ++i) {
10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr);
10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr);
10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr++);
11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = 255;
11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return 1;
11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennint rgb_to_rgba_process(const char** inputs,
11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        const int* input_sizes,
11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        int input_count,
11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        char* output,
12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                        int output_size,
121e5160e7e59f96aa457e7a4217197150086e8b7caAndreas Gampe                        void* user_data ATTRIBUTE_UNUSED) {
12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Make sure we have exactly one input
12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (input_count != 1)
12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Make sure sizes match up
12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (input_sizes[0]/3 != output_size/4)
12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Get the input and output pointers
13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  const char* input_ptr = inputs[0];
13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  char* output_ptr = output;
13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (!input_ptr || !output_ptr)
13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return 0;
13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Run the conversion
13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  int i;
13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (i = 0; i < output_size / 4; ++i) {
13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr++);
14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr++);
14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = *(input_ptr++);
14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    *(output_ptr++) = 255;
14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return 1;
14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
148