#include <oop.h>
#include <oop-read.h>
+typedef struct PosnState PosnState;
+struct PosnState {
+ int x, y, width, height;
+ Pixmap pm;
+};
+
+typedef struct MaskState MaskState;
+struct MaskState {
+ int x, y, width, height;
+ GC gc;
+};
+
typedef struct SegmovfeatState SegmovfeatState;
struct SegmovfeatState {
SegmovfeatState *next;
- int invert, det, posn, x, y, width, height, redraw_needed;
- GC gc;
- Pixmap (*posns)[2/*i*/][2/*det*/];
+ int invert, det, posn, redraw_needed;
+ MaskState mask;
+ PosnState (*posns)[2/*i*/][2/*det*/];
+ /* posns[n_posns]=unknown if n_posns>1 */
};
oop_source *events;
static oop_source_sys *sys_events;
static Window w;
static int redraw_needed_count, expose_count;
+static Pixmap bg_pixmap;
static void diex(const char *fn, const char *w) __attribute__((noreturn));
static void diex(const char *fn, const char *w) {
fs= fs->next) {
if (fs->redraw_needed)
continue;
- if (!range_overlap(fs->x, fs->width,
+ if (!range_overlap(fs->mask.x, fs->mask.width,
ev->x, ev->width)) continue;
- if (!range_overlap(fs->y, fs->height,
+ if (!range_overlap(fs->mask.y, fs->mask.height,
ev->y, ev->height)) continue;
fs->redraw_needed= 1;
redraw_needed_count++;
}
static void redraw(SegmovfeatState *fs) {
- Pixmap src;
+ PosnState *src;
if (fs->redraw_needed) {
fs->redraw_needed= 0;
redraw_needed_count--;
}
if (fs->invert < 0) {
- XCALL( XFillRectangle, "redraw",
- (d,w, fs->gc,
- fs->x, fs->y,
- fs->width, fs->height) );
+ XCALL( XCopyArea, "redraw",
+ (d, bg_pixmap, w, fs->mask.gc,
+ fs->mask.x, fs->mask.y,
+ fs->mask.width, fs->mask.height,
+ fs->mask.x, fs->mask.y) );
} else {
- src= fs->posns[fs->posn][fs->invert][fs->det];
+ src= &fs->posns[fs->posn][fs->invert][fs->det];
XCALL( XCopyArea, "redraw",
- (d, src, w, fs->gc,
- 0,0, fs->width, fs->height,
- fs->x, fs->y) );
+ (d, src->pm, w, fs->mask.gc,
+ 0,0, src->width, src->height,
+ src->x, src->y) );
}
}
if (invert<0) badcmd(0,"off may not take movfeatpos");
ps_neednumber(&ps, &posn, 0, movfeat_d->n_posns-1, "movfeatpos");
} else {
- if (invert>=0 && movfeat_d->n_posns > 1) badcmd(0,"movfeatpos needed");
- posn= 0;
+ if (invert>=0 && movfeat_d->n_posns > 1) {
+ posn= movfeat_d->n_posns;
+ } else {
+ posn= 0;
+ }
}
ps_neednoargs(&ps);
oop_read *rd;
const char *arg;
- Pixmap bg_pixmap;
Pixmap mask;
XpmAttributes mattribs;
XWindowAttributes wattribs;
- XColor background_colour;
int segment_ix, movfeat_ix, posn, invert, det, oor;
SegmovfeatState *fs;
const PlanSegmentData *segment_d;
(d,w, (char**)ui_plan_data.background, &bg_pixmap,0,0) );
XCALL( XSetWindowBackgroundPixmap, 0, (d,w,bg_pixmap) );
- XCALL( XFreePixmap, "background", (d,bg_pixmap) );
-
- XCALL( XAllocNamedColor, "background",
- (d, wattribs.colormap, ui_plan_colour_off,
- &background_colour, &background_colour) );
state= mmalloc(sizeof(*state) * ui_plan_data.n_segments);
for (segment_ix= 0, segment_d= ui_plan_data.segments;
movfeat_ix++, movfeat_d++, fs++) {
fs->next= states_head; states_head= fs;
fs->invert= -1;
- fs->det= fs->posn= 0;
- fs->x= movfeat_d->x;
- fs->y= movfeat_d->y;
+ fs->det= 0;
+ fs->posn= movfeat_d->n_posns;
+ if (fs->posn==1) fs->posn= 0;
+ fs->mask.x= movfeat_d->mask.x;
+ fs->mask.y= movfeat_d->mask.y;
fs->redraw_needed= 0;
+
mattribs.valuemask= XpmDepth | XpmColorSymbols;
mattribs.depth= 1;
mattribs.colorsymbols= coloursymbols;
mattribs.numsymbols= sizeof(coloursymbols) / sizeof(*coloursymbols);
XPMCALL( XpmCreatePixmapFromData, "mask",
- (d,w, (char**)movfeat_d->off, &mask,0, &mattribs) );
- fs->width= mattribs.width;
- fs->height= mattribs.height;
+ (d,w, (char**)movfeat_d->mask.d, &mask,0, &mattribs) );
+ fs->mask.width= mattribs.width;
+ fs->mask.height= mattribs.height;
- gcv.clip_x_origin= fs->x;
- gcv.clip_y_origin= fs->y;
+ gcv.clip_x_origin= fs->mask.x;
+ gcv.clip_y_origin= fs->mask.y;
gcv.clip_mask= mask;
- gcv.foreground= background_colour.pixel;
- fs->gc= XCreateGC(d,w,
- GCClipXOrigin | GCClipYOrigin
- | GCClipMask | GCForeground,
- &gcv);
+ fs->mask.gc= XCreateGC(d,w,
+ GCClipXOrigin | GCClipYOrigin | GCClipMask,
+ &gcv);
XCALL( XFreePixmap, "mask", (d,mask) );
- fs->posns= mmalloc(sizeof(*fs->posns)*movfeat_d->n_posns);
- for (posn= 0; posn < movfeat_d->n_posns; posn++)
+ fs->posns= mmalloc(sizeof(*fs->posns)*(fs->posn+1));
+ for (posn= 0; posn <= fs->posn; posn++)
for (invert=0; invert<2; invert++)
for (det=0; det<2; det++) {
+ PosnState *ps= &fs->posns[posn][invert][det];
+ const PlanPixmapDataRef *ppdr= posn < movfeat_d->n_posns
+ ? &movfeat_d->posns[posn].on[invert][det]
+ : &movfeat_d->unknown[invert][det];
+ ps->x= ppdr->x;
+ ps->y= ppdr->y;
+ mattribs.valuemask= 0;
XPMCALL( XpmCreatePixmapFromData, "main",
(d,w,
- (char**)(movfeat_d->posns[posn].a[invert][det]),
- &fs->posns[posn][invert][det],
- 0,0) );
+ (char**)ppdr->d,
+ &ps->pm,
+ 0, &mattribs) );
+ ps->width= mattribs.width;
+ ps->height= mattribs.height;
}
}
}
};
}
+#---------- parse args ----------
+
+our $gvarname= 'ui_plan_data';
+
+die unless @ARGV;
+die if $ARGV[0] =~ m/^\-/;
+if ($ARGV[$#ARGV] =~ s/^\-g//) {
+ $gvarname= pop @ARGV;
+ $gvarname =~ s/\W/_/g;
+}
+
#---------- read segcmap ----------
our (%datum_numbits,%datum_basebit);
#---------- output ----------
+our ($backgd);
+
sub cmapdata_output_all () {
my ($cmapname, $stuff, $cmap, $sname, $pixchars);
sub xpmdata_output_all () {
my ($style, $namerhs, $xp, $row, $pp, $xy, $pixel);
my ($y, $cmap_data, $header_data, $cmapname);
+ $backgd= $xpmdata{'background'}{''};
foreach $style (sort keys %xpmdata) {
foreach $namerhs (sort keys %{ $xpmdata{$style} }) {
$xp= $xpmdata{$style}{$namerhs};
sub ppdr ($$$) {
my ($style,$cmap,$namerhs) = @_;
- my ($xpmd, $backgd);
+ my ($xpmd);
$xpmd= $xpmdata{$style}{$namerhs};
- $backgd= $xpmdata{'background'}{''};
defined $xpmd or die "$style $cmap $namerhs ?";
return sprintf("{ %d-%d,%d-%d, p_%s_%s }",
(map { $xpmd->{$_}{Min}, $backgd->{$_}{Min} } qw(X Y)),
}
oods('ui_plan_data',
- "const PlanData ui_plan_data= {\n".
- " $sz{X}, $sz{Y},\n".
+ "const PlanData $gvarname= {\n".
+ " $backgd->{X}{Max}-$backgd->{X}{Min},".
+ " $backgd->{Y}{Max}-$backgd->{Y}{Min},".
" p_background_,\n".
" ".scalar(@segnames).", segments\n".
"};\n");