summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xamiga/gui.c105
-rw-r--r--amiga/options.h5
-rwxr-xr-xamiga/plotters.c146
-rwxr-xr-xamiga/plotters.h2
4 files changed, 155 insertions, 103 deletions
diff --git a/amiga/gui.c b/amiga/gui.c
index 35fac8345..f95951e57 100755
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -165,6 +165,8 @@ void ami_get_vscroll_pos(struct gui_window_2 *gwin, ULONG *ys);
ULONG ami_set_border_gadget_balance(struct gui_window_2 *gwin);
ULONG ami_get_border_gadget_balance(struct gui_window_2 *gwin, ULONG *size1, ULONG *size2);
void ami_try_quit(void);
+void ami_do_redraw_limits(struct gui_window *g, struct browser_window *bw,
+ int x0, int y0, int x1, int y1);
STRPTR ami_locale_langs(void)
{
@@ -2852,9 +2854,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
glob = &browserglob;
if(locked_screen) UnlockPubScreen(NULL,scrn);
-
- //if (search_web_ico() == NULL)
- search_web_retrieve_ico(false);
+ search_web_retrieve_ico(false);
return gwin;
}
@@ -3097,6 +3097,8 @@ void ami_do_redraw_limits(struct gui_window *g, struct browser_window *bw,
ULONG cur_tab = 0;
ULONG sx, sy;
struct rect clip;
+ struct RastPort *temprp;
+ int posx, posy;
if(!g) return;
if(browser_window_redraw_ready(bw) == false) return;
@@ -3121,29 +3123,47 @@ void ami_do_redraw_limits(struct gui_window *g, struct browser_window *bw,
xoffset=bbox->Left;
yoffset=bbox->Top;
- plot=amiplot;
- glob = &browserglob;
-
if((y1<sy) || (y0>sy+height)) return;
if((x1<sx) || (x0>sx+width)) return;
if((x0-(int)sx)<0) x0 = sx;
if((y0-(int)sy)<0) y0 = sy;
+ /* Check this - xoffset/yoffset are window-relative, not bitmap-relative */
if((x1-x0)+(xoffset+x0-sx)>(width)) x1 = (width-(x0-sx)+x0);
if((y1-y0)+(yoffset+y0-sy)>(height)) y1 = (height-(y0-sy)+y0);
+ plot = amiplot;
+ glob = &browserglob;
glob->scale = bw->scale;
- clip.x0 = (x0 - sx);
- clip.y0 = (y0 - sy);
- clip.x1 = (x1 - sx);
- clip.y1 = (y1 - sy);
+ if(option_direct_render == false)
+ {
+ clip.x0 = (x0 - sx);
+ clip.y0 = (y0 - sy);
+ clip.x1 = (x1 - sx);
+ clip.y1 = (y1 - sy);
+ posx = - sx;
+ posy = - sy;
+ }
+ else
+ {
+ temprp = browserglob.rp;
+ browserglob.rp = g->shared->win->RPort;
+ clip.x0 = (x0 - sx) + bbox->Left;
+ clip.y0 = (y0 - sy) + bbox->Top;
+ clip.x1 = (x1 - sx) + bbox->Left;
+ clip.y1 = (y1 - sy) + bbox->Top;
+ posx = bbox->Left - sx; /* wrong */
+ posy = bbox->Top - sy; /* wrong */
+ }
- if(browser_window_redraw(bw, -sx, -sy, &clip))
+ if(browser_window_redraw(bw, posx, posy, &clip))
{
ami_clearclipreg(&browserglob);
+ if(option_direct_render == false)
+ {
/* This is identical to the below, but for some reason doesn't blit anything.
* Probably some values are wrong and BltBitMapTags is fussier.
@@ -3169,6 +3189,11 @@ void ami_do_redraw_limits(struct gui_window *g, struct browser_window *bw,
(x1 - x0) * g->shared->bw->scale,
(y1 - y0) * g->shared->bw->scale,
0x0C0);
+ }
+ else
+ {
+ browserglob.rp = temprp;
+ }
}
current_redraw_browser = NULL;
@@ -3209,6 +3234,7 @@ void ami_do_redraw(struct gui_window_2 *g)
struct IBox *bbox;
ULONG oldh=g->oldh,oldv=g->oldv;
bool morescroll = false;
+ struct RastPort *temprp;
if(browser_window_redraw_ready(g->bw) == false) return;
@@ -3224,8 +3250,6 @@ void ami_do_redraw(struct gui_window_2 *g)
height=bbox->Height;
xoffset=bbox->Left;
yoffset=bbox->Top;
- plot = amiplot;
- glob = &browserglob;
if(g->bw->reformat_pending)
{
@@ -3287,28 +3311,49 @@ void ami_do_redraw(struct gui_window_2 *g)
{
struct rect clip;
- clip.x0 = 0;
- clip.y0 = 0;
- clip.x1 = width + hcurrent;
- clip.y1 = height + vcurrent;
-
+ plot = amiplot;
+ glob = &browserglob;
glob->scale = g->bw->scale;
- if(browser_window_redraw(g->bw, -hcurrent, -vcurrent, &clip))
+ if(option_direct_render == false)
+ {
+ clip.x0 = 0;
+ clip.y0 = 0;
+ clip.x1 = width + hcurrent;
+ clip.y1 = height + vcurrent;
+ }
+ else
+ {
+ temprp = browserglob.rp;
+ browserglob.rp = g->win->RPort;
+ clip.x0 = bbox->Left;
+ clip.y0 = bbox->Top;
+ clip.x1 = bbox->Left + bbox->Width;
+ clip.y1 = bbox->Top + bbox->Height;
+ }
+
+ if(browser_window_redraw(g->bw, clip.x0 - hcurrent, clip.y0 - vcurrent, &clip))
{
ami_clearclipreg(&browserglob);
- BltBitMapTags(BLITA_SrcType, BLITT_BITMAP,
- BLITA_Source, browserglob.bm,
- BLITA_SrcX, 0,
- BLITA_SrcY, 0,
- BLITA_DestType, BLITT_RASTPORT,
- BLITA_Dest, g->win->RPort,
- BLITA_DestX, bbox->Left,
- BLITA_DestY, bbox->Top,
- BLITA_Width, bbox->Width,
- BLITA_Height, bbox->Height,
- TAG_DONE);
+ if(option_direct_render == false)
+ {
+ BltBitMapTags(BLITA_SrcType, BLITT_BITMAP,
+ BLITA_Source, browserglob.bm,
+ BLITA_SrcX, 0,
+ BLITA_SrcY, 0,
+ BLITA_DestType, BLITT_RASTPORT,
+ BLITA_Dest, g->win->RPort,
+ BLITA_DestX, bbox->Left,
+ BLITA_DestY, bbox->Top,
+ BLITA_Width, bbox->Width,
+ BLITA_Height, bbox->Height,
+ TAG_DONE);
+ }
+ else
+ {
+ browserglob.rp = temprp;
+ }
}
}
diff --git a/amiga/options.h b/amiga/options.h
index 46928e7ad..086d45c11 100644
--- a/amiga/options.h
+++ b/amiga/options.h
@@ -64,6 +64,7 @@ extern int option_cookies_window_ypos;
extern int option_cookies_window_xsize;
extern int option_cookies_window_ysize;
extern int option_cairo_renderer;
+extern bool option_direct_render;
#define EXTRA_OPTION_DEFINE \
char *option_url_file = 0; \
@@ -110,6 +111,7 @@ int option_cookies_window_ypos = 0; \
int option_cookies_window_xsize = 0; \
int option_cookies_window_ysize = 0; \
int option_cairo_renderer = 1; \
+bool option_direct_render = false; \
#define EXTRA_OPTION_TABLE \
{ "url_file", OPTION_STRING, &option_url_file }, \
@@ -155,5 +157,6 @@ int option_cairo_renderer = 1; \
{ "cookies_window_ypos", OPTION_INTEGER, &option_cookies_window_ypos}, \
{ "cookies_window_xsize", OPTION_INTEGER, &option_cookies_window_xsize}, \
{ "cookies_window_ysize", OPTION_INTEGER, &option_cookies_window_ysize}, \
-{ "cairo_renderer", OPTION_INTEGER, &option_cairo_renderer},
+{ "cairo_renderer", OPTION_INTEGER, &option_cairo_renderer}, \
+{ "direct_render", OPTION_BOOL, &option_direct_render},
#endif
diff --git a/amiga/plotters.c b/amiga/plotters.c
index bb9ef5f73..9bdfbb295 100755
--- a/amiga/plotters.c
+++ b/amiga/plotters.c
@@ -130,33 +130,36 @@ void ami_init_layers(struct gui_globals *gg, ULONG width, ULONG height)
gg->tmprasbuf = AllocVec(width*height,MEMF_PRIVATE | MEMF_CLEAR);
gg->bm = p96AllocBitMap(width, height, 32,
- BMF_INTERLEAVED, friend, RGBFB_A8R8G8B8);
-
+ BMF_INTERLEAVED, friend, RGBFB_A8R8G8B8);
if(!gg->bm) warn_user("NoMemory","");
- InitRastPort(&gg->rp);
- gg->rp.BitMap = gg->bm;
+ gg->rp = AllocVec(sizeof(struct RastPort), MEMF_PRIVATE | MEMF_CLEAR);
+ if(!gg->rp) warn_user("NoMemory","");
+
+ InitRastPort(gg->rp);
+ gg->rp->BitMap = gg->bm;
- SetDrMd(&gg->rp,BGBACKFILL);
+ /* Is all this safe to do to an existing window RastPort? */
+ SetDrMd(gg->rp,BGBACKFILL);
- gg->rp.Layer = CreateUpfrontLayer(gg->layerinfo,gg->rp.BitMap,0,0,
+ gg->rp->Layer = CreateUpfrontLayer(gg->layerinfo,gg->rp->BitMap,0,0,
width-1, height-1, LAYERSIMPLE, NULL);
- InstallLayerHook(gg->rp.Layer,LAYERS_NOBACKFILL);
+ InstallLayerHook(gg->rp->Layer,LAYERS_NOBACKFILL);
- gg->rp.AreaInfo = AllocVec(sizeof(struct AreaInfo),MEMF_PRIVATE | MEMF_CLEAR);
+ gg->rp->AreaInfo = AllocVec(sizeof(struct AreaInfo),MEMF_PRIVATE | MEMF_CLEAR);
- if((!gg->areabuf) || (!gg->rp.AreaInfo)) warn_user("NoMemory","");
+ if((!gg->areabuf) || (!gg->rp->AreaInfo)) warn_user("NoMemory","");
- InitArea(gg->rp.AreaInfo,gg->areabuf,100/5);
- gg->rp.TmpRas = AllocVec(sizeof(struct TmpRas),MEMF_PRIVATE | MEMF_CLEAR);
+ InitArea(gg->rp->AreaInfo,gg->areabuf,100/5);
+ gg->rp->TmpRas = AllocVec(sizeof(struct TmpRas),MEMF_PRIVATE | MEMF_CLEAR);
- if((!gg->tmprasbuf) || (!gg->rp.TmpRas)) warn_user("NoMemory","");
+ if((!gg->tmprasbuf) || (!gg->rp->TmpRas)) warn_user("NoMemory","");
- InitTmpRas(gg->rp.TmpRas, gg->tmprasbuf, width*height);
+ InitTmpRas(gg->rp->TmpRas, gg->tmprasbuf, width*height);
#ifdef NS_AMIGA_CAIRO
- gg->surface = cairo_amigaos_surface_create(gg->rp.BitMap);
+ gg->surface = cairo_amigaos_surface_create(gg->rp->BitMap);
gg->cr = cairo_create(gg->surface);
#endif
}
@@ -167,21 +170,22 @@ void ami_free_layers(struct gui_globals *gg)
cairo_destroy(gg->cr);
cairo_surface_destroy(gg->surface);
#endif
- DeleteLayer(0,gg->rp.Layer);
- FreeVec(gg->rp.TmpRas);
- FreeVec(gg->rp.AreaInfo);
-
- DisposeLayerInfo(gg->layerinfo);
- p96FreeBitMap(gg->bm);
+ DeleteLayer(0,gg->rp->Layer);
+ FreeVec(gg->rp->TmpRas);
+ FreeVec(gg->rp->AreaInfo);
FreeVec(gg->tmprasbuf);
FreeVec(gg->areabuf);
+ DisposeLayerInfo(gg->layerinfo);
+
+ FreeVec(gg->rp);
+ p96FreeBitMap(gg->bm);
}
void ami_clearclipreg(struct gui_globals *gg)
{
struct Region *reg = NULL;
- reg = InstallClipRegion(gg->rp.Layer,NULL);
+ reg = InstallClipRegion(gg->rp->Layer,NULL);
if(reg) DisposeRegion(reg);
gg->rect.MinX = 0;
@@ -200,10 +204,10 @@ bool ami_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style)
if(option_cairo_renderer < 2)
{
- SetRPAttrs(&glob->rp, RPTAG_APenColor,
+ SetRPAttrs(glob->rp, RPTAG_APenColor,
p96EncodeColor(RGBFB_A8B8G8R8, style->fill_colour),
TAG_DONE);
- RectFill(&glob->rp, x0, y0, x1-1, y1-1);
+ RectFill(glob->rp, x0, y0, x1-1, y1-1);
}
else
{
@@ -222,37 +226,37 @@ bool ami_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style)
if (style->stroke_type != PLOT_OP_TYPE_NONE) {
if(option_cairo_renderer < 2)
{
- glob->rp.PenWidth = style->stroke_width;
- glob->rp.PenHeight = style->stroke_width;
+ glob->rp->PenWidth = style->stroke_width;
+ glob->rp->PenHeight = style->stroke_width;
switch (style->stroke_type) {
case PLOT_OP_TYPE_SOLID: /**< Solid colour */
default:
- glob->rp.LinePtrn = PATT_LINE;
+ glob->rp->LinePtrn = PATT_LINE;
break;
case PLOT_OP_TYPE_DOT: /**< Doted plot */
- glob->rp.LinePtrn = PATT_DOT;
+ glob->rp->LinePtrn = PATT_DOT;
break;
case PLOT_OP_TYPE_DASH: /**< dashed plot */
- glob->rp.LinePtrn = PATT_DASH;
+ glob->rp->LinePtrn = PATT_DASH;
break;
}
- SetRPAttrs(&glob->rp,
+ SetRPAttrs(glob->rp,
RPTAG_APenColor,
p96EncodeColor(RGBFB_A8B8G8R8, style->stroke_colour),
TAG_DONE);
- Move(&glob->rp, x0,y0);
- Draw(&glob->rp, x1, y0);
- Draw(&glob->rp, x1, y1);
- Draw(&glob->rp, x0, y1);
- Draw(&glob->rp, x0, y0);
-
- glob->rp.PenWidth = 1;
- glob->rp.PenHeight = 1;
- glob->rp.LinePtrn = PATT_LINE;
+ Move(glob->rp, x0,y0);
+ Draw(glob->rp, x1, y0);
+ Draw(glob->rp, x1, y1);
+ Draw(glob->rp, x0, y1);
+ Draw(glob->rp, x0, y0);
+
+ glob->rp->PenWidth = 1;
+ glob->rp->PenHeight = 1;
+ glob->rp->LinePtrn = PATT_LINE;
}
else
{
@@ -295,34 +299,34 @@ bool ami_line(int x0, int y0, int x1, int y1, const plot_style_t *style)
if(option_cairo_renderer < 2)
{
- glob->rp.PenWidth = style->stroke_width;
- glob->rp.PenHeight = style->stroke_width;
+ glob->rp->PenWidth = style->stroke_width;
+ glob->rp->PenHeight = style->stroke_width;
switch (style->stroke_type) {
case PLOT_OP_TYPE_SOLID: /**< Solid colour */
default:
- glob->rp.LinePtrn = PATT_LINE;
+ glob->rp->LinePtrn = PATT_LINE;
break;
case PLOT_OP_TYPE_DOT: /**< Doted plot */
- glob->rp.LinePtrn = PATT_DOT;
+ glob->rp->LinePtrn = PATT_DOT;
break;
case PLOT_OP_TYPE_DASH: /**< dashed plot */
- glob->rp.LinePtrn = PATT_DASH;
+ glob->rp->LinePtrn = PATT_DASH;
break;
}
- SetRPAttrs(&glob->rp,
+ SetRPAttrs(glob->rp,
RPTAG_APenColor,
p96EncodeColor(RGBFB_A8B8G8R8, style->stroke_colour),
TAG_DONE);
- Move(&glob->rp,x0,y0);
- Draw(&glob->rp,x1,y1);
+ Move(glob->rp,x0,y0);
+ Draw(glob->rp,x1,y1);
- glob->rp.PenWidth = 1;
- glob->rp.PenHeight = 1;
- glob->rp.LinePtrn = PATT_LINE;
+ glob->rp->PenWidth = 1;
+ glob->rp->PenHeight = 1;
+ glob->rp->LinePtrn = PATT_LINE;
}
else
{
@@ -373,7 +377,7 @@ bool ami_polygon(const int *p, unsigned int n, const plot_style_t *style)
{
ULONG cx,cy;
- SetRPAttrs(&glob->rp,
+ SetRPAttrs(glob->rp,
RPTAG_APenColor,
p96EncodeColor(RGBFB_A8B8G8R8, style->fill_colour),
RPTAG_OPenColor,
@@ -381,15 +385,15 @@ bool ami_polygon(const int *p, unsigned int n, const plot_style_t *style)
// RPTAG_OPenColor,0xffffffff,
TAG_DONE);
- AreaMove(&glob->rp,p[0],p[1]);
+ AreaMove(glob->rp,p[0],p[1]);
for(k=1;k<n;k++)
{
- AreaDraw(&glob->rp,p[k*2],p[(k*2)+1]);
+ AreaDraw(glob->rp,p[k*2],p[(k*2)+1]);
}
- AreaEnd(&glob->rp);
- BNDRYOFF(&glob->rp);
+ AreaEnd(glob->rp);
+ BNDRYOFF(glob->rp);
}
else
{
@@ -418,7 +422,7 @@ bool ami_clip(const struct rect *clip)
struct Region *reg = NULL;
- if(glob->rp.Layer)
+ if(glob->rp->Layer)
{
reg = NewRegion();
@@ -429,7 +433,7 @@ bool ami_clip(const struct rect *clip)
OrRectRegion(reg,&glob->rect);
- reg = InstallClipRegion(glob->rp.Layer,reg);
+ reg = InstallClipRegion(glob->rp->Layer,reg);
if(reg) DisposeRegion(reg);
}
@@ -454,7 +458,7 @@ bool ami_text(int x, int y, const char *text, size_t length,
LOG(("[ami_plotter] Entered ami_text()"));
#endif
- ami_unicode_text(&glob->rp,text,length,fstyle,x,y);
+ ami_unicode_text(glob->rp,text,length,fstyle,x,y);
return true;
}
@@ -467,21 +471,21 @@ bool ami_disc(int x, int y, int radius, const plot_style_t *style)
if(option_cairo_renderer < 2)
{
if (style->fill_type != PLOT_OP_TYPE_NONE) {
- SetRPAttrs(&glob->rp,
+ SetRPAttrs(glob->rp,
RPTAG_APenColor,
p96EncodeColor(RGBFB_A8B8G8R8, style->fill_colour),
TAG_DONE);
- AreaCircle(&glob->rp,x,y,radius);
- AreaEnd(&glob->rp);
+ AreaCircle(glob->rp,x,y,radius);
+ AreaEnd(glob->rp);
}
if (style->stroke_type != PLOT_OP_TYPE_NONE) {
- SetRPAttrs(&glob->rp,
+ SetRPAttrs(glob->rp,
RPTAG_APenColor,
p96EncodeColor(RGBFB_A8B8G8R8, style->stroke_colour),
TAG_DONE);
- DrawEllipse(&glob->rp,x,y,radius,radius);
+ DrawEllipse(glob->rp,x,y,radius,radius);
}
}
else
@@ -536,12 +540,12 @@ bool ami_arc(int x, int y, int radius, int angle1, int angle2, const plot_style_
/* http://www.crbond.com/primitives.htm
CommonFuncsPPC.lha */
- SetRPAttrs(&glob->rp,
+ SetRPAttrs(glob->rp,
RPTAG_APenColor,
p96EncodeColor(RGBFB_A8B8G8R8, style->fill_colour),
TAG_DONE);
-// DrawArc(&glob->rp,x,y,(float)angle1,(float)angle2,radius);
+// DrawArc(glob->rp,x,y,(float)angle1,(float)angle2,radius);
}
return true;
}
@@ -562,7 +566,7 @@ static bool ami_bitmap(int x, int y, int width, int height, struct bitmap *bitma
(y > glob->rect.MaxY))
return true;
- tbm = ami_getcachenativebm(bitmap,width,height,glob->rp.BitMap);
+ tbm = ami_getcachenativebm(bitmap,width,height,glob->rp->BitMap);
if(!tbm) return true;
@@ -576,7 +580,7 @@ static bool ami_bitmap(int x, int y, int width, int height, struct bitmap *bitma
if(!bitmap->opaque)
comptype = COMPOSITE_Src_Over_Dest;
- CompositeTags(comptype,tbm,glob->rp.BitMap,
+ CompositeTags(comptype,tbm,glob->rp->BitMap,
COMPTAG_Flags,COMPFLAG_IgnoreDestAlpha,
COMPTAG_DestX,glob->rect.MinX,
COMPTAG_DestY,glob->rect.MinY,
@@ -593,7 +597,7 @@ static bool ami_bitmap(int x, int y, int width, int height, struct bitmap *bitma
BltBitMapTags(BLITA_Width,width,
BLITA_Height,height,
BLITA_Source,tbm,
- BLITA_Dest,&glob->rp,
+ BLITA_Dest,glob->rp,
BLITA_DestX,x,
BLITA_DestY,y,
BLITA_SrcType,BLITT_BITMAP,
@@ -635,7 +639,7 @@ bool ami_bitmap_tile(int x, int y, int width, int height,
if((bitmap->opaque == false) && (bitmap->width == 1) && (bitmap->height == 1))
return true;
- tbm = ami_getcachenativebm(bitmap,width,height,glob->rp.BitMap);
+ tbm = ami_getcachenativebm(bitmap,width,height,glob->rp->BitMap);
if(!tbm) return true;
@@ -697,11 +701,11 @@ bool ami_bitmap_tile(int x, int y, int width, int height,
bfh->h_Data = &bfbm;
}
- InstallLayerHook(glob->rp.Layer,bfh);
+ InstallLayerHook(glob->rp->Layer,bfh);
- EraseRect(&glob->rp,xm,ym,xf,yf);
+ EraseRect(glob->rp,xm,ym,xf,yf);
- InstallLayerHook(glob->rp.Layer,LAYERS_NOBACKFILL);
+ InstallLayerHook(glob->rp->Layer,LAYERS_NOBACKFILL);
if(bitmap->opaque) DeleteBackFillHook(bfh);
else FreeVec(bfh);
diff --git a/amiga/plotters.h b/amiga/plotters.h
index 7bd42af6f..f9d95b765 100755
--- a/amiga/plotters.h
+++ b/amiga/plotters.h
@@ -28,7 +28,7 @@
struct gui_globals
{
struct BitMap *bm;
- struct RastPort rp;
+ struct RastPort *rp;
struct Layer_Info *layerinfo;
APTR areabuf;
APTR tmprasbuf;