[vlc-devel] [PATCH 2/3] draw text taking into-account visible display size
Vittorio Giovara
vittorio.giovara at gmail.com
Mon Jul 15 18:00:28 CEST 2013
---
src/video_output/video_text.c | 8 +++----
src/video_output/vout_subpictures.c | 43 +++++++++++++++++++----------------
2 files changed, 27 insertions(+), 24 deletions(-)
diff --git a/src/video_output/video_text.c b/src/video_output/video_text.c
index 8d3cffc..4ef8865 100644
--- a/src/video_output/video_text.c
+++ b/src/video_output/video_text.c
@@ -62,8 +62,8 @@ static void OSDTextUpdate(subpicture_t *subpic,
return;
subpic->b_absolute = false;
- subpic->i_original_picture_width = fmt_dst->i_width * fmt_dst->i_sar_num / fmt_dst->i_sar_den;
- subpic->i_original_picture_height = fmt_dst->i_height;
+ subpic->i_original_picture_width = fmt_dst->i_visible_width * fmt_dst->i_sar_num / fmt_dst->i_sar_den;
+ subpic->i_original_picture_height = fmt_dst->i_visible_height;
video_format_t fmt;
video_format_Init( &fmt, VLC_CODEC_TEXT);
@@ -85,13 +85,13 @@ static void OSDTextUpdate(subpicture_t *subpic,
if (r->i_align & SUBPICTURE_ALIGN_LEFT)
r->i_x += margin_h + fmt_dst->i_x_offset;
else if (r->i_align & SUBPICTURE_ALIGN_RIGHT)
- r->i_x += margin_h + fmt_dst->i_width - (fmt_dst->i_visible_width + fmt_dst->i_x_offset);
+ r->i_x += margin_h - fmt_dst->i_x_offset;
r->i_y = 0;
if (r->i_align & SUBPICTURE_ALIGN_TOP )
r->i_y += margin_v + fmt_dst->i_y_offset;
else if (r->i_align & SUBPICTURE_ALIGN_BOTTOM )
- r->i_y += margin_v + fmt_dst->i_height - (fmt_dst->i_visible_height + fmt_dst->i_y_offset);
+ r->i_y += margin_v - fmt_dst->i_y_offset;
}
static void OSDTextDestroy(subpicture_t *subpic)
diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c
index 6434772..90e6708 100644
--- a/src/video_output/vout_subpictures.c
+++ b/src/video_output/vout_subpictures.c
@@ -476,16 +476,16 @@ static void SpuRegionPlace(int *x, int *y,
if (region->i_align & SUBPICTURE_ALIGN_TOP)
*y = region->i_y;
else if (region->i_align & SUBPICTURE_ALIGN_BOTTOM)
- *y = subpic->i_original_picture_height - region->fmt.i_height - region->i_y;
+ *y = subpic->i_original_picture_height - region->fmt.i_visible_height - region->i_y;
else
- *y = subpic->i_original_picture_height / 2 - region->fmt.i_height / 2;
+ *y = subpic->i_original_picture_height / 2 - region->fmt.i_visible_height / 2;
if (region->i_align & SUBPICTURE_ALIGN_LEFT)
*x = region->i_x;
else if (region->i_align & SUBPICTURE_ALIGN_RIGHT)
- *x = subpic->i_original_picture_width - region->fmt.i_width - region->i_x;
+ *x = subpic->i_original_picture_width - region->fmt.i_visible_width - region->i_x;
else
- *x = subpic->i_original_picture_width / 2 - region->fmt.i_width / 2;
+ *x = subpic->i_original_picture_width / 2 - region->fmt.i_visible_width / 2;
}
}
@@ -722,7 +722,8 @@ static void SpuRenderRegion(spu_t *spu,
/* Save this position for subtitle overlap support
* it is really important that there are given without scale_size applied */
*dst_area = spu_area_create(x_offset, y_offset,
- region->fmt.i_width, region->fmt.i_height,
+ region->fmt.i_visible_width,
+ region->fmt.i_visible_height,
scale_size);
/* Handle overlapping subtitles when possible */
@@ -738,8 +739,10 @@ static void SpuRenderRegion(spu_t *spu,
if (subpic->b_subtitle)
restrained.y -= y_margin;
- spu_area_t display = spu_area_create(0, 0, fmt->i_width, fmt->i_height,
+ spu_area_t display = spu_area_create(0, 0, fmt->i_visible_width,
+ fmt->i_visible_height,
spu_scale_unit());
+ //fprintf("
SpuAreaFitInside(&restrained, &display);
/* Fix the position for the current scale_size */
@@ -782,8 +785,8 @@ static void SpuRenderRegion(spu_t *spu,
(!using_palette || (sys->scale_yuvp && sys->scale_yuvp->p_module)) &&
(scale_size.w != SCALE_UNIT || scale_size.h != SCALE_UNIT ||
using_palette || convert_chroma)) {
- const unsigned dst_width = spu_scale_w(region->fmt.i_width, scale_size);
- const unsigned dst_height = spu_scale_h(region->fmt.i_height, scale_size);
+ const unsigned dst_width = spu_scale_w(region->fmt.i_visible_width, scale_size);
+ const unsigned dst_height = spu_scale_h(region->fmt.i_visible_height, scale_size);
/* Destroy the cache if unusable */
if (region->p_private) {
@@ -791,8 +794,8 @@ static void SpuRenderRegion(spu_t *spu,
bool is_changed = false;
/* Check resize changes */
- if (dst_width != private->fmt.i_width ||
- dst_height != private->fmt.i_height)
+ if (dst_width != private->fmt.i_visible_width ||
+ dst_height != private->fmt.i_visible_height)
is_changed = true;
/* Check forced palette changes */
@@ -835,8 +838,8 @@ static void SpuRenderRegion(spu_t *spu,
/* Conversion(except from YUVP)/Scaling */
if (picture &&
- (picture->format.i_width != dst_width ||
- picture->format.i_height != dst_height ||
+ (picture->format.i_visible_width != dst_width ||
+ picture->format.i_visible_height != dst_height ||
(convert_chroma && !using_palette)))
{
scale->fmt_in.video = picture->format;
@@ -987,8 +990,8 @@ static subpicture_t *SpuRenderSubpictures(spu_t *spu,
subpicture_t *output = subpicture_New(NULL);
if (!output)
return NULL;
- output->i_original_picture_width = fmt_dst->i_width;
- output->i_original_picture_height = fmt_dst->i_height;
+ output->i_original_picture_width = fmt_dst->i_visible_width;
+ output->i_original_picture_height = fmt_dst->i_visible_height;
subpicture_region_t **output_last_ptr = &output->p_region;
/* Allocate area array for subtitle overlap */
@@ -1019,8 +1022,8 @@ static subpicture_t *SpuRenderSubpictures(spu_t *spu,
else
msg_Warn(spu, "original picture size is undefined");
- subpic->i_original_picture_width = fmt_src->i_width;
- subpic->i_original_picture_height = fmt_src->i_height;
+ subpic->i_original_picture_width = fmt_src->i_visible_width;
+ subpic->i_original_picture_height = fmt_src->i_visible_height;
}
if (sys->text) {
@@ -1042,8 +1045,8 @@ static subpicture_t *SpuRenderSubpictures(spu_t *spu,
/* Compute region scale AR */
video_format_t region_fmt = region->fmt;
if (region_fmt.i_sar_num <= 0 || region_fmt.i_sar_den <= 0) {
- region_fmt.i_sar_num = (int64_t)fmt_dst->i_width * fmt_dst->i_sar_num * subpic->i_original_picture_height;
- region_fmt.i_sar_den = (int64_t)fmt_dst->i_height * fmt_dst->i_sar_den * subpic->i_original_picture_width;
+ region_fmt.i_sar_num = (int64_t)fmt_dst->i_visible_width * fmt_dst->i_sar_num * subpic->i_original_picture_height;
+ region_fmt.i_sar_den = (int64_t)fmt_dst->i_visible_height * fmt_dst->i_sar_den * subpic->i_original_picture_width;
vlc_ureduce(®ion_fmt.i_sar_num, ®ion_fmt.i_sar_den,
region_fmt.i_sar_num, region_fmt.i_sar_den, 65536);
}
@@ -1052,9 +1055,9 @@ static subpicture_t *SpuRenderSubpictures(spu_t *spu,
* FIXME The current scaling ensure that the heights match, the width being
* cropped.
*/
- spu_scale_t scale = spu_scale_createq((int64_t)fmt_dst->i_height * fmt_dst->i_sar_den * region_fmt.i_sar_num,
+ spu_scale_t scale = spu_scale_createq((int64_t)fmt_dst->i_visible_height * fmt_dst->i_sar_den * region_fmt.i_sar_num,
(int64_t)subpic->i_original_picture_height * fmt_dst->i_sar_num * region_fmt.i_sar_den,
- fmt_dst->i_height,
+ fmt_dst->i_visible_height,
subpic->i_original_picture_height);
/* Check scale validity */
--
1.7.9.5
More information about the vlc-devel
mailing list