22 #ifndef AGG_SPAN_GRADIENT_CONTOUR_INCLUDED 23 #define AGG_SPAN_GRADIENT_CONTOUR_INCLUDED 25 #include "agg_basics.h" 26 #include "agg_trans_affine.h" 27 #include "agg_path_storage.h" 28 #include "agg_pixfmt_gray.h" 29 #include "agg_conv_transform.h" 30 #include "agg_conv_curve.h" 31 #include "agg_bounding_rect.h" 32 #include "agg_renderer_base.h" 33 #include "agg_renderer_primitives.h" 34 #include "agg_rasterizer_outline.h" 35 #include "agg_span_gradient.h" 87 int contour_width() {
return m_width; }
88 int contour_height() {
return m_height; }
90 void d1(
double d ) { m_d1 = d; }
91 void d2(
double d ) { m_d2 = d; }
93 void frame(
int f ) { m_frame = f; }
94 int frame() {
return m_frame; }
96 int calculate(
int x,
int y,
int d)
const 100 int px = x >> agg::gradient_subpixel_shift;
101 int py = y >> agg::gradient_subpixel_shift;
117 return iround(m_buffer[py * m_width + px ] * (m_d2 / 256 ) + m_d1 ) << gradient_subpixel_shift;
128 static AGG_INLINE
int square(
int x ) {
return x * x; }
131 void dt(
float* spanf,
float* spang,
float* spanr,
int* spann ,
int length )
137 spang[0 ] = -FLT_MAX;
140 for (
int q = 1; q <= length - 1; q++)
142 s = ((spanf[q ] + square(q ) ) - (spanf[spann[k ] ] + square(spann[k ] ) ) ) / (2 * q - 2 * spann[k ] );
144 while (s <= spang[k ])
147 s = ((spanf[q ] + square(q ) ) - (spanf[spann[k ] ] + square(spann[k ] ) ) ) / (2 * q - 2 * spann[k ] );
153 spang[k + 1 ] = FLT_MAX;
159 for (
int q = 0; q <= length - 1; q++)
161 while (spang[k + 1 ] < q )
166 spanr[q ] = square(q - spann[k ] ) + spanf[spann[k ] ];
171 int8u* gradient_contour::contour_create(
path_storage* ps )
173 int8u* result = NULL;
181 double x1, y1, x2, y2;
183 if (agg::bounding_rect_single(conv ,0 ,&x1 ,&y1 ,&x2 ,&y2 ))
186 int width = int(ceil(x2 - x1 ) ) + m_frame * 2 + 1;
187 int height = int(ceil(y2 - y1 ) ) + m_frame * 2 + 1;
189 int8u* buffer =
new int8u[width * height];
193 std::memset(buffer ,255 ,width * height );
197 rb.attach(buffer ,width ,height ,width );
211 ras.add_path(trans );
215 float* image =
new float[width * height];
219 for (
int y = 0, l = 0; y < height; y++ )
221 for (
int x = 0; x < width; x++, l++ )
244 float* spanf =
new float[length];
245 float* spang =
new float[length + 1];
246 float* spanr =
new float[length];
247 int* spann =
new int[length];
249 if ((spanf) && (spang) && (spanr) && (spann))
252 for (
int x = 0; x < width; x++ )
254 for (
int y = 0; y < height; y++ )
256 spanf[y] = image[y * width + x];
260 dt(spanf ,spang ,spanr ,spann ,height );
262 for (
int y = 0; y < height; y++ )
264 image[y * width + x] = spanr[y];
269 for (
int y = 0; y < height; y++ )
271 for (
int x = 0; x < width; x++ )
273 spanf[x] = image[y * width + x];
277 dt(spanf ,spang ,spanr ,spann ,width );
279 for (
int x = 0; x < width; x++ )
281 image[y * width + x] = spanr[x];
286 float min = std::sqrt(image[0] );
289 for (
int y = 0, l = 0; y < height; y++ )
291 for (
int x = 0; x < width; x++, l++ )
293 image[l] = std::sqrt(image[l]);
311 std::memset(buffer ,0 ,width * height );
315 float scale = 255 / (max - min );
317 for (
int y = 0, l = 0; y < height; y++ )
319 for (
int x = 0; x < width; x++ ,l++ )
321 buffer[l] = int8u(
int((image[l] - min ) * scale ));
341 if (spanf) {
delete [] spanf; }
342 if (spang) {
delete [] spang; }
343 if (spanr) {
delete [] spanr; }
344 if (spann) {
delete [] spann; }