packages feed

graphicstools-0.2: c/convert.c

#include <stdint.h>
#include <string.h>
#include "convert.h"

void cpy_ipl_d8_gray_to_d8_rgb(IplImage *src, void *dst)
{
    uint8_t *src_data, *dst_data, value;
    src_data = (uint8_t *)src->imageData;
    dst_data = (uint8_t *)dst;

    if (src->width == src->widthStep) {
        PRINT("D8 Gray Continuous\n");
        unsigned int i, size, pos;
        size = src->width * src->height;
        for (i = size, pos = (size - 1) * 3; i--; pos -= 3) {
            value = src_data[i];
            dst_data[pos] = dst_data[pos + 1] = dst_data[pos + 2] = value;
        }
    }
    else {
        PRINT("D8 Gray Discontinuous\n");
        unsigned int x, y, width, height, stride, data_pos, pos;
        width = src->width;
        height = src->height;
        stride = src->widthStep;
        for (y = 0; y < height; y++) {
            data_pos = y * stride;
            pos = y * width * 3;
            for (x = 0; x < width; x++, data_pos++, pos += 3) {
                value = src_data[data_pos];
                dst_data[pos] = dst_data[pos + 1] = dst_data[pos + 2] = value;
            }
        }
    }
}

void cpy_ipl_f32_gray_to_d8_rgb(IplImage *src, void *dst)
{
    float *src_data;
    unsigned int src_width, src_height, src_stride;
    uint8_t *dst_data, value;

    src_data = (float *)src->imageData;
    src_width =  src->width;
    src_height = src->height;
    src_stride = src->widthStep / sizeof(float);
    dst_data = (uint8_t *)dst;

    if (src_width == src_stride) {
        PRINT("D32 Gray Continuous\n");
        unsigned int size, src_pos, dst_pos;

        size = src_width * src_height;
        dst_pos = (size - 1) * 3;
        for (src_pos = size; src_pos--; dst_pos -= 3) {
            value = (uint8_t)(255 * src_data[src_pos]);
            dst_data[dst_pos] = dst_data[dst_pos + 1] = dst_data[dst_pos + 2] = value;
        }
    }
    else {
        PRINT("D32 Gray Discontinuous\n");
        unsigned int x, y, src_stride, dst_stride, src_pos, dst_pos;

        dst_stride = src_width * 3;
        for (y = 0; y < src_height; y++) {
            src_pos = y * src_stride;
            dst_pos = y * dst_stride;
            for (x = 0; x < src_width; x++, src_pos++, dst_pos += 3) {
                value = (uint8_t)(255 * src_data[src_pos]);
                dst_data[dst_pos] = dst_data[dst_pos + 1] = dst_data[dst_pos + 2] = value;
            }
        }
    }
}

void cpy_ipl_d8_rgb_to_d8_rgb(IplImage *src, void *dst)
{
    uint8_t *src_pos, *dst_pos, r, g, b;
    src_pos = (uint8_t *)src->imageData;
    dst_pos = (uint8_t *)dst;

    /* if image is continuous, can memcpy whole buffer */
    if (src->width * 3 == src->widthStep) {
        PRINT("D8 RGB Continuous\n");
        unsigned int size;

        size = src->height * src->width * 3 * sizeof(uint8_t);
        memcpy(dst_pos, src_pos, size);
    }
    /* otherwise, must memcpy one row at a time */
    else {
        PRINT("D8 RGB Discontinuous\n");
        unsigned int size, y, height, src_stride, dst_stride;

        size = src->width * 3 * sizeof(uint8_t);
        height = src->height;
        src_stride = src->widthStep;
        dst_stride = src->width * 3;
        for (y = 0; y < height; y++, src_pos += src_stride, dst_pos += dst_stride) {
            memcpy(dst_pos, src_pos, size);
        }
    }
}

void cpy_ipl_f32_rgb_to_d8_rgb(IplImage *src, void *dst)
{
    float *src_pos, r, g, b;
    uint8_t *dst_pos;
    unsigned int src_stride;

    src_pos = (float *)src->imageData;
    dst_pos = (uint8_t *)dst;
    src_stride = src->widthStep / sizeof(float);

    /* if image is continuous, can use a single loop */
    if (src->width * 3 == src_stride) {
        PRINT("D32 RGB Continuous\n");
        unsigned int i, size, pos;
        size = src->width * src->height;
        for (i = size, pos = (size - 1) * 3; i--; pos -= 3) {
            r = src_pos[pos];
            g = src_pos[pos + 1];
            b = src_pos[pos + 2];
            dst_pos[pos]     = (uint8_t)(255 * r);
            dst_pos[pos + 1] = (uint8_t)(255 * g);
            dst_pos[pos + 2] = (uint8_t)(255 * b);
        }
    }
    /* otherwise, must go row-wise in two loops */
    else {
        PRINT("D32 RGB Discontinuous\n");
        unsigned int x, y, width, height, data_pos, pos;
        width = src->width;
        height = src->height;
        for (y = 0; y < height; y++) {
            data_pos = y * src_stride;
            pos = y * width * 3;
            for (x = 0; x < width; x++, data_pos += 3, pos += 3) {
                r = src_pos[data_pos];
                g = src_pos[data_pos + 1];
                b = src_pos[data_pos + 2];
                dst_pos[pos]     = (uint8_t)(255 * r);
                dst_pos[pos + 1] = (uint8_t)(255 * g);
                dst_pos[pos + 2] = (uint8_t)(255 * b);
            }
        }
    }
}