From 3f6acee0039d7d9b54b5aae9aa1cc58b7abff59e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Wed, 21 Jun 2006 10:36:39 +0000 Subject: [PATCH] actually render all the shapes... TODO: gradients git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17890 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../icon-o-matic/document/IconRenderer.cpp | 63 ++++++++++++++++--- src/apps/icon-o-matic/document/IconRenderer.h | 5 +- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/src/apps/icon-o-matic/document/IconRenderer.cpp b/src/apps/icon-o-matic/document/IconRenderer.cpp index 3bfdd4a86b..95277293ff 100644 --- a/src/apps/icon-o-matic/document/IconRenderer.cpp +++ b/src/apps/icon-o-matic/document/IconRenderer.cpp @@ -9,12 +9,18 @@ #include "IconRenderer.h" #include +#include #include +#include "agg_conv_curve.h" + #include "Icon.h" +#include "Shape.h" +#include "ShapeContainer.h" #include "Style.h" #include "StyleManager.h" +#include "VectorPath.h" using std::nothrow; @@ -34,14 +40,16 @@ class StyleHandler { if (!style) return true; - return style->Gradient() != NULL; + return style->Gradient() == NULL; } const agg::rgba8& color(unsigned styleIndex) { Style* style = fStyles->StyleAt(styleIndex); - if (!style) + if (!style) { + printf("no style at index: %d!\n", styleIndex); return fTransparent; + } const rgb_color& c = style->Color(); fColor = agg::rgba8(fGammaTable.dir(c.red), @@ -55,6 +63,7 @@ class StyleHandler { void generate_span(agg::rgba8* span, int x, int y, unsigned len, unsigned styleIndex) { +printf("unimplemented: generate_span(%p, %d, %d, %d)\n", span, x, y, len); // TODO: render gradient of Style at styleIndex into span } @@ -72,7 +81,7 @@ IconRenderer::IconRenderer(BBitmap* bitmap) fIcon(NULL), fStyles(StyleManager::Default()), - fGammaTable(2.2), + fGammaTable(1.0), fRenderingBuffer(), fPixelFormat(fRenderingBuffer), @@ -91,8 +100,6 @@ IconRenderer::IconRenderer(BBitmap* bitmap) bitmap->Bounds().IntegerWidth() + 1, bitmap->Bounds().IntegerHeight() + 1, bitmap->BytesPerRow()); - - // attach bitmap } // destructor @@ -111,19 +118,57 @@ IconRenderer::SetIcon(Icon* icon) // TODO: ... ? } +// Render +void +IconRenderer::Render() +{ + _Render(fBitmap->Bounds()); +} + +// Render +void +IconRenderer::Render(const BRect& area) +{ + _Render(fBitmap->Bounds() & area); +} + // #pragma mark - -// _RenderIcon +// _Render void -IconRenderer::_RenderIcon() +IconRenderer::_Render(const BRect& r) { - fBaseRenderer.clear(agg::rgba8(0, 0, 0, 0)); + fBaseRendererPre.clear(agg::rgba8(0, 0, 0, 0)); if (!fIcon) return; - // TODO: iterate over shapes in icon and + fBaseRendererPre.clip_box((int)floorf(r.left), + (int)floorf(r.top), + (int)ceilf(r.right), + (int)ceilf(r.bottom)); + + fRasterizer.reset(); + // iterate over shapes in icon and // add the vector paths to the rasterizer + // and associate the shapes style + int32 shapeCount = fIcon->Shapes()->CountShapes(); + for (int32 s = 0; s < shapeCount; s++) { + Shape* shape = fIcon->Shapes()->ShapeAtFast(s); + agg::path_storage aggPath; + int32 pathCount = shape->Paths()->CountPaths(); + for (int32 p = 0; p < pathCount; p++) { + VectorPath* path = shape->Paths()->PathAtFast(p); + agg::path_storage subPath; + if (path->GetAGGPathStorage(subPath)) { + aggPath.concat_path(subPath); + } + } + int32 styleIndex = fStyles->IndexOf(shape->Style()); + fRasterizer.styles(styleIndex, -1); + agg::conv_curve curve(aggPath); + fRasterizer.add_path(curve); + } StyleHandler styleHandler(fStyles, fGammaTable); diff --git a/src/apps/icon-o-matic/document/IconRenderer.h b/src/apps/icon-o-matic/document/IconRenderer.h index 3c39e24559..d352d2abe2 100644 --- a/src/apps/icon-o-matic/document/IconRenderer.h +++ b/src/apps/icon-o-matic/document/IconRenderer.h @@ -44,8 +44,11 @@ class IconRenderer { void SetIcon(Icon* icon); + void Render(); + void Render(const BRect& area); + private: - void _RenderIcon(); + void _Render(const BRect& area); BBitmap* fBitmap; Icon* fIcon;