efl/legacy/evas/src/modules/engines/software_ddraw/evas_ddraw_buffer.c

93 lines
2.4 KiB
C

#include <string.h>
#include "evas_common.h"
#include "evas_engine.h"
DD_Output_Buffer *
evas_software_ddraw_output_buffer_new(int depth,
int width,
int height,
void *data)
{
DD_Output_Buffer *ddob;
ddob = calloc(1, sizeof(DD_Output_Buffer));
if (!ddob) return NULL;
ddob->data = data;
ddob->depth = depth;
ddob->width = width;
ddob->height = height;
ddob->pitch = width * depth / 8;
ddob->psize = ddob->pitch * height;
if (!ddob->data)
{
ddob->data = malloc(ddob->pitch * height);
if (!ddob->data)
{
free(ddob);
return NULL;
}
}
return ddob;
}
void
evas_software_ddraw_output_buffer_free(DD_Output_Buffer *ddob)
{
if (ddob->data) free(ddob->data);
free(ddob);
}
void
evas_software_ddraw_output_buffer_paste(DD_Output_Buffer *ddob,
void *ddraw_data,
int ddraw_width,
int ddraw_height,
int ddraw_pitch,
int ddraw_depth,
int x,
int y)
{
DATA8 *dd_data;
DATA8 *evas_data;
int width;
int height;
int pitch;
int j;
if ((x >= ddraw_width) || (y >= ddraw_height))
return;
/* compute the size of the data to copy on the back surface */
width = ((x + ddob->width) > ddraw_width)
? ddraw_width - x
: ddob->width;
height = ((y + ddob->height) > ddraw_height)
? ddraw_height - y
: ddob->height;
pitch = width * ddob->depth / 8;
dd_data = (DATA8 *)ddraw_data + y * ddraw_pitch + x * ddraw_depth;
evas_data = (unsigned char *)ddob->data;
for (j = 0; j < height; j++, evas_data += ddob->pitch, dd_data += ddraw_pitch)
memcpy(dd_data, evas_data, pitch);
}
DATA8 *
evas_software_ddraw_output_buffer_data(DD_Output_Buffer *ddob,
int *bytes_per_line_ret)
{
if (bytes_per_line_ret) *bytes_per_line_ret = ddob->pitch;
return ddob->data;
}
int
evas_software_ddraw_output_buffer_depth(DD_Output_Buffer *ddob)
{
return ddob->depth;
}