summaryrefslogtreecommitdiff
path: root/amiga/plotters.c
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2009-05-26 19:02:51 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2009-05-26 19:02:51 +0000
commit772bbec9e876156f579e377bfe863389ce4c0f44 (patch)
tree067212d4affb680b15caa993cb6ca29a39e988bd /amiga/plotters.c
parent6ac80f3e05a073ed3f37d187d37849481f7c82a9 (diff)
downloadnetsurf-772bbec9e876156f579e377bfe863389ce4c0f44.tar.gz
netsurf-772bbec9e876156f579e377bfe863389ce4c0f44.tar.bz2
Super whizzy fast shiny new tile plotter
Massively speeds up www.amigaimpact.org, slight improvement on other sites. Unfortunately alpha plotting on tiled btimaps is broken again (makes amigaworld.net difficult to read). May need to reimplement the old tile plotter for alpha bitmaps only, or write my own alpha-supporting backfill hook svn path=/trunk/netsurf/; revision=7550
Diffstat (limited to 'amiga/plotters.c')
-rwxr-xr-xamiga/plotters.c91
1 files changed, 44 insertions, 47 deletions
diff --git a/amiga/plotters.c b/amiga/plotters.c
index 1b13fa70a..357ddf26e 100755
--- a/amiga/plotters.c
+++ b/amiga/plotters.c
@@ -410,8 +410,9 @@ bool ami_bitmap_tile(int x, int y, int width, int height,
struct bitmap *bitmap, colour bg,
bool repeat_x, bool repeat_y, struct content *content)
{
- int xf,yf;
+ int xf,yf,xm,ym,oy,ox;
struct BitMap *tbm = NULL;
+ struct Hook *bfh = NULL;
if(!(repeat_x || repeat_y))
return ami_bitmap(x, y, width, height, bitmap, bg, content);
@@ -420,60 +421,56 @@ bool ami_bitmap_tile(int x, int y, int width, int height,
if(!tbm) return true;
+ ox = x;
+ oy = y;
+
/* get left most tile position */
- if (repeat_x)
- for (; x > glob.rect.MinX; x -= width)
- ;
+ for (; ox > 0; ox -= width)
+ ;
/* get top most tile position */
- if (repeat_y)
- for (; y > glob.rect.MinY; y -= height)
- ;
-
- /* tile down and across to extents */
- for (xf = x; xf < glob.rect.MaxX; xf += width) {
- for (yf = y; yf < glob.rect.MaxY; yf += height) {
+ for (; oy > 0; oy -= height)
+ ;
- assert(tbm);
+ if(ox<0) ox = -ox;
+ if(oy<0) oy = -oy;
- if(GfxBase->lib_Version >= 53) // AutoDoc says v52, but this function isn't in OS4.0, so checking for v53 (OS4.1)
- {
- uint32 comptype = COMPOSITE_Src;
- if(!bitmap->opaque) comptype = COMPOSITE_Src_Over_Dest;
+ if(repeat_x)
+ {
+ xf = glob.rect.MaxX;
+ xm = glob.rect.MinX;
+ }
+ else
+ {
+ xf = x + width;
+ xm = x;
+ }
- CompositeTags(comptype,tbm,currp->BitMap,
- COMPTAG_Flags,COMPFLAG_IgnoreDestAlpha,
- COMPTAG_DestX,glob.rect.MinX,
- COMPTAG_DestY,glob.rect.MinY,
- COMPTAG_DestWidth,glob.rect.MaxX - glob.rect.MinX + 1,
- COMPTAG_DestHeight,glob.rect.MaxY - glob.rect.MinY + 1,
- COMPTAG_SrcWidth,width,
- COMPTAG_SrcHeight,height,
- COMPTAG_OffsetX,xf,
- COMPTAG_OffsetY,yf,
- TAG_DONE);
- }
- else
- {
- BltBitMapTags(BLITA_Width,width,
- BLITA_Height,height,
- BLITA_Source,tbm,
- BLITA_Dest,currp,
- BLITA_DestX,xf,
- BLITA_DestY,yf,
- BLITA_SrcType,BLITT_BITMAP,
- BLITA_DestType,BLITT_RASTPORT,
-// BLITA_Mask,0xFF,
- BLITA_UseSrcAlpha,!bitmap->opaque,
- TAG_DONE);
- }
- if (!repeat_y)
- break;
- }
- if (!repeat_x)
- break;
+ if(repeat_y)
+ {
+ yf = glob.rect.MaxY;
+ ym = glob.rect.MinY;
+ }
+ else
+ {
+ yf = y + height;
+ ym = y;
}
+ bfh = CreateBackFillHook(BFHA_BitMap,tbm,
+ BFHA_Width,width,
+ BFHA_Height,height,
+ BFHA_OffsetX,ox,
+ BFHA_OffsetY,oy,
+ TAG_DONE);
+
+ InstallLayerHook(currp->Layer,bfh);
+
+ EraseRect(currp,xm,ym,xf,yf);
+
+ InstallLayerHook(currp->Layer,LAYERS_NOBACKFILL);
+ DeleteBackFillHook(bfh);
+
if(tbm != bitmap->nativebm)
{
p96FreeBitMap(tbm);