Use a log handler to modify abort() behaviour

Be more library friendly, by not aborting in library errors.

spice_common now includes a proper log handler that will abort by
default when reaching a warning.

SPICE_ABORT_LEVEL can be changed to modify run-time abort level.

SPICE_DEBUG_LEVEL can be changed to be more verbose. By default, only
log level more importants than WARNING.

Only memory-related functions are allowed to abort(), since they are
not recoverable errors in the library.
This commit is contained in:
Marc-André Lureau 2011-04-03 15:49:36 +02:00 committed by Marc-André Lureau
parent bb133148d8
commit c1403ee6bf
28 changed files with 821 additions and 554 deletions

View File

@ -12,6 +12,8 @@ libspice_common_la_SOURCES = \
draw.h \
lines.c \
lines.h \
log.c \
log.h \
lz.c \
lz.h \
lz_common.h \

View File

@ -21,7 +21,10 @@
* Copyright (C) 2008 Red Hat, Inc.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

View File

@ -31,6 +31,7 @@
#include <math.h>
#include <spice/macros.h>
#include "log.h"
#include "quic.h"
#include "lz.h"
#include "canvas_base.h"
@ -43,21 +44,6 @@
#include "mutex.h"
#ifndef CANVAS_ERROR
#define CANVAS_ERROR(format, ...) { \
printf("%s: " format "\n", __FUNCTION__, ## __VA_ARGS__); \
abort(); \
}
#endif
#ifndef WARN
#define WARN(x) printf("warning: %s\n", x)
#endif
#ifndef DBG
#define DBG(level, format, ...) printf("%s: debug: " format "\n", __FUNCTION__, ## __VA_ARGS__);
#endif
#define ROUND(_x) ((int)floor((_x) + 0.5))
#define IS_IMAGE_LOSSY(descriptor) \
@ -115,9 +101,9 @@ static inline uint32_t canvas_16bpp_to_32bpp(uint32_t color)
static HDC create_compatible_dc()
{
HDC dc = CreateCompatibleDC(NULL);
if (!dc) {
CANVAS_ERROR("create compatible DC failed");
}
spice_return_val_if_fail(dc != NULL, NULL);
return dc;
}
@ -403,7 +389,8 @@ static pixman_image_t *canvas_get_quic(CanvasBase *canvas, SpiceImage *image,
if (setjmp(quic_data->jmp_env)) {
pixman_image_unref(surface);
CANVAS_ERROR("quic error, %s", quic_data->message_buf);
spice_warning("%s", quic_data->message_buf);
return NULL;
}
quic_data->chunks = image->u.quic.data;
@ -413,10 +400,11 @@ static pixman_image_t *canvas_get_quic(CanvasBase *canvas, SpiceImage *image,
(uint32_t *)image->u.quic.data->chunk[0].data,
image->u.quic.data->chunk[0].len >> 2,
&type, &width, &height) == QUIC_ERROR) {
CANVAS_ERROR("quic decode begin failed");
spice_warning("quic decode begin failed");
return NULL;
}
switch (type) {
switch (type) {
case QUIC_IMAGE_TYPE_RGBA:
as_type = QUIC_IMAGE_TYPE_RGBA;
pixman_format = PIXMAN_a8r8g8b8;
@ -440,11 +428,12 @@ static pixman_image_t *canvas_get_quic(CanvasBase *canvas, SpiceImage *image,
case QUIC_IMAGE_TYPE_INVALID:
case QUIC_IMAGE_TYPE_GRAY:
default:
CANVAS_ERROR("unexpected image type");
spice_warn_if_reached();
return NULL;
}
ASSERT((uint32_t)width == image->descriptor.width);
ASSERT((uint32_t)height == image->descriptor.height);
spice_return_val_if_fail((uint32_t)width == image->descriptor.width, NULL);
spice_return_val_if_fail((uint32_t)height == image->descriptor.height, NULL);
surface = surface_create(
#ifdef WIN32
@ -453,16 +442,15 @@ static pixman_image_t *canvas_get_quic(CanvasBase *canvas, SpiceImage *image,
pixman_format,
width, height, FALSE);
if (surface == NULL) {
CANVAS_ERROR("create surface failed");
}
spice_return_val_if_fail(surface != NULL, NULL);
dest = (uint8_t *)pixman_image_get_data(surface);
stride = pixman_image_get_stride(surface);
if (quic_decode(quic_data->quic, as_type,
dest, stride) == QUIC_ERROR) {
pixman_image_unref(surface);
CANVAS_ERROR("quic decode failed");
spice_warning("quic decode failed");
return NULL;
}
if (invers) {
@ -518,11 +506,11 @@ static pixman_image_t *canvas_get_jpeg(CanvasBase *canvas, SpiceImage *image, in
int height;
uint8_t *dest;
ASSERT(image->u.jpeg.data->num_chunks == 1); /* TODO: Handle chunks */
spice_return_val_if_fail(image->u.jpeg.data->num_chunks == 1, NULL);
canvas->jpeg->ops->begin_decode(canvas->jpeg, image->u.jpeg.data->chunk[0].data, image->u.jpeg.data->chunk[0].len,
&width, &height);
ASSERT((uint32_t)width == image->descriptor.width);
ASSERT((uint32_t)height == image->descriptor.height);
spice_return_val_if_fail((uint32_t)width == image->descriptor.width, NULL);
spice_return_val_if_fail((uint32_t)height == image->descriptor.height, NULL);
surface = surface_create(
#ifdef WIN32
@ -531,7 +519,8 @@ static pixman_image_t *canvas_get_jpeg(CanvasBase *canvas, SpiceImage *image, in
PIXMAN_x8r8g8b8,
width, height, FALSE);
if (surface == NULL) {
CANVAS_ERROR("create surface failed");
spice_warning("create surface failed");
return NULL;
}
dest = (uint8_t *)pixman_image_get_data(surface);
@ -574,13 +563,13 @@ static pixman_image_t *canvas_get_jpeg_alpha(CanvasBase *canvas,
int alpha_size;
int lz_alpha_width, lz_alpha_height, n_comp_pixels, lz_alpha_top_down;
ASSERT(image->u.jpeg_alpha.data->num_chunks == 1);
spice_return_val_if_fail(image->u.jpeg_alpha.data->num_chunks == 1, NULL);
canvas->jpeg->ops->begin_decode(canvas->jpeg,
image->u.jpeg_alpha.data->chunk[0].data,
image->u.jpeg_alpha.jpeg_size,
&width, &height);
ASSERT((uint32_t)width == image->descriptor.width);
ASSERT((uint32_t)height == image->descriptor.height);
spice_return_val_if_fail((uint32_t)width == image->descriptor.width, NULL);
spice_return_val_if_fail((uint32_t)height == image->descriptor.height, NULL);
if (image->u.jpeg_alpha.flags & SPICE_JPEG_ALPHA_FLAGS_TOP_DOWN) {
alpha_top_down = TRUE;
@ -593,7 +582,8 @@ static pixman_image_t *canvas_get_jpeg_alpha(CanvasBase *canvas,
width, height, width*height, alpha_top_down);
if (surface == NULL) {
CANVAS_ERROR("create surface failed");
spice_warning("create surface failed");
return NULL;
}
dest = (uint8_t *)pixman_image_get_data(surface);
@ -607,11 +597,11 @@ static pixman_image_t *canvas_get_jpeg_alpha(CanvasBase *canvas,
lz_decode_begin(lz_data->lz, comp_alpha_buf, alpha_size, &lz_alpha_type,
&lz_alpha_width, &lz_alpha_height, &n_comp_pixels,
&lz_alpha_top_down, NULL);
ASSERT(lz_alpha_type == LZ_IMAGE_TYPE_XXXA);
ASSERT(!!lz_alpha_top_down == !!alpha_top_down);
ASSERT(lz_alpha_width == width);
ASSERT(lz_alpha_height == height);
ASSERT(n_comp_pixels == width * height);
spice_return_val_if_fail(lz_alpha_type == LZ_IMAGE_TYPE_XXXA, NULL);
spice_return_val_if_fail(!!lz_alpha_top_down == !!alpha_top_down, NULL);
spice_return_val_if_fail(lz_alpha_width == width, NULL);
spice_return_val_if_fail(lz_alpha_height == height, NULL);
spice_return_val_if_fail(n_comp_pixels == width * height, NULL);
if (!alpha_top_down) {
decomp_alpha_buf = dest + stride * (height - 1);
@ -664,7 +654,8 @@ static pixman_image_t *canvas_bitmap_to_surface(CanvasBase *canvas, SpiceBitmap*
format,
bitmap->x, bitmap->y, FALSE);
if (image == NULL) {
CANVAS_ERROR("create surface failed");
spice_warning("create surface failed");
return NULL;
}
spice_bitmap_convert_to_pixman(format, image,
@ -724,7 +715,8 @@ static inline SpicePalette *canvas_get_localized_palette(CanvasBase *canvas, Spi
break;
case SPICE_SURFACE_FMT_16_565:
default:
PANIC("Unsupported palette depth");
spice_warn_if_reached();
return NULL;
}
*free_palette = TRUE;
return copy;
@ -750,22 +742,24 @@ static pixman_image_t *canvas_get_lz(CanvasBase *canvas, SpiceImage *image, int
if (setjmp(lz_data->jmp_env)) {
free(decomp_buf);
CANVAS_ERROR("lz error, %s", lz_data->message_buf);
spice_warning("%s", lz_data->message_buf);
return NULL;
}
free_palette = FALSE;
if (image->descriptor.type == SPICE_IMAGE_TYPE_LZ_RGB) {
ASSERT(image->u.lz_rgb.data->num_chunks == 1); /* TODO: Handle chunks */
spice_return_val_if_fail(image->u.lz_rgb.data->num_chunks == 1, NULL); /* TODO: Handle chunks */
comp_buf = image->u.lz_rgb.data->chunk[0].data;
comp_size = image->u.lz_rgb.data->chunk[0].len;
palette = NULL;
} else if (image->descriptor.type == SPICE_IMAGE_TYPE_LZ_PLT) {
ASSERT(image->u.lz_plt.data->num_chunks == 1); /* TODO: Handle chunks */
spice_return_val_if_fail(image->u.lz_plt.data->num_chunks == 1, NULL); /* TODO: Handle chunks */
comp_buf = image->u.lz_plt.data->chunk[0].data;
comp_size = image->u.lz_plt.data->chunk[0].len;
palette = canvas_get_localized_palette(canvas, image->u.lz_plt.palette, image->u.lz_plt.palette_id, image->u.lz_plt.flags, &free_palette);
} else {
CANVAS_ERROR("unexpected image type");
spice_warn_if_reached();
return NULL;
}
lz_decode_begin(lz_data->lz, comp_buf, comp_size, &type,
@ -798,13 +792,14 @@ static pixman_image_t *canvas_get_lz(CanvasBase *canvas, SpiceImage *image, int
}
break;
default:
CANVAS_ERROR("unexpected LZ image type");
spice_warn_if_reached();
return NULL;
}
ASSERT((unsigned)width == image->descriptor.width);
ASSERT((unsigned)height == image->descriptor.height);
spice_return_val_if_fail((unsigned)width == image->descriptor.width, NULL);
spice_return_val_if_fail((unsigned)height == image->descriptor.height, NULL);
ASSERT((image->descriptor.type == SPICE_IMAGE_TYPE_LZ_PLT) || (n_comp_pixels == width * height));
spice_return_val_if_fail((image->descriptor.type == SPICE_IMAGE_TYPE_LZ_PLT) || (n_comp_pixels == width * height), NULL);
#ifdef WIN32
lz_data->decode_data.dc = canvas->dc;
#endif
@ -850,9 +845,7 @@ static pixman_image_t *canvas_get_lz(CanvasBase *canvas, SpiceImage *image, int
static pixman_image_t *canvas_get_glz_rgb_common(CanvasBase *canvas, uint8_t *data,
int want_original)
{
if (canvas->glz_data.decoder == NULL) {
CANVAS_ERROR("glz not supported");
}
spice_return_val_if_fail(canvas->glz_data.decoder != NULL, NULL);
canvas->glz_data.decoder->ops->decode(canvas->glz_data.decoder,
data, NULL,
@ -867,12 +860,12 @@ static pixman_image_t *canvas_get_glz_rgb_common(CanvasBase *canvas, uint8_t *da
static pixman_image_t *canvas_get_glz(CanvasBase *canvas, SpiceImage *image,
int want_original)
{
ASSERT(image->descriptor.type == SPICE_IMAGE_TYPE_GLZ_RGB);
spice_return_val_if_fail(image->descriptor.type == SPICE_IMAGE_TYPE_GLZ_RGB, NULL);
#ifdef WIN32
canvas->glz_data.decode_data.dc = canvas->dc;
#endif
ASSERT(image->u.lz_rgb.data->num_chunks == 1); /* TODO: Handle chunks */
spice_return_val_if_fail(image->u.lz_rgb.data->num_chunks == 1, NULL); /* TODO: Handle chunks */
return canvas_get_glz_rgb_common(canvas, image->u.lz_rgb.data->chunk[0].data, want_original);
}
@ -882,11 +875,9 @@ static pixman_image_t *canvas_get_zlib_glz_rgb(CanvasBase *canvas, SpiceImage *i
uint8_t *glz_data;
pixman_image_t *surface;
if (canvas->zlib == NULL) {
CANVAS_ERROR("zlib not supported");
}
spice_return_val_if_fail(canvas->zlib != NULL, NULL);
ASSERT(image->u.zlib_glz.data->num_chunks == 1); /* TODO: Handle chunks */
spice_return_val_if_fail(image->u.zlib_glz.data->num_chunks == 1, NULL); /* TODO: Handle chunks */
glz_data = (uint8_t*)spice_malloc(image->u.zlib_glz.glz_data_size);
canvas->zlib->ops->decode(canvas->zlib, image->u.zlib_glz.data->chunk[0].data,
image->u.zlib_glz.data->chunk[0].len,
@ -1134,10 +1125,12 @@ static pixman_image_t *canvas_get_image_internal(CanvasBase *canvas, SpiceImage
break;
}
default:
CANVAS_ERROR("invalid image type");
spice_warn_if_reached();
return NULL;
}
surface_format = spice_pixman_image_get_format(surface);
spice_return_val_if_fail(surface != NULL, NULL);
spice_return_val_if_fail(spice_pixman_image_get_format(surface, &surface_format), NULL);
if (descriptor->flags & SPICE_IMAGE_FLAGS_HIGH_BITS_SET &&
descriptor->type != SPICE_IMAGE_TYPE_FROM_CACHE &&
@ -1172,7 +1165,8 @@ static pixman_image_t *canvas_get_image_internal(CanvasBase *canvas, SpiceImage
#ifdef SW_CANVAS_CACHE
} else if (descriptor->flags & SPICE_IMAGE_FLAGS_CACHE_REPLACE_ME) {
if (IS_IMAGE_LOSSY(descriptor)) {
CANVAS_ERROR("invalid cache replace request: the image is lossy");
spice_warning("invalid cache replace request: the image is lossy");
return NULL;
}
canvas->bits_cache->ops->replace_lossy(canvas->bits_cache, descriptor->id, surface);
#ifdef DEBUG_DUMP_SURFACE
@ -1249,8 +1243,11 @@ static pixman_image_t *canvas_get_image_internal(CanvasBase *canvas, SpiceImage
return canvas_get_bits(canvas, &image->u.bitmap, want_original, &format);
}
default:
CANVAS_ERROR("invalid image type");
spice_warn_if_reached();
return NULL;
}
return NULL;
}
#endif
@ -1288,9 +1285,7 @@ static pixman_image_t* canvas_get_image_from_self(SpiceCanvas *canvas,
surface = pixman_image_create_bits(spice_surface_format_to_pixman (canvas_base->format),
width, height, NULL, 0);
if (surface == NULL) {
CANVAS_ERROR("create surface failed");
}
spice_return_val_if_fail(surface != NULL, NULL);
dest = (uint8_t *)pixman_image_get_data(surface);
dest_stride = pixman_image_get_stride(surface);
@ -1333,9 +1328,7 @@ static pixman_image_t *canvas_get_bitmap_mask(CanvasBase *canvas, SpiceBitmap* b
canvas->dc,
#endif
PIXMAN_a1, bitmap->x, bitmap->y, TRUE);
if (surface == NULL) {
CANVAS_ERROR("create surface failed");
}
spice_return_val_if_fail(surface != NULL, NULL);
spice_chunks_linearize(bitmap->data);
src_line = bitmap->data->chunk[0].data;
@ -1350,7 +1343,7 @@ static pixman_image_t *canvas_get_bitmap_mask(CanvasBase *canvas, SpiceBitmap* b
#else
if (!(bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
#endif
ASSERT(bitmap->y > 0);
spice_return_val_if_fail(bitmap->y > 0, NULL);
dest_line += dest_stride * ((int)bitmap->y - 1);
dest_stride = -dest_stride;
}
@ -1389,7 +1382,8 @@ static pixman_image_t *canvas_get_bitmap_mask(CanvasBase *canvas, SpiceBitmap* b
default:
pixman_image_unref(surface);
surface = NULL;
CANVAS_ERROR("invalid bitmap format");
spice_warn_if_reached();
return NULL;
}
} else {
switch (bitmap->format) {
@ -1420,7 +1414,8 @@ static pixman_image_t *canvas_get_bitmap_mask(CanvasBase *canvas, SpiceBitmap* b
default:
pixman_image_unref(surface);
surface = NULL;
CANVAS_ERROR("invalid bitmap format");
spice_warn_if_reached();
return NULL;
}
}
return surface;
@ -1434,12 +1429,10 @@ static inline pixman_image_t *canvas_A1_invers(pixman_image_t *src_surf)
uint8_t *src_line, *end_line, *dest_line;
int src_stride, line_size, dest_stride;
ASSERT(pixman_image_get_depth(src_surf) == 1);
spice_return_val_if_fail(pixman_image_get_depth(src_surf) == 1, NULL);
invers = pixman_image_create_bits(PIXMAN_a1, width, height, NULL, 0);
if (invers == NULL) {
CANVAS_ERROR("create surface failed");
}
spice_return_val_if_fail(invers != NULL, NULL);
src_line = (uint8_t *)pixman_image_get_data(src_surf);
src_stride = pixman_image_get_stride(src_surf);
@ -1499,7 +1492,8 @@ static pixman_image_t *canvas_get_mask(CanvasBase *canvas, SpiceQMask *mask, int
break;
#endif
default:
CANVAS_ERROR("invalid image type");
spice_warn_if_reached();
return NULL;
}
#if defined(SW_CANVAS_CACHE) || defined(SW_CANVAS_IMAGE_CACHE)
@ -1523,7 +1517,8 @@ static pixman_image_t *canvas_get_mask(CanvasBase *canvas, SpiceQMask *mask, int
static inline void canvas_raster_glyph_box(const SpiceRasterGlyph *glyph, SpiceRect *r)
{
ASSERT(r);
spice_return_if_fail(r != NULL);
r->top = glyph->render_pos.y + glyph->glyph_origin.y;
r->bottom = r->top + glyph->height;
r->left = glyph->render_pos.x + glyph->glyph_origin.x;
@ -1598,8 +1593,8 @@ static void canvas_put_glyph_bits(SpiceRasterGlyph *glyph, int bpp, uint8_t *des
//todo: support SPICE_STRING_FLAGS_RASTER_TOP_DOWN
canvas_raster_glyph_box(glyph, &glyph_box);
ASSERT(glyph_box.top >= bounds->top && glyph_box.bottom <= bounds->bottom);
ASSERT(glyph_box.left >= bounds->left && glyph_box.right <= bounds->right);
spice_return_if_fail(glyph_box.top >= bounds->top && glyph_box.bottom <= bounds->bottom);
spice_return_if_fail(glyph_box.left >= bounds->left && glyph_box.right <= bounds->right);
rect_offset(&glyph_box, -bounds->left, -bounds->top);
dest += glyph_box.top * dest_stride;
@ -1660,7 +1655,8 @@ static void canvas_put_glyph_bits(SpiceRasterGlyph *glyph, int bpp, uint8_t *des
break;
}
default:
CANVAS_ERROR("invalid bpp");
spice_warn_if_reached();
return;
}
}
@ -1673,7 +1669,7 @@ static pixman_image_t *canvas_get_str_mask(CanvasBase *canvas, SpiceString *str,
int dest_stride;
int i;
ASSERT(str->length > 0);
spice_return_val_if_fail(str->length > 0, NULL);
glyph = str->glyphs[0];
canvas_raster_glyph_box(glyph, &bounds);
@ -1688,9 +1684,8 @@ static pixman_image_t *canvas_get_str_mask(CanvasBase *canvas, SpiceString *str,
str_mask = pixman_image_create_bits((bpp == 1) ? PIXMAN_a1 : PIXMAN_a8,
bounds.right - bounds.left,
bounds.bottom - bounds.top, NULL, 0);
if (str_mask == NULL) {
CANVAS_ERROR("create surface failed");
}
spice_return_val_if_fail(str_mask != NULL, NULL);
dest = (uint8_t *)pixman_image_get_data(str_mask);
dest_stride = pixman_image_get_stride(str_mask);
for (i = 0; i < str->length; i++) {
@ -1713,13 +1708,13 @@ static pixman_image_t *canvas_scale_surface(pixman_image_t *src, const SpiceRect
{
pixman_image_t *surface;
pixman_transform_t transform;
pixman_format_code_t format;
double sx, sy;
surface = pixman_image_create_bits(spice_pixman_image_get_format (src),
width, height, NULL, 0);
if (surface == NULL) {
CANVAS_ERROR("create surface failed");
}
spice_return_val_if_fail(spice_pixman_image_get_format (src, &format), NULL);
surface = pixman_image_create_bits(format, width, height, NULL, 0);
spice_return_val_if_fail(surface != NULL, NULL);
sx = (double)(src_area->right - src_area->left) / width;
sy = (double)(src_area->bottom - src_area->top) / height;
@ -1728,7 +1723,7 @@ static pixman_image_t *canvas_scale_surface(pixman_image_t *src, const SpiceRect
pixman_image_set_transform (src, &transform);
pixman_image_set_repeat(src, PIXMAN_REPEAT_NONE);
ASSERT(scale_mode == SPICE_IMAGE_SCALE_MODE_INTERPOLATE || scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST);
spice_return_val_if_fail(scale_mode == SPICE_IMAGE_SCALE_MODE_INTERPOLATE || scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST, NULL);
pixman_image_set_filter(src,
(scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST) ?PIXMAN_FILTER_NEAREST : PIXMAN_FILTER_GOOD,
NULL, 0);
@ -1746,7 +1741,7 @@ static pixman_image_t *canvas_scale_surface(pixman_image_t *src, const SpiceRect
return surface;
}
static void quic_usr_error(QuicUsrContext *usr, const char *fmt, ...)
ATTR_PRINTF(2, 3) static void quic_usr_error(QuicUsrContext *usr, const char *fmt, ...)
{
QuicData *usr_data = (QuicData *)usr;
va_list ap;
@ -1758,7 +1753,7 @@ static void quic_usr_error(QuicUsrContext *usr, const char *fmt, ...)
longjmp(usr_data->jmp_env, 1);
}
static void quic_usr_warn(QuicUsrContext *usr, const char *fmt, ...)
ATTR_PRINTF(2, 3) static void quic_usr_warn(QuicUsrContext *usr, const char *fmt, ...)
{
QuicData *usr_data = (QuicData *)usr;
va_list ap;
@ -1778,7 +1773,7 @@ static void quic_usr_free(QuicUsrContext *usr, void *ptr)
free(ptr);
}
static void lz_usr_warn(LzUsrContext *usr, const char *fmt, ...)
ATTR_PRINTF(2, 3) static void lz_usr_warn(LzUsrContext *usr, const char *fmt, ...)
{
LzData *usr_data = (LzData *)usr;
va_list ap;
@ -1788,7 +1783,7 @@ static void lz_usr_warn(LzUsrContext *usr, const char *fmt, ...)
va_end(ap);
}
static void lz_usr_error(LzUsrContext *usr, const char *fmt, ...)
ATTR_PRINTF(2, 3) static void lz_usr_error(LzUsrContext *usr, const char *fmt, ...)
{
LzData *usr_data = (LzData *)usr;
va_list ap;
@ -1901,7 +1896,8 @@ static void canvas_clip_pixman(CanvasBase *canvas,
break;
}
default:
CANVAS_ERROR("invalid clip type");
spice_warn_if_reached();
return;
}
}
@ -2049,6 +2045,8 @@ static void draw_brush(SpiceCanvas *canvas,
}
} else {
tile = canvas_get_image(canvas_base, pattern->pat, FALSE);
spice_return_if_fail(tile != NULL);
if (rop == SPICE_ROP_COPY) {
canvas->ops->fill_tiled_rects(canvas, rects, n_rects, tile, offset_x, offset_y);
} else {
@ -2064,7 +2062,8 @@ static void draw_brush(SpiceCanvas *canvas,
canvas->ops->fill_solid_rects_rop(canvas, rects, n_rects, 0, rop);
break;
default:
CANVAS_ERROR("invalid brush type");
spice_warn_if_reached();
return;
}
}
@ -2183,6 +2182,8 @@ static void canvas_draw_copy(SpiceCanvas *spice_canvas, SpiceRect *bbox, SpiceCl
}
} else {
src_image = canvas_get_image(canvas, copy->src_bitmap, FALSE);
spice_return_if_fail(src_image != NULL);
if (rect_is_same_size(bbox, &copy->src_area)) {
if (rop == SPICE_ROP_COPY) {
spice_canvas->ops->blit_image(spice_canvas, &dest_region,
@ -2288,6 +2289,8 @@ static void canvas_draw_transparent(SpiceCanvas *spice_canvas, SpiceRect *bbox,
}
} else {
src_image = canvas_get_image(canvas, transparent->src_bitmap, FALSE);
spice_return_if_fail(src_image != NULL);
if (rect_is_same_size(bbox, &transparent->src_area)) {
spice_canvas->ops->colorkey_image(spice_canvas, &dest_region,
src_image,
@ -2365,6 +2368,8 @@ static void canvas_draw_alpha_blend(SpiceCanvas *spice_canvas, SpiceRect *bbox,
}
} else {
src_image = canvas_get_image(canvas, alpha_blend->src_bitmap, TRUE);
spice_return_if_fail(src_image != NULL);
if (rect_is_same_size(bbox, &alpha_blend->src_area)) {
spice_canvas->ops->blend_image(spice_canvas, &dest_region,
alpha_blend->alpha_flags & SPICE_ALPHA_FLAGS_DEST_HAS_ALPHA,
@ -2448,6 +2453,7 @@ static void canvas_draw_opaque(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spice
}
} else {
src_image = canvas_get_image(canvas, opaque->src_bitmap, FALSE);
spice_return_if_fail(src_image != NULL);
if (rect_is_same_size(bbox, &opaque->src_area)) {
spice_canvas->ops->blit_image(spice_canvas, &dest_region,
@ -2545,6 +2551,8 @@ static void canvas_draw_blend(SpiceCanvas *spice_canvas, SpiceRect *bbox, SpiceC
}
} else {
src_image = canvas_get_image(canvas, blend->src_bitmap, FALSE);
spice_return_if_fail(src_image != NULL);
if (rect_is_same_size(bbox, &blend->src_area)) {
if (rop == SPICE_ROP_COPY)
spice_canvas->ops->blit_image(spice_canvas, &dest_region,
@ -3086,7 +3094,8 @@ static void canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox,
gc.tile_offset_y = stroke->brush.u.pattern.pos.y;
break;
default:
CANVAS_ERROR("invalid brush type");
spice_warn_if_reached();
return;
}
stroke_lines_init(&lines);
@ -3105,7 +3114,7 @@ static void canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox,
}
if (seg->flags & SPICE_PATH_BEZIER) {
ASSERT((point - end_point) % 3 == 0);
spice_return_if_fail((point - end_point) % 3 == 0);
for (; point + 2 < end_point; point += 3) {
stroke_lines_append_bezier(&lines,
&point[0],
@ -3186,7 +3195,8 @@ static void canvas_draw_rop3(SpiceCanvas *spice_canvas, SpiceRect *bbox,
}
if (pixman_image_get_width(s) - src_pos.x < width ||
pixman_image_get_height(s) - src_pos.y < heigth) {
CANVAS_ERROR("bad src bitmap size");
spice_critical("bad src bitmap size");
return;
}
if (rop3->brush.type == SPICE_BRUSH_TYPE_PATTERN) {
SpiceCanvas *_surface_canvas;
@ -3280,7 +3290,7 @@ static void canvas_base_group_end(SpiceCanvas *spice_canvas)
static void unimplemented_op(SpiceCanvas *canvas)
{
PANIC("unimplemented canvas operation");
spice_critical("unimplemented canvas operation");
}
inline static void canvas_base_init_ops(SpiceCanvasOps *ops)

View File

@ -19,10 +19,9 @@
#include <config.h>
#endif
#include "spice_common.h"
#include "canvas_utils.h"
#include <spice/macros.h>
#ifdef __GNUC__
#include <stdlib.h>
#include <stdio.h>
@ -33,13 +32,6 @@
static int gdi_handlers = 0;
#endif
#ifndef CANVAS_ERROR
#define CANVAS_ERROR(format, ...) { \
printf("%s: " format "\n", __FUNCTION__, ## __VA_ARGS__); \
abort(); \
}
#endif
static void release_data(pixman_image_t *image, void *release_data)
{
PixmanData *data = (PixmanData *)release_data;
@ -65,7 +57,7 @@ pixman_image_add_data(pixman_image_t *image)
if (data == NULL) {
data = (PixmanData *)calloc(1, sizeof(PixmanData));
if (data == NULL) {
CANVAS_ERROR("out of memory");
spice_error("out of memory");
}
pixman_image_set_destroy_function(image,
release_data,
@ -85,17 +77,21 @@ spice_pixman_image_set_format(pixman_image_t *image,
data->format = format;
}
pixman_format_code_t
spice_pixman_image_get_format(pixman_image_t *image)
int spice_pixman_image_get_format(pixman_image_t *image, pixman_format_code_t *format)
{
PixmanData *data;
data = (PixmanData *)pixman_image_get_destroy_data(image);
if (data != NULL &&
data->format != 0)
return data->format;
spice_return_val_if_fail(format != NULL, 0);
CANVAS_ERROR("Unknown pixman image type");
data = (PixmanData *)pixman_image_get_destroy_data(image);
if (data != NULL && data->format != 0) {
*format = data->format;
return 1;
}
spice_warn_if_reached();
return 0;
}
static INLINE pixman_image_t *__surface_create_stride(pixman_format_code_t format, int width, int height,
@ -117,7 +113,7 @@ static INLINE pixman_image_t *__surface_create_stride(pixman_format_code_t forma
if (surface == NULL) {
free(data);
CANVAS_ERROR("create surface failed, out of memory");
spice_error("create surface failed, out of memory");
}
pixman_data = pixman_image_add_data(surface);
@ -182,20 +178,20 @@ pixman_image_t * surface_create(pixman_format_code_t format, int width, int heig
nstride = SPICE_ALIGN(width, 32) / 8;
break;
default:
CANVAS_ERROR("invalid format");
spice_error("invalid format");
}
bitmap_info.inf.bmiHeader.biCompression = BI_RGB;
mutex = CreateMutex(NULL, 0, NULL);
if (!mutex) {
CANVAS_ERROR("Unable to CreateMutex");
spice_error("Unable to CreateMutex");
}
bitmap = CreateDIBSection(dc, &bitmap_info.inf, 0, (VOID **)&data, NULL, 0);
if (!bitmap) {
CloseHandle(mutex);
CANVAS_ERROR("Unable to CreateDIBSection");
spice_error("Unable to CreateDIBSection");
}
if (top_down) {
@ -209,7 +205,7 @@ pixman_image_t * surface_create(pixman_format_code_t format, int width, int heig
if (surface == NULL) {
CloseHandle(mutex);
DeleteObject(bitmap);
CANVAS_ERROR("create surface failed, out of memory");
spice_error("create surface failed, out of memory");
}
pixman_data = pixman_image_add_data(surface);
pixman_data->format = format;
@ -246,7 +242,7 @@ pixman_image_t * surface_create(pixman_format_code_t format, int width, int heig
stride = SPICE_ALIGN(width, 32) / 8;
break;
default:
CANVAS_ERROR("invalid format");
spice_error("invalid format");
}
stride = -stride;
return __surface_create_stride(format, width, height, stride);

View File

@ -43,7 +43,7 @@ typedef struct PixmanData {
void spice_pixman_image_set_format(pixman_image_t *image,
pixman_format_code_t format);
pixman_format_code_t spice_pixman_image_get_format(pixman_image_t *image);
int spice_pixman_image_get_format(pixman_image_t *image, pixman_format_code_t *format);
#ifdef WIN32

View File

@ -331,14 +331,14 @@ static void set_path(GdiCanvas *canvas, SpicePath *s)
BeginPath(canvas->dc);
if (!MoveToEx(canvas->dc, (int)fix_to_double(point->x), (int)fix_to_double(point->y),
NULL)) {
CANVAS_ERROR("MoveToEx failed");
spice_critical("MoveToEx failed");
return;
}
point++;
}
if (seg->flags & SPICE_PATH_BEZIER) {
ASSERT((point - end_point) % 3 == 0);
spice_return_if_fail((point - end_point) % 3 == 0);
for (; point + 2 < end_point; point += 3) {
POINT points[3];
@ -349,7 +349,7 @@ static void set_path(GdiCanvas *canvas, SpicePath *s)
points[2].x = (int)fix_to_double(point[2].x);
points[2].y = (int)fix_to_double(point[2].y);
if (!PolyBezierTo(canvas->dc, points, 3)) {
CANVAS_ERROR("PolyBezierTo failed");
spice_critical("PolyBezierTo failed");
return;
}
}
@ -357,7 +357,7 @@ static void set_path(GdiCanvas *canvas, SpicePath *s)
for (; point < end_point; point++) {
if (!LineTo(canvas->dc, (int)fix_to_double(point->x),
(int)fix_to_double(point->y))) {
CANVAS_ERROR("LineTo failed");
spice_critical("LineTo failed");
}
}
}
@ -366,12 +366,12 @@ static void set_path(GdiCanvas *canvas, SpicePath *s)
if (seg->flags & SPICE_PATH_CLOSE) {
if (!CloseFigure(canvas->dc)) {
CANVAS_ERROR("CloseFigure failed");
spice_critical("CloseFigure failed");
}
}
if (!EndPath(canvas->dc)) {
CANVAS_ERROR("EndPath failed");
spice_critical("EndPath failed");
}
}
@ -385,7 +385,7 @@ static void set_scale_mode(GdiCanvas *canvas, uint8_t scale_mode)
} else if (scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST) {
SetStretchBltMode(canvas->dc, COLORONCOLOR);
} else {
CANVAS_ERROR("Unknown ScaleMode");
spice_critical("Unknown ScaleMode");
}
}
@ -394,7 +394,7 @@ static void set_clip(GdiCanvas *canvas, SpiceClip *clip)
switch (clip->type) {
case SPICE_CLIP_TYPE_NONE:
if (SelectClipRgn(canvas->dc, NULL) == ERROR) {
CANVAS_ERROR("SelectClipRgn failed");
spice_critical("SelectClipRgn failed");
}
break;
case SPICE_CLIP_TYPE_RECTS: {
@ -416,26 +416,27 @@ static void set_clip(GdiCanvas *canvas, SpiceClip *clip)
combaine_hrgn = CreateRectRgn(now->left, now->top, now->right,
now->bottom);
if (!combaine_hrgn) {
CANVAS_ERROR("Unable to CreateRectRgn");
spice_critical("Unable to CreateRectRgn");
DeleteObject(main_hrgn);
return;
}
if (CombineRgn(main_hrgn, main_hrgn, combaine_hrgn, RGN_OR) == ERROR) {
CANVAS_ERROR("Unable to CombineRgn");
spice_critical("Unable to CombineRgn");
DeleteObject(combaine_hrgn);
return;
}
DeleteObject(combaine_hrgn);
}
if (SelectClipRgn(canvas->dc, main_hrgn) == ERROR) {
CANVAS_ERROR("Unable to SelectClipRgn");
spice_critical("Unable to SelectClipRgn");
}
DeleteObject(main_hrgn);
}
break;
}
default:
CANVAS_ERROR("invalid clip type");
spice_warn_if_reached();
return;
}
}
@ -445,7 +446,8 @@ static void copy_bitmap(const uint8_t *src_image, int height, int src_stride,
int copy_width = MIN(dest_stride, src_stride);
int y = 0;
ASSERT(dest_stride >= 0 && src_stride >= 0);
spice_return_if_fail(dest_stride >= 0 && src_stride >= 0);
while (y < height) {
memcpy(dest_bitmap, src_image, copy_width);
src_image += src_stride;
@ -533,13 +535,13 @@ static uint8_t *create_bitmap(HBITMAP *bitmap, HBITMAP *prev_bitmap, HDC *dc,
*dc = create_compatible_dc();
if (!*dc) {
CANVAS_ERROR("create_compatible_dc() failed");
spice_critical("create_compatible_dc() failed");
return NULL;
}
*bitmap = CreateDIBSection(*dc, &bitmap_info.inf, 0, (VOID **)&data, NULL, 0);
if (!*bitmap) {
CANVAS_ERROR("Unable to CreateDIBSection");
spice_critical("Unable to CreateDIBSection");
DeleteDC(*dc);
return NULL;
}
@ -565,7 +567,8 @@ static uint8_t *create_bitmap(HBITMAP *bitmap, HBITMAP *prev_bitmap, HDC *dc,
nstride = width * 4;
break;
default:
CANVAS_ERROR("invalid bitmap bits size");
spice_warn_if_reached();
return;
}
if (bitmap_data) {
@ -638,7 +641,8 @@ static HBRUSH get_brush(GdiCanvas *canvas, SpiceBrush *brush, RecurciveMutex **b
switch (brush->type) {
case SPICE_BRUSH_TYPE_SOLID:
if (!(hbrush = CreateSolidBrush(get_color_ref(canvas, brush->u.color)))) {
CANVAS_ERROR("CreateSolidBrush failed");
spice_critical("CreateSolidBrush failed");
return NULL;
}
return hbrush;
case SPICE_BRUSH_TYPE_PATTERN: {
@ -653,19 +657,21 @@ static HBRUSH get_brush(GdiCanvas *canvas, SpiceBrush *brush, RecurciveMutex **b
if (gdi_surface) {
bitmap = (HBITMAP)GetCurrentObject(gdi_surface->dc, OBJ_BITMAP);
if (!bitmap) {
CANVAS_ERROR("GetCurrentObject failed");
spice_critical("GetCurrentObject failed");
return NULL;
}
*brush_lock = gdi_surface->lock;
} else {
surface = canvas_get_image(&canvas->base, brush->u.pattern.pat, FALSE);
if (!create_bitmap_from_pixman(&bitmap, &prev_bitmap, &dc, surface, 0)) {
CANVAS_ERROR("create_bitmap failed");
spice_critical("create_bitmap failed");
return NULL;
}
}
if (!(hbrush = CreatePatternBrush(bitmap))) {
CANVAS_ERROR("CreatePatternBrush failed");
spice_critical("CreatePatternBrush failed");
return NULL;
}
if (!gdi_surface) {
@ -677,7 +683,7 @@ static HBRUSH get_brush(GdiCanvas *canvas, SpiceBrush *brush, RecurciveMutex **b
case SPICE_BRUSH_TYPE_NONE:
return NULL;
default:
CANVAS_ERROR("invalid brush type");
spice_warn_if_reached();
return NULL;
}
}
@ -692,12 +698,13 @@ static HBRUSH set_brush(HDC dc, HBRUSH hbrush, SpiceBrush *brush)
HBRUSH prev_hbrush;
prev_hbrush = (HBRUSH)SelectObject(dc, hbrush);
if (!SetBrushOrgEx(dc, brush->u.pattern.pos.x, brush->u.pattern.pos.y, NULL)) {
CANVAS_ERROR("SetBrushOrgEx failed");
spice_critical("SetBrushOrgEx failed");
return NULL;
}
return prev_hbrush;
}
default:
CANVAS_ERROR("invalid brush type");
spice_warn_if_reached();
return NULL;
}
}
@ -753,7 +760,8 @@ uint8_t calc_rop3(uint16_t rop3_bits, int brush)
if (rop3_bits & SPICE_ROPD_OP_BLACKNESS || rop3_bits & SPICE_ROPD_OP_WHITENESS ||
rop3_bits & SPICE_ROPD_OP_INVERS) {
CANVAS_ERROR("invalid rop3 type");
spice_warn_if_reached("invalid rop3 type");
return 0;
}
return rop3;
}
@ -802,7 +810,8 @@ static struct BitmapData get_mask_bitmap(struct GdiCanvas *canvas, struct SpiceQ
_bitmap = (HBITMAP)GetCurrentObject(gdi_surface->dc, OBJ_BITMAP);
if (!_bitmap) {
CANVAS_ERROR ("GetCurrentObject failed");
spice_critical("GetCurrentObject failed");
return bitmap;
}
bitmap.dc = gdi_surface->dc;
bitmap.hbitmap = _bitmap;
@ -850,13 +859,15 @@ static void gdi_draw_bitmap(HDC dest_dc, const SpiceRect *src, const SpiceRect *
(dest->bottom - dest->top) == (src->bottom - src->top)) {
if (!BitBlt(dest_dc, dest->left, dest->top, dest->right - dest->left,
dest->bottom - dest->top, src_dc, src->left, src->top, rast_oper)) {
CANVAS_ERROR("BitBlt failed");
spice_critical("BitBlt failed");
return;
}
} else {
if (!StretchBlt(dest_dc, dest->left, dest->top, dest->right - dest->left,
dest->bottom - dest->top, src_dc, src->left, src->top,
src->right - src->left, src->bottom - src->top, rast_oper)) {
CANVAS_ERROR("StretchBlt failed");
spice_critical("StretchBlt failed");
return;
}
}
} else {
@ -866,7 +877,8 @@ static void gdi_draw_bitmap(HDC dest_dc, const SpiceRect *src, const SpiceRect *
dest->bottom - dest->top, src_dc, src->left, src->top,
bitmapmask->hbitmap, bitmapmask->pos.x, bitmapmask->pos.y,
rast_oper)) {
CANVAS_ERROR("MaskBlt failed");
spice_critical("MaskBlt failed");
return;
}
}
}
@ -905,7 +917,7 @@ static void draw_str_mask_bitmap(struct GdiCanvas *canvas,
bitmap.hbitmap = (HBITMAP)1;
if (!(surface = canvas_get_str_mask(&canvas->base, str, n, &pos))) {
CANVAS_ERROR("unable to canvas_get_str_mask");
spice_critical("unable to canvas_get_str_mask");
return;
}
@ -946,7 +958,8 @@ static void draw_str_mask_bitmap(struct GdiCanvas *canvas,
dest_stride = dest_stride * 4;
break;
default:
CANVAS_ERROR("unsupported bitmap bits size");
spice_warn_if_reached();
return;
}
dest_stride = dest_stride + 3;
dest_stride = dest_stride & ~3;
@ -1018,10 +1031,8 @@ static void gdi_canvas_draw_fill(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spi
RecurciveLock lock(*canvas->lock);
if (!(brush = get_brush(canvas, &fill->brush, &brush_lock))) {
CANVAS_ERROR("no braash");
return;
}
brush = get_brush(canvas, &fill->brush, &brush_lock);
spice_return_if_fail(brush != NULL);
bitmapmask = get_mask_bitmap(canvas, &fill->mask);
@ -1123,18 +1134,18 @@ static void gdi_canvas_put_image(SpiceCanvas *spice_canvas, HDC dc, const SpiceR
rects[i].x2,
rects[i].y2);
if (!combaine_hrgn) {
CANVAS_ERROR("CreateRectRgn failed");
spice_critical("CreateRectRgn failed");
DeleteObject(main_hrgn);
return;
}
if (!CombineRgn(main_hrgn, main_hrgn, combaine_hrgn, RGN_OR)) {
CANVAS_ERROR("CombineRgn failed in put_image");
spice_critical("CombineRgn failed in put_image");
return;
}
DeleteObject(combaine_hrgn);
}
if (SelectClipRgn(canvas->dc, main_hrgn) == ERROR) {
CANVAS_ERROR("SelectClipRgn failed in put_image");
spice_critical("SelectClipRgn failed in put_image");
DeleteObject(main_hrgn);
return;
}
@ -1238,7 +1249,8 @@ static void gdi_draw_bitmap_alpha(HDC dest_dc, const SpiceRect *src, const Spice
if (!AlphaBlend(dest_dc, dest->left, dest->top, dest->right - dest->left,
dest->bottom - dest->top, src_dc, src->left, src->top,
src->right - src->left, src->bottom - src->top, bf)) {
CANVAS_ERROR("AlphaBlend failed");
spice_critical("AlphaBlend failed");
return;
}
}
@ -1582,7 +1594,7 @@ static void gdi_canvas_draw_text(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spi
draw_str_mask_bitmap(canvas, str, 4, &dest, &src, &text->fore_brush);
} else if (str->flags & SPICE_STRING_FLAGS_RASTER_A8) {
WARN("untested path A8 glyphs, doing nothing");
spice_warning("untested path A8 glyphs, doing nothing");
if (0) {
SpiceRect dest;
SpiceRect src;
@ -1590,7 +1602,7 @@ static void gdi_canvas_draw_text(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spi
draw_str_mask_bitmap(canvas, str, 8, &dest, &src, &text->fore_brush);
}
} else {
WARN("untested path vector glyphs, doing nothing");
spice_warning("untested path vector glyphs, doing nothing");
if (0) {
}
}
@ -1601,9 +1613,8 @@ static uint32_t *gdi_get_userstyle(GdiCanvas *canvas, uint8_t nseg, SPICE_FIXED2
uint32_t *local_style;
int i;
if (nseg == 0) {
CANVAS_ERROR("bad nseg");
}
spice_return_val_if_fail(nseg != 0, NULL);
local_style = spice_new(uint32_t , nseg);
if (start_is_gap) {
@ -1701,9 +1712,8 @@ static void gdi_canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox, S
} bitmap_info;
GdiImage image;
#endif
//CANVAS_ERROR("untested path stroke brush with pattern");
#if 0
ASSERT(surface)
spice_return_if_fail(surface != NULL)
surface_to_image(surface, &image);
memset(&bitmap_info, 0, sizeof(bitmap_info));
@ -1722,7 +1732,8 @@ static void gdi_canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox, S
logbrush.lbHatch = (LONG)GlobalAlloc(GMEM_MOVEABLE,
image.height * -image.stride + sizeof(BITMAPINFO));
if (!logbrush.lbHatch) {
CANVAS_ERROR("GlobalAlloc failed");
spice_critical("GlobalAlloc failed");
return;
}
copy_bitmap(image.pixels - (image.height - 1) * -image.stride,
image.height, -image.stride,
@ -1731,7 +1742,8 @@ static void gdi_canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox, S
logbrush.lbHatch = (LONG)GlobalAlloc(GMEM_MOVEABLE,
image.height * image.stride + sizeof(BITMAPINFO));
if (!logbrush.lbHatch) {
CANVAS_ERROR("GlobalAlloc failed");
spice_critical("GlobalAlloc failed");
return;
}
copy_bitmap(image.pixels, image.height, image.stride,
(uint8_t *)logbrush.lbHatch, image.width);

View File

@ -94,7 +94,8 @@ static pixman_image_t *canvas_surf_to_trans_surf(GLCImage *image,
ret = pixman_image_create_bits(PIXMAN_a8r8g8b8, width, height, NULL, 0);
if (ret == NULL) {
CANVAS_ERROR("create surface failed");
spice_critical("create surface failed");
return NULL;
}
src_line = image->pixels;
@ -133,7 +134,7 @@ static GLCPath get_path(GLCanvas *canvas, SpicePath *s)
}
if (seg->flags & SPICE_PATH_BEZIER) {
ASSERT((point - end_point) % 3 == 0);
spice_return_val_if_fail((point - end_point) % 3 == 0, path);
for (; point + 2 < end_point; point += 3) {
glc_path_curve_to(path,
fix_to_double(point[0].x), fix_to_double(point[0].y),
@ -199,7 +200,8 @@ static void set_clip(GLCanvas *canvas, SpiceRect *bbox, SpiceClip *clip)
break;
}
default:
CANVAS_ERROR("invalid clip type");
spice_warn_if_reached();
return;
}
}
@ -225,7 +227,7 @@ static inline void surface_to_image(GLCanvas *canvas, pixman_image_t *surface, G
{
int depth = pixman_image_get_depth(surface);
ASSERT(depth == 32 || depth == 24);
spice_return_if_fail(depth == 32 || depth == 24);
image->format = (depth == 24) ? GLC_IMAGE_RGB32 : GLC_IMAGE_ARGB32;
image->width = pixman_image_get_width(surface);
image->height = pixman_image_get_height(surface);
@ -276,7 +278,8 @@ static void set_brush(GLCanvas *canvas, SpiceBrush *brush)
case SPICE_BRUSH_TYPE_NONE:
return;
default:
CANVAS_ERROR("invalid brush type");
spice_warn_if_reached();
return;
}
}
@ -334,7 +337,7 @@ static void set_op(GLCanvas *canvas, uint16_t rop_decriptor)
op = GLC_OP_OR_INVERTED;
break;
default:
WARN("GLC_OP_NOOP");
spice_warning("GLC_OP_NOOP");
op = GLC_OP_NOOP;
}
glc_set_op(canvas->glc, op);
@ -530,7 +533,8 @@ static void gl_canvas_draw_rop3(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spic
d = pixman_image_create_bits(PIXMAN_x8r8g8b8, image.width, image.height, NULL, 0);
if (d == NULL) {
CANVAS_ERROR("create surface failed");
spice_critical("create surface failed");
return;
}
image.pixels = (uint8_t *)pixman_image_get_data(d);
image.stride = pixman_image_get_stride(d);
@ -565,7 +569,8 @@ static void gl_canvas_draw_rop3(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spic
if (pixman_image_get_width(s) - src_pos.x < image.width ||
pixman_image_get_height(s) - src_pos.y < image.height) {
CANVAS_ERROR("bad src bitmap size");
spice_critical("bad src bitmap size");
return;
}
if (rop3->brush.type == SPICE_BRUSH_TYPE_PATTERN) {
@ -619,7 +624,7 @@ static void gl_canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox, Sp
set_brush(canvas, &stroke->brush);
if (stroke->attr.flags & SPICE_LINE_FLAGS_STYLED) {
WARN("SPICE_LINE_FLAGS_STYLED");
spice_warning("SPICE_LINE_FLAGS_STYLED");
}
glc_set_line_width(canvas->glc, 1.0);
@ -667,7 +672,7 @@ static void gl_canvas_draw_text(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spic
pixman_image_unref(mask);
} else if (str->flags & SPICE_STRING_FLAGS_RASTER_A8) {
WARN("untested path A8 glyphs, doing nothing");
spice_warning("untested path A8 glyphs, doing nothing");
if (0) {
SpicePoint pos;
pixman_image_t *mask = canvas_get_str_mask(&canvas->base, str, 8, &pos);
@ -679,7 +684,7 @@ static void gl_canvas_draw_text(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spic
pixman_image_unref(mask);
}
} else {
WARN("untested path vector glyphs, doing nothing");
spice_warning("untested path vector glyphs, doing nothing");
if (0) {
//draw_vector_str(canvas, str, &text->fore_brush, text->fore_mode);
}
@ -709,7 +714,8 @@ static void gl_canvas_read_bits(SpiceCanvas *spice_canvas, uint8_t *dest, int de
GLCanvas *canvas = (GLCanvas *)spice_canvas;
GLCImage image;
ASSERT(dest_stride > 0);
spice_return_if_fail(dest_stride > 0);
image.format = GLC_IMAGE_RGB32;
image.height = area->bottom - area->top;
image.width = area->right - area->left;
@ -752,7 +758,8 @@ static void gl_canvas_put_image(SpiceCanvas *spice_canvas, const SpiceRect *dest
GLCImage image;
uint32_t i;
ASSERT(src_stride <= 0)
spice_return_if_fail(src_stride <= 0);
glc_clip_reset(canvas->glc);
if (clip) {

View File

@ -20,28 +20,29 @@
#ifndef GL_UTILS_H
#define GL_UTILS_H
#include "spice_common.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef RED_DEBUG
#define GLC_ERROR_TEST_FLUSH { \
GLenum gl_err; glFlush(); \
if ((gl_err = glGetError()) != GL_NO_ERROR) { \
printf("%s[%d]: opengl error: %s\n", __FUNCTION__, __LINE__, \
gluErrorString(gl_err)); \
abort(); \
} \
#define GLC_ERROR_TEST_FLUSH { \
GLenum gl_err; glFlush(); \
if ((gl_err = glGetError()) != GL_NO_ERROR) { \
printf("%s[%d]: opengl error: %s\n", __FUNCTION__, __LINE__, \
gluErrorString(gl_err)); \
spice_abort(); \
} \
}
#define GLC_ERROR_TEST_FINISH { \
GLenum gl_err; glFinish(); \
if ((gl_err = glGetError()) != GL_NO_ERROR) { \
printf("%s[%d]: opengl error: %s\n", __FUNCTION__, __LINE__, \
gluErrorString(gl_err)); \
abort(); \
} \
#define GLC_ERROR_TEST_FINISH { \
GLenum gl_err; glFinish(); \
if ((gl_err = glGetError()) != GL_NO_ERROR) { \
printf("%s[%d]: opengl error: %s\n", __FUNCTION__, __LINE__, \
gluErrorString(gl_err)); \
spice_abort(); \
} \
}
#else
#define GLC_ERROR_TEST_FLUSH ;

View File

@ -305,7 +305,7 @@ void glc_path_move_to(GLCPath path, double x, double y)
{
InternalPath *internal = (InternalPath *)path;
ASSERT(internal);
spice_assert(internal);
if (internal->current_segment) {
internal->current_segment = NULL;
@ -361,7 +361,7 @@ void glc_path_line_to(GLCPath path, double x, double y)
{
InternalPath *internal = (InternalPath *)path;
ASSERT(internal);
spice_assert(internal);
add_segment_common(internal, GLC_PATH_SEG_LINES, 1);
put_point(internal, x, y);
@ -372,7 +372,7 @@ void glc_path_curve_to(GLCPath path, double p1_x, double p1_y, double p2_x, doub
{
InternalPath *internal = (InternalPath *)path;
ASSERT(internal);
spice_assert(internal);
add_segment_common(internal, GLC_PATH_SEG_BEIZER, 3);
put_point(internal, p1_x, p1_y);
@ -384,7 +384,7 @@ void glc_path_close(GLCPath path)
{
InternalPath *internal = (InternalPath *)path;
ASSERT(internal);
spice_assert(internal);
if (!internal->current_path) {
return;
}
@ -397,7 +397,7 @@ void glc_path_cleare(GLCPath path)
{
InternalPath *internal = (InternalPath *)path;
ASSERT(internal);
spice_assert(internal);
internal->paths_pos = internal->segments_pos = 0;
internal->current_segment = NULL;
internal->current_path = NULL;
@ -412,7 +412,7 @@ GLCPath glc_path_create(GLCCtx glc)
InternaCtx *ctx = (InternaCtx *)glc;
InternalPath *path;
ASSERT(ctx);
spice_assert(ctx);
path = spice_new0(InternalPath, 1);
path->paths_size = 2;
path->paths = spice_new(Path, path->paths_size);
@ -447,7 +447,7 @@ static inline void unref_pat(InternalPat *pat)
if (!pat) {
return;
}
ASSERT(pat->refs > 0);
spice_assert(pat->refs > 0);
if (--pat->refs == 0) {
glFinish();
glDeleteTextures(1, &pat->texture);
@ -498,16 +498,16 @@ static inline void init_pattern(InternalPat *pat, int x_orign, int y_orign, cons
const int pix_bytes = 4;
ASSERT(image->format == GLC_IMAGE_RGB32); //for now
spice_assert(image->format == GLC_IMAGE_RGB32); //for now
width = image->width;
height = image->height;
width2 = gl_get_to_power_two(width);
height2 = gl_get_to_power_two(height);
ASSERT(width > 0 && height > 0);
ASSERT(width > 0 && width <= pat->owner->max_texture_size);
ASSERT(height > 0 && height <= pat->owner->max_texture_size);
spice_assert(width > 0 && height > 0);
spice_assert(width > 0 && width <= pat->owner->max_texture_size);
spice_assert(height > 0 && height <= pat->owner->max_texture_size);
if (width2 != width || height2 != height) {
tmp_pixmap = (uint32_t *)spice_malloc(width2 * height2 * sizeof(uint32_t));
@ -529,7 +529,7 @@ static inline void init_pattern(InternalPat *pat, int x_orign, int y_orign, cons
tmp_pixmap);
free(tmp_pixmap);
} else {
ASSERT(image->stride % pix_bytes == 0);
spice_assert(image->stride % pix_bytes == 0);
glPixelStorei(GL_UNPACK_ROW_LENGTH, image->stride / pix_bytes);
glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE,
image->pixels);
@ -553,7 +553,7 @@ GLCPattern glc_pattern_create(GLCCtx glc, int x_orign, int y_orign, const GLCIma
InternaCtx *ctx = (InternaCtx *)glc;
InternalPat *pat;
ASSERT(ctx && image);
spice_assert(ctx && image);
pat = spice_new0(InternalPat, 1);
pat->refs = 1;
@ -566,7 +566,7 @@ GLCPattern glc_pattern_create(GLCCtx glc, int x_orign, int y_orign, const GLCIma
void glc_pattern_set(GLCPattern pattern, int x_orign, int y_orign, const GLCImage *image)
{
InternalPat *pat = (InternalPat *)pattern;
ASSERT(pat && pat->owner);
spice_assert(pat && pat->owner);
glFinish();
init_pattern(pat, x_orign, y_orign, image);
@ -603,7 +603,7 @@ void glc_set_pattern(GLCCtx glc, GLCPattern pattern)
InternaCtx *ctx = (InternaCtx *)glc;
InternalPat *pat = (InternalPat *)pattern;
ASSERT(ctx && pat && pat->owner == ctx);
spice_assert(ctx && pat && pat->owner == ctx);
set_pat(ctx, pat);
}
@ -611,7 +611,7 @@ void glc_set_rgb(GLCCtx glc, double red, double green, double blue)
{
InternaCtx *ctx = (InternaCtx *)glc;
ASSERT(ctx);
spice_assert(ctx);
glDisable(GL_TEXTURE_2D);
unref_pat(ctx->pat);
@ -634,7 +634,7 @@ void glc_set_line_width(GLCCtx glc, double width)
{
InternaCtx *ctx = (InternaCtx *)glc;
ASSERT(ctx);
spice_assert(ctx);
ctx->line_width = (GLfloat)width;
if (ctx->line_width > 0) {
glLineWidth(ctx->line_width);
@ -648,7 +648,7 @@ void glc_set_line_dash(GLCCtx glc, const double *dashes, int num_dashes, double
{
InternaCtx *ctx = (InternaCtx *)glc;
ASSERT(ctx);
spice_assert(ctx);
if (dashes && num_dashes >= 0 && offset >= 0) {
ctx->line_dash.dashes = spice_new(double, num_dashes);
memcpy(ctx->line_dash.dashes, dashes, sizeof(double) * num_dashes);
@ -666,7 +666,7 @@ void glc_set_fill_mode(GLCCtx glc, GLCFillMode fill_mode)
{
InternaCtx *ctx = (InternaCtx *)glc;
ASSERT(ctx);
spice_assert(ctx);
int mode;
switch (fill_mode) {
case GLC_FILL_MODE_WINDING_ODD:
@ -703,8 +703,8 @@ void glc_set_mask(GLCCtx glc, int x_dest, int y_dest, int width, int height,
{
InternaCtx *ctx = (InternaCtx *)glc;
uint32_t mask = (id == GLC_MASK_A) ? 0x04 : 0x08;
ASSERT(ctx && bitmap);
ASSERT(id == GLC_MASK_A || id == GLC_MASK_B);
spice_assert(ctx && bitmap);
spice_assert(id == GLC_MASK_A || id == GLC_MASK_B);
if (ctx->pat) {
glDisable(GL_TEXTURE_2D);
@ -732,8 +732,8 @@ void glc_mask_rects(GLCCtx glc, int num_rect, GLCRect *rects, GLCMaskID id)
InternaCtx *ctx = (InternaCtx *)glc;
uint32_t mask = (id == GLC_MASK_A) ? 0x04 : 0x08;
GLCRect *end;
ASSERT(ctx && rects);
ASSERT(id == GLC_MASK_A || id == GLC_MASK_B);
spice_assert(ctx && rects);
spice_assert(id == GLC_MASK_A || id == GLC_MASK_B);
if (ctx->pat) {
glDisable(GL_TEXTURE_2D);
@ -763,8 +763,8 @@ void glc_clear_mask(GLCCtx glc, GLCMaskID id)
{
InternaCtx *ctx = (InternaCtx *)glc;
uint32_t mask = (id == GLC_MASK_A) ? 0x04 : 0x08;
ASSERT(ctx);
ASSERT(id == GLC_MASK_A || id == GLC_MASK_B);
spice_assert(ctx);
spice_assert(id == GLC_MASK_A || id == GLC_MASK_B);
if ((ctx->stencil_mask & mask)) {
ctx->stencil_mask &= ~mask;
@ -855,7 +855,7 @@ void glc_clip_rect(GLCCtx glc, const GLCRect *rect, GLCClipOp op)
{
InternaCtx *ctx = (InternaCtx *)glc;
ASSERT(ctx && rect);
spice_assert(ctx && rect);
clip_common(ctx, op, fill_rect, (void *)rect);
}
@ -863,7 +863,7 @@ void glc_clip_path(GLCCtx glc, GLCPath path, GLCClipOp op)
{
InternaCtx *ctx = (InternaCtx *)glc;
ASSERT(ctx && path);
spice_assert(ctx && path);
clip_common(ctx, op, fill_path, path);
}
@ -889,7 +889,7 @@ void glc_clip_mask(GLCCtx glc, int x_dest, int y_dest, int width, int height,
InternaCtx *ctx = (InternaCtx *)glc;
FillMaskInfo mask_info;
ASSERT(ctx && bitmap);
spice_assert(ctx && bitmap);
mask_info.x_dest = x_dest;
mask_info.y_dest = y_dest;
mask_info.width = width;
@ -934,7 +934,7 @@ void glc_fill_rect(GLCCtx glc, const GLCRect *rect)
InternaCtx *ctx = (InternaCtx *)glc;
GLCRect *r = (GLCRect *)rect; // to avoid bugs in gcc older than 4.3
ASSERT(ctx);
spice_assert(ctx);
start_draw(ctx);
fill_rect(ctx, (void *)r);
GLC_ERROR_TEST_FLUSH;
@ -970,7 +970,7 @@ static void fill_path(InternaCtx *ctx, void *p)
(GLdouble *)&current_point[2]);
}
} else {
ASSERT(current_segment->type == GLC_PATH_SEG_LINES);
spice_assert(current_segment->type == GLC_PATH_SEG_LINES);
end_point = current_point + current_segment->count;
for (; current_point < end_point; current_point++) {
gluTessVertex(ctx->tesselator, (GLdouble *)current_point,
@ -987,7 +987,7 @@ void glc_fill_path(GLCCtx glc, GLCPath path_ref)
{
InternaCtx *ctx = (InternaCtx *)glc;
ASSERT(ctx && path_ref);
spice_assert(ctx && path_ref);
start_draw(ctx);
fill_path(ctx, path_ref);
}
@ -1005,10 +1005,10 @@ void _glc_fill_mask(GLCCtx glc, int x_dest, int y_dest, int width, int height, i
{
InternaCtx *ctx = (InternaCtx *)glc;
ASSERT(ctx && bitmap);
spice_assert(ctx && bitmap);
start_draw(ctx);
if (ctx->pat) {
WARN_ONCE("%s: unimplemented fill mask with pattern\n", __FUNCTION__);
spice_critical("unimplemented fill mask with pattern");
}
fill_mask(ctx, x_dest, y_dest, width, height, stride, bitmap);
}
@ -1019,7 +1019,7 @@ void glc_fill_alpha(GLCCtx glc, int x_dest, int y_dest, int width, int height, i
InternaCtx *ctx = (InternaCtx *)glc;
GLCRect r;
ASSERT(ctx);
spice_assert(ctx);
start_draw(ctx);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
@ -1045,7 +1045,7 @@ void glc_stroke_rect(GLCCtx glc, const GLCRect *rect)
{
InternaCtx *ctx = (InternaCtx *)glc;
ASSERT(ctx);
spice_assert(ctx);
if (ctx->line_width == 0) {
return;
}
@ -1151,7 +1151,7 @@ static void glc_vertex2d(InternaCtx *ctx, double x, double y)
ctx->path_stroke.y = y;
ctx->path_stroke.state = GLC_STROKE_ACTIVE;
} else {
ASSERT(ctx->path_stroke.state == GLC_STROKE_NONACTIVE);
spice_assert(ctx->path_stroke.state == GLC_STROKE_NONACTIVE);
//error
}
}
@ -1173,7 +1173,7 @@ void glc_stroke_path(GLCCtx glc, GLCPath path_ref)
InternaCtx *ctx = (InternaCtx *)glc;
InternalPath *path = (InternalPath *)path_ref;
ASSERT(ctx && path);
spice_assert(ctx && path);
if (ctx->line_width == 0) {
return;
}
@ -1202,7 +1202,7 @@ void glc_stroke_path(GLCCtx glc, GLCPath path_ref)
glc_vertex2d(ctx, current_point[2].x, current_point[2].y);
}
} else {
ASSERT(current_segment->type == GLC_PATH_SEG_LINES);
spice_assert(current_segment->type == GLC_PATH_SEG_LINES);
end_point = current_point + current_segment->count;
for (; current_point < end_point; current_point++) {
glc_vertex2d(ctx, current_point->x, current_point->y);
@ -1220,10 +1220,10 @@ void glc_draw_image(GLCCtx glc, const GLCRecti *dest, const GLCRecti *src, const
uint8_t *pixels;
const int pix_bytes = 4;
ASSERT(ctx && image);
ASSERT(src->width > 0 && src->height > 0);
spice_assert(ctx && image);
spice_assert(src->width > 0 && src->height > 0);
ASSERT(image->format == GLC_IMAGE_RGB32 || image->format == GLC_IMAGE_ARGB32); //for now
spice_assert(image->format == GLC_IMAGE_RGB32 || image->format == GLC_IMAGE_ARGB32); //for now
start_draw(ctx);
if (ctx->pat) {
glDisable(GL_TEXTURE_2D);
@ -1242,7 +1242,7 @@ void glc_draw_image(GLCCtx glc, const GLCRecti *dest, const GLCRecti *src, const
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
}
ASSERT(image->stride % pix_bytes == 0);
spice_assert(image->stride % pix_bytes == 0);
glPixelStorei(GL_UNPACK_ROW_LENGTH, image->stride / pix_bytes);
glDrawPixels(src->width, src->height, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
@ -1262,7 +1262,7 @@ void glc_copy_pixels(GLCCtx glc, int x_dest, int y_dest, int x_src, int y_src, i
InternaCtx *ctx = (InternaCtx *)glc;
int recreate = 0;
ASSERT(ctx);
spice_assert(ctx);
#ifdef USE_COPY_PIXELS
start_draw(ctx);
if (ctx->pat) {
@ -1303,7 +1303,7 @@ void glc_copy_pixels(GLCCtx glc, int x_dest, int y_dest, int x_src, int y_src, i
glTexImage2D(GL_TEXTURE_2D, 0, 4, ctx->private_tex_width,
ctx->private_tex_height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
}
ASSERT(ctx->private_tex);
spice_assert(ctx->private_tex);
glBindTexture(GL_TEXTURE_2D, ctx->private_tex);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, x_src, ctx->height - (y_src + height),
width2, height2, 0);
@ -1332,9 +1332,9 @@ void glc_read_pixels(GLCCtx glc, int x, int y, GLCImage *image)
{
InternaCtx *ctx = (InternaCtx *)glc;
ASSERT(ctx && image);
ASSERT(image->format == GLC_IMAGE_RGB32); //for now
ASSERT((image->stride % 4) == 0); //for now
spice_assert(ctx && image);
spice_assert(image->format == GLC_IMAGE_RGB32); //for now
spice_assert((image->stride % 4) == 0); //for now
glPixelStorei(GL_PACK_ROW_LENGTH, image->stride / 4);
glReadPixels(x, ctx->height - (y + image->height), image->width, image->height,
GL_BGRA, GL_UNSIGNED_BYTE, image->pixels);
@ -1344,7 +1344,7 @@ void glc_clear(GLCCtx glc)
{
InternaCtx *ctx = (InternaCtx *)glc;
ASSERT(ctx);
spice_assert(ctx);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glClear(GL_COLOR_BUFFER_BIT);
}
@ -1458,7 +1458,7 @@ GLCCtx glc_create(int width, int height)
{
InternaCtx *ctx;
ASSERT(sizeof(PathPoint) == sizeof(Vertex));
spice_static_assert(sizeof(PathPoint) == sizeof(Vertex));
ctx = spice_new0(InternaCtx, 1);
if (!init(ctx, width, height)) {

113
common/log.c Normal file
View File

@ -0,0 +1,113 @@
/*
Copyright (C) 2012 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include "log.h"
#include "backtrace.h"
static int debug_level = -1;
static int abort_level = -1;
static const char * spice_log_level_to_string(SpiceLogLevel level)
{
static const char *to_string[] = {
[ SPICE_LOG_LEVEL_ERROR ] = "ERROR",
[ SPICE_LOG_LEVEL_CRITICAL ] = "CRITICAL",
[ SPICE_LOG_LEVEL_WARNING ] = "Warning",
[ SPICE_LOG_LEVEL_INFO ] = "Info",
[ SPICE_LOG_LEVEL_DEBUG ] = "Debug",
};
const char *str = NULL;
if (level < SPICE_N_ELEMENTS(to_string)) {
str = to_string[level];
}
return str;
}
#ifndef SPICE_ABORT_LEVEL_DEFAULT
#ifdef SPICE_DISABLE_ABORT
#define SPICE_ABORT_LEVEL_DEFAULT -1
#else
#define SPICE_ABORT_LEVEL_DEFAULT SPICE_LOG_LEVEL_CRITICAL
#endif
#endif
void spice_logv(const char *log_domain,
SpiceLogLevel log_level,
const char *strloc,
const char *function,
const char *format,
va_list args)
{
const char *level = spice_log_level_to_string(log_level);
if (debug_level == -1) {
debug_level = getenv("SPICE_DEBUG_LEVEL") ? atoi(getenv("SPICE_DEBUG_LEVEL")) : SPICE_LOG_LEVEL_WARNING;
}
if (abort_level == -1) {
abort_level = getenv("SPICE_ABORT_LEVEL") ? atoi(getenv("SPICE_ABORT_LEVEL")) : SPICE_ABORT_LEVEL_DEFAULT;
}
if (debug_level < log_level)
return;
fprintf(stderr, "(%s:%d): ", getenv("_"), getpid());
if (log_domain) {
fprintf(stderr, "%s-", log_domain);
}
if (level) {
fprintf(stderr, "%s **: ", level);
}
if (strloc && function) {
fprintf(stderr, "%s:%s: ", strloc, function);
}
if (format) {
vfprintf(stderr, format, args);
}
fprintf(stderr, "\n");
if (abort_level != -1 && abort_level >= log_level) {
spice_backtrace();
abort();
}
}
void spice_log(const char *log_domain,
SpiceLogLevel log_level,
const char *strloc,
const char *function,
const char *format,
...)
{
va_list args;
va_start (args, format);
spice_logv (log_domain, log_level, strloc, function, format, args);
va_end (args);
}

144
common/log.h Normal file
View File

@ -0,0 +1,144 @@
/*
Copyright (C) 2012 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef H_SPICE_LOG
#define H_SPICE_LOG
#include <spice/macros.h>
#include <stdarg.h>
SPICE_BEGIN_DECLS
#ifndef SPICE_LOG_DOMAIN
#define SPICE_LOG_DOMAIN "Spice"
#endif
#define SPICE_STRINGIFY(x) SPICE_STRINGIFY_ARG (x)
#define SPICE_STRINGIFY_ARG(x) #x
#define SPICE_STRLOC __FILE__ ":" SPICE_STRINGIFY (__LINE__)
typedef enum {
SPICE_LOG_LEVEL_ERROR,
SPICE_LOG_LEVEL_CRITICAL,
SPICE_LOG_LEVEL_WARNING,
SPICE_LOG_LEVEL_INFO,
SPICE_LOG_LEVEL_DEBUG,
} SpiceLogLevel;
void spice_logv(const char *log_domain,
SpiceLogLevel log_level,
const char *strloc,
const char *function,
const char *format,
va_list args);
void spice_log(const char *log_domain,
SpiceLogLevel log_level,
const char *strloc,
const char *function,
const char *format,
...);
#ifndef spice_return_if_fail
#define spice_return_if_fail(x) SPICE_STMT_START { \
if SPICE_LIKELY(x) { } else { \
spice_log(SPICE_LOG_DOMAIN, SPICE_LOG_LEVEL_CRITICAL, SPICE_STRLOC, __FUNCTION__, "condition `%s' failed", #x); \
return; \
} \
} SPICE_STMT_END
#endif
#ifndef spice_return_val_if_fail
#define spice_return_val_if_fail(x, val) SPICE_STMT_START { \
if SPICE_LIKELY(x) { } else { \
spice_log(SPICE_LOG_DOMAIN, SPICE_LOG_LEVEL_CRITICAL, SPICE_STRLOC, __FUNCTION__, "condition `%s' failed", #x); \
return (val); \
} \
} SPICE_STMT_END
#endif
#ifndef spice_warn_if_reached
#define spice_warn_if_reached() SPICE_STMT_START { \
spice_log(SPICE_LOG_DOMAIN, SPICE_LOG_LEVEL_WARNING, SPICE_STRLOC, __FUNCTION__, "should not be reached"); \
} SPICE_STMT_END
#endif
#ifndef spice_printerr
#define spice_printerr(format, ...) SPICE_STMT_START { \
fprintf(stderr, "%s: " format "\n", __FUNCTION__, ## __VA_ARGS__); \
} SPICE_STMT_END
#endif
#ifndef spice_debug
#define spice_debug(format, ...) SPICE_STMT_START { \
spice_log(SPICE_LOG_DOMAIN, SPICE_LOG_LEVEL_DEBUG, SPICE_STRLOC, __FUNCTION__, format, ## __VA_ARGS__); \
} SPICE_STMT_END
#endif
#ifndef spice_warning
#define spice_warning(format, ...) SPICE_STMT_START { \
spice_log(SPICE_LOG_DOMAIN, SPICE_LOG_LEVEL_WARNING, SPICE_STRLOC, __FUNCTION__, format, ## __VA_ARGS__); \
} SPICE_STMT_END
#endif
#ifndef spice_critical
#define spice_critical(format, ...) SPICE_STMT_START { \
spice_log(SPICE_LOG_DOMAIN, SPICE_LOG_LEVEL_CRITICAL, SPICE_STRLOC, __FUNCTION__, format, ## __VA_ARGS__); \
} SPICE_STMT_END
#endif
#ifndef spice_error
#define spice_error(format, ...) SPICE_STMT_START { \
spice_log(SPICE_LOG_DOMAIN, SPICE_LOG_LEVEL_ERROR, SPICE_STRLOC, __FUNCTION__, format, ## __VA_ARGS__); \
} SPICE_STMT_END
#endif
#ifndef spice_warn_if_fail
#define spice_warn_if_fail(x) SPICE_STMT_START { \
if SPICE_LIKELY(x) { } else { \
spice_warning("condition `%s' failed", #x); \
} \
} SPICE_STMT_END
#endif
#ifndef spice_warn_if
#define spice_warn_if(x) SPICE_STMT_START { \
if SPICE_UNLIKELY(x) { \
spice_warning("condition `%s' reached", #x); \
} \
} SPICE_STMT_END
#endif
#ifndef spice_assert
#define spice_assert(x) SPICE_STMT_START { \
if SPICE_LIKELY(x) { } else { \
spice_error("assertion `%s' failed", #x); \
} \
} SPICE_STMT_END
#endif
/* FIXME: improve that some day.. */
#ifndef spice_static_assert
#define spice_static_assert(x) SPICE_STMT_START { \
spice_assert(x); \
} SPICE_STMT_END
#endif
SPICE_END_DECLS
#endif /* H_SPICE_LOG */

View File

@ -47,21 +47,9 @@
#include <config.h>
#endif
#include "spice_common.h"
#include "lz.h"
#define DEBUG
#ifdef DEBUG
#define ASSERT(usr, x) \
if (!(x)) (usr)->error(usr, "%s: ASSERT %s failed\n", __FUNCTION__, #x);
#else
#define ASSERT(usr, x)
#endif
#define HASH_LOG 13
#define HASH_SIZE (1 << HASH_LOG)
#define HASH_MASK (HASH_SIZE - 1)
@ -184,7 +172,7 @@ static int lz_read_image_segments(Encoder *encoder, uint8_t *first_lines,
uint8_t* lines = first_lines;
int row;
ASSERT(encoder->usr, !encoder->head_image_segs);
spice_return_val_if_fail(!encoder->head_image_segs, FALSE);
image_seg = lz_alloc_image_seg(encoder);
if (!image_seg) {
@ -240,10 +228,10 @@ static INLINE void encode(Encoder *encoder, uint8_t byte)
if (more_io_bytes(encoder) <= 0) {
encoder->usr->error(encoder->usr, "%s: no more bytes\n", __FUNCTION__);
}
ASSERT(encoder->usr, encoder->io_now);
spice_return_if_fail(encoder->io_now);
}
ASSERT(encoder->usr, encoder->io_now < encoder->io_end);
spice_return_if_fail(encoder->io_now < encoder->io_end);
*(encoder->io_now++) = byte;
}
@ -263,7 +251,7 @@ static INLINE void encode_copy_count(Encoder *encoder, uint8_t copy_count)
static INLINE void update_copy_count(Encoder *encoder, uint8_t copy_count)
{
ASSERT(encoder->usr, encoder->io_last_copy);
spice_return_if_fail(encoder->io_last_copy);
*(encoder->io_last_copy) = copy_count;
}
@ -278,12 +266,13 @@ static INLINE void compress_output_prev(Encoder *encoder)
// io_now cannot be the first byte of the buffer
encoder->io_now--;
// the function should be called only when copy count is written unnecessarily by lz_compress
ASSERT(encoder->usr, encoder->io_now == encoder->io_last_copy)
spice_return_if_fail(encoder->io_now == encoder->io_last_copy);
}
static int encoder_reset(Encoder *encoder, uint8_t *io_ptr, uint8_t *io_ptr_end)
{
ASSERT(encoder->usr, io_ptr <= io_ptr_end);
spice_return_val_if_fail(io_ptr <= io_ptr_end, FALSE);
encoder->io_bytes_count = io_ptr_end - io_ptr;
encoder->io_start = io_ptr;
encoder->io_now = io_ptr;
@ -300,9 +289,9 @@ static INLINE uint8_t decode(Encoder *encoder)
if (num_io_bytes <= 0) {
encoder->usr->error(encoder->usr, "%s: no more bytes\n", __FUNCTION__);
}
ASSERT(encoder->usr, encoder->io_now);
spice_assert(encoder->io_now);
}
ASSERT(encoder->usr, encoder->io_now < encoder->io_end);
spice_assert(encoder->io_now < encoder->io_end);
return *(encoder->io_now++);
}
@ -707,7 +696,7 @@ void lz_decode(LzContext *lz, LzImageType to_type, uint8_t *buf)
if (encoder->type == to_type) {
out_size = lz_rgb32_decompress(encoder, (rgb32_pixel_t *)buf, size);
alpha_size = lz_rgb_alpha_decompress(encoder, (rgb32_pixel_t *)buf, size);
ASSERT(encoder->usr, alpha_size == size);
spice_assert(alpha_size == size);
} else {
encoder->usr->error(encoder->usr, "unsupported output format\n");
}
@ -731,8 +720,8 @@ void lz_decode(LzContext *lz, LzImageType to_type, uint8_t *buf)
}
}
ASSERT(encoder->usr, is_io_to_decode_end(encoder));
ASSERT(encoder->usr, out_size == size);
spice_assert(is_io_to_decode_end(encoder));
spice_assert(out_size == size);
if (out_size != size) {
encoder->usr->error(encoder->usr, "bad decode size\n");

View File

@ -9,6 +9,7 @@
#include "lz_common.h"
#include "lz_config.h"
#include "draw.h"
#include "macros.h"
#ifdef __cplusplus
extern "C" {
@ -18,9 +19,9 @@ typedef void *LzContext;
typedef struct LzUsrContext LzUsrContext;
struct LzUsrContext {
void (*error)(LzUsrContext *usr, const char *fmt, ...);
void (*warn)(LzUsrContext *usr, const char *fmt, ...);
void (*info)(LzUsrContext *usr, const char *fmt, ...);
ATTR_PRINTF(2, 3) void (*error)(LzUsrContext *usr, const char *fmt, ...);
ATTR_PRINTF(2, 3) void (*warn)(LzUsrContext *usr, const char *fmt, ...);
ATTR_PRINTF(2, 3) void (*info)(LzUsrContext *usr, const char *fmt, ...);
void *(*malloc)(LzUsrContext *usr, int size);
void (*free)(LzUsrContext *usr, void *ptr);
int (*more_space)(LzUsrContext *usr, uint8_t **io_ptr); // get the next chunk of the

View File

@ -254,9 +254,9 @@ static size_t FNAME(decompress)(Encoder *encoder, OUT_PIXEL *out_buf, int size)
#endif
ref -= ofs;
ASSERT(encoder->usr, op + len <= op_limit);
ASSERT(encoder->usr, ref + len <= op_limit);
ASSERT(encoder->usr, ref >= out_buf);
spice_assert(op + len <= op_limit);
spice_assert(ref + len <= op_limit);
spice_assert(ref >= out_buf);
// TODO: optimize by not calling loop at least 3 times when not PLT_TO_RGB32 (len is
// always >=3). in PLT_TO_RGB32 len >= 3*number_of_pixels_per_byte
@ -270,29 +270,29 @@ static size_t FNAME(decompress)(Encoder *encoder, OUT_PIXEL *out_buf, int size)
OUT_PIXEL b = *ref;
for (; len; --len) {
COPY_PIXEL(b, op);
ASSERT(encoder->usr, op <= op_limit);
spice_assert(op <= op_limit);
}
} else {
for (; len; --len) {
COPY_REF_PIXEL(ref, op);
ASSERT(encoder->usr, op <= op_limit);
spice_assert(op <= op_limit);
}
}
} else { // copy
ctrl++; // copy count is biased by 1
#if defined(TO_RGB32) && (defined(PLT4_BE) || defined(PLT4_LE) || defined(PLT1_BE) || \
defined(PLT1_LE))
ASSERT(encoder->usr, op + CAST_PLT_DISTANCE(ctrl) <= op_limit);
spice_assert(op + CAST_PLT_DISTANCE(ctrl) <= op_limit);
#else
ASSERT(encoder->usr, op + ctrl <= op_limit);
spice_assert(op + ctrl <= op_limit);
#endif
COPY_COMP_PIXEL(encoder, op);
ASSERT(encoder->usr, op <= op_limit);
spice_assert(op <= op_limit);
for (--ctrl; ctrl; ctrl--) {
COPY_COMP_PIXEL(encoder, op);
ASSERT(encoder->usr, op <= op_limit);
spice_assert(op <= op_limit);
}
}

30
common/macros.h Normal file
View File

@ -0,0 +1,30 @@
/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
Copyright (C) 2009 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __MACROS_H
#define __MACROS_H
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
#define ATTR_PRINTF(a,b) \
__attribute__((format(printf,a,b)))
#else
#define ATTR_PRINTF(a,b)
#endif /* __GNUC__ */
#endif /* __MACROS_H */

View File

@ -19,16 +19,18 @@
#include <config.h>
#endif
#include "spice_common.h"
#include "mem.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifndef MALLOC_ERROR
#define MALLOC_ERROR(format, ...) { \
printf(format "\n", ## __VA_ARGS__); \
abort(); \
}
#define MALLOC_ERROR(format, ...) SPICE_STMT_START { \
spice_error(format, ## __VA_ARGS__); \
abort(); \
} SPICE_STMT_END
#endif
size_t spice_strnlen(const char *str, size_t max_len)
@ -94,8 +96,7 @@ void *spice_malloc(size_t n_bytes)
return mem;
}
MALLOC_ERROR("spice_malloc: panic: unable to allocate %lu bytes\n",
(unsigned long)n_bytes);
MALLOC_ERROR("unable to allocate %lu bytes", (unsigned long)n_bytes);
}
return NULL;
}
@ -111,8 +112,7 @@ void *spice_malloc0(size_t n_bytes)
return mem;
}
MALLOC_ERROR("spice_malloc0: panic: unable to allocate %lu bytes\n",
(unsigned long)n_bytes);
MALLOC_ERROR("unable to allocate %lu bytes", (unsigned long)n_bytes);
}
return NULL;
}
@ -126,8 +126,7 @@ void *spice_realloc(void *mem, size_t n_bytes)
return mem;
}
MALLOC_ERROR("spice_realloc: panic: unable to allocate %lu bytes\n",
(unsigned long)n_bytes);
MALLOC_ERROR("unable to allocate %lu bytes", (unsigned long)n_bytes);
}
free(mem);
@ -140,7 +139,7 @@ void *spice_realloc(void *mem, size_t n_bytes)
void *spice_malloc_n(size_t n_blocks, size_t n_block_bytes)
{
if (SIZE_OVERFLOWS (n_blocks, n_block_bytes)) {
MALLOC_ERROR("spice_malloc_n: overflow allocating %lu*%lu bytes",
MALLOC_ERROR("overflow allocating %lu*%lu bytes",
(unsigned long)n_blocks, (unsigned long)n_block_bytes);
}
@ -179,7 +178,7 @@ void *spice_realloc_n(void *mem, size_t n_blocks, size_t n_block_bytes)
if (SIZE_OVERFLOWS (n_blocks, n_block_bytes)) {
MALLOC_ERROR("spice_realloc_n: overflow allocating %lu*%lu bytes",
(unsigned long)n_blocks, (unsigned long)n_block_bytes);
}
}
return spice_realloc(mem, n_blocks * n_block_bytes);
}

View File

@ -243,7 +243,7 @@ void oglctx_destroy(OGLCtx *ctx)
XFreePixmap(ctx->x_display, ((OGLPixmapCtx *)ctx)->pixmap);
break;
default:
PANIC("invalid ogl ctx type");
spice_error("invalid ogl ctx type");
}
XCloseDisplay(ctx->x_display);

View File

@ -206,12 +206,12 @@ void spice_pixman_fill_rect(pixman_image_t *dest,
depth = spice_pixman_image_get_bpp(dest);
/* stride is in bytes, depth in bits */
ASSERT(x >= 0);
ASSERT(y >= 0);
ASSERT(width > 0);
ASSERT(height > 0);
ASSERT(x + width <= pixman_image_get_width(dest));
ASSERT(y + height <= pixman_image_get_height(dest));
spice_assert(x >= 0);
spice_assert(y >= 0);
spice_assert(width > 0);
spice_assert(height > 0);
spice_assert(x + width <= pixman_image_get_width(dest));
spice_assert(y + height <= pixman_image_get_height(dest));
if (pixman_fill(bits,
stride / 4,
@ -231,7 +231,7 @@ void spice_pixman_fill_rect(pixman_image_t *dest,
byte_width = 2 * width;
value = (value & 0xffff) * 0x00010001;
} else {
ASSERT (depth == 32)
spice_assert (depth == 32);
byte_line = ((uint8_t *)bits) + stride * y + x * 4;
byte_width = 4 * width;
}
@ -298,13 +298,13 @@ void spice_pixman_fill_rect_rop(pixman_image_t *dest,
depth = spice_pixman_image_get_bpp(dest);
/* stride is in bytes, depth in bits */
ASSERT(x >= 0);
ASSERT(y >= 0);
ASSERT(width > 0);
ASSERT(height > 0);
ASSERT(x + width <= pixman_image_get_width(dest));
ASSERT(y + height <= pixman_image_get_height(dest));
ASSERT(rop >= 0 && rop < 16);
spice_assert(x >= 0);
spice_assert(y >= 0);
spice_assert(width > 0);
spice_assert(height > 0);
spice_assert(x + width <= pixman_image_get_width(dest));
spice_assert(y + height <= pixman_image_get_height(dest));
spice_assert(rop >= 0 && rop < 16);
if (depth == 8) {
solid_rop_8_func_t rop_func = solid_rops_8[rop];
@ -358,13 +358,13 @@ void spice_pixman_tile_rect(pixman_image_t *dest,
tile_width = pixman_image_get_width(tile);
tile_height = pixman_image_get_height(tile);
ASSERT(x >= 0);
ASSERT(y >= 0);
ASSERT(width > 0);
ASSERT(height > 0);
ASSERT(x + width <= pixman_image_get_width(dest));
ASSERT(y + height <= pixman_image_get_height(dest));
ASSERT(depth == spice_pixman_image_get_bpp(tile));
spice_assert(x >= 0);
spice_assert(y >= 0);
spice_assert(width > 0);
spice_assert(height > 0);
spice_assert(x + width <= pixman_image_get_width(dest));
spice_assert(y + height <= pixman_image_get_height(dest));
spice_assert(depth == spice_pixman_image_get_bpp(tile));
tile_start_x = (x - offset_x) % tile_width;
if (tile_start_x < 0) {
@ -406,7 +406,7 @@ void spice_pixman_tile_rect(pixman_image_t *dest,
}
}
} else {
ASSERT (depth == 32);
spice_assert (depth == 32);
byte_line = ((uint8_t *)bits) + stride * y + x * 4;
tile_line = ((uint8_t *)tile_bits) + tile_stride * tile_start_y + tile_start_x * 4;
@ -449,14 +449,14 @@ void spice_pixman_tile_rect_rop(pixman_image_t *dest,
tile_width = pixman_image_get_width(tile);
tile_height = pixman_image_get_height(tile);
ASSERT(x >= 0);
ASSERT(y >= 0);
ASSERT(width > 0);
ASSERT(height > 0);
ASSERT(x + width <= pixman_image_get_width(dest));
ASSERT(y + height <= pixman_image_get_height(dest));
ASSERT(rop >= 0 && rop < 16);
ASSERT(depth == spice_pixman_image_get_bpp(tile));
spice_assert(x >= 0);
spice_assert(y >= 0);
spice_assert(width > 0);
spice_assert(height > 0);
spice_assert(x + width <= pixman_image_get_width(dest));
spice_assert(y + height <= pixman_image_get_height(dest));
spice_assert(rop >= 0 && rop < 16);
spice_assert(depth == spice_pixman_image_get_bpp(tile));
tile_start_x = (x - offset_x) % tile_width;
if (tile_start_x < 0) {
@ -504,7 +504,7 @@ void spice_pixman_tile_rect_rop(pixman_image_t *dest,
} else {
tiled_rop_32_func_t rop_func = tiled_rops_32[rop];
ASSERT (depth == 32);
spice_assert (depth == 32);
byte_line = ((uint8_t *)bits) + stride * y + x * 4;
tile_line = ((uint8_t *)tile_bits) + tile_stride * tile_start_y + tile_start_x * 4;
@ -536,6 +536,11 @@ void spice_pixman_blit(pixman_image_t *dest,
uint8_t *src_line;
int byte_width;
if (!src) {
fprintf(stderr, "missing src!");
return;
}
bits = pixman_image_get_data(dest);
stride = pixman_image_get_stride(dest);
depth = spice_pixman_image_get_bpp(dest);
@ -569,17 +574,17 @@ void spice_pixman_blit(pixman_image_t *dest,
return;
}
ASSERT(src_x >= 0);
ASSERT(src_y >= 0);
ASSERT(dest_x >= 0);
ASSERT(dest_y >= 0);
ASSERT(width > 0);
ASSERT(height > 0);
ASSERT(dest_x + width <= pixman_image_get_width(dest));
ASSERT(dest_y + height <= pixman_image_get_height(dest));
ASSERT(src_x + width <= pixman_image_get_width(src));
ASSERT(src_y + height <= pixman_image_get_height(src));
ASSERT(depth == src_depth);
spice_assert(src_x >= 0);
spice_assert(src_y >= 0);
spice_assert(dest_x >= 0);
spice_assert(dest_y >= 0);
spice_assert(width > 0);
spice_assert(height > 0);
spice_assert(dest_x + width <= pixman_image_get_width(dest));
spice_assert(dest_y + height <= pixman_image_get_height(dest));
spice_assert(src_x + width <= pixman_image_get_width(src));
spice_assert(src_y + height <= pixman_image_get_height(src));
spice_assert(depth == src_depth);
if (pixman_blt(src_bits,
bits,
@ -601,7 +606,7 @@ void spice_pixman_blit(pixman_image_t *dest,
byte_width = width * 2;
src_line = ((uint8_t *)src_bits) + src_stride * src_y + src_x * 2;
} else {
ASSERT (depth == 32);
spice_assert (depth == 32);
byte_line = ((uint8_t *)bits) + stride * dest_y + dest_x * 4;
byte_width = width * 4;
src_line = ((uint8_t *)src_bits) + src_stride * src_y + src_x * 4;
@ -660,17 +665,17 @@ void spice_pixman_blit_rop (pixman_image_t *dest,
return;
}
ASSERT(src_x >= 0);
ASSERT(src_y >= 0);
ASSERT(dest_x >= 0);
ASSERT(dest_y >= 0);
ASSERT(width > 0);
ASSERT(height > 0);
ASSERT(dest_x + width <= pixman_image_get_width(dest));
ASSERT(dest_y + height <= pixman_image_get_height(dest));
ASSERT(src_x + width <= pixman_image_get_width(src));
ASSERT(src_y + height <= pixman_image_get_height(src));
ASSERT(depth == src_depth);
spice_assert(src_x >= 0);
spice_assert(src_y >= 0);
spice_assert(dest_x >= 0);
spice_assert(dest_y >= 0);
spice_assert(width > 0);
spice_assert(height > 0);
spice_assert(dest_x + width <= pixman_image_get_width(dest));
spice_assert(dest_y + height <= pixman_image_get_height(dest));
spice_assert(src_x + width <= pixman_image_get_width(src));
spice_assert(src_y + height <= pixman_image_get_height(src));
spice_assert(depth == src_depth);
if (depth == 8) {
copy_rop_8_func_t rop_func = copy_rops_8[rop];
@ -697,7 +702,7 @@ void spice_pixman_blit_rop (pixman_image_t *dest,
} else {
copy_rop_32_func_t rop_func = copy_rops_32[rop];
ASSERT (depth == 32);
spice_assert (depth == 32);
byte_line = ((uint8_t *)bits) + stride * dest_y + dest_x * 4;
src_line = ((uint8_t *)src_bits) + src_stride * src_y + src_x * 4;
@ -756,17 +761,17 @@ void spice_pixman_blit_colorkey (pixman_image_t *dest,
return;
}
ASSERT(src_x >= 0);
ASSERT(src_y >= 0);
ASSERT(dest_x >= 0);
ASSERT(dest_y >= 0);
ASSERT(width > 0);
ASSERT(height > 0);
ASSERT(dest_x + width <= pixman_image_get_width(dest));
ASSERT(dest_y + height <= pixman_image_get_height(dest));
ASSERT(src_x + width <= pixman_image_get_width(src));
ASSERT(src_y + height <= pixman_image_get_height(src));
ASSERT(depth == spice_pixman_image_get_bpp(src));
spice_assert(src_x >= 0);
spice_assert(src_y >= 0);
spice_assert(dest_x >= 0);
spice_assert(dest_y >= 0);
spice_assert(width > 0);
spice_assert(height > 0);
spice_assert(dest_x + width <= pixman_image_get_width(dest));
spice_assert(dest_y + height <= pixman_image_get_height(dest));
spice_assert(src_x + width <= pixman_image_get_width(src));
spice_assert(src_y + height <= pixman_image_get_height(src));
spice_assert(depth == spice_pixman_image_get_bpp(src));
if (depth == 8) {
byte_line = ((uint8_t *)bits) + stride * dest_y + dest_x;
@ -806,7 +811,7 @@ void spice_pixman_blit_colorkey (pixman_image_t *dest,
src_line += src_stride;
}
} else {
ASSERT (depth == 32);
spice_assert (depth == 32);
byte_line = ((uint8_t *)bits) + stride * dest_y + dest_x * 4;
src_line = ((uint8_t *)src_bits) + src_stride * src_y + src_x * 4;
@ -925,7 +930,7 @@ pixman_format_code_t spice_surface_format_to_pixman(uint32_t surface_format)
return PIXMAN_a8r8g8b8;
default:
printf("Unknown surface format %d\n", surface_format);
abort();
spice_abort();
break;
}
return (pixman_format_code_t)0; /* Not reached */
@ -961,7 +966,7 @@ pixman_format_code_t spice_bitmap_format_to_pixman(int bitmap_format,
case SPICE_BITMAP_FMT_INVALID:
default:
printf("Unknown bitmap format %d\n", bitmap_format);
abort();
spice_abort();
return PIXMAN_a8r8g8b8;
}
}
@ -1131,7 +1136,7 @@ static void bitmap_8_32_to_32(uint8_t *dest, int dest_stride,
#endif
if (!palette) {
PANIC("No palette");
spice_error("No palette");
return;
}
@ -1177,7 +1182,7 @@ static void bitmap_8_16_to_16_555(uint8_t *dest, int dest_stride,
#endif
if (!palette) {
PANIC("No palette");
spice_error("No palette");
return;
}
@ -1223,7 +1228,7 @@ static void bitmap_4be_32_to_32(uint8_t* dest, int dest_stride,
#endif
if (!palette) {
PANIC("No palette");
spice_error("No palette");
return;
}
@ -1273,7 +1278,7 @@ static void bitmap_4be_16_to_16_555(uint8_t* dest, int dest_stride,
#endif
if (!palette) {
PANIC("No palette");
spice_error("No palette");
return;
}
@ -1323,7 +1328,7 @@ static void bitmap_1be_32_to_32(uint8_t* dest, int dest_stride,
uint32_t fore_color;
uint32_t back_color;
ASSERT(palette != NULL);
spice_assert(palette != NULL);
if (!palette) {
return;
@ -1355,7 +1360,7 @@ static void bitmap_1be_16_to_16_555(uint8_t* dest, int dest_stride,
uint16_t fore_color;
uint16_t back_color;
ASSERT(palette != NULL);
spice_assert(palette != NULL);
if (!palette) {
return;
@ -1461,7 +1466,7 @@ pixman_image_t *spice_bitmap_to_pixman(pixman_image_t *dest_image,
dest = (uint8_t *)pixman_image_get_data(dest_image);
dest_stride = pixman_image_get_stride(dest_image);
if (!(flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
ASSERT(height > 0);
spice_assert(height > 0);
dest += dest_stride * (height - 1);
dest_stride = -dest_stride;
}
@ -1485,7 +1490,7 @@ pixman_image_t *spice_bitmap_to_pixman(pixman_image_t *dest_image,
} else if (palette_surface_format == SPICE_SURFACE_FMT_16_555) {
bitmap_8_16_to_16_555(dest, dest_stride, src, src_stride, width, end, palette);
} else {
PANIC("Unsupported palette format");
spice_error("Unsupported palette format");
}
break;
case SPICE_BITMAP_FMT_4BIT_BE:
@ -1495,7 +1500,7 @@ pixman_image_t *spice_bitmap_to_pixman(pixman_image_t *dest_image,
} else if (palette_surface_format == SPICE_SURFACE_FMT_16_555) {
bitmap_4be_16_to_16_555(dest, dest_stride, src, src_stride, width, end, palette);
} else {
PANIC("Unsupported palette format");
spice_error("Unsupported palette format");
}
break;
case SPICE_BITMAP_FMT_1BIT_BE:
@ -1505,11 +1510,11 @@ pixman_image_t *spice_bitmap_to_pixman(pixman_image_t *dest_image,
} else if (palette_surface_format == SPICE_SURFACE_FMT_16_555) {
bitmap_1be_16_to_16_555(dest, dest_stride, src, src_stride, width, end, palette);
} else {
PANIC("Unsupported palette format");
spice_error("Unsupported palette format");
}
break;
default:
PANIC("Unsupported bitmap format");
spice_error("Unsupported bitmap format");
break;
}

View File

@ -24,11 +24,9 @@
#endif
#include "quic.h"
#include <spice/macros.h>
#include "spice_common.h"
#include "bitops.h"
//#define DEBUG
#define RLE
#define RLE_STAT
#define PRED_1
@ -42,17 +40,6 @@
#define QUIC_VERSION_MINOR 1U
#define QUIC_VERSION ((QUIC_VERSION_MAJOR << 16) | (QUIC_VERSION_MAJOR & 0xffff))
#ifdef DEBUG
#define ASSERT(usr, x) \
if (!(x)) (usr)->error(usr, "%s: ASSERT %s failed\n", __FUNCTION__, #x);
#else
#define ASSERT(usr, x)
#endif
typedef uint8_t BYTE;
/* maximum number of codes in family */
@ -253,8 +240,8 @@ static const unsigned int tabrand_chaos[TABRAND_TABSIZE] = {
static unsigned int stabrand(void)
{
//ASSERT( !(TABRAND_SEEDMASK & TABRAND_TABSIZE));
//ASSERT( TABRAND_SEEDMASK + 1 == TABRAND_TABSIZE );
//spice_assert( !(TABRAND_SEEDMASK & TABRAND_TABSIZE));
//spice_assert( TABRAND_SEEDMASK + 1 == TABRAND_TABSIZE );
return TABRAND_SEEDMASK;
}
@ -279,19 +266,19 @@ static void set_wm_trigger(CommonState *state)
wm = 10;
}
ASSERT(state->encoder->usr, evol < 6);
spice_assert(evol < 6);
state->wm_trigger = besttrigtab[evol / 2][wm];
ASSERT(state->encoder->usr, state->wm_trigger <= 2000);
ASSERT(state->encoder->usr, state->wm_trigger >= 1);
spice_assert(state->wm_trigger <= 2000);
spice_assert(state->wm_trigger >= 1);
}
static int ceil_log_2(int val) /* ceil(log_2(val)) */
{
int result;
//ASSERT(val>0);
//spice_assert(val>0);
if (val == 1) {
return 0;
@ -346,7 +333,7 @@ static void decorelate_init(QuicFamily *family, int bpc)
const unsigned int pixelbitmaskshr = pixelbitmask >> 1;
unsigned int s;
//ASSERT(bpc <= 8);
//spice_assert(bpc <= 8);
for (s = 0; s <= pixelbitmask; s++) {
if (s <= pixelbitmaskshr) {
@ -362,7 +349,7 @@ static void corelate_init(QuicFamily *family, int bpc)
const unsigned long int pixelbitmask = bppmask[bpc];
unsigned long int s;
//ASSERT(bpc <= 8);
//spice_assert(bpc <= 8);
for (s = 0; s <= pixelbitmask; s++) {
if (s & 0x01) {
@ -404,7 +391,7 @@ static void more_io_words(Encoder *encoder)
if (num_io_words <= 0) {
encoder->usr->error(encoder->usr, "%s: no more words\n", __FUNCTION__);
}
ASSERT(encoder->usr, io_ptr);
spice_assert(io_ptr);
encoder->io_words_count += num_io_words;
encoder->io_now = io_ptr;
encoder->io_end = encoder->io_now + num_io_words;
@ -431,8 +418,8 @@ static INLINE void encode(Encoder *encoder, unsigned int word, unsigned int len)
{
int delta;
ASSERT(encoder->usr, len > 0 && len < 32);
ASSERT(encoder->usr, !(word & ~bppmask[len]));
spice_assert(len > 0 && len < 32);
spice_assert(!(word & ~bppmask[len]));
if ((delta = ((int)encoder->io_available_bits - len)) >= 0) {
encoder->io_available_bits = delta;
encoder->io_word |= word << encoder->io_available_bits;
@ -444,8 +431,8 @@ static INLINE void encode(Encoder *encoder, unsigned int word, unsigned int len)
encoder->io_available_bits = 32 - delta;
encoder->io_word = word << encoder->io_available_bits;
ASSERT(encoder->usr, encoder->io_available_bits < 32);
ASSERT(encoder->usr, (encoder->io_word & bppmask[encoder->io_available_bits]) == 0);
spice_assert(encoder->io_available_bits < 32);
spice_assert((encoder->io_word & bppmask[encoder->io_available_bits]) == 0);
}
static INLINE void encode_32(Encoder *encoder, unsigned int word)
@ -478,7 +465,7 @@ static INLINE void read_io_word(Encoder *encoder)
__read_io_word_ptr(encoder); //disable inline optimizations
return;
}
ASSERT(encoder->usr, encoder->io_now < encoder->io_end);
spice_assert(encoder->io_now < encoder->io_end);
encoder->io_next_word = *(encoder->io_now++);
}
@ -486,7 +473,7 @@ static INLINE void decode_eatbits(Encoder *encoder, int len)
{
int delta;
ASSERT(encoder->usr, len > 0 && len < 32);
spice_assert(len > 0 && len < 32);
encoder->io_word <<= len;
if ((delta = ((int)encoder->io_available_bits - len)) >= 0) {
@ -717,7 +704,7 @@ static INLINE void encode_run(Encoder *encoder, unsigned int len)
while ((msb = spice_bit_find_msb(len))) {
len &= ~(1 << (msb - 1));
ASSERT(encoder->usr, msb < 32);
spice_assert(msb < 32);
encode(encoder, (1 << (msb)) - 1, msb);
encode(encoder, 0, 1);
}
@ -739,7 +726,7 @@ static INLINE unsigned int decode_run(Encoder *encoder)
while (encoder->io_word & (1U << 31)) {
decode_eatbits(encoder, 1);
count++;
ASSERT(encoder->usr, count < 32);
spice_assert(count < 32);
}
decode_eatbits(encoder, 1);
len += (1U << count) >> 1;
@ -871,10 +858,10 @@ static void fill_model_structures(Encoder *encoder, FamilyStat *family_stat,
family_stat->buckets_buf[bnumber].pcounters = free_counter;
free_counter += ncounters;
ASSERT(encoder->usr, bstart < n_buckets_ptrs);
spice_assert(bstart < n_buckets_ptrs);
{
unsigned int i;
ASSERT(encoder->usr, bend < n_buckets_ptrs);
spice_assert(bend < n_buckets_ptrs);
for (i = bstart; i <= bend; i++) {
family_stat->buckets_ptrs[i] = family_stat->buckets_buf + bnumber;
}
@ -883,7 +870,7 @@ static void fill_model_structures(Encoder *encoder, FamilyStat *family_stat,
bnumber++;
} while (bend < levels - 1);
ASSERT(encoder->usr, free_counter - family_stat->counters == nbuckets * ncounters);
spice_assert(free_counter - family_stat->counters == nbuckets * ncounters);
}
static void find_model_params(Encoder *encoder,
@ -901,7 +888,7 @@ static void find_model_params(Encoder *encoder,
unsigned int bstart, bend = 0; /* bucket start and end, range : 0 to levels-1*/
unsigned int repcntr; /* helper */
ASSERT(encoder->usr, bpc <= 8 && bpc > 0);
spice_assert(bpc <= 8 && bpc > 0);
*ncounters = 8;
@ -965,7 +952,7 @@ static void find_model_params(Encoder *encoder,
*n_buckets_ptrs = *levels;
} else if (bsize >= 256) { /* this bucket is allowed to reside in the 2nd table */
b_lo_ptrs = bstart;
assert(bstart); /* previous bucket exists */
spice_assert(bstart); /* previous bucket exists */
}
#endif
}
@ -1089,8 +1076,8 @@ static int init_encoder(Encoder *encoder, QuicUsrContext *usr)
static int encoder_reste(Encoder *encoder, uint32_t *io_ptr, uint32_t *io_ptr_end)
{
ASSERT(encoder->usr, ((unsigned long)io_ptr % 4) == ((unsigned long)io_ptr_end % 4));
ASSERT(encoder->usr, io_ptr <= io_ptr_end);
spice_assert(((unsigned long)io_ptr % 4) == ((unsigned long)io_ptr_end % 4));
spice_assert(io_ptr <= io_ptr_end);
encoder->rgb_state.waitcnt = 0;
encoder->rgb_state.tabrand_seed = stabrand();
@ -1171,7 +1158,7 @@ static int encoder_reste_channels(Encoder *encoder, int channels, int width, int
static void quic_image_params(Encoder *encoder, QuicImageType type, int *channels, int *bpc)
{
ASSERT(encoder->usr, channels && bpc);
spice_assert(channels && bpc);
switch (type) {
case QUIC_IMAGE_TYPE_GRAY:
*channels = 1;
@ -1251,7 +1238,10 @@ int quic_encode(QuicContext *quic, QuicImageType type, int width, int height,
int i;
#endif
ASSERT(encoder->usr, line);
if (line == NULL) {
spice_warn_if_reached();
return QUIC_ERROR;
}
lines_end = line + num_lines * stride;
quic_image_params(encoder, type, &channels, &bpc);
@ -1275,19 +1265,19 @@ int quic_encode(QuicContext *quic, QuicImageType type, int width, int height,
switch (type) {
#ifdef QUIC_RGB
case QUIC_IMAGE_TYPE_RGB32:
ASSERT(encoder->usr, ABS(stride) >= width * 4);
spice_assert(ABS(stride) >= width * 4);
QUIC_COMPRESS_RGB(32);
break;
case QUIC_IMAGE_TYPE_RGB24:
ASSERT(encoder->usr, ABS(stride) >= width * 3);
spice_assert(ABS(stride) >= width * 3);
QUIC_COMPRESS_RGB(24);
break;
case QUIC_IMAGE_TYPE_RGB16:
ASSERT(encoder->usr, ABS(stride) >= width * 2);
spice_assert(ABS(stride) >= width * 2);
QUIC_COMPRESS_RGB(16);
break;
case QUIC_IMAGE_TYPE_RGBA:
ASSERT(encoder->usr, ABS(stride) >= width * 4);
spice_assert(ABS(stride) >= width * 4);
encoder->channels[0].correlate_row[-1] = 0;
encoder->channels[1].correlate_row[-1] = 0;
@ -1315,7 +1305,7 @@ int quic_encode(QuicContext *quic, QuicImageType type, int width, int height,
break;
#else
case QUIC_IMAGE_TYPE_RGB24:
ASSERT(encoder->usr, ABS(stride) >= width * 3);
spice_assert(ABS(stride) >= width * 3);
for (i = 0; i < 3; i++) {
encoder->channels[i].correlate_row[-1] = 0;
quic_three_compress_row0(encoder, &encoder->channels[i], (three_bytes_t *)(line + i),
@ -1335,7 +1325,7 @@ int quic_encode(QuicContext *quic, QuicImageType type, int width, int height,
break;
case QUIC_IMAGE_TYPE_RGB32:
case QUIC_IMAGE_TYPE_RGBA:
ASSERT(encoder->usr, ABS(stride) >= width * 4);
spice_assert(ABS(stride) >= width * 4);
for (i = 0; i < channels; i++) {
encoder->channels[i].correlate_row[-1] = 0;
quic_four_compress_row0(encoder, &encoder->channels[i], (four_bytes_t *)(line + i),
@ -1355,7 +1345,7 @@ int quic_encode(QuicContext *quic, QuicImageType type, int width, int height,
break;
#endif
case QUIC_IMAGE_TYPE_GRAY:
ASSERT(encoder->usr, ABS(stride) >= width);
spice_assert(ABS(stride) >= width);
encoder->channels[0].correlate_row[-1] = 0;
quic_one_compress_row0(encoder, &encoder->channels[0], (one_byte_t *)line, width);
encoder->rows_completed++;
@ -1525,18 +1515,18 @@ int quic_decode(QuicContext *quic, QuicImageType type, uint8_t *buf, int stride)
int i;
#endif
ASSERT(encoder->usr, buf);
spice_assert(buf);
switch (encoder->type) {
#ifdef QUIC_RGB
case QUIC_IMAGE_TYPE_RGB32:
case QUIC_IMAGE_TYPE_RGB24:
if (type == QUIC_IMAGE_TYPE_RGB32) {
ASSERT(encoder->usr, ABS(stride) >= (int)encoder->width * 4);
spice_assert(ABS(stride) >= (int)encoder->width * 4);
QUIC_UNCOMPRESS_RGB(32, rgb32_pixel_t);
break;
} else if (type == QUIC_IMAGE_TYPE_RGB24) {
ASSERT(encoder->usr, ABS(stride) >= (int)encoder->width * 3);
spice_assert(ABS(stride) >= (int)encoder->width * 3);
QUIC_UNCOMPRESS_RGB(24, rgb24_pixel_t);
break;
}
@ -1544,10 +1534,10 @@ int quic_decode(QuicContext *quic, QuicImageType type, uint8_t *buf, int stride)
return QUIC_ERROR;
case QUIC_IMAGE_TYPE_RGB16:
if (type == QUIC_IMAGE_TYPE_RGB16) {
ASSERT(encoder->usr, ABS(stride) >= (int)encoder->width * 2);
spice_assert(ABS(stride) >= (int)encoder->width * 2);
QUIC_UNCOMPRESS_RGB(16, rgb16_pixel_t);
} else if (type == QUIC_IMAGE_TYPE_RGB32) {
ASSERT(encoder->usr, ABS(stride) >= (int)encoder->width * 4);
spice_assert(ABS(stride) >= (int)encoder->width * 4);
QUIC_UNCOMPRESS_RGB(16_to_32, rgb32_pixel_t);
} else {
encoder->usr->warn(encoder->usr, "unsupported output format\n");
@ -1561,12 +1551,12 @@ int quic_decode(QuicContext *quic, QuicImageType type, uint8_t *buf, int stride)
encoder->usr->warn(encoder->usr, "unsupported output format\n");
return QUIC_ERROR;
}
ASSERT(encoder->usr, ABS(stride) >= (int)encoder->width * 4);
spice_assert(ABS(stride) >= (int)encoder->width * 4);
uncompress_rgba(encoder, buf, stride);
break;
#else
case QUIC_IMAGE_TYPE_RGB24:
ASSERT(encoder->usr, ABS(stride) >= (int)encoder->width * 3);
spice_assert(ABS(stride) >= (int)encoder->width * 3);
for (i = 0; i < 3; i++) {
encoder->channels[i].correlate_row[-1] = 0;
quic_three_uncompress_row0(encoder, &encoder->channels[i], (three_bytes_t *)(buf + i),
@ -1587,7 +1577,7 @@ int quic_decode(QuicContext *quic, QuicImageType type, uint8_t *buf, int stride)
}
break;
case QUIC_IMAGE_TYPE_RGB32:
ASSERT(encoder->usr, ABS(stride) >= encoder->width * 4);
spice_assert(ABS(stride) >= encoder->width * 4);
for (i = 0; i < 3; i++) {
encoder->channels[i].correlate_row[-1] = 0;
quic_four_uncompress_row0(encoder, &encoder->channels[i], (four_bytes_t *)(buf + i),
@ -1610,7 +1600,7 @@ int quic_decode(QuicContext *quic, QuicImageType type, uint8_t *buf, int stride)
}
break;
case QUIC_IMAGE_TYPE_RGBA:
ASSERT(encoder->usr, ABS(stride) >= encoder->width * 4);
spice_assert(ABS(stride) >= encoder->width * 4);
for (i = 0; i < 4; i++) {
encoder->channels[i].correlate_row[-1] = 0;
quic_four_uncompress_row0(encoder, &encoder->channels[i], (four_bytes_t *)(buf + i),
@ -1637,7 +1627,7 @@ int quic_decode(QuicContext *quic, QuicImageType type, uint8_t *buf, int stride)
encoder->usr->warn(encoder->usr, "unsupported output format\n");
return QUIC_ERROR;
}
ASSERT(encoder->usr, ABS(stride) >= (int)encoder->width);
spice_assert(ABS(stride) >= (int)encoder->width);
uncompress_gray(encoder, buf, stride);
break;
case QUIC_IMAGE_TYPE_INVALID:

View File

@ -20,6 +20,7 @@
#define __QUIC_H
#include "quic_config.h"
#include "macros.h"
#ifdef __cplusplus
extern "C" {
@ -41,9 +42,9 @@ typedef void *QuicContext;
typedef struct QuicUsrContext QuicUsrContext;
struct QuicUsrContext {
void (*error)(QuicUsrContext *usr, const char *fmt, ...);
void (*warn)(QuicUsrContext *usr, const char *fmt, ...);
void (*info)(QuicUsrContext *usr, const char *fmt, ...);
ATTR_PRINTF(2, 3) void (*error)(QuicUsrContext *usr, const char *fmt, ...);
ATTR_PRINTF(2, 3) void (*warn)(QuicUsrContext *usr, const char *fmt, ...);
ATTR_PRINTF(2, 3) void (*info)(QuicUsrContext *usr, const char *fmt, ...);
void *(*malloc)(QuicUsrContext *usr, int size);
void (*free)(QuicUsrContext *usr, void *ptr);
int (*more_space)(QuicUsrContext *usr, uint32_t **io_ptr, int rows_completed);

View File

@ -107,7 +107,7 @@ static void FNAME(update_model)(CommonState *state, s_bucket * const bucket,
static s_bucket *FNAME(find_bucket)(Channel *channel, const unsigned int val)
{
ASSERT(channel->encoder->usr, val < (0x1U << BPC));
spice_assert(val < (0x1U << BPC));
return channel->_buckets_ptrs[val];
}

View File

@ -235,7 +235,7 @@ static void FNAME(compress_row0_seg)(Encoder *encoder, int i,
BYTE * const correlate_row_b = channel_b->correlate_row;
int stopidx;
ASSERT(encoder->usr, end - i > 0);
spice_assert(end - i > 0);
if (!i) {
unsigned int codeword, codewordlen;
@ -305,9 +305,9 @@ static void FNAME(compress_row0)(Encoder *encoder, const PIXEL *cur_row,
}
}
ASSERT(encoder->usr, (int)encoder->rgb_state.wmidx <= wmimax);
ASSERT(encoder->usr, encoder->rgb_state.wmidx <= 32);
ASSERT(encoder->usr, wminext > 0);
spice_assert((int)encoder->rgb_state.wmidx <= wmimax);
spice_assert(encoder->rgb_state.wmidx <= 32);
spice_assert(wminext > 0);
}
#define COMPRESS_ONE_0(channel) \
@ -347,7 +347,7 @@ static void FNAME(compress_row_seg)(Encoder *encoder, int i,
int run_size;
#endif
ASSERT(encoder->usr, end - i > 0);
spice_assert(end - i > 0);
if (!i) {
unsigned int codeword, codewordlen;
@ -451,9 +451,9 @@ static void FNAME(compress_row)(Encoder *encoder,
}
}
ASSERT(encoder->usr, (int)encoder->rgb_state.wmidx <= wmimax);
ASSERT(encoder->usr, encoder->rgb_state.wmidx <= 32);
ASSERT(encoder->usr, wminext > 0);
spice_assert((int)encoder->rgb_state.wmidx <= wmimax);
spice_assert(encoder->rgb_state.wmidx <= 32);
spice_assert(wminext > 0);
}
#endif
@ -490,7 +490,7 @@ static void FNAME(uncompress_row0_seg)(Encoder *encoder, int i,
BYTE * const correlate_row_b = channel_b->correlate_row;
int stopidx;
ASSERT(encoder->usr, end - i > 0);
spice_assert(end - i > 0);
if (!i) {
unsigned int codewordlen;
@ -567,9 +567,9 @@ static void FNAME(uncompress_row0)(Encoder *encoder,
}
}
ASSERT(encoder->usr, (int)encoder->rgb_state.wmidx <= wmimax);
ASSERT(encoder->usr, encoder->rgb_state.wmidx <= 32);
ASSERT(encoder->usr, wminext > 0);
spice_assert((int)encoder->rgb_state.wmidx <= wmimax);
spice_assert(encoder->rgb_state.wmidx <= 32);
spice_assert(wminext > 0);
}
#define UNCOMPRESS_ONE_0(channel) \
@ -611,7 +611,7 @@ static void FNAME(uncompress_row_seg)(Encoder *encoder,
int run_end;
#endif
ASSERT(encoder->usr, end - i > 0);
spice_assert(end - i > 0);
if (!i) {
unsigned int codewordlen;
@ -721,9 +721,9 @@ static void FNAME(uncompress_row)(Encoder *encoder,
}
}
ASSERT(encoder->usr, (int)encoder->rgb_state.wmidx <= wmimax);
ASSERT(encoder->usr, encoder->rgb_state.wmidx <= 32);
ASSERT(encoder->usr, wminext > 0);
spice_assert((int)encoder->rgb_state.wmidx <= wmimax);
spice_assert(encoder->rgb_state.wmidx <= 32);
spice_assert(wminext > 0);
}
#undef PIXEL

View File

@ -158,7 +158,7 @@ static void FNAME(compress_row0_seg)(Encoder *encoder, Channel *channel, int i,
BYTE * const decorelate_drow = channel->correlate_row;
int stopidx;
ASSERT(encoder->usr, end - i > 0);
spice_assert(end - i > 0);
if (i == 0) {
unsigned int codeword, codewordlen;
@ -233,9 +233,9 @@ static void FNAME(compress_row0)(Encoder *encoder, Channel *channel, const PIXEL
}
}
ASSERT(encoder->usr, (int)channel->state.wmidx <= wmimax);
ASSERT(encoder->usr, channel->state.wmidx <= 32);
ASSERT(encoder->usr, wminext > 0);
spice_assert((int)channel->state.wmidx <= wmimax);
spice_assert(channel->state.wmidx <= 32);
spice_assert(wminext > 0);
}
static void FNAME(compress_row_seg)(Encoder *encoder, Channel *channel, int i,
@ -253,7 +253,7 @@ static void FNAME(compress_row_seg)(Encoder *encoder, Channel *channel, int i,
int run_size;
#endif
ASSERT(encoder->usr, end - i > 0);
spice_assert(end - i > 0);
if (!i) {
unsigned int codeword, codewordlen;
@ -375,9 +375,9 @@ static void FNAME(compress_row)(Encoder *encoder, Channel *channel,
}
}
ASSERT(encoder->usr, (int)channel->state.wmidx <= wmimax);
ASSERT(encoder->usr, channel->state.wmidx <= 32);
ASSERT(encoder->usr, wminext > 0);
spice_assert((int)channel->state.wmidx <= wmimax);
spice_assert(channel->state.wmidx <= 32);
spice_assert(wminext > 0);
}
static void FNAME(uncompress_row0_seg)(Encoder *encoder, Channel *channel, int i,
@ -390,7 +390,7 @@ static void FNAME(uncompress_row0_seg)(Encoder *encoder, Channel *channel, int i
{
int stopidx;
ASSERT(encoder->usr, end - i > 0);
spice_assert(end - i > 0);
if (i == 0) {
unsigned int codewordlen;
@ -475,9 +475,9 @@ static void FNAME(uncompress_row0)(Encoder *encoder, Channel *channel,
}
}
ASSERT(encoder->usr, (int)channel->state.wmidx <= wmimax);
ASSERT(encoder->usr, channel->state.wmidx <= 32);
ASSERT(encoder->usr, wminext > 0);
spice_assert((int)channel->state.wmidx <= wmimax);
spice_assert(channel->state.wmidx <= 32);
spice_assert(wminext > 0);
}
static void FNAME(uncompress_row_seg)(Encoder *encoder, Channel *channel,
@ -496,7 +496,7 @@ static void FNAME(uncompress_row_seg)(Encoder *encoder, Channel *channel,
int run_end;
#endif
ASSERT(encoder->usr, end - i > 0);
spice_assert(end - i > 0);
if (i == 0) {
unsigned int codewordlen;
@ -613,9 +613,9 @@ static void FNAME(uncompress_row)(Encoder *encoder, Channel *channel,
}
}
ASSERT(encoder->usr, (int)channel->state.wmidx <= wmimax);
ASSERT(encoder->usr, channel->state.wmidx <= 32);
ASSERT(encoder->usr, wminext > 0);
spice_assert((int)channel->state.wmidx <= wmimax);
spice_assert(channel->state.wmidx <= 32);
spice_assert(wminext > 0);
}
#undef PIXEL

View File

@ -561,7 +561,7 @@ static void rect_set(SpiceRect *r, int32_t top, int32_t left, int32_t bottom, in
r->left = left;
r->bottom = bottom;
r->right = right;
ASSERT(rect_is_valid(r));
spice_assert(rect_is_valid(r));
}
static void random_region(QRegion *reg)

View File

@ -48,14 +48,14 @@ static inline int ring_item_is_linked(RingItem *item)
static inline int ring_is_empty(Ring *ring)
{
ASSERT(ring->next != NULL && ring->prev != NULL);
spice_assert(ring->next != NULL && ring->prev != NULL);
return ring == ring->next;
}
static inline void ring_add(Ring *ring, RingItem *item)
{
ASSERT(ring->next != NULL && ring->prev != NULL);
ASSERT(item->next == NULL && item->prev == NULL);
spice_assert(ring->next != NULL && ring->prev != NULL);
spice_assert(item->next == NULL && item->prev == NULL);
item->next = ring->next;
item->prev = ring;
@ -81,8 +81,8 @@ static inline void __ring_remove(RingItem *item)
static inline void ring_remove(RingItem *item)
{
ASSERT(item->next != NULL && item->prev != NULL);
ASSERT(item->next != item);
spice_assert(item->next != NULL && item->prev != NULL);
spice_assert(item->next != item);
__ring_remove(item);
}
@ -91,7 +91,7 @@ static inline RingItem *ring_get_head(Ring *ring)
{
RingItem *ret;
ASSERT(ring->next != NULL && ring->prev != NULL);
spice_assert(ring->next != NULL && ring->prev != NULL);
if (ring_is_empty(ring)) {
return NULL;
@ -104,7 +104,7 @@ static inline RingItem *ring_get_tail(Ring *ring)
{
RingItem *ret;
ASSERT(ring->next != NULL && ring->prev != NULL);
spice_assert(ring->next != NULL && ring->prev != NULL);
if (ring_is_empty(ring)) {
return NULL;
@ -117,9 +117,9 @@ static inline RingItem *ring_next(Ring *ring, RingItem *pos)
{
RingItem *ret;
ASSERT(ring->next != NULL && ring->prev != NULL);
ASSERT(pos);
ASSERT(pos->next != NULL && pos->prev != NULL);
spice_assert(ring->next != NULL && ring->prev != NULL);
spice_assert(pos);
spice_assert(pos->next != NULL && pos->prev != NULL);
ret = pos->next;
return (ret == ring) ? NULL : ret;
}
@ -128,9 +128,9 @@ static inline RingItem *ring_prev(Ring *ring, RingItem *pos)
{
RingItem *ret;
ASSERT(ring->next != NULL && ring->prev != NULL);
ASSERT(pos);
ASSERT(pos->next != NULL && pos->prev != NULL);
spice_assert(ring->next != NULL && ring->prev != NULL);
spice_assert(pos);
spice_assert(pos->next != NULL && pos->prev != NULL);
ret = pos->prev;
return (ret == ring) ? NULL : ret;
}

View File

@ -47,13 +47,13 @@ static void default_rop3_with_pattern_handler(pixman_image_t *d, pixman_image_t
SpicePoint *src_pos, pixman_image_t *p,
SpicePoint *pat_pos)
{
WARN("not implemented");
spice_critical("not implemented");
}
static void default_rop3_withe_color_handler(pixman_image_t *d, pixman_image_t *s, SpicePoint *src_pos,
uint32_t rgb)
{
WARN("not implemented");
spice_critical("not implemented");
}
static void default_rop3_test_handler(void)
@ -624,8 +624,8 @@ void do_rop3_with_pattern(uint8_t rop3, pixman_image_t *d, pixman_image_t *s, Sp
int bpp;
bpp = spice_pixman_image_get_bpp(d);
ASSERT (bpp == spice_pixman_image_get_bpp(s));
ASSERT (bpp == spice_pixman_image_get_bpp(p));
spice_assert(bpp == spice_pixman_image_get_bpp(s));
spice_assert(bpp == spice_pixman_image_get_bpp(p));
if (bpp == 32) {
rop3_with_pattern_handlers_32[rop3](d, s, src_pos, p, pat_pos);
@ -640,7 +640,7 @@ void do_rop3_with_color(uint8_t rop3, pixman_image_t *d, pixman_image_t *s, Spic
int bpp;
bpp = spice_pixman_image_get_bpp(d);
ASSERT (bpp == spice_pixman_image_get_bpp(s));
spice_assert(bpp == spice_pixman_image_get_bpp(s));
if (bpp == 32) {
rop3_with_color_handlers_32[rop3](d, s, src_pos, rgb);

View File

@ -23,57 +23,15 @@
#include <time.h>
#include <stdlib.h>
#include <stddef.h>
#include <spice/macros.h>
#include "backtrace.h"
#include "log.h"
#define ASSERT(x) if (!(x)) { \
printf("%s: ASSERT %s failed\n", __FUNCTION__, #x); \
spice_backtrace(); \
abort(); \
}
#define PANIC(format, ...) do { \
printf("%s: panic: " format "\n", __FUNCTION__, ## __VA_ARGS__ ); \
abort(); \
} while (0)
#define PANIC_ON(x) if ((x)) { \
printf("%s: panic %s\n", __FUNCTION__, #x); \
abort(); \
}
#define red_error(format, ...) do { \
printf("%s: " format "\n", __FUNCTION__, ## __VA_ARGS__ ); \
abort(); \
} while (0)
#define red_printf(format, ...) \
printf("%s: " format "\n", __FUNCTION__, ## __VA_ARGS__ )
#define red_printf_once(format, ...) do { \
static int do_print = TRUE; \
if (do_print) { \
do_print = FALSE; \
printf("%s: " format "\n", __FUNCTION__, ## __VA_ARGS__ ); \
} \
} while (0)
#define WARN(format, ...) red_printf("warning: "format, ##__VA_ARGS__ );
#define WARN_ONCE red_printf_once
#define red_printf_some(every, format, ...) do { \
static int count = 0; \
if (count++ % (every) == 0) { \
printf("%s: " format "\n", __FUNCTION__, ## __VA_ARGS__ ); \
} \
} while (0)
#define red_printf_debug(debug, prefix, format, ...) do { \
static int debug_level = -1; \
if (debug_level == -1) { \
debug_level = getenv("SPICE_DEBUG_LEVEL") != NULL ? atoi(getenv("SPICE_DEBUG_LEVEL")) : 0; \
} \
if (debug <= debug_level) { \
printf("%s: %s: " format "\n", prefix, __FUNCTION__, ## __VA_ARGS__ ); \
} \
} while(0)
#ifdef SPICE_DISABLE_ABORT
#define spice_abort() do { } while(0)
#else
#define spice_abort() abort()
#endif
#endif

View File

@ -83,8 +83,10 @@ static pixman_image_t *canvas_get_pixman_brush(SwCanvas *canvas,
case SPICE_BRUSH_TYPE_NONE:
return NULL;
default:
CANVAS_ERROR("invalid brush type");
spice_warn_if_reached();
return NULL;
}
return NULL;
}
static pixman_image_t *get_image(SpiceCanvas *canvas)
@ -477,8 +479,8 @@ static void __scale_image(SpiceCanvas *spice_canvas,
pixman_image_set_transform(src, &transform);
pixman_image_set_repeat(src, PIXMAN_REPEAT_NONE);
ASSERT(scale_mode == SPICE_IMAGE_SCALE_MODE_INTERPOLATE ||
scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST);
spice_return_if_fail(scale_mode == SPICE_IMAGE_SCALE_MODE_INTERPOLATE ||
scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST);
pixman_image_set_filter(src,
(scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST) ?
PIXMAN_FILTER_NEAREST : PIXMAN_FILTER_GOOD,
@ -539,11 +541,13 @@ static void __scale_image_rop(SpiceCanvas *spice_canvas,
pixman_box32_t *rects;
int n_rects, i;
pixman_fixed_t fsx, fsy;
pixman_format_code_t format;
fsx = ((pixman_fixed_48_16_t) src_width * 65536) / dest_width;
fsy = ((pixman_fixed_48_16_t) src_height * 65536) / dest_height;
scaled = pixman_image_create_bits(spice_pixman_image_get_format(src),
spice_return_if_fail(spice_pixman_image_get_format(src, &format));
scaled = pixman_image_create_bits(format,
dest_width,
dest_height,
NULL, 0);
@ -558,8 +562,8 @@ static void __scale_image_rop(SpiceCanvas *spice_canvas,
pixman_image_set_transform(src, &transform);
pixman_image_set_repeat(src, PIXMAN_REPEAT_NONE);
ASSERT(scale_mode == SPICE_IMAGE_SCALE_MODE_INTERPOLATE ||
scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST);
spice_return_if_fail(scale_mode == SPICE_IMAGE_SCALE_MODE_INTERPOLATE ||
scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST);
pixman_image_set_filter(src,
(scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST) ?
PIXMAN_FILTER_NEAREST : PIXMAN_FILTER_GOOD,
@ -759,8 +763,8 @@ static void __blend_scale_image(SpiceCanvas *spice_canvas,
pixman_image_set_transform(src, &transform);
pixman_image_set_repeat(src, PIXMAN_REPEAT_NONE);
ASSERT(scale_mode == SPICE_IMAGE_SCALE_MODE_INTERPOLATE ||
scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST);
spice_return_if_fail(scale_mode == SPICE_IMAGE_SCALE_MODE_INTERPOLATE ||
scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST);
pixman_image_set_filter(src,
(scale_mode == SPICE_IMAGE_SCALE_MODE_NEAREST) ?
PIXMAN_FILTER_NEAREST : PIXMAN_FILTER_GOOD,
@ -895,11 +899,13 @@ static void __colorkey_scale_image(SpiceCanvas *spice_canvas,
pixman_box32_t *rects;
int n_rects, i;
pixman_fixed_t fsx, fsy;
pixman_format_code_t format;
fsx = ((pixman_fixed_48_16_t) src_width * 65536) / dest_width;
fsy = ((pixman_fixed_48_16_t) src_height * 65536) / dest_height;
scaled = pixman_image_create_bits(spice_pixman_image_get_format (src),
spice_return_if_fail(spice_pixman_image_get_format(src, &format));
scaled = pixman_image_create_bits(format,
dest_width,
dest_height,
NULL, 0);
@ -1042,7 +1048,7 @@ static void canvas_draw_text(SpiceCanvas *spice_canvas, SpiceRect *bbox,
pixman_region32_t dest_region;
pixman_image_t *str_mask, *brush;
SpiceString *str;
SpicePoint pos;
SpicePoint pos = { 0, };
int depth;
pixman_region32_init_rect(&dest_region,
@ -1064,7 +1070,7 @@ static void canvas_draw_text(SpiceCanvas *spice_canvas, SpiceRect *bbox,
/* Nothing else makes sense for text and we should deprecate it
* and actually it means OVER really */
ASSERT(text->fore_mode == SPICE_ROPD_OP_PUT);
spice_return_if_fail(text->fore_mode == SPICE_ROPD_OP_PUT);
pixman_region32_init_rect(&back_region,
text->back_area.left,
@ -1087,10 +1093,10 @@ static void canvas_draw_text(SpiceCanvas *spice_canvas, SpiceRect *bbox,
} else if (str->flags & SPICE_STRING_FLAGS_RASTER_A4) {
depth = 4;
} else if (str->flags & SPICE_STRING_FLAGS_RASTER_A8) {
WARN("untested path A8 glyphs");
spice_warning("untested path A8 glyphs");
depth = 8;
} else {
WARN("unsupported path vector glyphs");
spice_warning("unsupported path vector glyphs");
pixman_region32_fini (&dest_region);
return;
}
@ -1133,7 +1139,7 @@ static void canvas_read_bits(SpiceCanvas *spice_canvas, uint8_t *dest,
uint8_t *dest_end;
int bpp;
ASSERT(canvas && area);
spice_return_if_fail(canvas && area);
surface = canvas->image;