#include <stdarg.h>
#include <errno.h>
#include <libusb.h>
+#include <math.h>
#include "am7xxx.h"
#include "serialize.h"
# define __attribute__(x) /*NOTHING*/
#endif
+/* Control shared library symbols visibility */
+#if defined _WIN32 || defined __CYGWIN__
+ #define AM7XXX_PUBLIC __declspec(dllexport)
+ #define AM7XXX_LOCAL
+#else
+ #if __GNUC__ >= 4
+ #define AM7XXX_PUBLIC __attribute__ ((visibility ("default")))
+ #define AM7XXX_LOCAL __attribute__ ((visibility ("hidden")))
+ #else
+ #define AM7XXX_PUBLIC
+ #define AM7XXX_LOCAL
+ #endif
+#endif
+
static void log_message(am7xxx_context *ctx,
int level,
const char *function,
};
/* The header size on the wire is known to be always 24 bytes, regardless of
- * the memory configuration enforced by different architechtures or compilers
+ * the memory configuration enforced by different architectures or compilers
* for struct am7xxx_header
*/
#define AM7XXX_HEADER_WIRE_SIZE 24
return ret;
}
-int am7xxx_init(am7xxx_context **ctx)
+/* Public API */
+
+AM7XXX_PUBLIC int am7xxx_init(am7xxx_context **ctx)
{
int ret = 0;
return ret;
}
-void am7xxx_shutdown(am7xxx_context *ctx)
+AM7XXX_PUBLIC void am7xxx_shutdown(am7xxx_context *ctx)
{
am7xxx_device *current;
ctx = NULL;
}
-void am7xxx_set_log_level(am7xxx_context *ctx, am7xxx_log_level log_level)
+AM7XXX_PUBLIC void am7xxx_set_log_level(am7xxx_context *ctx, am7xxx_log_level log_level)
{
ctx->log_level = log_level;
}
-int am7xxx_open_device(am7xxx_context *ctx, am7xxx_device **dev,
+AM7XXX_PUBLIC int am7xxx_open_device(am7xxx_context *ctx, am7xxx_device **dev,
unsigned int device_index)
{
int ret;
return ret;
}
-int am7xxx_close_device(am7xxx_device *dev)
+AM7XXX_PUBLIC int am7xxx_close_device(am7xxx_device *dev)
{
if (dev == NULL) {
fatal("dev must not be NULL!\n");
return 0;
}
-int am7xxx_get_device_info(am7xxx_device *dev,
+AM7XXX_PUBLIC int am7xxx_get_device_info(am7xxx_device *dev,
am7xxx_device_info *device_info)
{
int ret;
return 0;
}
-int am7xxx_calc_scaled_image_dimensions(am7xxx_device *dev,
+AM7XXX_PUBLIC int am7xxx_calc_scaled_image_dimensions(am7xxx_device *dev,
unsigned int upscale,
unsigned int original_width,
unsigned int original_height,
if (width_ratio > height_ratio) {
/*
* The input is proportionally "wider" than the device viewport
- * so it's height needs to be adjusted
+ * so its height needs to be adjusted
*/
debug(dev->ctx, "CASE 1, original image wider, adjust the scaled height\n");
*scaled_width = device_info.native_width;
- *scaled_height = (unsigned int)(original_height / width_ratio);
+ *scaled_height = (unsigned int)lroundf(original_height / width_ratio);
} else if (width_ratio < height_ratio) {
/*
* The input is proportionally "taller" than the device viewport
* so its width needs to be adjusted
*/
debug(dev->ctx, "CASE 2 original image taller, adjust the scaled width\n");
- *scaled_width = (unsigned int)(original_width / height_ratio);
+ *scaled_width = (unsigned int)lroundf(original_width / height_ratio);
*scaled_height = device_info.native_height;
} else {
debug(dev->ctx, "CASE 3, just rescale, same aspect ratio already\n");
return 0;
}
-int am7xxx_send_image(am7xxx_device *dev,
+AM7XXX_PUBLIC int am7xxx_send_image(am7xxx_device *dev,
am7xxx_image_format format,
unsigned int width,
unsigned int height,
return send_data(dev, image, image_size);
}
-int am7xxx_set_power_mode(am7xxx_device *dev, am7xxx_power_mode mode)
+AM7XXX_PUBLIC int am7xxx_set_power_mode(am7xxx_device *dev, am7xxx_power_mode mode)
{
int ret;
struct am7xxx_header h = {