summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Bowler <jbowler@acm.org>2011-12-24 08:29:20 -0600
committerGlenn Randers-Pehrson <glennrp at users.sourceforge.net>2011-12-24 08:29:20 -0600
commitd7c22fb7ecfe0d533fc8f1783627803db07aab5e (patch)
tree90cb135269f56fba1bff415eff47f629a703cb15
parent939310bac19528bf957ed0108175fd40e698321c (diff)
downloadlibpng-d7c22fb7ecfe0d533fc8f1783627803db07aab5e.tar.gz
[libpng16] Added pngvalid.c compile time checks for const APIs.
-rw-r--r--contrib/libtests/pngvalid.c155
1 files changed, 97 insertions, 58 deletions
diff --git a/contrib/libtests/pngvalid.c b/contrib/libtests/pngvalid.c
index fc780a0fc..03a40dea0 100644
--- a/contrib/libtests/pngvalid.c
+++ b/contrib/libtests/pngvalid.c
@@ -78,6 +78,13 @@ typedef png_byte *png_const_bytep;
((png_fixed_point)(PNG_GAMMA_THRESHOLD * PNG_FP_1))
#endif
+#if PNG_LIBPNG_VER < 10600
+ /* 1.6.0 constifies many APIs, the following exists to allow pngvalid to be
+ * compiled against earlier versions.
+ */
+# define png_const_strutp png_structp
+#endif
+
#include "zlib.h" /* For crc32 */
#include <float.h> /* For floating point constants */
@@ -782,7 +789,7 @@ store_storefile(png_store *ps, png_uint_32 id)
/* Generate an error message (in the given buffer) */
static size_t
-store_message(png_store *ps, png_structp pp, char *buffer, size_t bufsize,
+store_message(png_store *ps, png_const_structp pp, char *buffer, size_t bufsize,
size_t pos, PNG_CONST char *msg)
{
if (pp != NULL && pp == ps->pread)
@@ -822,7 +829,7 @@ store_message(png_store *ps, png_structp pp, char *buffer, size_t bufsize,
/* Verbose output to the error stream: */
static void
-store_verbose(png_store *ps, png_structp pp, png_const_charp prefix,
+store_verbose(png_store *ps, png_const_structp pp, png_const_charp prefix,
png_const_charp message)
{
char buffer[512];
@@ -837,7 +844,8 @@ store_verbose(png_store *ps, png_structp pp, png_const_charp prefix,
/* Log an error or warning - the relevant count is always incremented. */
static void
-store_log(png_store* ps, png_structp pp, png_const_charp message, int is_error)
+store_log(png_store* ps, png_const_structp pp, png_const_charp message,
+ int is_error)
{
/* The warning is copied to the error buffer if there are no errors and it is
* the first warning. The error is copied to the error buffer if it is the
@@ -866,8 +874,9 @@ internal_error(png_store *ps, png_const_charp message)
/* Functions to use as PNG callbacks. */
static void
-store_error(png_structp pp, png_const_charp message) /* PNG_NORETURN */
+store_error(png_structp ppIn, png_const_charp message) /* PNG_NORETURN */
{
+ png_const_structp pp = ppIn;
png_store *ps = voidcast(png_store*, png_get_error_ptr(pp));
if (!ps->expect_error)
@@ -881,8 +890,9 @@ store_error(png_structp pp, png_const_charp message) /* PNG_NORETURN */
}
static void
-store_warning(png_structp pp, png_const_charp message)
+store_warning(png_structp ppIn, png_const_charp message)
{
+ png_const_structp pp = ppIn;
png_store *ps = voidcast(png_store*, png_get_error_ptr(pp));
if (!ps->expect_warning)
@@ -896,7 +906,7 @@ store_warning(png_structp pp, png_const_charp message)
*/
/* Return a single row from the correct image. */
static png_bytep
-store_image_row(PNG_CONST png_store* ps, png_structp pp, int nImage,
+store_image_row(PNG_CONST png_store* ps, png_const_structp pp, int nImage,
png_uint_32 y)
{
png_size_t coffset = (nImage * ps->image_h + y) * (ps->cb_row + 5) + 2;
@@ -911,7 +921,7 @@ store_image_row(PNG_CONST png_store* ps, png_structp pp, int nImage,
}
static void
-store_image_free(png_store *ps, png_structp pp)
+store_image_free(png_store *ps, png_const_structp pp)
{
if (ps->image != NULL)
{
@@ -933,8 +943,8 @@ store_image_free(png_store *ps, png_structp pp)
}
static void
-store_ensure_image(png_store *ps, png_structp pp, int nImages, png_size_t cbRow,
- png_uint_32 cRows)
+store_ensure_image(png_store *ps, png_const_structp pp, int nImages,
+ png_size_t cbRow, png_uint_32 cRows)
{
png_size_t cb = nImages * cRows * (cbRow + 5);
@@ -999,7 +1009,7 @@ store_ensure_image(png_store *ps, png_structp pp, int nImages, png_size_t cbRow,
}
static void
-store_image_check(PNG_CONST png_store* ps, png_structp pp, int iImage)
+store_image_check(PNG_CONST png_store* ps, png_const_structp pp, int iImage)
{
png_const_bytep image = ps->image;
@@ -1029,8 +1039,9 @@ store_image_check(PNG_CONST png_store* ps, png_structp pp, int iImage)
}
static void
-store_write(png_structp pp, png_bytep pb, png_size_t st)
+store_write(png_structp ppIn, png_bytep pb, png_size_t st)
{
+ png_const_structp pp = ppIn;
png_store *ps = voidcast(png_store*, png_get_io_ptr(pp));
if (ps->pwrite != pp)
@@ -1056,9 +1067,9 @@ store_write(png_structp pp, png_bytep pb, png_size_t st)
}
static void
-store_flush(png_structp pp)
+store_flush(png_structp ppIn)
{
- UNUSED(pp) /*DOES NOTHING*/
+ UNUSED(ppIn) /*DOES NOTHING*/
}
static size_t
@@ -1149,8 +1160,9 @@ store_read_imp(png_store *ps, png_bytep pb, png_size_t st)
}
static void
-store_read(png_structp pp, png_bytep pb, png_size_t st)
+store_read(png_structp ppIn, png_bytep pb, png_size_t st)
{
+ png_const_structp pp = ppIn;
png_store *ps = voidcast(png_store*, png_get_io_ptr(pp));
if (ps == NULL || ps->pread != pp)
@@ -1238,7 +1250,7 @@ typedef struct store_memory
* all the memory.
*/
static void
-store_pool_error(png_store *ps, png_structp pp, PNG_CONST char *msg)
+store_pool_error(png_store *ps, png_const_structp pp, PNG_CONST char *msg)
{
if (pp != NULL)
png_error(pp, msg);
@@ -1251,7 +1263,7 @@ store_pool_error(png_store *ps, png_structp pp, PNG_CONST char *msg)
}
static void
-store_memory_free(png_structp pp, store_pool *pool, store_memory *memory)
+store_memory_free(png_const_structp pp, store_pool *pool, store_memory *memory)
{
/* Note that pp may be NULL (see store_pool_delete below), the caller has
* found 'memory' in pool->list *and* unlinked this entry, so this is a valid
@@ -1337,8 +1349,9 @@ store_pool_delete(png_store *ps, store_pool *pool)
/* The memory callbacks: */
static png_voidp
-store_malloc(png_structp pp, png_alloc_size_t cb)
+store_malloc(png_structp ppIn, png_alloc_size_t cb)
{
+ png_const_structp pp = ppIn;
store_pool *pool = voidcast(store_pool*, png_get_mem_ptr(pp));
store_memory *new = voidcast(store_memory*, malloc(cb + (sizeof *new) +
(sizeof pool->mark)));
@@ -1385,8 +1398,9 @@ store_malloc(png_structp pp, png_alloc_size_t cb)
}
static void
-store_free(png_structp pp, png_voidp memory)
+store_free(png_structp ppIn, png_voidp memory)
{
+ png_const_structp pp = ppIn;
store_pool *pool = voidcast(store_pool*, png_get_mem_ptr(pp));
store_memory *this = voidcast(store_memory*, memory), **test;
@@ -2540,8 +2554,9 @@ modifier_read_imp(png_modifier *pm, png_bytep pb, png_size_t st)
/* The callback: */
static void
-modifier_read(png_structp pp, png_bytep pb, png_size_t st)
+modifier_read(png_structp ppIn, png_bytep pb, png_size_t st)
{
+ png_const_structp pp = ppIn;
png_modifier *pm = voidcast(png_modifier*, png_get_io_ptr(pp));
if (pm == NULL || pm->this.pread != pp)
@@ -2974,6 +2989,7 @@ make_standard_palette(png_store* ps, int npalette, int do_tRNS)
/* Initialize a standard palette on a write stream. The 'do_tRNS' argument
* indicates whether or not to also set the tRNS chunk.
*/
+/* TODO: the png_structp here can probably be 'const' in the future */
static void
init_standard_palette(png_store *ps, png_structp pp, png_infop pi, int npalette,
int do_tRNS)
@@ -3022,7 +3038,7 @@ init_standard_palette(png_store *ps, png_structp pp, png_infop pi, int npalette,
* API to determine this prior to 1.5, so we need an inquiry function:
*/
static int
-npasses_from_interlace_type(png_structp pp, int interlace_type)
+npasses_from_interlace_type(png_const_structp pp, int interlace_type)
{
switch (interlace_type)
{
@@ -3038,7 +3054,7 @@ npasses_from_interlace_type(png_structp pp, int interlace_type)
}
static unsigned int
-bit_size(png_structp pp, png_byte colour_type, png_byte bit_depth)
+bit_size(png_const_structp pp, png_byte colour_type, png_byte bit_depth)
{
switch (colour_type)
{
@@ -3063,7 +3079,8 @@ bit_size(png_structp pp, png_byte colour_type, png_byte bit_depth)
#define SIZE_HEIGHTMAX 16 /* Maximum range of size images */
static size_t
-transform_rowsize(png_structp pp, png_byte colour_type, png_byte bit_depth)
+transform_rowsize(png_const_structp pp, png_byte colour_type,
+ png_byte bit_depth)
{
return (TRANSFORM_WIDTH * bit_size(pp, colour_type, bit_depth)) / 8;
}
@@ -3074,7 +3091,7 @@ transform_rowsize(png_structp pp, png_byte colour_type, png_byte bit_depth)
#define transform_width(pp, colour_type, bit_depth) TRANSFORM_WIDTH
static png_uint_32
-transform_height(png_structp pp, png_byte colour_type, png_byte bit_depth)
+transform_height(png_const_structp pp, png_byte colour_type, png_byte bit_depth)
{
switch (bit_size(pp, colour_type, bit_depth))
{
@@ -3107,7 +3124,7 @@ transform_height(png_structp pp, png_byte colour_type, png_byte bit_depth)
* of the transform image sizes.
*/
static png_uint_32
-standard_width(png_structp pp, png_uint_32 id)
+standard_width(png_const_structp pp, png_uint_32 id)
{
png_uint_32 width = WIDTH_FROM_ID(id);
UNUSED(pp)
@@ -3119,7 +3136,7 @@ standard_width(png_structp pp, png_uint_32 id)
}
static png_uint_32
-standard_height(png_structp pp, png_uint_32 id)
+standard_height(png_const_structp pp, png_uint_32 id)
{
png_uint_32 height = HEIGHT_FROM_ID(id);
@@ -3130,7 +3147,7 @@ standard_height(png_structp pp, png_uint_32 id)
}
static png_uint_32
-standard_rowsize(png_structp pp, png_uint_32 id)
+standard_rowsize(png_const_structp pp, png_uint_32 id)
{
png_uint_32 width = standard_width(pp, id);
@@ -3140,7 +3157,7 @@ standard_rowsize(png_structp pp, png_uint_32 id)
}
static void
-transform_row(png_structp pp, png_byte buffer[TRANSFORM_ROWMAX],
+transform_row(png_const_structp pp, png_byte buffer[TRANSFORM_ROWMAX],
png_byte colour_type, png_byte bit_depth, png_uint_32 y)
{
png_uint_32 v = y << 7;
@@ -3656,8 +3673,8 @@ make_size_images(png_store *ps)
/* Return a row based on image id and 'y' for checking: */
static void
-standard_row(png_structp pp, png_byte std[STANDARD_ROWMAX], png_uint_32 id,
- png_uint_32 y)
+standard_row(png_const_structp pp, png_byte std[STANDARD_ROWMAX],
+ png_uint_32 id, png_uint_32 y)
{
if (WIDTH_FROM_ID(id) == 0)
transform_row(pp, std, COL_FROM_ID(id), DEPTH_FROM_ID(id), y);
@@ -3671,6 +3688,9 @@ standard_row(png_structp pp, png_byte std[STANDARD_ROWMAX], png_uint_32 id,
* to ensure that they get detected - it should not be possible to write an
* invalid image with libpng!
*/
+/* TODO: the 'set' functions can probably all be made to take a
+ * png_const_structp rather than a modifiable one.
+ */
#ifdef PNG_WARNINGS_SUPPORTED
static void
sBIT0_error_fn(png_structp pp, png_infop pi)
@@ -4074,7 +4094,8 @@ standard_palette_init(standard_display *dp)
* palette (it does not check for a transparent colour in the non-palette case.)
*/
static int
-read_palette(store_palette palette, int *npalette, png_structp pp, png_infop pi)
+read_palette(store_palette palette, int *npalette, png_const_structp pp,
+ png_infop pi)
{
png_colorp pal;
png_bytep trans_alpha;
@@ -4165,7 +4186,8 @@ read_palette(store_palette palette, int *npalette, png_structp pp, png_infop pi)
* non-transform case).
*/
static void
-standard_palette_validate(standard_display *dp, png_structp pp, png_infop pi)
+standard_palette_validate(standard_display *dp, png_const_structp pp,
+ png_infop pi)
{
int npalette;
store_palette palette;
@@ -4359,8 +4381,8 @@ standard_info_part1(standard_display *dp, png_structp pp, png_infop pi)
* image.
*/
static void
-standard_info_part2(standard_display *dp, png_structp pp, png_infop pi,
- int nImages)
+standard_info_part2(standard_display *dp, png_const_structp pp,
+ png_const_infop pi, int nImages)
{
/* Record cbRow now that it can be found. */
dp->pixel_size = bit_size(pp, png_get_color_type(pp, pi),
@@ -4418,8 +4440,9 @@ standard_info(png_structp pp, png_infop pi)
}
static void
-progressive_row(png_structp pp, png_bytep new_row, png_uint_32 y, int pass)
+progressive_row(png_structp ppIn, png_bytep new_row, png_uint_32 y, int pass)
{
+ png_const_structp pp = ppIn;
PNG_CONST standard_display *dp = voidcast(standard_display*,
png_get_progressive_ptr(pp));
@@ -4538,7 +4561,7 @@ sequential_row(standard_display *dp, png_structp pp, png_infop pi,
}
static void
-standard_row_validate(standard_display *dp, png_structp pp,
+standard_row_validate(standard_display *dp, png_const_structp pp,
int iImage, int iDisplay, png_uint_32 y)
{
int where;
@@ -4594,7 +4617,7 @@ standard_row_validate(standard_display *dp, png_structp pp,
}
static void
-standard_image_validate(standard_display *dp, png_structp pp, int iImage,
+standard_image_validate(standard_display *dp, png_const_structp pp, int iImage,
int iDisplay)
{
png_uint_32 y;
@@ -4613,8 +4636,9 @@ standard_image_validate(standard_display *dp, png_structp pp, int iImage,
}
static void
-standard_end(png_structp pp, png_infop pi)
+standard_end(png_structp ppIn, png_infop pi)
{
+ png_const_structp pp = ppIn;
standard_display *dp = voidcast(standard_display*,
png_get_progressive_ptr(pp));
@@ -5121,7 +5145,7 @@ typedef struct image_transform
* reporting via png_error and png_warning.
*/
void (*mod)(PNG_CONST struct image_transform *this, image_pixel *that,
- png_structp pp, PNG_CONST struct transform_display *display);
+ png_const_structp pp, PNG_CONST struct transform_display *display);
/* Add this transform to the list and return true if the transform is
* meaningful for this colour type and bit depth - if false then the
@@ -5216,7 +5240,7 @@ sample_scale(double sample_value, unsigned int scale)
static void
image_transform_mod_end(PNG_CONST image_transform *this, image_pixel *that,
- png_structp pp, PNG_CONST transform_display *display)
+ png_const_structp pp, PNG_CONST transform_display *display)
{
PNG_CONST unsigned int scale = (1U<<that->sample_depth)-1;
@@ -5445,7 +5469,7 @@ transform_info(png_structp pp, png_infop pi)
}
static void
-transform_range_check(png_structp pp, unsigned int r, unsigned int g,
+transform_range_check(png_const_structp pp, unsigned int r, unsigned int g,
unsigned int b, unsigned int a, unsigned int in_digitized, double in,
unsigned int out, png_byte sample_depth, double err, double limit,
PNG_CONST char *name, double digitization_error)
@@ -5488,7 +5512,8 @@ transform_range_check(png_structp pp, unsigned int r, unsigned int g,
}
static void
-transform_image_validate(transform_display *dp, png_structp pp, png_infop pi)
+transform_image_validate(transform_display *dp, png_const_structp pp,
+ png_infop pi)
{
/* Constants for the loop below: */
PNG_CONST png_store* PNG_CONST ps = dp->this.ps;
@@ -5646,8 +5671,9 @@ transform_image_validate(transform_display *dp, png_structp pp, png_infop pi)
}
static void
-transform_end(png_structp pp, png_infop pi)
+transform_end(png_structp ppIn, png_infop pi)
{
+ png_const_structp pp = ppIn;
transform_display *dp = voidcast(transform_display*,
png_get_progressive_ptr(pp));
@@ -5793,7 +5819,8 @@ image_transform_png_set_palette_to_rgb_set(PNG_CONST image_transform *this,
static void
image_transform_png_set_palette_to_rgb_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
+ image_pixel *that, png_const_structp pp,
+ PNG_CONST transform_display *display)
{
if (that->colour_type == PNG_COLOR_TYPE_PALETTE)
image_pixel_convert_PLTE(that);
@@ -5830,7 +5857,8 @@ image_transform_png_set_tRNS_to_alpha_set(PNG_CONST image_transform *this,
static void
image_transform_png_set_tRNS_to_alpha_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
+ image_pixel *that, png_const_structp pp,
+ PNG_CONST transform_display *display)
{
/* LIBPNG BUG: this always forces palette images to RGB. */
if (that->colour_type == PNG_COLOR_TYPE_PALETTE)
@@ -5887,7 +5915,8 @@ image_transform_png_set_gray_to_rgb_set(PNG_CONST image_transform *this,
static void
image_transform_png_set_gray_to_rgb_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
+ image_pixel *that, png_const_structp pp,
+ PNG_CONST transform_display *display)
{
/* NOTE: we can actually pend the tRNS processing at this point because we
* can correctly recognize the original pixel value even though we have
@@ -5945,7 +5974,8 @@ image_transform_png_set_expand_set(PNG_CONST image_transform *this,
static void
image_transform_png_set_expand_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
+ image_pixel *that, png_const_structp pp,
+ PNG_CONST transform_display *display)
{
/* The general expand case depends on what the colour type is: */
if (that->colour_type == PNG_COLOR_TYPE_PALETTE)
@@ -5994,7 +6024,7 @@ image_transform_png_set_expand_gray_1_2_4_to_8_set(
static void
image_transform_png_set_expand_gray_1_2_4_to_8_mod(
- PNG_CONST image_transform *this, image_pixel *that, png_structp pp,
+ PNG_CONST image_transform *this, image_pixel *that, png_const_structp pp,
PNG_CONST transform_display *display)
{
image_transform_png_set_expand_mod(this, that, pp, display);
@@ -6025,7 +6055,8 @@ image_transform_png_set_expand_16_set(PNG_CONST image_transform *this,
static void
image_transform_png_set_expand_16_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
+ image_pixel *that, png_const_structp pp,
+ PNG_CONST transform_display *display)
{
/* Expect expand_16 to expand everything to 16 bits as a result of also
* causing 'expand' to happen.
@@ -6072,7 +6103,8 @@ image_transform_png_set_scale_16_set(PNG_CONST image_transform *this,
static void
image_transform_png_set_scale_16_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
+ image_pixel *that, png_const_structp pp,
+ PNG_CONST transform_display *display)
{
if (that->bit_depth == 16)
{
@@ -6115,7 +6147,8 @@ image_transform_png_set_strip_16_set(PNG_CONST image_transform *this,
static void
image_transform_png_set_strip_16_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
+ image_pixel *that, png_const_structp pp,
+ PNG_CONST transform_display *display)
{
if (that->bit_depth == 16)
{
@@ -6181,7 +6214,8 @@ image_transform_png_set_strip_alpha_set(PNG_CONST image_transform *this,
static void
image_transform_png_set_strip_alpha_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
+ image_pixel *that, png_const_structp pp,
+ PNG_CONST transform_display *display)
{
if (that->colour_type == PNG_COLOR_TYPE_GRAY_ALPHA)
that->colour_type = PNG_COLOR_TYPE_GRAY;
@@ -6513,7 +6547,8 @@ image_transform_png_set_rgb_to_gray_set(PNG_CONST image_transform *this,
static void
image_transform_png_set_rgb_to_gray_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
+ image_pixel *that, png_const_structp pp,
+ PNG_CONST transform_display *display)
{
if ((that->colour_type & PNG_COLOR_MASK_COLOR) != 0)
{
@@ -6764,7 +6799,8 @@ image_transform_png_set_background_set(PNG_CONST image_transform *this,
static void
image_transform_png_set_background_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
+ image_pixel *that, png_const_structp pp,
+ PNG_CONST transform_display *display)
{
/* Check for tRNS first: */
if (that->have_tRNS && that->colour_type != PNG_COLOR_TYPE_PALETTE)
@@ -7014,7 +7050,8 @@ image_transform_png_set_@_set(PNG_CONST image_transform *this,
static void
image_transform_png_set_@_mod(PNG_CONST image_transform *this,
- image_pixel *that, png_structp pp, PNG_CONST transform_display *display)
+ image_pixel *that, png_const_structp pp,
+ PNG_CONST transform_display *display)
{
this->next->mod(this->next, that, pp, display);
}
@@ -7317,7 +7354,7 @@ gamma_info(png_structp pp, png_infop pi)
*/
typedef struct validate_info
{
- png_structp pp;
+ png_const_structp pp;
gamma_display *dp;
png_byte sbit;
int use_input_precision;
@@ -7347,7 +7384,7 @@ typedef struct validate_info
validate_info;
static void
-init_validate_info(validate_info *vi, gamma_display *dp, png_struct *pp,
+init_validate_info(validate_info *vi, gamma_display *dp, png_const_structp pp,
int in_depth, int out_depth)
{
PNG_CONST unsigned int outmax = (1U<<out_depth)-1;
@@ -8060,7 +8097,8 @@ gamma_component_validate(PNG_CONST char *name, PNG_CONST validate_info *vi,
}
static void
-gamma_image_validate(gamma_display *dp, png_structp pp, png_infop pi)
+gamma_image_validate(gamma_display *dp, png_const_structp pp,
+ png_infop pi)
{
/* Get some constants derived from the input and output file formats: */
PNG_CONST png_store* PNG_CONST ps = dp->this.ps;
@@ -8249,8 +8287,9 @@ gamma_image_validate(gamma_display *dp, png_structp pp, png_infop pi)
}
static void
-gamma_end(png_structp pp, png_infop pi)
+gamma_end(png_structp ppIn, png_infop pi)
{
+ png_const_structp pp = ppIn;
gamma_display *dp = voidcast(gamma_display*, png_get_progressive_ptr(pp));
if (!dp->this.speed)