mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-03 20:43:49 +02:00
440 lines
7.9 KiB
ObjectPascal
440 lines
7.9 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 renderer_mclip
|
|
//
|
|
// [Pascal Port History] -----------------------------------------------------
|
|
//
|
|
// 11.02.2006-Milano: Unit port establishment
|
|
//
|
|
{ agg_renderer_mclip.pas }
|
|
unit
|
|
agg_renderer_mclip ;
|
|
|
|
INTERFACE
|
|
|
|
{$I agg_mode.inc }
|
|
|
|
uses
|
|
agg_basics ,
|
|
agg_array ,
|
|
agg_color ,
|
|
agg_rendering_buffer ,
|
|
agg_renderer_base ,
|
|
agg_pixfmt ;
|
|
|
|
{ TYPES DEFINITION }
|
|
type
|
|
renderer_mclip = object(renderer_base )
|
|
m_clip : pod_deque;
|
|
m_curr_cb : unsigned;
|
|
m_bounds : rect;
|
|
|
|
constructor Construct(ren_ : pixel_formats_ptr );
|
|
destructor Destruct;
|
|
|
|
function bounding_clip_box : rect_ptr; virtual;
|
|
function bounding_xmin : int; virtual;
|
|
function bounding_ymin : int; virtual;
|
|
function bounding_xmax : int; virtual;
|
|
function bounding_ymax : int; virtual;
|
|
|
|
procedure first_clip_box; virtual;
|
|
function next_clip_box : boolean; virtual;
|
|
|
|
procedure reset_clipping(visibility : boolean ); virtual;
|
|
|
|
procedure add_clip_box(x1 ,y1 ,x2 ,y2 : int );
|
|
|
|
procedure copy_pixel (x ,y : int; c : aggclr_ptr ); virtual;
|
|
procedure blend_pixel(x ,y : int; c : aggclr_ptr; cover : int8u ); virtual;
|
|
function pixel (x ,y : int ) : aggclr; virtual;
|
|
|
|
procedure copy_hline(x1 ,y ,x2 : int; c : aggclr_ptr ); virtual;
|
|
procedure copy_vline(x ,y1 ,y2 : int; c : aggclr_ptr ); virtual;
|
|
|
|
procedure blend_hline(x1 ,y ,x2 : int; c : aggclr_ptr; cover : int8u ); virtual;
|
|
procedure blend_vline(x ,y1 ,y2 : int; c : aggclr_ptr; cover : int8u ); virtual;
|
|
|
|
procedure copy_bar (x1 ,y1 ,x2 ,y2 : int; c : aggclr_ptr ); virtual;
|
|
procedure blend_bar(x1 ,y1 ,x2 ,y2 : int; c : aggclr_ptr; cover : int8u ); virtual;
|
|
|
|
procedure blend_solid_hspan(x ,y ,len : int; c : aggclr_ptr; covers : int8u_ptr ); virtual;
|
|
procedure blend_solid_vspan(x ,y ,len : int; c : aggclr_ptr; covers : int8u_ptr ); virtual;
|
|
|
|
procedure copy_color_hspan (x ,y ,len : int; colors : aggclr_ptr ); virtual;
|
|
procedure blend_color_hspan(x ,y ,len : int; colors : aggclr_ptr; covers : int8u_ptr; cover : int8u = cover_full ); virtual;
|
|
procedure blend_color_vspan(x ,y ,len : int; colors : aggclr_ptr; covers : int8u_ptr; cover : int8u = cover_full ); virtual;
|
|
|
|
procedure copy_from(from : rendering_buffer_ptr; rc : rect_ptr = NIL; x_to : int = 0; y_to : int = 0 ); virtual;
|
|
|
|
end;
|
|
|
|
{ GLOBAL PROCEDURES }
|
|
|
|
|
|
IMPLEMENTATION
|
|
{ LOCAL VARIABLES & CONSTANTS }
|
|
{ UNIT IMPLEMENTATION }
|
|
{ CONSTRUCT }
|
|
constructor renderer_mclip.Construct;
|
|
begin
|
|
inherited Construct(ren_ );
|
|
|
|
m_clip.Construct (sizeof(rect ) ,4 );
|
|
m_bounds.Construct(_xmin ,_ymin ,_xmax ,_ymax );
|
|
|
|
m_curr_cb:=0;
|
|
|
|
end;
|
|
|
|
{ DESTRUCT }
|
|
destructor renderer_mclip.Destruct;
|
|
begin
|
|
m_clip.Destruct;
|
|
|
|
end;
|
|
|
|
{ BOUNDING_CLIP_BOX }
|
|
function renderer_mclip.bounding_clip_box;
|
|
begin
|
|
result:=@m_bounds;
|
|
|
|
end;
|
|
|
|
{ BOUNDING_XMIN }
|
|
function renderer_mclip.bounding_xmin;
|
|
begin
|
|
result:=m_bounds.x1;
|
|
|
|
end;
|
|
|
|
{ BOUNDING_YMIN }
|
|
function renderer_mclip.bounding_ymin;
|
|
begin
|
|
result:=m_bounds.y1;
|
|
|
|
end;
|
|
|
|
{ BOUNDING_XMAX }
|
|
function renderer_mclip.bounding_xmax;
|
|
begin
|
|
result:=m_bounds.x2;
|
|
|
|
end;
|
|
|
|
{ BOUNDING_YMAX }
|
|
function renderer_mclip.bounding_ymax;
|
|
begin
|
|
result:=m_bounds.y2;
|
|
|
|
end;
|
|
|
|
{ FIRST_CLIP_BOX }
|
|
procedure renderer_mclip.first_clip_box;
|
|
var
|
|
cb : rect_ptr;
|
|
|
|
begin
|
|
m_curr_cb:=0;
|
|
|
|
if m_clip.size <> 0 then
|
|
begin
|
|
cb:=m_clip.array_operator(0 );
|
|
|
|
clip_box_naked(cb.x1 ,cb.y1 ,cb.x2 ,cb.y2 );
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
{ NEXT_CLIP_BOX }
|
|
function renderer_mclip.next_clip_box;
|
|
var
|
|
cb : rect_ptr;
|
|
|
|
begin
|
|
inc(m_curr_cb );
|
|
|
|
if m_curr_cb < m_clip.size then
|
|
begin
|
|
cb:=m_clip.array_operator(m_curr_cb );
|
|
|
|
clip_box_naked(cb.x1 ,cb.y1 ,cb.x2 ,cb.y2 );
|
|
|
|
result:=true;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
result:=false;
|
|
|
|
end;
|
|
|
|
{ RESET_CLIPPING }
|
|
procedure renderer_mclip.reset_clipping;
|
|
begin
|
|
inherited reset_clipping(visibility );
|
|
|
|
m_clip.remove_all;
|
|
|
|
m_curr_cb:=0;
|
|
|
|
m_bounds.Construct(_clip_box );
|
|
|
|
end;
|
|
|
|
{ ADD_CLIP_BOX }
|
|
procedure renderer_mclip.add_clip_box;
|
|
var
|
|
cb ,
|
|
rc : rect;
|
|
|
|
begin
|
|
cb.Construct(x1 ,y1 ,x2 ,y2 );
|
|
cb.normalize;
|
|
rc.Construct(0 ,0 ,width - 1 ,height - 1 );
|
|
|
|
if cb.clip(@rc ) then
|
|
begin
|
|
m_clip.add(@cb );
|
|
|
|
if cb.x1 < m_bounds.x1 then
|
|
m_bounds.x1:=cb.x1;
|
|
|
|
if cb.y1 < m_bounds.y1 then
|
|
m_bounds.y1:=cb.y1;
|
|
|
|
if cb.x2 > m_bounds.x2 then
|
|
m_bounds.x2:=cb.x2;
|
|
|
|
if cb.y2 > m_bounds.y2 then
|
|
m_bounds.y2:=cb.y2;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
{ COPY_PIXEL }
|
|
procedure renderer_mclip.copy_pixel;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
if inbox(x ,y ) then
|
|
begin
|
|
m_ren.copy_pixel(m_ren ,x ,y ,c );
|
|
|
|
break;
|
|
|
|
end;
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ BLEND_PIXEL }
|
|
procedure renderer_mclip.blend_pixel;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
if inbox(x ,y ) then
|
|
begin
|
|
m_ren.blend_pixel(m_ren ,x ,y ,c ,cover );
|
|
|
|
break;
|
|
|
|
end;
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ PIXEL }
|
|
function renderer_mclip.pixel;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
if inbox(x ,y ) then
|
|
begin
|
|
result:=m_ren.pixel(m_ren ,x ,y );
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
until not next_clip_box;
|
|
|
|
result.clear;
|
|
|
|
end;
|
|
|
|
{ COPY_HLINE }
|
|
procedure renderer_mclip.copy_hline;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited copy_hline(x1 ,y ,x2 ,c );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ COPY_VLINE }
|
|
procedure renderer_mclip.copy_vline;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited copy_vline(x ,y1 ,y2 ,c );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ BLEND_HLINE }
|
|
procedure renderer_mclip.blend_hline;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited blend_hline(x1 ,y ,x2 ,c ,cover );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ BLEND_VLINE }
|
|
procedure renderer_mclip.blend_vline;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited blend_vline(x ,y1 ,y2 ,c ,cover );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ COPY_BAR }
|
|
procedure renderer_mclip.copy_bar;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited copy_bar(x1 ,y1 ,x2 ,y2 ,c );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ BLEND_BAR }
|
|
procedure renderer_mclip.blend_bar;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited blend_bar(x1 ,y1 ,x2 ,y2 ,c ,cover );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ BLEND_SOLID_HSPAN }
|
|
procedure renderer_mclip.blend_solid_hspan;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited blend_solid_hspan(x ,y ,len ,c ,covers );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ BLEND_SOLID_VSPAN }
|
|
procedure renderer_mclip.blend_solid_vspan;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited blend_solid_vspan(x ,y ,len ,c ,covers );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ COPY_COLOR_HSPAN }
|
|
procedure renderer_mclip.copy_color_hspan;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited copy_color_hspan(x ,y ,len ,colors );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ BLEND_COLOR_HSPAN }
|
|
procedure renderer_mclip.blend_color_hspan;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited blend_color_hspan(x ,y ,len ,colors ,covers ,cover );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ BLEND_COLOR_VSPAN }
|
|
procedure renderer_mclip.blend_color_vspan;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited blend_color_vspan(x ,y ,len ,colors ,covers ,cover );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
{ COPY_FROM }
|
|
procedure renderer_mclip.copy_from;
|
|
begin
|
|
first_clip_box;
|
|
|
|
repeat
|
|
inherited copy_from(from ,rc ,x_to ,y_to );
|
|
|
|
until not next_clip_box;
|
|
|
|
end;
|
|
|
|
END.
|
|
|