implemented gradient rendering

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17892 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2006-06-21 12:14:19 +00:00
parent f67876a0c5
commit 0f50089d87
3 changed files with 133 additions and 28 deletions
+6
View File
@@ -17,6 +17,7 @@
#include "IconEditorApp.h"
// TODO: just for testing
#include "Gradient.h"
#include "Icon.h"
#include "MultipleManipulatorState.h"
#include "PathManipulator.h"
@@ -92,6 +93,11 @@ MainWindow::_Init()
Style* style = new Style();
style->SetColor((rgb_color){ 255, 0, 0, 255 });
Gradient* gradient = new Gradient(true);
gradient->AddColor((rgb_color){ 255, 211, 6, 255 }, 0.0);
gradient->AddColor((rgb_color){ 255, 238, 160, 255 }, 0.5);
gradient->AddColor((rgb_color){ 208, 43, 92, 255 }, 1.0);
style->SetGradient(gradient);
StyleManager::Default()->AddStyle(style);
+121 -22
View File
@@ -14,7 +14,10 @@
#include <Bitmap.h>
#include "agg_conv_curve.h"
#include "agg_span_gradient.h"
#include "agg_span_interpolator_linear.h"
#include "Gradient.h"
#include "Icon.h"
#include "Shape.h"
#include "ShapeContainer.h"
@@ -43,37 +46,133 @@ class StyleHandler {
return style->Gradient() == NULL;
}
const agg::rgba8& color(unsigned styleIndex)
{
Style* style = fStyles->StyleAt(styleIndex);
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),
fGammaTable.dir(c.green),
fGammaTable.dir(c.blue),
c.alpha);
fColor.premultiply();
return fColor;
}
const agg::rgba8& color(unsigned styleIndex);
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
}
unsigned len, unsigned styleIndex);
private:
template<class GradientFunction>
void _GenerateGradient(agg::rgba8* span, int x, int y, unsigned len,
GradientFunction function,
const agg::rgba8* gradientColors,
agg::trans_affine& gradientTransform);
const StyleManager* fStyles;
GammaTable& fGammaTable;
agg::rgba8 fTransparent;
agg::rgba8 fColor;
};
// color
const agg::rgba8&
StyleHandler::color(unsigned styleIndex)
{
Style* style = fStyles->StyleAt(styleIndex);
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),
fGammaTable.dir(c.green),
fGammaTable.dir(c.blue),
c.alpha);
fColor.premultiply();
return fColor;
}
// generate_span
void
StyleHandler::generate_span(agg::rgba8* span, int x, int y,
unsigned len, unsigned styleIndex)
{
Style* style = fStyles->StyleAt(styleIndex);
if (!style || !style->Gradient()) {
printf("no style/gradient at index: %d!\n", styleIndex);
// TODO: memset() span?
return;
}
Gradient* gradient = style->Gradient();
// TODO: move filling of color array elsewhere and cache result
// maybe in Style?
agg::rgba8 colors[256];
gradient->MakeGradient((uint32*)colors, 256);
agg::trans_affine transformation;
// TODO: construct the gradient transformation here
switch (gradient->Type()) {
case GRADIENT_LINEAR: {
agg::gradient_x function;
_GenerateGradient(span, x, y, len, function, colors,
transformation);
break;
}
case GRADIENT_CIRCULAR: {
agg::gradient_radial function;
_GenerateGradient(span, x, y, len, function, colors,
transformation);
break;
}
case GRADIENT_DIAMONT: {
agg::gradient_diamond function;
_GenerateGradient(span, x, y, len, function, colors,
transformation);
break;
}
case GRADIENT_CONIC: {
agg::gradient_conic function;
_GenerateGradient(span, x, y, len, function, colors,
transformation);
break;
}
case GRADIENT_XY: {
agg::gradient_xy function;
_GenerateGradient(span, x, y, len, function, colors,
transformation);
break;
}
case GRADIENT_SQRT_XY: {
agg::gradient_sqrt_xy function;
_GenerateGradient(span, x, y, len, function, colors,
transformation);
break;
}
}
}
// _GenerateGradient
template<class GradientFunction>
void
StyleHandler::_GenerateGradient(agg::rgba8* span, int x, int y, unsigned len,
GradientFunction function,
const agg::rgba8* gradientColors,
agg::trans_affine& gradientTransform)
{
typedef agg::pod_auto_array<agg::rgba8, 256> ColorArray;
typedef agg::span_interpolator_linear<> Interpolator;
typedef agg::span_gradient<agg::rgba8,
Interpolator,
GradientFunction,
ColorArray> GradientGenerator;
Interpolator interpolator(gradientTransform);
ColorArray array(gradientColors);
GradientGenerator gradientGenerator(interpolator,
function,
array,
0, 100);
gradientGenerator.generate(span, x, y, len);
}
// #pragma mark -
// constructor
IconRenderer::IconRenderer(BBitmap* bitmap)
@@ -81,7 +180,7 @@ IconRenderer::IconRenderer(BBitmap* bitmap)
fIcon(NULL),
fStyles(StyleManager::Default()),
fGammaTable(1.0),
fGammaTable(2.2),
fRenderingBuffer(),
fPixelFormat(fRenderingBuffer),
+6 -6
View File
@@ -392,9 +392,9 @@ Gradient::MakeGradient(uint32* colors, int32 count) const
if (index > 0) {
uint8* c = (uint8*)&colors[0];
for (int32 i = 0; i < index; i++) {
c[0] = from->color.blue;
c[0] = from->color.red;
c[1] = from->color.green;
c[2] = from->color.red;
c[2] = from->color.blue;
c[3] = from->color.alpha;
c += 4;
}
@@ -457,9 +457,9 @@ Gradient::MakeGradient(uint32* colors, int32 count) const
if (fInterpolation == INTERPOLATION_SMOOTH)
f = gauss(1.0 - f);
float t = 1.0 - f;
c[0] = (uint8)floor(from->color.blue * f + to->color.blue * t + 0.5);
c[0] = (uint8)floor(from->color.red * f + to->color.red * t + 0.5);
c[1] = (uint8)floor(from->color.green * f + to->color.green * t + 0.5);
c[2] = (uint8)floor(from->color.red * f + to->color.red * t + 0.5);
c[2] = (uint8)floor(from->color.blue * f + to->color.blue * t + 0.5);
c[3] = (uint8)floor(from->color.alpha * f + to->color.alpha * t + 0.5);
c += 4;
}
@@ -473,9 +473,9 @@ Gradient::MakeGradient(uint32* colors, int32 count) const
if (index < count) {
uint8* c = (uint8*)&colors[index];
for (int32 i = index; i < count; i++) {
c[0] = from->color.blue;
c[0] = from->color.red;
c[1] = from->color.green;
c[2] = from->color.red;
c[2] = from->color.blue;
c[3] = from->color.alpha;
c += 4;
}