[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[ft] Stroker and glyph border
From: |
Fred408 |
Subject: |
[ft] Stroker and glyph border |
Date: |
Mon, 20 Nov 2006 02:27:02 -0800 (PST) |
Hello,
I'm using freetype to render subtitles to display in video. All the glyphs
look
really great with the anti-aliasing and everything seems to work fine.
However, I am now trying to add a black border (contour) to the glyph shapes
so that
they remain visible in most background video. I use the stroker to create
the
contour but I can't manage to adjust the contour position so that it fits
perfectly
the edge of the shape.
Once I have rendered the contour to a bitmap, how can I position it so that
it fits
perfectly with the white glyph shapes edges ?
My code is just below.
Thanks alot for the help,
Fred
Here is my code : (in bold are passages I'm unsure about)
_____________________________________________________________
// Init freeType
error = FT_Init_FreeType(&library);
// Create Face
error = FT_New_Face(library, "arial.ttf", 0, &face);
// Set Pixel size
error = FT_Set_Pixel_Sizes(face, 256, 0);
// Shortcut to glyph slot
pSlot = (face->glyph);
// for each character in the string
for(i=0 ; i<strlen(text) ; i++){
// load the glyph in the glyphSlot
error = FT_Load_Char(face, text[i], FT_LOAD_RENDER);
// compute the upper left corner of the glyph
nPosX = penx + pSlot->metrics.horiBearingX/64+1;
nPosY = peny - pSlot->metrics.horiBearingY/64+1;
// draw the glyph to the bitmap
for(j=0 ; j<pSlot->bitmap.rows ; j++){
for(k=0 ; k<pSlot->bitmap.width ; k++){
bitmap[nPosY+j][nPosX+k] =
pSlot->bitmap.buffer[(j*(pSlot->bitmap.width))+k];
}
}
// Up to here everything looks great.
// Now lets add some nice black contour to the glyph shapes.
// load the glyph once again but without rendering it
error = FT_Load_Char(face, text[i], FT_LOAD_DEFAULT);
// copy from glyphSlot to glyph
error = FT_Get_Glyph( pSlot, &glyph );
// create stroker
FT_Stroker_New(library, &stroker);
// Configure stroker (how to choose radius ?)
FT_Stroker_Set(stroker,
16, // ??
FT_STROKER_LINECAP_ROUND,
FT_STROKER_LINEJOIN_ROUND,
0
);
// Apply stroke to the glyph to create the contour
error = FT_Glyph_Stroke( &glyph, stroker, 0 );
// Render the contour glyph to the bitmap
error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, &origin, 0 );
// cast the contour glyph to a bitmapGlyph
glyphBitmap = (FT_BitmapGlyph)glyph;
// Compute contour glyph upper left corner
nPosX = penx + pSlot->metrics.horiBearingX/64;//+?
nPosY = peny - pSlot->metrics.horiBearingY/64;//+?
// Draw the contour to another bitmap
for(j=0 ; j<glyphBitmap->bitmap.rows ; j++){
for(k=0 ; k<glyphBitmap->bitmap.width ; k++){
bitmap2[nPosY+j][nPosX+k] =
glyphBitmap->bitmap.buffer[(j*(glyphBitmap->bitmap.width))+k];
}
}
// update the penX coordinate with the glyph or with the contour
// glyph horiAdvance ? (if the contour is very thick we have to take
// it into account in the pen update)
penx += pSlot->metrics.horiAdvance/64; // ?
}
_________________________________________________________
--
View this message in context:
http://www.nabble.com/Stroker-and-glyph-border-tf2668115.html#a7440125
Sent from the Freetype - User mailing list archive at Nabble.com.
- [ft] Stroker and glyph border,
Fred408 <=