git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@3339 92316355-f0b4-4df1-b90c-862c8a59935fmaster
@@ -21,6 +21,7 @@ libpipi_la_SOURCES = \ | |||||
pipi_template.h \ | pipi_template.h \ | ||||
context.c \ | context.c \ | ||||
pixels.c \ | pixels.c \ | ||||
tiles.c \ | |||||
codec.c \ | codec.c \ | ||||
stock.c \ | stock.c \ | ||||
colorstring.c \ | colorstring.c \ | ||||
@@ -101,6 +101,9 @@ typedef struct | |||||
} | } | ||||
pipi_pixels_t; | pipi_pixels_t; | ||||
/* pipi_tile_t: the internal tile type */ | |||||
typedef struct pipi_tile pipi_tile_t; | |||||
/* pipi_image_t: the main image type */ | /* pipi_image_t: the main image type */ | ||||
typedef struct pipi_image pipi_image_t; | typedef struct pipi_image pipi_image_t; | ||||
@@ -127,6 +130,11 @@ __extern void pipi_destroy_context(pipi_context_t *); | |||||
__extern pipi_command_t const *pipi_get_command_list(void); | __extern pipi_command_t const *pipi_get_command_list(void); | ||||
__extern int pipi_command(pipi_context_t *, char const *, ...); | __extern int pipi_command(pipi_context_t *, char const *, ...); | ||||
__extern pipi_tile_t *pipi_get_tile(pipi_image_t *, int, int, int, | |||||
pipi_format_t, int); | |||||
__extern void pipi_release_tile(pipi_image_t *, pipi_tile_t *); | |||||
__extern pipi_tile_t *pipi_create_tile(pipi_format_t, int); | |||||
__extern pipi_image_t *pipi_load(char const *); | __extern pipi_image_t *pipi_load(char const *); | ||||
__extern pipi_image_t *pipi_load_stock(char const *); | __extern pipi_image_t *pipi_load_stock(char const *); | ||||
__extern pipi_image_t *pipi_new(int, int); | __extern pipi_image_t *pipi_new(int, int); | ||||
@@ -35,6 +35,22 @@ struct pipi_histogram | |||||
unsigned int y[256]; | unsigned int y[256]; | ||||
}; | }; | ||||
#ifdef USE_TILES | |||||
#define TILE_SIZE 128 | |||||
struct pipi_tile | |||||
{ | |||||
int x, y; | |||||
int zoom; | |||||
int refcount; | |||||
pipi_format_t fmt; | |||||
int plane; | |||||
union { uint8_t *u8; float *f; double *d; } data; | |||||
union { uint8_t u8[1]; float f[1]; double d[1]; } align; | |||||
}; | |||||
#endif /* USE_TILES */ | |||||
/* pipi_image_t: the image structure. This is probably going to be the most | /* pipi_image_t: the image structure. This is probably going to be the most | ||||
* complex structure in the library, but right now it only has fairly normal | * complex structure in the library, but right now it only has fairly normal | ||||
@@ -43,6 +59,11 @@ struct pipi_image | |||||
{ | { | ||||
int w, h, pitch; | int w, h, pitch; | ||||
#ifdef USE_TILES | |||||
pipi_tile_t **tiles; | |||||
int ntiles; | |||||
#endif /* USE_TILES */ | |||||
/* A list of internal image flags. | /* A list of internal image flags. | ||||
* wrap: should filters wrap around at edges? | * wrap: should filters wrap around at edges? | ||||
* u8: are the image samples still 8-bit per channel? */ | * u8: are the image samples still 8-bit per channel? */ | ||||
@@ -0,0 +1,112 @@ | |||||
/* | |||||
* libpipi Pathetic image processing interface library | |||||
* Copyright (c) 2004-2008 Sam Hocevar <sam@zoy.org> | |||||
* All Rights Reserved | |||||
* | |||||
* $Id$ | |||||
* | |||||
* This library is free software. It comes without any warranty, to | |||||
* the extent permitted by applicable law. You can redistribute it | |||||
* and/or modify it under the terms of the Do What The Fuck You Want | |||||
* To Public License, Version 2, as published by Sam Hocevar. See | |||||
* http://sam.zoy.org/wtfpl/COPYING for more details. | |||||
*/ | |||||
/* | |||||
* tiles.c: the tiles system | |||||
*/ | |||||
#include "config.h" | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#include "pipi.h" | |||||
#include "pipi_internals.h" | |||||
#ifdef USE_TILES | |||||
pipi_tile_t *pipi_get_tile(pipi_image_t *img, int x, int y, int zoom, | |||||
pipi_format_t fmt, int plane) | |||||
{ | |||||
pipi_tile_t * ret; | |||||
int i; | |||||
/* If the tile already exists, return it. */ | |||||
for(i = 0; i < img->ntiles; i++) | |||||
{ | |||||
if(img->tiles[i]->x == x && img->tiles[i]->y == y | |||||
&& img->tiles[i]->fmt == fmt | |||||
&& img->tiles[i]->zoom == zoom | |||||
&& img->tiles[i]->plane == plane) | |||||
{ | |||||
img->tiles[i]->refcount++; | |||||
return img->tiles[i]; | |||||
} | |||||
} | |||||
/* Create a tile. When the image provides a tile creation function, | |||||
* we should use it. */ | |||||
ret = pipi_create_tile(fmt, plane); | |||||
ret->x = x; | |||||
ret->y = y; | |||||
ret->refcount = 1; | |||||
/* Insert tile and return it. */ | |||||
img->ntiles++; | |||||
img->tiles = realloc(img->tiles, img->ntiles * sizeof(pipi_tile_t *)); | |||||
img->tiles[img->ntiles - 1] = ret; | |||||
return ret; | |||||
} | |||||
void pipi_release_tile(pipi_image_t *img, pipi_tile_t *tile) | |||||
{ | |||||
int i; | |||||
for(i = 0; i < img->ntiles; i++) | |||||
{ | |||||
if(img->tiles[i] == tile) | |||||
{ | |||||
img->tiles[i]->refcount--; | |||||
if(img->tiles[i]->refcount <= 0) | |||||
{ | |||||
free(img->tiles[i]); | |||||
img->tiles[i] = img->tiles[img->ntiles - 1]; | |||||
img->ntiles--; | |||||
} | |||||
return; | |||||
} | |||||
} | |||||
} | |||||
pipi_tile_t *pipi_create_tile(pipi_format_t fmt, int plane) | |||||
{ | |||||
pipi_tile_t * ret; | |||||
size_t bytes; | |||||
switch(fmt) | |||||
{ | |||||
case PIPI_PIXELS_RGBA_C: | |||||
case PIPI_PIXELS_BGR_C: | |||||
bytes = sizeof(uint8_t) * TILE_SIZE * TILE_SIZE; | |||||
break; | |||||
case PIPI_PIXELS_RGBA_F: | |||||
case PIPI_PIXELS_Y_F: | |||||
bytes = sizeof(float) * TILE_SIZE * TILE_SIZE; | |||||
break; | |||||
default: | |||||
bytes = 0; | |||||
break; | |||||
} | |||||
ret = malloc(sizeof(pipi_tile_t) + bytes); | |||||
ret->fmt = fmt; | |||||
ret->plane = plane; | |||||
ret->data.u8 = ret->align.u8; | |||||
return ret; | |||||
} | |||||
#endif /* USE_TILES */ | |||||