lazarus/components/aggpas/src/agg_scanline_bin.pas
mattias 87711ee8b3 aggpas: undo 64bit changes
git-svn-id: trunk@21993 -
2009-10-03 15:33:56 +00:00

221 lines
4.4 KiB
ObjectPascal

//----------------------------------------------------------------------------
// Anti-Grain Geometry - Version 2.4 (Public License)
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Anti-Grain Geometry - Version 2.4 Release Milano 3 (AggPas 2.4 RM3)
// Pascal Port By: Milan Marusinec alias Milano
// milan@marusinec.sk
// http://www.aggpas.org
// Copyright (c) 2005-2006
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
//----------------------------------------------------------------------------
// Contact: mcseem@antigrain.com
// mcseemagg@yahoo.com
// http://www.antigrain.com
//
//----------------------------------------------------------------------------
//
// Class scanline_bin - binary scanline.
//
//----------------------------------------------------------------------------
//
// Adaptation for 32-bit screen coordinates (scanline32_bin) has been sponsored by
// Liberty Technology Systems, Inc., visit http://lib-sys.com
//
// Liberty Technology Systems, Inc. is the provider of
// PostScript and PDF technology for software developers.
//
// [Pascal Port History] -----------------------------------------------------
//
// 23.06.2006-Milano: ptrcomp adjustments
// 15.01.2006-Milano: Unit port establishment
//
{ agg_scanline_bin.pas }
unit
agg_scanline_bin ;
INTERFACE
{$I agg_mode.inc }
uses
agg_basics ,
agg_scanline ;
{ TYPES DEFINITION }
type
span_bin_ptr = ^span_bin;
span_bin = record
x ,
len : int16;
end;
//=============================================================scanline_bin
//
// This is binary scaline container which supports the interface
// used in the rasterizer::render(). See description of agg_scanline_u8
// for details.
//
//------------------------------------------------------------------------
scanline_bin = object(scanline )
m_max_len : unsigned;
m_last_x ,
m_y : int;
m_spans ,
m_cur_span : span_bin_ptr;
constructor Construct;
destructor Destruct;
procedure reset(min_x ,max_x : int ); virtual;
procedure reset_spans; virtual;
procedure finalize(y_ : int ); virtual;
procedure add_cell(x : int; cover : unsigned ); virtual;
procedure add_span(x : int; len ,cover : unsigned ); virtual;
function y : int; virtual;
function num_spans : unsigned; virtual;
function begin_ : pointer; virtual;
function sz_of_span : unsigned; virtual;
end;
{ GLOBAL PROCEDURES }
IMPLEMENTATION
{ LOCAL VARIABLES & CONSTANTS }
{ UNIT IMPLEMENTATION }
{ CONSTRUCT }
constructor scanline_bin.Construct;
begin
m_max_len:=0;
m_last_x :=$7FFFFFF0;
m_spans :=NIL;
m_cur_span:=NIL;
end;
{ DESTRUCT }
destructor scanline_bin.Destruct;
begin
agg_freemem(pointer(m_spans ) ,m_max_len * sizeof(span_bin ) );
end;
{ RESET }
procedure scanline_bin.reset;
var
max_len : unsigned;
begin
max_len:=max_x - min_x + 3;
if max_len > m_max_len then
begin
agg_freemem(pointer(m_spans ) ,m_max_len * sizeof(span_bin ) );
agg_getmem (pointer(m_spans ) ,max_len * sizeof(span_bin ) );
m_max_len:=max_len;
end;
m_last_x :=$7FFFFFF0;
m_cur_span:=m_spans;
end;
{ RESET_SPANS }
procedure scanline_bin.reset_spans;
begin
m_last_x :=$7FFFFFF0;
m_cur_span:=m_spans;
end;
{ FINALIZE }
procedure scanline_bin.finalize;
begin
m_y:=y_;
end;
{ ADD_CELL }
procedure scanline_bin.add_cell;
begin
if x = m_last_x + 1 then
inc(m_cur_span.len )
else
begin
inc(ptrcomp(m_cur_span ) ,sizeof(span_bin ) );
m_cur_span.x :=int16(x );
m_cur_span.len:=1;
end;
m_last_x:=x;
end;
{ ADD_SPAN }
procedure scanline_bin.add_span;
begin
if x = m_last_x + 1 then
m_cur_span.len:=int16(m_cur_span.len + len )
else
begin
inc(ptrcomp(m_cur_span ) ,sizeof(span_bin ) );
m_cur_span.x :=int16(x );
m_cur_span.len:=int16(len );
end;
m_last_x:=x + len - 1;
end;
{ Y }
function scanline_bin.y;
begin
result:=m_y
end;
{ NUM_SPANS }
function scanline_bin.num_spans;
begin
result:=(ptrcomp(m_cur_span ) - ptrcomp(m_spans ) ) div sizeof(span_bin );
end;
{ BEGIN_ }
function scanline_bin.begin_;
begin
result:=span_bin_ptr(ptrcomp(m_spans ) + sizeof(span_bin ) );
end;
{ SZ_OF_SPAN }
function scanline_bin.sz_of_span;
begin
result:=sizeof(span_bin );
end;
END.