Repository URL to install this package:
Version:
2.0.10 ▾
|
//
// AggPas 2.4 RM3 pixel format definition file
//
{ make_pix_555 }
function make_pix_555(r ,g ,b : unsigned ) : int16u;
begin
result:=int16u(
((r and $F8 ) shl 7 ) or
((g and $F8 ) shl 2 ) or
(b shr 3 ) or
$8000 );
end;
{ make_color_555 }
procedure make_color_555(var color : aggclr; p : int16u_ptr );
begin
color.ConstrInt(
(p^ shr 7) and $F8 ,
(p^ shr 2) and $F8 ,
(p^ shl 3) and $F8 );
end;
{ blend_pix_555 }
procedure blend_pix_555(p : int16u_ptr; cr ,cg ,cb ,alpha : unsigned );
var
rgb : int16u;
r ,g ,b : int;
begin
rgb:=p^;
r:=(rgb shr 7) and $F8;
g:=(rgb shr 2) and $F8;
b:=(rgb shl 3) and $F8;
p^:=int16u(
((((cr - r ) * alpha + (r shl 8 ) ) shr 1 ) and $7C00 ) or
((((cg - g ) * alpha + (g shl 8 ) ) shr 6 ) and $03E0 ) or
(((cb - b ) * alpha + (b shl 8 ) ) shr 11 ) or $8000 );
end;
{ copy_or_blend_pix_555 }
procedure copy_or_blend_pix_555(p : int16u_ptr; c : aggclr_ptr; cover : unsigned );
var
alpha : unsigned;
begin
if c.a <> 0 then
begin
alpha:=(c.a * (cover + 1 ) ) shr 8;
if alpha = base_mask then
p^:=make_pix_555(c.r ,c.g ,c.b )
else
blend_pix_555(p ,c.r ,c.g ,c.b ,alpha );
end;
end;
{ rgb555_copy_pixel }
procedure rgb555_copy_pixel(this : pixel_formats_ptr; x ,y : int; c : aggclr_ptr );
begin
int16u_ptr(ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) )^:=make_pix_555(c.r ,c.g ,c.b );
end;
{ rgb555_blend_pixel }
procedure rgb555_blend_pixel(this : pixel_formats_ptr; x ,y : int; c : aggclr_ptr; cover : int8u );
begin
copy_or_blend_pix_555(int16u_ptr(ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) ) ,c ,cover );
end;
{ rgb555_pixel }
function rgb555_pixel(this : pixel_formats_ptr; x ,y : int ) : aggclr;
begin
make_color_555(
result ,
int16u_ptr(ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) ) );
end;
{ rgb555_copy_hline }
procedure rgb555_copy_hline(this : pixel_formats_ptr; x ,y : int; len : unsigned; c : aggclr_ptr );
var
p : int16u_ptr;
v : int16u;
begin
p:=int16u_ptr (ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) );
v:=make_pix_555(c.r ,c.g ,c.b );
repeat
p^:=v;
inc(ptrcomp(p ) ,sizeof(int16u ) );
dec(len );
until len = 0;
end;
{ rgb555_copy_vline }
procedure rgb555_copy_vline(this : pixel_formats_ptr; x ,y : int; len : unsigned; c : aggclr_ptr );
var
p : int16u_ptr;
v : int16u;
begin
p:=int16u_ptr (ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) );
v:=make_pix_555(c.r ,c.g ,c.b );
repeat
p^:=v;
p :=int16u_ptr(this.m_rbuf.next_row(int8u_ptr(p ) ) );
dec(len );
until len = 0;
end;
{ rgb555_blend_hline }
procedure rgb555_blend_hline(this : pixel_formats_ptr; x ,y : int; len : unsigned; c : aggclr_ptr; cover : int8u );
var
p : int16u_ptr;
v : int16u;
alpha : unsigned;
begin
if c.a <> 0 then
begin
p:=int16u_ptr(ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) );
alpha:=(c.a * (cover + 1 ) ) shr 8;
if alpha = base_mask then
begin
v:=make_pix_555(c.r ,c.g ,c.b );
repeat
p^:=v;
inc(ptrcomp(p ) ,sizeof(int16u ) );
dec(len );
until len = 0;
end
else
repeat
blend_pix_555(p ,c.r ,c.g ,c.b ,alpha );
inc(ptrcomp(p ) ,sizeof(int16u ) );
dec(len );
until len = 0;
end;
end;
{ rgb555_blend_vline }
procedure rgb555_blend_vline(this : pixel_formats_ptr; x ,y : int; len : unsigned; c : aggclr_ptr; cover : int8u );
var
p : int16u_ptr;
v : int16u;
alpha : unsigned;
begin
if c.a <> 0 then
begin
p:=int16u_ptr(ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) );
alpha:=(c.a * (cover + 1 ) ) shr 8;
if alpha = base_mask then
begin
v:=make_pix_555(c.r ,c.g ,c.b );
repeat
p^:=v;
p :=int16u_ptr(this.m_rbuf.next_row(int8u_ptr(p ) ) );
dec(len );
until len = 0;
end
else
repeat
blend_pix_555(p ,c.r ,c.g ,c.b ,alpha );
p:=int16u_ptr(this.m_rbuf.next_row(int8u_ptr(p ) ) );
dec(len );
until len = 0;
end;
end;
{ rgb555_blend_solid_hspan }
procedure rgb555_blend_solid_hspan(this : pixel_formats_ptr; x ,y : int; len : unsigned; c : aggclr_ptr; covers : int8u_ptr );
var
p : int16u_ptr;
begin
p:=int16u_ptr(ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) );
repeat
copy_or_blend_pix_555(p ,c ,covers^ );
inc(ptrcomp(covers ) );
inc(ptrcomp(p ) ,sizeof(int16u ) );
dec(len );
until len = 0;
end;
{ rgb555_blend_solid_vspan }
procedure rgb555_blend_solid_vspan(this : pixel_formats_ptr; x ,y : int; len : unsigned; c : aggclr_ptr; covers : int8u_ptr );
var
p : int16u_ptr;
begin
p:=int16u_ptr(ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) );
repeat
copy_or_blend_pix_555(p ,c ,covers^ );
inc(ptrcomp(covers ) );
p:=int16u_ptr(this.m_rbuf.next_row(int8u_ptr(p ) ) );
dec(len );
until len = 0;
end;
{ rgb555_blend_color_hspan }
procedure rgb555_blend_color_hspan(this : pixel_formats_ptr; x ,y : int; len : unsigned; colors : aggclr_ptr; covers : int8u_ptr; cover : int8u );
var
p : int16u_ptr;
begin
p:=int16u_ptr(ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) );
repeat
if covers <> NIL then
begin
copy_or_blend_pix_555(p ,colors ,covers^ );
inc(ptrcomp(covers ) ,sizeof(int8u ) );
end
else
copy_or_blend_pix_555(p ,colors ,cover );
inc(ptrcomp(p ) ,sizeof(int16u ) );
inc(ptrcomp(colors ) ,sizeof(aggclr ) );
dec(len );
until len = 0;
end;
{ rgb555_blend_color_vspan }
procedure rgb555_blend_color_vspan(this : pixel_formats_ptr; x ,y : int; len : unsigned; colors : aggclr_ptr; covers : int8u_ptr; cover : int8u );
var
p : int16u_ptr;
begin
p:=int16u_ptr(ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) );
repeat
if covers <> NIL then
begin
copy_or_blend_pix_555(p ,colors ,covers^ );
inc(ptrcomp(covers ) ,sizeof(int8u ) );
end
else
copy_or_blend_pix_555(p ,colors ,cover );
p:=int16u_ptr(this.m_rbuf.next_row(int8u_ptr(p ) ) );
inc(ptrcomp(colors ) ,sizeof(aggclr ) );
dec(len );
until len = 0;
end;
{ rgb555_copy_from }
procedure rgb555_copy_from(this : pixel_formats_ptr; from : rendering_buffer_ptr; xdst ,ydst ,xsrc ,ysrc : int; len : unsigned );
begin
move(
int16u_ptr(ptrcomp(from.row(ysrc ) ) + xsrc * sizeof(int16u ) )^ ,
int16u_ptr(ptrcomp(this.m_rbuf.row(ydst ) ) + xdst * sizeof(int16 ) )^ ,
len * sizeof(int16u ) );
end;
{ rgb555_blend_from }
procedure rgb555_blend_from(this : pixel_formats_ptr; from : pixel_formats_ptr; psrc_ : int8u_ptr; xdst ,ydst ,xsrc ,ysrc : int; len : unsigned; cover : int8u );
var
psrc : int8u_ptr;
pdst : int16u_ptr;
alpha : unsigned;
begin
psrc:=psrc_;
pdst:=int16u_ptr(ptrcomp(this.m_rbuf.row(ydst ) ) + xdst * sizeof(int16u ) );
repeat
alpha:=int8u_ptr(ptrcomp(psrc ) + from.m_order.A )^;
if alpha <> 0 then
if (alpha = base_mask ) and
(cover = 255 ) then
pdst^:=make_pix_555(
int8u_ptr(ptrcomp(psrc ) + from.m_order.R )^ ,
int8u_ptr(ptrcomp(psrc ) + from.m_order.G )^ ,
int8u_ptr(ptrcomp(psrc ) + from.m_order.B )^ )
else
blend_pix_555(
pdst ,
int8u_ptr(ptrcomp(psrc ) + from.m_order.R )^ ,
int8u_ptr(ptrcomp(psrc ) + from.m_order.G )^ ,
int8u_ptr(ptrcomp(psrc ) + from.m_order.B )^ ,
alpha );
inc(ptrcomp(psrc ) ,4 );
inc(ptrcomp(pdst ) ,sizeof(int16u ) );
dec(len );
until len = 0;
end;
{ rgb555_copy_color_hspan }
procedure rgb555_copy_color_hspan(this : pixel_formats_ptr; x ,y : int; len : unsigned; colors : aggclr_ptr );
var
p : int16u_ptr;
begin
p:=int16u_ptr(ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) );
repeat
p^:=make_pix_555(colors.r ,colors.g ,colors.b );
inc(ptrcomp(p ) ,sizeof(int16u ) );
inc(ptrcomp(colors ) ,sizeof(aggclr ) );
dec(len );
until len = 0;
end;
{ rgb555_copy_color_vspan }
procedure rgb555_copy_color_vspan(this : pixel_formats_ptr; x ,y : int; len : unsigned; colors : aggclr_ptr );
var
p : int16u_ptr;
begin
p:=int16u_ptr(ptrcomp(this.m_rbuf.row(y ) ) + x * sizeof(int16u ) );
repeat
p^:=make_pix_555(colors.r ,colors.g ,colors.b );
p :=int16u_ptr(this.m_rbuf.next_row(int8u_ptr(p ) ) );
inc(ptrcomp(colors ) ,sizeof(aggclr ) );
dec(len );
until len = 0;
end;
{ rgb555_blend_from_color }
procedure rgb555_blend_from_color(this : pixel_formats_ptr; from : pixel_formats_ptr; color : aggclr_ptr; xdst ,ydst ,xsrc ,ysrc : int; len : unsigned; cover : int8u );
var
ppsz : unsigned;
psrc : int8u_ptr;
pdst : int16u_ptr;
begin
ppsz:=from._pix_width;
psrc:=from.row_ptr(ysrc );
if psrc <> NIL then
begin
pdst:=int16u_ptr(ptrcomp(this.m_rbuf.row_xy(xdst ,ydst ,len ) ) + xdst * sizeof(int16u ) );
repeat
blend_pix_555(pdst ,color.r ,color.g ,color.b ,shr_int32(psrc^ * cover + base_mask ,base_shift ) );
inc(ptrcomp(psrc ) ,ppsz );
inc(ptrcomp(pdst ) ,sizeof(int16u ) );
dec(len );
until len = 0;
end;
end;
{ rgb555_blend_from_lut }
procedure rgb555_blend_from_lut(this : pixel_formats_ptr; from : pixel_formats_ptr; color_lut : aggclr_ptr; xdst ,ydst ,xsrc ,ysrc : int; len : unsigned; cover : int8u );
var
ppsz : unsigned;
psrc : int8u_ptr;
pdst : int16u_ptr;
color : aggclr_ptr;
begin
ppsz:=from._pix_width;
psrc:=from.row_ptr(ysrc );
if psrc <> NIL then
begin
pdst:=int16u_ptr(ptrcomp(this.m_rbuf.row_xy(xdst ,ydst ,len ) ) + xdst * sizeof(int16u ) );
repeat
color:=aggclr_ptr(ptrcomp(color_lut ) + psrc^ * sizeof(aggclr ) );
blend_pix_555(pdst ,color.r ,color.g ,color.b ,shr_int32(psrc^ * cover + base_mask ,base_shift ) );
inc(ptrcomp(psrc ) ,ppsz );
inc(ptrcomp(pdst ) ,sizeof(int16u ) );
dec(len );
until len = 0;
end;
end;