summaryrefslogtreecommitdiffstatsci
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2022-07-14 06:17:32 +0200
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2022-07-14 06:17:32 +0200
commit7682cf917a05784c132b1faca2611986c6a01e04 (patch)
tree7755756d16ba24cb0d3af994834312942f75fe54
parentfae189723237dd5fa3b87bbe421f63a8e7f66ca7 (diff)
vkvg_surface_resizeresizeSurf
-rw-r--r--include/vkvg.h5
-rw-r--r--src/vkvg_context.c4
-rw-r--r--src/vkvg_surface.c36
-rw-r--r--src/vkvg_surface_internal.h6
4 files changed, 41 insertions, 10 deletions
diff --git a/include/vkvg.h b/include/vkvg.h
index 3483a1e..164ef61 100644
--- a/include/vkvg.h
+++ b/include/vkvg.h
@@ -790,6 +790,11 @@ void vkvg_surface_destroy (VkvgSurface surf);
vkvg_public
vkvg_status_t vkvg_surface_status (VkvgSurface surf);
/**
+ * @brief Resize the surface.
+ */
+vkvg_public
+void vkvg_surface_resize(VkvgSurface surf, uint32_t width, uint32_t height);
+/**
* @brief Clear surface's content.
*
* Clear the surface content, alpha is also set to 0 resulting in a transparent image. The clipping region is also
diff --git a/src/vkvg_context.c b/src/vkvg_context.c
index ea5b1f5..a88f71b 100644
--- a/src/vkvg_context.c
+++ b/src/vkvg_context.c
@@ -47,7 +47,7 @@ void _init_ctx (VkvgContext ctx) {
ctx->miterLimit = 10;
ctx->curOperator = VKVG_OPERATOR_OVER;
ctx->curFillRule = VKVG_FILL_RULE_NON_ZERO;
- ctx->bounds = (VkRect2D) {{0,0},{ctx->pSurf->width,ctx->pSurf->height}};
+ ctx->bounds = (VkRect2D) { {0,0}, { ctx->pSurf->width, ctx->pSurf->height } };
ctx->pushConsts = (push_constants) {
{.a = 1},
{(float)ctx->pSurf->width,(float)ctx->pSurf->height},
@@ -575,7 +575,7 @@ void _curve_to (VkvgContext ctx, float x1, float y1, float x2, float y2, float x
//compute dyn distanceTolerance depending on current scale
float sx = 1, sy = 1;
vkvg_matrix_get_scale (&ctx->pushConsts.mat, &sx, &sy);
- float distanceTolerance = fabs(0.25f / fmaxf(sx,sy));
+ float distanceTolerance = fabs(0.01f / fmaxf(sx,sy));
_recursive_bezier (ctx, distanceTolerance, cp.x, cp.y, x1, y1, x2, y2, x3, y3, 0);
/*cp.x = x3;
diff --git a/src/vkvg_surface.c b/src/vkvg_surface.c
index 369adbd..c70e2aa 100644
--- a/src/vkvg_surface.c
+++ b/src/vkvg_surface.c
@@ -65,8 +65,8 @@ VkvgSurface vkvg_surface_create (VkvgDevice dev, uint32_t width, uint32_t height
if (surf->status)
return surf;
- surf->width = MAX(1, width);
- surf->height = MAX(1, height);
+ surf->imgWidth = surf->width = MAX(1, width);
+ surf->imgHeight = surf->height = MAX(1, height);
surf->newSurf = true;//used to clear all attacments on first render pass
_create_surface_images (surf);
@@ -88,8 +88,8 @@ VkvgSurface vkvg_surface_create_for_VkhImage (VkvgDevice dev, void* vkhImg) {
}
VkhImage img = (VkhImage)vkhImg;
- surf->width = img->infos.extent.width;
- surf->height= img->infos.extent.height;
+ surf->imgWidth = img->infos.extent.width;
+ surf->imgHeight = img->infos.extent.height;
surf->img = img;
@@ -116,8 +116,8 @@ VkvgSurface vkvg_surface_create_from_bitmap (VkvgDevice dev, unsigned char* img,
return surf;
}
- surf->width = MAX(1, width);
- surf->height = MAX(1, height);
+ surf->imgWidth = surf->width = MAX(1, width);
+ surf->imgHeight = surf->height = MAX(1, height);
_create_surface_images (surf);
@@ -275,7 +275,31 @@ uint32_t vkvg_surface_get_reference_count (VkvgSurface surf) {
return 0;
return surf->references;
}
+void vkvg_surface_resize(VkvgSurface surf, uint32_t width, uint32_t height) {
+ if (surf->status)
+ return;
+
+ surf->width = MAX(1, width);
+ surf->height = MAX(1, height);
+
+ vkDestroyFramebuffer(surf->dev->vkDev, surf->fb, NULL);
+
+ if (width > surf->imgWidth || height > surf->imgHeight) {
+ if (!surf->img->imported)
+ vkh_image_destroy(surf->img);
+ vkh_image_destroy(surf->imgMS);
+ vkh_image_destroy(surf->stencil);
+ surf->newSurf = true;//used to clear all attacments on first render pass
+ _create_surface_images (surf);
+ _transition_surf_images (surf);
+
+ surf->imgWidth = surf->width;
+ surf->imgHeight = surf->height;
+ }
+
+ _create_framebuffer (surf);
+}
VkImage vkvg_surface_get_vk_image(VkvgSurface surf)
{
if (surf->status)
diff --git a/src/vkvg_surface_internal.h b/src/vkvg_surface_internal.h
index 5cc47c6..f89573f 100644
--- a/src/vkvg_surface_internal.h
+++ b/src/vkvg_surface_internal.h
@@ -30,8 +30,10 @@ typedef struct _vkvg_surface_t {
vkvg_status_t status; /**< Current status of surface, affected by last operation */
uint32_t references;
VkvgDevice dev;
- uint32_t width;
- uint32_t height;
+ uint32_t width; /**< surface width, underlying vulkan image may be larger */
+ uint32_t height; /**< surface height, underlying vulkan image may be larger */
+ uint32_t imgWidth; /**< physical surface image width */
+ uint32_t imgHeight; /**< physical surface image height */
VkFormat format;
VkFramebuffer fb;
VkhImage img;