/* blended color cycle */ static void ColorCycleBlend (TLN_Palette srcpalette, TLN_Palette dstpalette, struct Strip* strip, int t) { int c; int idx0, idx1; uint8_t *srcptr0, *srcptr1, *dstptr; int t0 = strip->t0; int t1 = strip->timer; int count = strip->count; int steps = strip->pos; /* map [t0 - t1] to [0 - 255] */ int f1 = lerp (t, t0,t1, 0,255); int f0 = 255 - f1; for (c=0; c<count; c++) { if (strip->dir) { idx0 = (c - steps + count) % count; idx1 = (c - steps - 1 + count) % count; } else { idx0 = (c + steps) % count; idx1 = (c + steps + 1) % count; } srcptr0 = GetPaletteData (srcpalette, strip->first + idx0); srcptr1 = GetPaletteData (srcpalette, strip->first + idx1); dstptr = GetPaletteData (dstpalette, strip->first + c); blendColors (srcptr0, srcptr1, dstptr, f0, f1); } }
/* regular color cycle */ static void ColorCycle (TLN_Palette srcpalette, TLN_Palette dstpalette, struct Strip* strip) { int c; uint32_t* srcptr = (uint32_t*)GetPaletteData (srcpalette, strip->first); uint32_t* dstptr = (uint32_t*)GetPaletteData (dstpalette, strip->first); int count = strip->count; int steps = strip->pos; if (strip->dir) { for (c=0; c<count; c++) dstptr[c] = srcptr[(c - steps + count) % count]; } else { for (c=0; c<count; c++) dstptr[c] = srcptr[(c + steps) % count]; } }
static void WimpButton( void ) { if ( iconbar && (e.data.mouse.window < 0) ) { if ( e.data.mouse.button.data.menu ) Menu_Show( &Menu_iconbar, e.data.mouse.pos.x, -1 ); else if ( e.data.mouse.button.data.select ) OpenMainWindow(); } else if ( e.data.mouse.window == palh && e.data.mouse.button.data.select ) { switch ( e.data.mouse.icon ) { case palicon_KEEP: case palicon_256: case palicon_216: case palicon_FILE: case palicon_OPTIMISE: DoPaletteRadio(); break; case palicon_OK: GetPaletteData(); /* fall through */ case palicon_CANCEL: Wimp_CloseWindow( palh ); palette_open = FALSE; break; } return; } else if ( e.data.mouse.window == spropth && e.data.mouse.button.data.select ) { switch ( e.data.mouse.icon ) { case spropticon_FORCENEW: DoSprOptRadio(); break; case spropticon_OK: GetSprOptData(); /* fall through */ case spropticon_CANCEL: Wimp_CloseWindow( spropth ); spropt_open = FALSE; break; } return; } else if ( e.data.mouse.window == wCFSI && e.data.mouse.button.data.select ) { switch ( e.data.mouse.icon ) { case cfsiicon_CFSI: Icon_SetShade( wCFSI, cfsiicon_OPTIONS, !Icon_GetSelect( wCFSI, cfsiicon_CFSI ) ); break; case cfsiicon_OK: GetCFSIData(); /* fall through */ case cfsiicon_CANCEL: Wimp_CloseWindow( wCFSI ); cfsi_open = FALSE; break; } return; } if ( e.data.mouse.window != wh ) return; if ( e.data.mouse.button.data.select ) { switch ( e.data.mouse.icon ) { case igicon_TRANS_FORCE: case igicon_TRANS_USE: case igicon_TRANS_NONE: Icon_SetShade( wh, igicon_TRANS_VALUE, !Icon_GetSelect( wh, igicon_TRANS_FORCE ) ); break; #if 0 /* fall through */ case igicon_INTERLACED: if ( !Icon_GetSelect( wh, igicon_TRANS_NONE ) && Icon_GetSelect( wh, igicon_INTERLACED ) ) Icon_SetSelect( wh, igicon_TRIM, TRUE ); break; #endif case igicon_DELAY_USE: Icon_SetShade( wh, igicon_DELAY, !Icon_GetSelect( wh, igicon_DELAY_USE ) ); break; case igicon_HELP_FILE: _kernel_oscli( "Filer_Run <InterGif$Dir>.!Help" ); break; case igicon_HELP_WEB: Internet_OpenURL( "http://utter.chaos.org.uk/~pdh/software/intergif.htm" ); break; case igicon_OUT_GIF: case igicon_OUT_SPRITE: { BOOL bSprite = Icon_GetSelect( wh, igicon_OUT_SPRITE ); strcpy( saveicon, bSprite ? "Sfile_ff9" : "Sfile_695" ); Wimp_SetIconState( wh, igicon_DRAGGABLE, 0, 0 ); Icon_SetShade( wh, igicon_INTERLACED, bSprite ); Icon_SetShade( wh, igicon_LOOP, bSprite ); Icon_SetShade( wh, igicon_DELAY, bSprite || !Icon_GetSelect( wh, igicon_DELAY_USE ) ); Icon_SetShade( wh, igicon_DELAY_USE, bSprite ); Icon_SetShade( wh, igicon_SPROPTIONS, !bSprite ); } break; case igicon_SAVE: SaveFile( savename ); break; case igicon_PALETTE: OpenPaletteWindow(); break; case igicon_SPROPTIONS: OpenSprOptWindow(); break; case igicon_CFSI: OpenCFSIWindow(); break; } } else if ( e.data.mouse.button.data.adjust ) { if ( e.data.mouse.icon == igicon_TRANS_FORCE ) Icon_SetShade( wh, igicon_TRANS_VALUE, !Icon_GetSelect( wh, igicon_TRANS_FORCE ) ); } else if ( e.data.mouse.button.data.dragselect ) { if ( e.data.mouse.icon == igicon_DRAGGABLE && *loadname ) { icon_block *pib = (icon_block*) ((&Template_intergif)+1); window_state ws; Wimp_GetWindowState( wh, &ws ); pib += igicon_DRAGGABLE; ws.openblock.screenrect.min.x += pib->workarearect.min.x; ws.openblock.screenrect.max.x = ws.openblock.screenrect.min.x + 68; ws.openblock.screenrect.max.y += pib->workarearect.max.y; ws.openblock.screenrect.min.y = ws.openblock.screenrect.max.y - 68; DragASprite_Start( 0xC5, (void*)1, saveicon+1, &ws.openblock.screenrect, NULL ); draggingfile = TRUE; } } }
static void SaveFile( char *filename ) { icon_block *pib = (icon_block*)((&Template_intergif)+1); char buffer[700]; /* two filenames and then some */ os_error *e; int next, oldnext, free, current; if (strchr( filename, ':' ) == NULL && strchr( filename, '.' ) == NULL ) { Error_Report2( 0, "To save, drag the icon to a directory display" ); return; } sprintf( buffer, "<InterGif$Dir>.intergif %s -desktop", loadname ); if ( Icon_GetSelect( wh, igicon_DELAY_USE ) ) { strcat( buffer, " -d " ); strcat( buffer, pib[igicon_DELAY].data.indirecttext.buffer ); } if ( Icon_GetSelect( wh, igicon_SPLIT ) ) strcat( buffer, " -split" ); if ( Icon_GetSelect( wh, igicon_OUT_SPRITE ) ) strcat( buffer, " -s" ); if ( Icon_GetSelect( wh, igicon_INTERLACED ) ) strcat( buffer, " -i" ); if ( Icon_GetSelect( wh, igicon_LOOP ) ) strcat( buffer, " -loop" ); if ( Icon_GetSelect( wh, igicon_TRIM ) ) strcat( buffer, " -trim" ); if ( Icon_GetSelect( wh, igicon_JOIN ) ) strcat( buffer, " -join" ); if ( !Icon_GetSelect( wh, igicon_TRANS_NONE ) ) { strcat( buffer, " -t " ); /* note extra space */ if ( Icon_GetSelect( wh, igicon_TRANS_FORCE ) ) strcat( buffer, pib[igicon_TRANS_VALUE].data.indirecttext.buffer ); } if ( palette_open ) GetPaletteData(); if ( palette_which == palicon_FILE && (!palettefile[0] ) ) { Error_Report2( 0, "Palette 'From file' chosen but no palette file supplied" ); return; } switch ( palette_which ) { case palicon_216: strcat( buffer, " -216" ); break; case palicon_256: strcat( buffer, " -256" ); break; case palicon_g16: strcat( buffer, " -g16" ); break; case palicon_g256: strcat( buffer, " -g256" ); break; case palicon_OPTIMISE: sprintf( buffer + strlen(buffer), " -best %d", palette_opt_colours ); break; case palicon_FILE: sprintf( buffer + strlen(buffer), " -pal %s", palettefile ); break; } if ( palette_keep_unused ) strcat( buffer, " -same" ); if ( palette_dither && (palette_which != palicon_KEEP) ) strcat( buffer, " -diffuse -zigzag" ); if ( spropt_open ) GetSprOptData(); if ( force_new ) { strcat( buffer, " -new" ); if (xdpi != 90) { sprintf( buffer + strlen(buffer), " -xdpi %d", xdpi ); } if (ydpi != 90) { sprintf( buffer + strlen(buffer), " -ydpi %d", ydpi ); } } if ( cfsi_open ) GetCFSIData(); if ( cfsi ) { strcat( buffer, " -c \"" ); strcat( buffer, cfsi_options ); strcat( buffer, "\"" ); } strcat( buffer, " -o " ); strcat( buffer, filename ); current = oldnext = free = -1; Wimp_SlotSize( ¤t, &oldnext, &free ); next = free - 4*1024; /* 64*1024; */ current = free = -1; Wimp_SlotSize( ¤t, &next, &free ); Hourglass_On(); e = Wimp_StartTask( buffer ); Hourglass_Off(); current = free = -1; Wimp_SlotSize( ¤t, &oldnext, &free ); if ( e ) Error_Report2( e->errnum, e->errmess ); else { if ( _kernel_getenv( "InterGif$Error", buffer, 700 ) ) Error_Report2( 0, "Internal error: error variable not set" ); else if ( *buffer ) Error_Report2( 0, buffer ); } }