actually render all the shapes... TODO: gradients
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17890 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -9,12 +9,18 @@
|
|||||||
#include "IconRenderer.h"
|
#include "IconRenderer.h"
|
||||||
|
|
||||||
#include <new>
|
#include <new>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <Bitmap.h>
|
#include <Bitmap.h>
|
||||||
|
|
||||||
|
#include "agg_conv_curve.h"
|
||||||
|
|
||||||
#include "Icon.h"
|
#include "Icon.h"
|
||||||
|
#include "Shape.h"
|
||||||
|
#include "ShapeContainer.h"
|
||||||
#include "Style.h"
|
#include "Style.h"
|
||||||
#include "StyleManager.h"
|
#include "StyleManager.h"
|
||||||
|
#include "VectorPath.h"
|
||||||
|
|
||||||
using std::nothrow;
|
using std::nothrow;
|
||||||
|
|
||||||
@@ -34,14 +40,16 @@ class StyleHandler {
|
|||||||
if (!style)
|
if (!style)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return style->Gradient() != NULL;
|
return style->Gradient() == NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const agg::rgba8& color(unsigned styleIndex)
|
const agg::rgba8& color(unsigned styleIndex)
|
||||||
{
|
{
|
||||||
Style* style = fStyles->StyleAt(styleIndex);
|
Style* style = fStyles->StyleAt(styleIndex);
|
||||||
if (!style)
|
if (!style) {
|
||||||
|
printf("no style at index: %d!\n", styleIndex);
|
||||||
return fTransparent;
|
return fTransparent;
|
||||||
|
}
|
||||||
|
|
||||||
const rgb_color& c = style->Color();
|
const rgb_color& c = style->Color();
|
||||||
fColor = agg::rgba8(fGammaTable.dir(c.red),
|
fColor = agg::rgba8(fGammaTable.dir(c.red),
|
||||||
@@ -55,6 +63,7 @@ class StyleHandler {
|
|||||||
void generate_span(agg::rgba8* span, int x, int y,
|
void generate_span(agg::rgba8* span, int x, int y,
|
||||||
unsigned len, unsigned styleIndex)
|
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
|
// TODO: render gradient of Style at styleIndex into span
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,7 +81,7 @@ IconRenderer::IconRenderer(BBitmap* bitmap)
|
|||||||
fIcon(NULL),
|
fIcon(NULL),
|
||||||
fStyles(StyleManager::Default()),
|
fStyles(StyleManager::Default()),
|
||||||
|
|
||||||
fGammaTable(2.2),
|
fGammaTable(1.0),
|
||||||
|
|
||||||
fRenderingBuffer(),
|
fRenderingBuffer(),
|
||||||
fPixelFormat(fRenderingBuffer),
|
fPixelFormat(fRenderingBuffer),
|
||||||
@@ -91,8 +100,6 @@ IconRenderer::IconRenderer(BBitmap* bitmap)
|
|||||||
bitmap->Bounds().IntegerWidth() + 1,
|
bitmap->Bounds().IntegerWidth() + 1,
|
||||||
bitmap->Bounds().IntegerHeight() + 1,
|
bitmap->Bounds().IntegerHeight() + 1,
|
||||||
bitmap->BytesPerRow());
|
bitmap->BytesPerRow());
|
||||||
|
|
||||||
// attach bitmap
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// destructor
|
// destructor
|
||||||
@@ -111,19 +118,57 @@ IconRenderer::SetIcon(Icon* icon)
|
|||||||
// TODO: ... ?
|
// TODO: ... ?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Render
|
||||||
|
void
|
||||||
|
IconRenderer::Render()
|
||||||
|
{
|
||||||
|
_Render(fBitmap->Bounds());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Render
|
||||||
|
void
|
||||||
|
IconRenderer::Render(const BRect& area)
|
||||||
|
{
|
||||||
|
_Render(fBitmap->Bounds() & area);
|
||||||
|
}
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
// _RenderIcon
|
// _Render
|
||||||
void
|
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)
|
if (!fIcon)
|
||||||
return;
|
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
|
// 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<agg::path_storage> curve(aggPath);
|
||||||
|
fRasterizer.add_path(curve);
|
||||||
|
}
|
||||||
|
|
||||||
StyleHandler styleHandler(fStyles, fGammaTable);
|
StyleHandler styleHandler(fStyles, fGammaTable);
|
||||||
|
|
||||||
|
|||||||
@@ -44,8 +44,11 @@ class IconRenderer {
|
|||||||
|
|
||||||
void SetIcon(Icon* icon);
|
void SetIcon(Icon* icon);
|
||||||
|
|
||||||
|
void Render();
|
||||||
|
void Render(const BRect& area);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _RenderIcon();
|
void _Render(const BRect& area);
|
||||||
|
|
||||||
BBitmap* fBitmap;
|
BBitmap* fBitmap;
|
||||||
Icon* fIcon;
|
Icon* fIcon;
|
||||||
|
|||||||
Reference in New Issue
Block a user