app_server: Support alpha masks for text rendering...

... both vector and bitmap based. Sub-pixel text rendering not yet handled,
I think the scanline is used differently in this case, in that three times the
horizontal resolution is used, while the alpha map doesn't match this
increase.
This commit is contained in:
Stephan Aßmus 2014-01-28 22:35:36 +01:00
parent a01eaea74b
commit a2f075eb42
3 changed files with 39 additions and 20 deletions

View File

@ -33,7 +33,8 @@ AGGTextRenderer::AGGTextRenderer(renderer_subpix_type& subpixRenderer,
renderer_type& solidRenderer, renderer_bin_type& binRenderer,
scanline_unpacked_type& scanline,
scanline_unpacked_subpix_type& subpixScanline,
rasterizer_subpix_type& subpixRasterizer)
rasterizer_subpix_type& subpixRasterizer,
scanline_unpacked_masked_type*& maskedScanline)
:
fPathAdaptor(),
fGray8Adaptor(),
@ -51,6 +52,8 @@ AGGTextRenderer::AGGTextRenderer(renderer_subpix_type& subpixRenderer,
fScanline(scanline),
fSubpixScanline(subpixScanline),
fSubpixRasterizer(subpixRasterizer),
fMaskedScanline(maskedScanline),
fRasterizer(),
fHinted(true),
@ -150,7 +153,10 @@ public:
void Finish(double x, double y)
{
if (fVector) {
if (fSubpixelAntiAliased) {
if (fRenderer.fMaskedScanline != NULL) {
agg::render_scanlines(fRenderer.fRasterizer,
*fRenderer.fMaskedScanline, fRenderer.fSolidRenderer);
} else if (fSubpixelAntiAliased) {
agg::render_scanlines(fRenderer.fSubpixRasterizer,
fRenderer.fSubpixScanline, fRenderer.fSubpixRenderer);
} else {
@ -234,11 +240,19 @@ public:
break;
case glyph_data_gray8:
agg::render_scanlines(fRenderer.fGray8Adaptor,
fRenderer.fGray8Scanline, fRenderer.fSolidRenderer);
if (fRenderer.fMaskedScanline != NULL) {
agg::render_scanlines(fRenderer.fGray8Adaptor,
*fRenderer.fMaskedScanline,
fRenderer.fSolidRenderer);
} else {
agg::render_scanlines(fRenderer.fGray8Adaptor,
fRenderer.fGray8Scanline,
fRenderer.fSolidRenderer);
}
break;
case glyph_data_subpix:
// TODO: Handle alpha mask (fRenderer.fMaskedScanline)
agg::render_scanlines(fRenderer.fGray8Adaptor,
fRenderer.fGray8Scanline,
fRenderer.fSubpixRenderer);

View File

@ -27,8 +27,11 @@ public:
renderer_type& solidRenderer,
renderer_bin_type& binRenderer,
scanline_unpacked_type& scanline,
scanline_unpacked_subpix_type& subpixScanline,
rasterizer_subpix_type& subpixRasterizer);
scanline_unpacked_subpix_type&
subpixScanline,
rasterizer_subpix_type& subpixRasterizer,
scanline_unpacked_masked_type*&
maskedScanline);
virtual ~AGGTextRenderer();
void SetFont(const ServerFont &font);
@ -82,6 +85,8 @@ private:
scanline_unpacked_type& fScanline;
scanline_unpacked_subpix_type& fSubpixScanline;
rasterizer_subpix_type& fSubpixRasterizer;
scanline_unpacked_masked_type*& fMaskedScanline;
rasterizer_type fRasterizer;
// NOTE: the object has it's own rasterizer object
// since it might be using a different gamma setting

View File

@ -201,7 +201,7 @@ Painter::Painter()
fPatternHandler(),
fTextRenderer(fSubpixRenderer, fRenderer, fRendererBin, fUnpackedScanline,
fSubpixUnpackedScanline, fSubpixRasterizer)
fSubpixUnpackedScanline, fSubpixRasterizer, fMaskedUnpackedScanline)
{
fPixelFormat.SetDrawingMode(fDrawingMode, fAlphaSrcMode, fAlphaFncMode,
false);
@ -2910,18 +2910,18 @@ Painter::_StrokePath(VertexSource& path) const
stroke.line_join(agg_line_join_mode_for(fLineJoinMode));
stroke.miter_limit(fMiterLimit);
if (gSubpixelAntialiasing) {
fSubpixRasterizer.reset();
fSubpixRasterizer.add_path(stroke);
agg::render_scanlines(fSubpixRasterizer,
fSubpixPackedScanline, fSubpixRenderer);
} else if(fMaskedUnpackedScanline != NULL) {
if (fMaskedUnpackedScanline != NULL) {
// TODO: we can't do both alpha-masking and subpixel AA.
fRasterizer.reset();
fRasterizer.add_path(path);
agg::render_scanlines(fRasterizer, *fMaskedUnpackedScanline,
fRenderer);
} else if (gSubpixelAntialiasing) {
fSubpixRasterizer.reset();
fSubpixRasterizer.add_path(stroke);
agg::render_scanlines(fSubpixRasterizer,
fSubpixPackedScanline, fSubpixRenderer);
} else {
fRasterizer.reset();
fRasterizer.add_path(stroke);
@ -2942,17 +2942,17 @@ template<class VertexSource>
BRect
Painter::_FillPath(VertexSource& path) const
{
if (gSubpixelAntialiasing) {
fSubpixRasterizer.reset();
fSubpixRasterizer.add_path(path);
agg::render_scanlines(fSubpixRasterizer,
fSubpixPackedScanline, fSubpixRenderer);
} else if(fMaskedUnpackedScanline != NULL) {
if (fMaskedUnpackedScanline != NULL) {
// TODO: we can't do both alpha-masking and subpixel AA.
fRasterizer.reset();
fRasterizer.add_path(path);
agg::render_scanlines(fRasterizer, *fMaskedUnpackedScanline,
fRenderer);
} else if (gSubpixelAntialiasing) {
fSubpixRasterizer.reset();
fSubpixRasterizer.add_path(path);
agg::render_scanlines(fSubpixRasterizer,
fSubpixPackedScanline, fSubpixRenderer);
} else {
fRasterizer.reset();
fRasterizer.add_path(path);