From a2f075eb427e1b5d41d094f4a43a07c0417b8fa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Tue, 28 Jan 2014 22:35:36 +0100 Subject: [PATCH] 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. --- .../app/drawing/Painter/AGGTextRenderer.cpp | 22 ++++++++++++--- .../app/drawing/Painter/AGGTextRenderer.h | 9 ++++-- src/servers/app/drawing/Painter/Painter.cpp | 28 +++++++++---------- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/servers/app/drawing/Painter/AGGTextRenderer.cpp b/src/servers/app/drawing/Painter/AGGTextRenderer.cpp index 0bbc0ad0d1..f1f9cd8972 100644 --- a/src/servers/app/drawing/Painter/AGGTextRenderer.cpp +++ b/src/servers/app/drawing/Painter/AGGTextRenderer.cpp @@ -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); diff --git a/src/servers/app/drawing/Painter/AGGTextRenderer.h b/src/servers/app/drawing/Painter/AGGTextRenderer.h index f9f4644f8e..471f44c7f7 100644 --- a/src/servers/app/drawing/Painter/AGGTextRenderer.h +++ b/src/servers/app/drawing/Painter/AGGTextRenderer.h @@ -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 diff --git a/src/servers/app/drawing/Painter/Painter.cpp b/src/servers/app/drawing/Painter/Painter.cpp index f1c8e8fa0d..f54bd1ea72 100644 --- a/src/servers/app/drawing/Painter/Painter.cpp +++ b/src/servers/app/drawing/Painter/Painter.cpp @@ -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 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);