From 706686f267e11a9a9f55f496a5e3b951c119d5d9 Mon Sep 17 00:00:00 2001 From: clouddan4 <45918423+clouddan4@users.noreply.github.com> Date: Mon, 11 Mar 2019 08:16:01 +0900 Subject: [PATCH] Add files via upload --- AGRAPH2.PAS | 889 ++++++++++++++++++++++++---------------------- AMIGA2.PAS | 11 +- FMMOUSE.PAS | 50 +-- README.md | 3 +- UEMSOP.PAS | 394 ++++++++++---------- UPICOP.PAS | 360 ++++++++++--------- memo_ATS_TODO.txt | 719 +++++++++++++++++++++++++++++-------- submenu.png | Bin 0 -> 32883 bytes 8 files changed, 1436 insertions(+), 990 deletions(-) create mode 100644 submenu.png diff --git a/AGRAPH2.PAS b/AGRAPH2.PAS index 61eff0a..6c6535b 100644 --- a/AGRAPH2.PAS +++ b/AGRAPH2.PAS @@ -45,10 +45,23 @@ type dithtype = array[1..4] of integer; const Dither: array[1..4] of dithtype = ( - (10, 4, 14, 0), - (14, 5, 1, 8), - ( 2, 9, 13, 7), - ( 6, 11, 3, 12)); + ( 0, 8, 2, 10), + (12, 4, 14, 6), + ( 3, 11, 1, 9), + (15, 7, 13, 5)); + + Dither2: array[1..4] of dithtype = ( + (11, 4, 6, 9), + (12, 0, 2, 14), + ( 7, 8, 10, 5), + ( 3, 15, 13, 1)); + + Dither3: array[1..4] of dithtype = ( + ( 6, 7, 8, 9), + ( 5, 0, 1, 10), + ( 4, 3, 2, 11), + (15, 14, 13, 12)); + var YPOSTBL : array [0..408] of word; XPOSTBL : array [0..639] of byte; @@ -63,26 +76,6 @@ var vramb : ^vramT; Stype : smoothtype; -(*-- child communicate ------------------------*) - -type - PenPatternT = array[0..15] of word; - TilePatternT= array[0..3,0..15] of word; - TonePatternT= array[0..15] of word; - - SystemWorkT = record - ID : Array[0..15]of char; - PenPattern : array[0..15]of PenPatternT; - TonePattern : array[0..15]of TonePatternT; - TilePattern : array[0..15]of TilePatternT; - Mask : array[0..15]of Boolean; - Pen : Byte; - Tone : Byte; - Tile : Byte; - IsMask : boolean; - IsUnder : boolean; - end; - (*-- palette -----------------------------*) type mcbT = record @@ -96,20 +89,10 @@ type PaletteAtom = array[RGBT] of byte; PaletteT = array[0..15] of PaletteAtom; - StayPalID_T = array [0..9] of char; - StayPalT = record - id : StayPalID_T; - tone : byte; - extflag : byte; - MpsWork : ^SystemWorkT; - palette : PaletteT; - end; var - RpalP : ^StayPalT; palet : array[0..15,0..2] of byte; underpalette,palettedata : PaletteT; const - Spal_ID : StayPalID_T = 'pal98 grb'+char(0); SystemPalette : PaletteT = ( ( 0, 0, 0),( 0, 0,12),( 0,12, 0),( 0,12,12), (12, 0, 0),(12, 0,12),(12,12, 0),( 7, 7, 7), @@ -117,15 +100,17 @@ const (15, 0, 0),(15, 0,15),(15,15, 0),(15,15,15) ); (*--EMS-----------------------------------*) -const EMSvector = $67; {EMM割り込みベクトル} +const + EMSvector = $67; {EMM割り込みベクトル} EMSerr = $ff; {EMSユニット内エラー番号} -var Emessage, {メッセージ出力フラグ} +var + Emessage, {メッセージ出力フラグ} EMSterr : boolean; {エラー番号出力フラグ} EMSerror : byte; {エラー番号格納用} EMSaddr : pointer; {ページアドレスデータ格納位置} - EMSppage, {物理ページ数} - EMSlpage, {論理ページ数} + EMSppage, {物理ページ数} + EMSlpage, {論理ページ数} EMShandle : word; {使用中のハンドル番号} @@ -212,26 +197,34 @@ procedure defpaletteset(paletteset : palettet); function HexStr(num:word):string; function pitago(x,y:real):real; -procedure EMScall(var R : registers); {EMMファンクションコール} -function Eexist : boolean; {EMSの存在を調べる} -function EstatOK : boolean; {EMSのステータスを調べる} -function Ever : byte; {EMSバージョンの取得} -function Etpage : word; {総ページ数取得} -function Eupage : word; {未使用ページ数取得} -procedure Egetppagedata; {物理ページデータの格納} -function Eppageseg(page : word) : word; {物理ページのセグメント取得} -procedure Egetlpage(page : word); {論理ページの取得} -procedure Eregetlpage(page : word); {論理ページの割り付け変更} -procedure Emapping(phys, logi : word); {マッピング} -procedure Efree; {EMSの解放} -function Eread(page, offset : word) : byte; {データ読み込み} -procedure Ewrite(page, offset : word; data : byte);{データ書き込み} +procedure EMScall(var R : registers); {EMMファンクションコール} +function Eexist : boolean; {EMSの存在を調べる} +function EstatOK : boolean; {EMSのステータスを調べる} +function Ever : byte; {EMSバージョンの取得} +function Etpage : word; {総ページ数取得} +function Eupage : word; {未使用ページ数取得} +procedure Egetppagedata; {物理ページデータの格納} +function Eppageseg(page : word) : word; {物理ページのセグメント取得} +procedure Egetlpage(page : word); {論理ページの取得} +procedure Eregetlpage(page : word); {論理ページの割り付け変更} +procedure Emapping(phys, logi : word); {マッピング} +procedure Efree; {EMSの解放} +function Eread(page, offset : word): byte; {データ読み込み} +procedure Ewrite(page,offset:word; data: byte); {データ書き込み} procedure emsinit; +(*-- Disk -----------------------------*) +function exist(filename : flnam) : boolean; +function existdir(var dir : flnam ): boolean; +procedure partfilename(pathname : flnam; var dir,name,ext : flnam ); +function extension(pathname : flnam ) : boolean; +procedure changedrive(drive : byte ); +function drives: integer; + procedure select_drive( drv : char ); function current_drive : char; procedure diskreset; -function exist(filename : flnam) : boolean; +function fileready( var name : flnam ) : boolean; procedure wait; function inkey : char; @@ -244,7 +237,6 @@ procedure cursoron ; procedure cursoroff; procedure SystemLine(sw:byte); -function fileready( var name : flnam ) : boolean; procedure SORTFILES (var Fnames: filelist; Nfiles: integer); procedure DISP_NAME (var Fnames: filelist; Fnum, Dispfrst, Fcolor, @@ -261,12 +253,16 @@ procedure hscopy(n:integer); procedure scrn0to1; procedure scrn1to0; +function loadpal( palettefilename : flnam) : boolean; +function savepal(palettefilename : flnam ): boolean; +function vramsave( name : picflnam ): boolean; +function vramload(name : picflnam ) : boolean; + procedure iffsave(fl : picflnam; sw : integer); procedure iffload( fl : picflnam); procedure useiffcolor; procedure useiffcolor0; procedure exiffcolor(i:integer); (* i=0 320*200 i=1 640*400 *) -procedure MagDecode(filename : picflnam); procedure textscreen; procedure fullscreen; @@ -928,6 +924,75 @@ end; (* ====================================================================== *) (* Disk *) +function exist(filename : flnam) : boolean; +var + fil : file; +begin + {$I-} + assign(fil,filename); + reset(fil); + close(fil); + {$I+} + exist :=( ioresult = 0 ); +end; + +function existdir(var dir : flnam ): boolean; +var + temppath : flnam; +begin + getdir(0,temppath); + {$i-} + chdir( dir ); + {$i+} + existdir := (ioresult = 0); + chdir(temppath); +end; + +procedure partfilename(pathname : flnam; var dir,name,ext : flnam ); +var + l,p,nameptr,extptr : integer; +begin + l := length( pathname ); + nameptr := 1; + for p := 1 to l do + if pathname[p] = '\' + then nameptr := p + 1; + dir := copy(pathname, 1, nameptr - 1 ); + extptr := l + 1; + for p := nameptr to l do + if pathname[p] = '.' then + extptr := p; + name := copy(pathname, nameptr, extptr - nameptr ); + ext := copy(pathname, extptr + 1, 3 ); +end; + +function extension(pathname : flnam ) : boolean; +var + dir,name,ext : flnam; +begin + partfilename( pathname, dir, name, ext ); + extension := not( ext = '' ); +end; + +procedure changedrive(drive : byte ); +var + directory : flnam; +begin + getdir( drive,directory ); + chdir( directory ); +end; + +function drives: integer; +var + r : regtypefl; +begin + r.ax := $0E00; + r.dx := $00FF; + msdos(r); + drives := r.ax and $FF; +end; + + procedure select_drive( drv : char ); var i : integer; @@ -960,20 +1025,45 @@ begin end; -function exist(filename : flnam) : boolean; +function fileready( var name : flnam ) : boolean; var - fil : file; + drive : CHAR; + ext : string[4]; + p : integer; + inpname,mask : flnam; begin - {$I-} - assign(fil,filename); - reset(fil); - close(fil); - {$I+} - exist :=( ioresult = 0 ); + drive := 'p'; + p := pos('.',name); + if p > 0 + then ext := copy( name,p,4 ) + else ext := ''; + if ext = '' + then mask := drive + '\*.*' + else mask := drive + '\*' + ext ; + file_select( mask,inpname ); + if inpname <> '' then + begin +{ if pos( ':',inpname ) = 0 then + inpname := drive + '\' + inpname; } + if pos( '.',inpname ) = 0 then + inpname := inpname + ext; + if exist( inpname ) then + begin + fileready := true; + name := inpname; + end + else + begin + writeln( inpname,' is not exist.' ); + fileready := false; + wait + end + end + else + fileready := false; end; - procedure wait; begin write( 'Hit any key.' ); @@ -1329,43 +1419,7 @@ end; { procedure FILE_SELECT } -function fileready( var name : flnam ) : boolean; -var - drive : CHAR; - ext : string[4]; - p : integer; - inpname,mask : flnam; -begin - drive := 'p'; - p := pos('.',name); - if p > 0 - then ext := copy( name,p,4 ) - else ext := ''; - if ext = '' - then mask := drive + '\*.*' - else mask := drive + '\*' + ext ; - file_select( mask,inpname ); - if inpname <> '' then - begin -{ if pos( ':',inpname ) = 0 then - inpname := drive + '\' + inpname; } - if pos( '.',inpname ) = 0 then - inpname := inpname + ext; - if exist( inpname ) then - begin - fileready := true; - name := inpname; - end - else - begin - writeln( inpname,' is not exist.' ); - fileready := false; - wait - end - end - else - fileready := false; -end; + (*=====================================================================*) (* EMS op *) @@ -1382,35 +1436,35 @@ begin Emapping(1,2*i-1); Emapping(2,2*i); - mem[$c000:$ff81] := $1; - for yp := 0 to 199 do - for xp := 0 to 39 do - begin - Ewrite(1,j,vram0[yp,xp]); - inc(j) - end; - mem[$c000:$ff81] := $42; - for yp := 0 to 199 do - for xp := 0 to 39 do - begin - Ewrite(1,j,vram0[yp,xp]); - inc(j) - end; - j := 0; - mem[$c000:$ff81] := $84; - for yp := 0 to 199 do - for xp := 0 to 39 do - begin - Ewrite(2,j,vram0[yp,xp]); - inc(j) - end; - mem[$c000:$ff81] := $c8; - for yp := 0 to 199 do - for xp := 0 to 39 do - begin - Ewrite(2,j,vram0[yp,xp]); - inc(j) - end; + mem[$c000:$ff81] := $1; + for yp := 0 to 199 do + for xp := 0 to 39 do + begin + Ewrite(1,j,vram0[yp,xp]); + inc(j) + end; + mem[$c000:$ff81] := $42; + for yp := 0 to 199 do + for xp := 0 to 39 do + begin + Ewrite(1,j,vram0[yp,xp]); + inc(j) + end; + j := 0; + mem[$c000:$ff81] := $84; + for yp := 0 to 199 do + for xp := 0 to 39 do + begin + Ewrite(2,j,vram0[yp,xp]); + inc(j) + end; + mem[$c000:$ff81] := $c8; + for yp := 0 to 199 do + for xp := 0 to 39 do + begin + Ewrite(2,j,vram0[yp,xp]); + inc(j) + end; end; procedure scrn1toems( i : integer); @@ -1425,35 +1479,35 @@ begin Emapping(1,2*i-1); Emapping(2,2*i); - mem[$c000:$ff81] := $1; - for yp := 200 to 399 do - for xp := 0 to 39 do - begin - Ewrite(1,j,vram0[yp,xp]); - inc(j) - end; - mem[$c000:$ff81] := $42; - for yp := 200 to 399 do - for xp := 0 to 39 do - begin - Ewrite(1,j,vram0[yp,xp]); - inc(j) - end; - j := 0; - mem[$c000:$ff81] := $84; - for yp := 200 to 399 do - for xp := 0 to 39 do - begin - Ewrite(2,j,vram0[yp,xp]); - inc(j) - end; - mem[$c000:$ff81] := $c8; - for yp := 200 to 399 do - for xp := 0 to 39 do - begin - Ewrite(2,j,vram0[yp,xp]); - inc(j) - end; + mem[$c000:$ff81] := $1; + for yp := 200 to 399 do + for xp := 0 to 39 do + begin + Ewrite(1,j,vram0[yp,xp]); + inc(j) + end; + mem[$c000:$ff81] := $42; + for yp := 200 to 399 do + for xp := 0 to 39 do + begin + Ewrite(1,j,vram0[yp,xp]); + inc(j) + end; + j := 0; + mem[$c000:$ff81] := $84; + for yp := 200 to 399 do + for xp := 0 to 39 do + begin + Ewrite(2,j,vram0[yp,xp]); + inc(j) + end; + mem[$c000:$ff81] := $c8; + for yp := 200 to 399 do + for xp := 0 to 39 do + begin + Ewrite(2,j,vram0[yp,xp]); + inc(j) + end; end; procedure emstoscrn(i:integer); @@ -1467,37 +1521,37 @@ begin j := 0; Emapping(1,2*i-1); Emapping(2,2*i); - test1 := memw[seg(EMSaddr^):ofs(EMSaddr^)]; - test2 := memw[seg(EMSaddr^):ofs(EMSaddr^)+4]; - mem[$c000:$ff81] := $1; - for yp := 0 to 199 do - for xp := 0 to 39 do - begin - vram0[yp,xp] := mem[test1:j]; - inc(j) - end; - mem[$c000:$ff81] := $42; - for yp := 0 to 199 do - for xp := 0 to 39 do - begin - vram0[yp,xp] := mem[test1:j]; - inc(j) - end; - j := 0; - mem[$c000:$ff81] := $84; - for yp := 0 to 199 do - for xp := 0 to 39 do - begin - vram0[yp,xp] := mem[test2:j]; - inc(j) - end; - mem[$c000:$ff81] := $c8; - for yp := 0 to 199 do - for xp := 0 to 39 do - begin - vram0[yp,xp] := mem[test2:j]; - inc(j) - end; + test1 := memw[seg(EMSaddr^):ofs(EMSaddr^)]; + test2 := memw[seg(EMSaddr^):ofs(EMSaddr^)+4]; + mem[$c000:$ff81] := $1; + for yp := 0 to 199 do + for xp := 0 to 39 do + begin + vram0[yp,xp] := mem[test1:j]; + inc(j) + end; + mem[$c000:$ff81] := $42; + for yp := 0 to 199 do + for xp := 0 to 39 do + begin + vram0[yp,xp] := mem[test1:j]; + inc(j) + end; + j := 0; + mem[$c000:$ff81] := $84; + for yp := 0 to 199 do + for xp := 0 to 39 do + begin + vram0[yp,xp] := mem[test2:j]; + inc(j) + end; + mem[$c000:$ff81] := $c8; + for yp := 0 to 199 do + for xp := 0 to 39 do + begin + vram0[yp,xp] := mem[test2:j]; + inc(j) + end; end; procedure emstoscrn1(i:integer); @@ -1511,41 +1565,40 @@ begin j := 0; Emapping(1,2*i-1); Emapping(2,2*i); - test1 := memw[seg(EMSaddr^):ofs(EMSaddr^)]; - test2 := memw[seg(EMSaddr^):ofs(EMSaddr^)+4]; - mem[$c000:$ff81] := $1; - for yp := 200 to 399 do - for xp := 0 to 39 do - begin - vram0[yp,xp] := mem[test1:j]; - inc(j) - end; - mem[$c000:$ff81] := $42; - for yp := 200 to 399 do - for xp := 0 to 39 do - begin - vram0[yp,xp] := mem[test1:j]; - inc(j) - end; - j := 0; - mem[$c000:$ff81] := $84; - for yp := 200 to 399 do - for xp := 0 to 39 do - begin - vram0[yp,xp] := mem[test2:j]; - inc(j) - end; - mem[$c000:$ff81] := $c8; - for yp := 200 to 399 do - for xp := 0 to 39 do - begin - vram0[yp,xp] := mem[test2:j]; - inc(j) - end; + test1 := memw[seg(EMSaddr^):ofs(EMSaddr^)]; + test2 := memw[seg(EMSaddr^):ofs(EMSaddr^)+4]; + mem[$c000:$ff81] := $1; + for yp := 200 to 399 do + for xp := 0 to 39 do + begin + vram0[yp,xp] := mem[test1:j]; + inc(j) + end; + mem[$c000:$ff81] := $42; + for yp := 200 to 399 do + for xp := 0 to 39 do + begin + vram0[yp,xp] := mem[test1:j]; + inc(j) + end; + j := 0; + mem[$c000:$ff81] := $84; + for yp := 200 to 399 do + for xp := 0 to 39 do + begin + vram0[yp,xp] := mem[test2:j]; + inc(j) + end; + mem[$c000:$ff81] := $c8; + for yp := 200 to 399 do + for xp := 0 to 39 do + begin + vram0[yp,xp] := mem[test2:j]; + inc(j) + end; end; procedure hscopy(n:integer); - var xp,yp,xxp,dxb,dyb:integer; begin @@ -1566,60 +1619,51 @@ begin end end; - for xxp := 0 to 3 do begin + for xxp := 0 to 3 do + begin case xxp of - 0 : begin - mem[$c000:$ff81] := $1; - end; - 1 : begin - mem[$c000:$ff81] := $42; - end; - 2 : begin - mem[$c000:$ff81] := $84; - end; - 3 : begin - mem[$c000:$ff81] := $c8; - end; + 0 : mem[$c000:$ff81] := $1; + 1 : mem[$c000:$ff81] := $42; + 2 : mem[$c000:$ff81] := $84; + 3 : mem[$c000:$ff81] := $c8; end; for yp := 0 to 199 do - for xp := 0 to 39 do - begin - vram0[yp+dyb,xp+dxb] := vram0[yp,xp]; - end; + begin + vram0[yp+dyb,xp+dxb] := vram0[yp,xp]; end; - end; + end; +end; procedure scrn0to1; begin - new(vramb); screenad(0,0); - mem[$c000:$ff81] := $1; - vramb^ := vram0; - screenad(1,1); - mem[$c000:$ff81] := $1; - vram0 := vramb^; - screenad(0,0); - mem[$c000:$ff81] := $42; - vramb^ := vram0; - screenad(1,1); - mem[$c000:$ff81] := $42; - vram0 := vramb^; - screenad(0,0); - mem[$c000:$ff81] := $84; - vramb^ := vram0; - screenad(1,1); - mem[$c000:$ff81] := $84; - vram0 := vramb^; - screenad(0,0); - mem[$c000:$ff81] := $c8; - vramb^ := vram0; - screenad(1,1); - mem[$c000:$ff81] := $c8; - vram0 := vramb^; + mem[$c000:$ff81] := $1; + vramb^ := vram0; + screenad(1,1); + mem[$c000:$ff81] := $1; + vram0 := vramb^; + screenad(0,0); + mem[$c000:$ff81] := $42; + vramb^ := vram0; + screenad(1,1); + mem[$c000:$ff81] := $42; + vram0 := vramb^; + screenad(0,0); + mem[$c000:$ff81] := $84; + vramb^ := vram0; + screenad(1,1); + mem[$c000:$ff81] := $84; + vram0 := vramb^; + screenad(0,0); + mem[$c000:$ff81] := $c8; + vramb^ := vram0; + screenad(1,1); + mem[$c000:$ff81] := $c8; + vram0 := vramb^; dispose(vramb); screenad(0,0) @@ -1630,29 +1674,29 @@ begin new(vramb); screenad(1,1); - mem[$c000:$ff81] := $1; - vramb^ := vram0; - screenad(0,0); - mem[$c000:$ff81] := $1; - vram0 := vramb^; - screenad(1,1); - mem[$c000:$ff81] := $42; - vramb^ := vram0; - screenad(0,0); - mem[$c000:$ff81] := $42; - vram0 := vramb^; - screenad(1,1); - mem[$c000:$ff81] := $84; - vramb^ := vram0; - screenad(0,0); - mem[$c000:$ff81] := $84; - vram0 := vramb^; - screenad(1,1); - mem[$c000:$ff81] := $c8; - vramb^ := vram0; - screenad(0,0); - mem[$c000:$ff81] := $c8; - vram0 := vramb^; + mem[$c000:$ff81] := $1; + vramb^ := vram0; + screenad(0,0); + mem[$c000:$ff81] := $1; + vram0 := vramb^; + screenad(1,1); + mem[$c000:$ff81] := $42; + vramb^ := vram0; + screenad(0,0); + mem[$c000:$ff81] := $42; + vram0 := vramb^; + screenad(1,1); + mem[$c000:$ff81] := $84; + vramb^ := vram0; + screenad(0,0); + mem[$c000:$ff81] := $84; + vram0 := vramb^; + screenad(1,1); + mem[$c000:$ff81] := $c8; + vramb^ := vram0; + screenad(0,0); + mem[$c000:$ff81] := $c8; + vram0 := vramb^; dispose(vramb); screenad(0,0) @@ -1671,15 +1715,15 @@ var xp,yp,xxp,i,J,JJ : integer; fptr,dots,data,nextdata,cc : byte; -procedure putdata( d : byte ); + procedure putdata( d : byte ); begin if fptr = 129 then - begin - {$I-} - blockwrite( picfile,fbuf,1 ); - {$I+} - fptr := 1 - end; + begin + {$I-} + blockwrite( picfile,fbuf,1 ); + {$I+} + fptr := 1 + end; fbuf[fptr] := d; fptr := fptr + 1; end; @@ -2126,154 +2170,133 @@ procedure exiffcolor(i:integer); end; -procedure PSet4Dot(x,y:integer; color:word); -begin - Pset(x ,y,lo(color) shr 4); - Pset(x+1,y,lo(color) and $f); - Pset(x+2,y,hi(color) shr 4); - Pset(x+3,y,hi(color) and $f); +function loadpal( palettefilename : flnam) : boolean; +var + palettefile : text; + c,r,g,b : byte; +begin + loadpal := false ; + {$i-} + assign(palettefile,palettefilename ); + reset(palettefile); + {$i+} + if ioresult <> 0 then + begin + {$i-} + close(palettefile); + {$i+} + exit; + end; + while not eof(palettefile) do + begin + {$i-} + readln(palettefile,c,r,g,b); + {$i+} + if ioresult <> 0 then + begin + close(palettefile); + exit; + end; + if c <= maxcolor then defpalette(c,r,g,b); + end; + close(palettefile); + loadpal := true; + getrgbpalette; end; -function PGet4Dot(x,y:integer):word; +function savepal(palettefilename : flnam ): boolean; +var + palettefile : text; + color,i : integer; + begin - PGet4Dot := - point(x ,y) shl 4 + - point(x+1,y) + - point(x+2,y) shl 12 + - point(x+3,y) shl 8 ; + savepal := false; + {$i-} + assign( palettefile,palettefilename ); + rewrite(palettefile); + {$i+} + if ioresult <> 0 then + begin + close(palettefile); + exit; + end; + for color := 0 to maxcolor do + begin + {$i-} + write(palettefile,color:3); + for i := 0 to 2 do + write(palettefile,palet[color,i]:3); + writeln(palettefile); + {$i+} + if ioresult <> 0 then + begin + close(palettefile); + exit; + end; + end; + close(palettefile); + savepal := true end; -procedure MagDecode(filename : picflnam); -type - MagHeader = record - header : byte; - machine : byte; - exflag : byte; - scrnmode : byte; - x1 : integer; - y1 : integer; - x2 : integer; - y2 : integer; - FlagAofs : longint; - FlagBofs : longint; - FlagBsize : longint; - Pixelofs : longint; - Pixelsize : longint; - Palette : paletteT; - end; -const - MagID : string[8] = 'MAKI02 '; - BufSize = 65520; - FbufSize= 80; +function vramsave( name : picflnam ): boolean; var - Header : MagHeader; - Buffer : pointerUnion; - FlagA : pointerUnion; - FlagB : pointerUnion; - Pixel : pointerUnion; - fp : file; - - procedure PixelDecode; - const - PostblX : array[0..15] of integer = - ( 0,4,8,16,0,4,0,4,8,0,4,8,0,4,8,0 ); - PostblY : array[0..15] of integer = - ( 0,0,0,0,1,1,2,2,2,4,4,4,8,8,8,16 ); - var flagbuf : array[0..FbufSize-1] of byte; - flag : byte; - a_bit : byte; - x,y : integer; - begin - fillchar(flagbuf,sizeof(flagbuf),0); - a_bit:=$80; - for y:=Header.y1 to Header.y2 do begin - for x:=Header.x1 div 8 to Header.x2 div 8 do - begin - if (FlagA.bp^ and a_bit)<>0 then begin - flagbuf[x]:=flagbuf[x] xor FlagB.bp^; - inc(FlagB.ofs); - end; - a_bit:=a_bit shr 1; - if a_bit=0 then begin - a_bit:=$80; - inc(FlagA.ofs); - end; - flag:=flagbuf[x] shr 4; - if flag=0 then begin - PSet4Dot(x*8,y,pixel.wp^); - inc(pixel.ofs,2); - end else begin - PSet4Dot(x*8,y, - PGet4Dot(x*8-PosTblX[flag],y-PosTblY[flag]) - ); - end; - flag:=flagbuf[x] and $0f; - if flag=0 then begin - PSet4Dot(x*8+4,y,pixel.wp^); - inc(pixel.ofs,2); - end else begin - PSet4Dot(x*8+4,y, - PGet4Dot(x*8+4-PosTblX[flag],y-PosTblY[flag]) - ); - end; - end; - end; - end; - procedure error(msg:string); - begin - writeln(msg); - {$i-}close(fp);{$i+} - FreeMem(Buffer.p,BufSize); - exit; - end; + f : file; + p : ^byte; + r : word; + vramb : ^vramT; +begin + {$i-} + assign(f,name); + rewrite(f,32000); + {$i+} + if ioresult <> 0 then + begin + vramsave := false; + close(f); + exit; + end; + new(vramb); + + {$i-} + mem[$c000:$ff81] := $1; vramb^ := vram0; blockwrite(f,vramb^,1,r); + mem[$c000:$ff81] := $42; vramb^ := vram0; blockwrite(f,vramb^,1,r); + mem[$c000:$ff81] := $84; vramb^ := vram0; blockwrite(f,vramb^,1,r); + mem[$c000:$ff81] := $C8; vramb^ := vram0; blockwrite(f,vramb^,1,r); + {$i+} + vramsave := ioresult = 0; + close(f); + dispose(vramb); +end; + +function vramload(name : picflnam ) : boolean; +var + f : file; + p : ^byte; + r : word; + vramb : ^vramT; -var c : char; - i : integer; - result : word; begin - assign(fp,filename); FileMode:=0; - {$i-}reset(fp,1);{$i+} - if IOresult<>0 then error('File not found.'); - for i:=1 to 8 do begin; - blockread(fp,c,1); - if c<>MagID[i] then error('This is not mag data.'); - end; - repeat - blockread(fp,c,1); - until c=#$1a; - blockread(fp,Header,sizeof(Header)); - with header do begin - if MaxAvail 0 then - error('256color MAG data not supported.'); - if x2>=FbufSize*8 then - error('Over width. Can not decode data.'); - if y2>399 then y2:=399; - for i:=0 to 15 do begin - Palette[i,GREEN] := palette[i,GREEN] shr 4; palet[i,0]:=Palette[i,GREEN]; - Palette[i,RED ] := palette[i,RED ] shr 4; palet[i,1]:=Palette[i,RED ]; - Palette[i,BLUE ] := palette[i,BLUE ] shr 4; palet[i,2]:=Palette[i,BLUE ]; - setrgbpalette(i,palet[i,0],palet[i,1],palet[i,2]); - end; - end; + {$i-} + assign(f,name); + reset(f,32000); + {$i+} + if ioresult <> 0 then + begin + vramload := false; + close(f); + exit; + end; + new(vramb); - GetMem(Buffer.p,BufSize); - blockread(fp,Buffer.p^,BufSize,result); - if result>=BufSize then - error('Buffer full. Can not decode data.'); - FlagA:=Buffer; - FlagB:=Buffer; - Pixel:=Buffer; - inc(FlagA.ofs,Header.FlagAofs-sizeof(Header)); - inc(FlagB.ofs,Header.FlagBofs-sizeof(Header)); - inc(Pixel.ofs,Header.Pixelofs-sizeof(Header)); - -{ PaletteSet(Header.Palette); } - PixelDecode; - - FreeMem(Buffer.p,BufSize); - close(fp); + {$i-} + blockread(f,vramb^,1,r); mem[$c000:$ff81] := $1; vram0 := vramb^; + blockread(f,vramb^,1,r); mem[$c000:$ff81] := $42; vram0 := vramb^; + blockread(f,vramb^,1,r); mem[$c000:$ff81] := $84; vram0 := vramb^; + blockread(f,vramb^,1,r); mem[$c000:$ff81] := $C8; vram0 := vramb^; + {$i+} + vramload := ioresult = 0; + close(f); + dispose(vramb); end; diff --git a/AMIGA2.PAS b/AMIGA2.PAS index 6f94883..1780198 100644 --- a/AMIGA2.PAS +++ b/AMIGA2.PAS @@ -23,6 +23,7 @@ uses uparticl, ufractal, uiff32, + uloader, upaint; {$O uturtle3 } {$O umapping } @@ -35,6 +36,7 @@ uses {$O uparticl } {$O ufractal } {$O uiff32 } +{$O uloader } {$O upaint } var command,yesno : char; @@ -58,11 +60,6 @@ begin TextColor(2); clrscr; window(41,1,80,24); - if RpalP<>nil then begin -(* writeln('Find resident palette. ',hexstr(seg(RpalP^))); - end else begin - writeln('Not find resident palette.'); *) - end; emsinit; frameinit; @@ -100,6 +97,7 @@ begin writeln(' [P] Picture operation'); writeln(' [Z] EMS operation'); writeln(' [@] anim32 operation'); + writeln(' [L] Load other picture'); writeln(' [!] quit (Return to OS)'); writeln; write( '>'); @@ -124,9 +122,10 @@ begin '8' : turtle3d; '9' : fractal; 'A' : particle; - '@' : iff32; 'P' : picop; 'Z' : emsop; + '@' : iff32; + 'L' : load_pics; '?' : checksystem; end; until (command = '!') and (yesno = 'Y'); diff --git a/FMMOUSE.PAS b/FMMOUSE.PAS index 36d655b..403c0e8 100644 --- a/FMMOUSE.PAS +++ b/FMMOUSE.PAS @@ -295,39 +295,45 @@ end; procedure revbox(x1,y1,x2,y2 : integer); var i,xx1,yy1,xx2,yy2 : integer; begin - if (x1 <> x2) or (x1 <> x2) then + if (x1 <> x2) or (y1 <> y2) then begin - if x1 > x2 then + if x1 < x2 then begin - xx1 := x1; - xx2 := x2 + if y1 < y2 then + begin + xx1 := x1; xx2 := x2; + yy1 := y1; yy2 := y2; + end else + begin + xx1 := x1; xx2 := x2; + yy1 := y2; yy2 := y1; + end end else begin - xx1 := x2; - xx2 := x1 + if y1 < y2 then + begin + xx1 := x2; xx2 := x1; + yy1 := y1; yy2 := y2; + end else + begin + xx1 := x2; xx2 := x1; + yy1 := y2; yy2 := y1; + end end; - if y1 > y2 then - begin - yy1 := y1; - yy2 := y2 - end else + for i := xx1 to xx2 do begin - yy1 := y2; - yy2 := y1 + revpset(i,yy1); + revpset(i,yy2) end; - for i := x1 to x2 do + for i := yy1 to yy2 do begin - revpset(i,y1); - revpset(i,y2) + revpset(xx1,i); + revpset(xx2,i) end; - for i := y1 to y2 do - begin - revpset(x1,i); - revpset(x2,i) - end - end + end; end; + procedure revxyline(x,y:integer); var i : integer; begin diff --git a/README.md b/README.md index 71d74d4..e5de84e 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ (Deluxe Paint III like) animation paint system for UNZ(FM-TOWNS emulator) ![繧ケ繧、繧ォ縺ョ陦碁イ](https://github.com/clouddan4/amiga2/blob/master/SUIKA.gif) +![繧ケ繧、繧ォ縺ョ陦碁イ](https://github.com/clouddan4/amiga2/blob/master/SUIKA.png) 20 years ago, I used Amiga500,Amiga4000,X68000 and FM-Towns(This program). Original source skelton is 'Turbo Graphics (PC-9801) by Anzai Tosihiro' and @@ -39,6 +40,7 @@ Add feature from 'Deluxe Paint III' - light table - (tool) step Animation - and more.... +![16color](https://github.com/clouddan4/amiga2/blob/master/submenu.png) ### New feature - 3 Animation tracks @@ -59,7 +61,6 @@ built-in external Anim_geneator module - Particle (poor) - Fractal (jumble of good and bad) -![繧ケ繧、繧ォ縺ョ陦碁イ](https://github.com/clouddan4/amiga2/blob/master/SUIKA.png) --- #### near future plans diff --git a/UEMSOP.PAS b/UEMSOP.PAS index a6d0af3..0b5855a 100644 --- a/UEMSOP.PAS +++ b/UEMSOP.PAS @@ -7,6 +7,7 @@ procedure emsop; Implementation +{$I col_op_z.pas} {$I wipe.pas} procedure compress( ratio : integer ); @@ -64,25 +65,23 @@ start1: writeln; writeln( ' [N] anim No. 0 - 2 : ',animno); writeln( ' [A] Anim frame 1 - 64 : ',animframe); - writeln( ' [F] anim oFset >frame : ',animofset); - writeln( ' [D] Dir : ',bmaskz); - writeln( ' [I] source : ',asource); - writeln( ' [O] dest : ',adestination); + writeln( ' [F] anim oFset(>frame): ',animofset); + writeln( ' [D] Dir : ',bmaskz); + writeln( ' [I] source : ',asource); + writeln( ' [O] dest [=]: ',adestination); writeln( ' [L] Load IFFs [S] Save IFFs' ); writeln('-------------------------------------'); - writeln( ' [P] Play [^] play 0 & 1'); - writeln( ' [-] play rev [V] copy reVerse '); - writeln( ' [=] play pinpon [T] to pingpong'); - writeln( ' [C] Clear '); + writeln( ' [P] Play [-] play ',animno,' & 1'); + writeln( ' [<] play rev [V] copy to reVerse '); + writeln( ' [>] play pinpon [T] copy to pinpon'); + writeln( ' [M] copy&effect [C] Clear '); writeln( ' [1] copy anim [E] Exchang anim'); - writeln( ' [M] copy&effect'); - writeln( ' [2] append anim [3] copy rotate'); - writeln( ' [4] pic > first [5] pic > allframe'); + writeln( ' [2] append anim [3] copy to rotate'); + writeln( ' [4] pic->frames [5] pic->all_frames'); writeln( ' [6] motion blur [7] fadeout'); - writeln( ' [W] Wipe OP'); - writeln( ' [Y] ex 1 color [R] Reverse color'); + writeln( ' [X] eX color OP [W] Wipe OP'); + writeln( ' [Y] ex 1color [R] Reverse color'); writeln( ' [Z] sort color [/] compress 1/n'); - writeln( ' [%] 16 ->8color [J] swap 8color'); write( 'p>'); readln( command ); command := upcase( command ); @@ -127,6 +126,7 @@ start1: end; 'I' : begin write('Source File : '); readln(asource) end; 'O' : begin write('Destination File : '); readln(adestination) end; + '=' : adestination := asource; 'L' : begin gscreen; readfileok := false; @@ -202,7 +202,7 @@ start1: screenad(0,0); emstoscrn(1+animno*animofset); end; - '^' : begin + '-' : begin screenad(1,0); fixscreen; screenad(0,0); scrn0to1; @@ -222,7 +222,7 @@ start1: emstoscrn(1+animno*animofset); emstoscrn1(1+1*animofset); end; - '-' : begin + '<' : begin screenad(1,0); fixscreen; screenad(0,0); scrn0to1; @@ -240,7 +240,7 @@ start1: screenad(0,0); emstoscrn(1+animno*animofset); end; - '=' : begin + '>' : begin screenad(1,0); fixscreen; screenad(0,0); scrn0to1; @@ -326,38 +326,45 @@ start1: 'M' : begin write('** Source AnimNo.(0.1.2) = '); readln(mm); write('** Target AnimNo.(0.1.2) = '); readln(m); - writeln(' Q: cancel'); - writeln('--------------------------------------'); - writeln(' 1: 通常 2: 平均'); - writeln(' +: 加算 -: 減算 *: 乗算'); - writeln(' /: xor &: and |: or'); + writeln('(Q: cancel) --------------------------'); + writeln(' 1: 通常 2: 平均 E: 組織的ディザ'); + writeln(' +: 加算 -: 減算 *: 乗算'); + writeln(' /: xor &: and |: or'); writeln(' 3: 差の絶対値 4: screen'); writeln(' L: 比較明 K: 比較暗'); - writeln(' A: alpha blend W: WR blend'); + writeln(' A: Alpha blend W: WR blend'); writeln('--------------------------------------'); writeln(' O: Overlay U: Underlay'); - writeln(' =: overlay+平均 0: 0 to 切り取り'); + writeln(' =: overlay+平均 \: over/under+平均'); + writeln(' 0: 0 で切り取り M: Mask作成'); writeln(' H: O/U 水平change V: O/U 垂直change'); - writeln(' B: O/U 裏画面mask M: Mask作成'); - writeln('--------------- not0 to---------------'); + writeln(' B: O/U 裏画面mask '); + writeln('--------------- (not0 to ) -----------'); writeln(' ]: not0 to mask0 [: not0 to mask15'); writeln(' I: inc not0 D: dec not0'); writeln(' 5: slit x 6: slit y'); writeln(' 7: slit x + y 8: slit x - y'); writeln('--------------------------------------'); - writeln(' S: Scroll T: Sc_Trim 9: -90°trim'); - writeln(' X: X-Flip Y: Y-Flip '); + writeln(' X: X-flip Y: Y-flip 9: 90°(trim)'); + writeln(' S: Srol %: srol(%) T: srol(Trim)'); write ('** Move method = '); readln(mmm); mmm := upcase(mmm); if mmm = 'Q' then goto start1; xx := 0; yy := 0; cx := 0; cy := 0; case mmm of - 'S','T' : begin + 'E' : begin + writeln( ' 0: Bayer 配列 パターン'); + writeln( ' 1: 網点 配列 パターン'); + writeln( ' 2: 渦巻き配列 パターン'); + write('ditherパターンの種類 = '); readln(cl1); + write('転送元濃度 (0〜15) = '); readln(cl2) + end; + 'S','%','T' : begin write('X offset = '); readln(xx); write('Y offset = '); readln(yy) end; 'M' : begin - write('域値 = '); readln(cl1); + write('域値color = '); readln(cl1); writeln( ' ボケ足: 1-15'); writeln( ' 2値 : 0'); write('ボケ足 = '); readln(cl2); @@ -388,133 +395,147 @@ start1: writeln(i); emstoscrn(i+m*animofset); hscopy(1); emstoscrn(i+mm*animofset); - if (mmm='S') or (mmm='T') or (mmm='X') or (mmm='Y') then hscopy(1); + if (mmm='S') or (mmm='%') or (mmm='T') or (mmm='X') or (mmm='Y') + then hscopy(1); for x :=0 to maxhor do for y := 0 to maxver do - begin - c1 := point(x,y); - c2 := point(x,y+200); - case mmm of - '1' : ccc := c1; - '2' : ccc := round((c1+c2)/2); - '+' : begin - ccc := c1 + c2; - if ccc > 15 then ccc := 15 - end; - '-' : begin - ccc := c2 - c1; - if ccc < 0 then ccc := 0 - end; - '*' : ccc := round((c1*c2)/15); - '/' : ccc := c1 xor c2; - '&' : ccc := c1 and c2; - '|' : ccc := c1 or c2; - '3' : ccc := abs(c1-c2); -{ '4' : ccc := round( (15-c1)*(15-c2)/15 ); } - '4' : ccc := round(15- (15-c1)*(15-c2)/15 ); - 'L' : if c1 > c2 then ccc := c1 - else ccc := c2; - 'K' : if c1 > c2 then ccc := c2 - else ccc := c1; - 'A' : ccc := round((c1*c1+(15-c1)*c2)/15); - 'W' : begin - ccc := c1 - 7; - ccc := ccc + c2; - if ccc > 15 then ccc := 15; - if ccc < 0 then ccc := 0 - end; - 'O' : if c1 = 0 then ccc := c2 - else ccc := c1; - 'U' : if c2 = 0 then ccc := c1 + begin + c1 := point(x,y); + c2 := point(x,y+200); + case mmm of + 'E' : begin + case cl1 of + 0 : c := Dither[x mod 4 + 1][y mod 4 + 1]; + 1 : c := Dither2[x mod 4 + 1][y mod 4 + 1]; + 2 : c := Dither3[x mod 4 + 1][y mod 4 + 1]; + end; + if cl2 > c then ccc := c1 else ccc := c2; + end; + '1' : ccc := c1; + '2' : ccc := round((c1+c2)/2); + '+' : begin + ccc := c1 + c2; + if ccc > 15 then ccc := 15 + end; + '-' : begin + ccc := c2 - c1; + if ccc < 0 then ccc := 0 + end; + '*' : ccc := round((c1*c2)/15); + '/' : ccc := c1 xor c2; + '&' : ccc := c1 and c2; + '|' : ccc := c1 or c2; + '3' : ccc := abs(c1-c2); +{ '4' : ccc := round( (15-c1)*(15-c2)/15 ); } + '4' : ccc := round(15- (15-c1)*(15-c2)/15 ); + 'L' : if c1 > c2 then ccc := c1 else ccc := c2; - 'H' : if y < 100 then - begin - if c1 = 0 then ccc := c2 - else ccc := c1 - end else - begin - if c2 = 0 then ccc := c1 - else ccc := c2; - end; - 'V' : if x < 160 then - begin - if c1 = 0 then ccc := c2 - else ccc := c1 - end else - begin - if c2 = 0 then ccc := c1 - else ccc := c2; - end; - 'B' : begin - screenad(1,0); - c := point(x,y); - screenad(0,0); - if c = 0 then - begin - if c1 = 0 then ccc := c2 - else ccc := c1 - end else - begin - if c2 = 0 then ccc := c1 - else ccc := c2; - end; - end; - 'M' : if c1 >= cl1 then ccc := maxcolor - else if c1 < c then ccc := 0 - else ccc := c1; - '=' : if c1 = 0 then ccc := c2 - else ccc := round((c1+c2)/2); - '0' : if c1 = 0 then ccc := 0 - else ccc := c2; - ']' : begin - if c1 <> 0 then c2 := 0; - ccc := c2 - end; - '[' : begin - if c1 <> 0 then c2 := maxcolor; - ccc := c2 - end; - 'I' : begin - if c1 <> 0 then c2 := c2+1; - if c2 > maxcolor then c2 := maxcolor; - ccc := c2 - end; - 'D' : begin - if c1 <> 0 then c2 := c2-1; - if c2 < 0 then c2 := 0; - ccc := c2 - end; - '5' : if c1 = 0 then ccc := c2 - else if odd(x+1) then ccc := c1 - else ccc := c2; - '6' : if c1 = 0 then ccc := c2 - else if odd(y+1) then ccc := c1 - else ccc := c2; - '7' : if c1 = 0 then ccc := c2 - else if odd(x+y+1) then ccc := c1 - else ccc := c2; - '8' : if c1 = 0 then ccc := c2 - else if odd(x-y+200) then ccc := c1 - else ccc := c2; - 'S' : ccc := point(((-xx+x+640) mod 320), - ((-yy+y+400) mod 200)+200); - 'T' : begin - ccc := point(-xx+x,-yy+y+200); - if ((-xx+x) < 0) or ((-xx+x) > maxhor) - or ((-yy+y) < 0) or ((-yy+y) > maxver) then ccc := 0 - end; - 'X' : begin - ccc := point(x,y+200); - cx := maxhor -x -x - end; - 'Y' : begin - ccc := point(x,y+200); - cy := maxver -y -y - end; - end; - pset(x+cx,y+cy,ccc); - end; - scrntoems(i+m*animofset); + 'K' : if c1 > c2 then ccc := c2 + else ccc := c1; + 'A' : ccc := round((c1*c1+(15-c1)*c2)/15); + 'W' : begin + ccc := c1 - 7; + ccc := ccc + c2; + if ccc > 15 then ccc := 15; + if ccc < 0 then ccc := 0 + end; + 'O' : if c1 = 0 then ccc := c2 + else ccc := c1; + 'U' : if c2 = 0 then ccc := c1 + else ccc := c2; + 'H' : if y < 100 then + begin + if c1 = 0 then ccc := c2 + else ccc := c1 + end else + begin + if c2 = 0 then ccc := c1 + else ccc := c2; + end; + 'V' : if x < 160 then + begin + if c1 = 0 then ccc := c2 + else ccc := c1 + end else + begin + if c2 = 0 then ccc := c1 + else ccc := c2; + end; + 'B' : begin + screenad(1,0); + c := point(x,y); + screenad(0,0); + if c = 0 then + begin + if c1 = 0 then ccc := c2 + else ccc := c1 + end else + begin + if c2 = 0 then ccc := c1 + else ccc := c2; + end; + end; + 'M' : if c1 >= cl1 then ccc := maxcolor + else if c1 < c then ccc := 0 + else ccc := c1; + '=' : if c1 = 0 then ccc := c2 + else ccc := round((c1+c2)/2); + '\' : if c1 = 0 then ccc := c2 + else if c2 = 0 then ccc := c1 + else ccc := round((c1+c2)/2); + '0' : if c1 = 0 then ccc := 0 + else ccc := c2; + ']' : begin + if c1 <> 0 then c2 := 0; + ccc := c2 + end; + '[' : begin + if c1 <> 0 then c2 := maxcolor; + ccc := c2 + end; + 'I' : begin + if c1 <> 0 then c2 := c2+1; + if c2 > maxcolor then c2 := maxcolor; + ccc := c2 + end; + 'D' : begin + if c1 <> 0 then c2 := c2-1; + if c2 < 0 then c2 := 0; + ccc := c2 + end; + '5' : if c1 = 0 then ccc := c2 + else if odd(x+1) then ccc := c1 + else ccc := c2; + '6' : if c1 = 0 then ccc := c2 + else if odd(y+1) then ccc := c1 + else ccc := c2; + '7' : if c1 = 0 then ccc := c2 + else if odd(x+y+1) then ccc := c1 + else ccc := c2; + '8' : if c1 = 0 then ccc := c2 + else if odd(x-y+200) then ccc := c1 + else ccc := c2; + 'S' : ccc := point(((-xx+x+640) mod 320), + ((-yy+y+400) mod 200)+200); + '%' : ccc := point(((-round(xx*i/animframe)+x+640) mod 320), + ((-round(yy*i/animframe)+y+400) mod 200)+200); + 'T' : begin + ccc := point(-xx+x,-yy+y+200); + if ((-xx+x) < 0) or ((-xx+x) > maxhor) + or ((-yy+y) < 0) or ((-yy+y) > maxver) then ccc := 0 + end; + 'X' : begin + ccc := point(x,y+200); + cx := maxhor -x -x + end; + 'Y' : begin + ccc := point(x,y+200); + cy := maxver -y -y + end; + end; + pset(x+cx,y+cy,ccc); + end; + scrntoems(i+m*animofset); end; end; '2' : begin @@ -546,8 +567,14 @@ start1: end; '4' : begin write(' Target AnimNo.(0.1.2) = '); readln(mm); + write(' first frame = '); readln(x); + write(' last frame = '); readln(y); gscreen; - scrntoems(1+mm*animofset); + for i := x to y do + begin + writeln(i); + scrntoems(i+mm*animofset) + end; end; '5' : begin write(' Target AnimNo.(0.1.2) = '); readln(mm); @@ -608,6 +635,7 @@ start1: scrntoems(i+m*animofset); end; end; + 'X' : color_op_ems; 'W' : slitwipe; 'Y' : begin writeln(' Chenge Color '); @@ -658,62 +686,6 @@ start1: scrntoems(i+m*animofset) end; end; - '%' : begin - gscreen; - for m := 1 to animframe do - begin - emstoscrn(m+animno*animofset); - for x := 0 to maxhor do - for y := 0 to maxver do - begin - c := point(x,y); - c1 := c mod 2; - if c = 0 then c2 := 0 else - case c1 of - 0 : if ((x+y) mod 2) = 0 then c2 := (c div 2) - else c2 := (c div 2)-1; - 1 : c2 := c div 2 - end; - pset(x,y,c2); - end; - scrntoems(m+animno*animofset) - end; - getRGBpalette; - for i := 0 to 7 do - for cx := 0 to 2 do - palet[i,cx] := palet[i*2,cx]; - for i := 8 to 15 do - for cx := 0 to 2 do - palet[i,cx] := palet[i-8,cx]; - useiffcolor; - end; - 'J' : begin - gscreen; - for m := 1 to animframe do - begin - emstoscrn(m+animno*animofset); - for x := 0 to maxhor do - for y := 0 to maxver do - begin - c := point(x,y); - if c <= 7 then c1 := 8 + c - else c1 := c - 8; - pset(x,y,c1) - end; - scrntoems(m+animno*animofset) - end; - getRGBpalette; - for i := 0 to 7 do - for cx := 0 to 2 do - begin - dumyp[i,cx] := palet[i,cx]; - palet[i,cx] := palet[i+8,cx] - end; - for i := 8 to 15 do - for cx := 0 to 2 do - palet[i,cx] := dumyp[i-8,cx]; - useiffcolor; - end; end; until command = 'Q'; end; diff --git a/UPICOP.PAS b/UPICOP.PAS index dffd25d..1a3bb4c 100644 --- a/UPICOP.PAS +++ b/UPICOP.PAS @@ -2,6 +2,7 @@ unit upicop; {$O-} Interface uses crt,DOS,agraph2,framelib; + procedure picop; Implementation @@ -31,24 +32,23 @@ start1: writeln; writeln( ' [D] Dir : ',bmaskp); writeln( ' [I] source : ',source); - writeln( ' [O] dest : ',destination); + writeln( ' [O] dest [=]: ',destination); writeln( ' [L] Load IFF [S] Save IFF 320' ); - writeln( ' [A] load MAG [4] save IFF 640' ); + writeln( ' [V] saVe IFF 640' ); writeln('-------------------------------------'); writeln( ' [G] Graphic [H] Hide graphic ' ); writeln( ' [T] mono Toon [P] Palette OP' ); - writeln( ' [C] gClear [0] all clear' ); + writeln( ' [M] copy&effect [C] gClear ([0]all)' ); writeln( ' [1..3] copy to [E] Exchange' ); - writeln( ' [M] copy&effect ' ); - writeln( ' [>] to page1 [<] from page1'); - writeln( ' [F] Fixscreen [U] Undofix'); - writeln( ' [6] > temp file [7] < temp file'); + writeln( ' [4] pic ->frame [5] pic<- frame'); writeln( ' [8] push 0 [9] pop 0'); - writeln( ' [^] push brush [B] Brush OP'); - writeln( ' [X] eX color OP ' ); - writeln( ' [Y] ex 1 color [R] Reverse color' ); + writeln( ' [W] sWap push0 [J] swap page'); + writeln( ' [.] ->page1 [,] <- page1'); + writeln( ' [>] ->tmp_file [<] <- tmp_file'); + writeln( ' [F] Fixscreen [U] Undo fix'); + writeln( ' [X] eX color OP [B] Brush OP'); + writeln( ' [Y] ex 1color [R] Reverse color' ); writeln( ' [Z] sort color [/] compress 1/n'); - writeln( ' [Q] Quit' ); write( 'p>'); readln( command ); command := upcase( command ); @@ -79,6 +79,7 @@ start1: end; 'I' : begin write('Source File : '); readln(source) end; 'O' : begin write('Destination File : '); readln(destination) end; + '=' : destination := source; 'L' : begin readfileok := false; if (source <> '') and (exist(source)) then @@ -94,16 +95,7 @@ start1: end else writeln( 'Picture not found !' ); wait end; - 'A' : begin - readfileok := false; - if (source <> '') and (exist(source)) then - begin - gscreen; - MagDecode(source); - end else writeln( 'Picture not found !' ); - wait - end; - 'S','4' : begin + 'S','V' : begin if destination <> '' then begin if exist(destination) then writeln('Picture already exists!'); @@ -132,15 +124,25 @@ start1: write( 'Gclear color = ' ); readln( c ); if c in [ 0..maxcol ] then - begin - gscreen; - gclear( c ) - end + begin + gscreen; + gclear( c ) + end end; '0' : fillscreen(0); '1' : hscopy(1); '2' : hscopy(2); '3' : hscopy(3); + '4' : begin + write(' Target frame<- pic = '); readln(x); + gscreen; + scrntoems(x+animno*animofset) + end; + '5' : begin + write(' Target frame ->pic = '); readln(x); + gscreen; + emstoscrn(x+animno*animofset) + end; 'E' : begin write('Exchenge Posicion = '); readln(m); @@ -159,29 +161,28 @@ start1: end; end; 'M' : begin - write('** Move Posicion = '); - readln(m); - writeln(' Q: cancel'); - writeln('--------------------------------------'); - writeln(' 1: 通常 2: 平均'); - writeln(' +: 加算 -: 減算 *: 乗算'); - writeln(' /: xor &: and |: or'); + write('** Move Posicion = '); readln(m); + writeln('(Q: cancel) --------------------------'); + writeln(' 1: 通常 2: 平均 E: 組織的ディザ'); + writeln(' +: 加算 -: 減算 *: 乗算'); + writeln(' /: xor &: and |: or'); writeln(' 3: 差の絶対値 4: screen'); writeln(' L: 比較明 K: 比較暗'); - writeln(' A: alpha blend W: WR blend'); + writeln(' A: Alpha blend W: WR blend'); writeln('--------------------------------------'); writeln(' O: Overlay U: Underlay'); - writeln(' =: overlay+平均 0: 0 to 切り取り'); + writeln(' =: overlay+平均 \: over/under+平均'); + writeln(' 0: 0 で切り取り M: Mask作成'); writeln(' H: O/U 水平change V: O/U 垂直change'); - writeln(' B: O/U 裏画面mask M: Mask作成'); - writeln('--------------- not0 to---------------'); + writeln(' B: O/U 裏画面mask '); + writeln('--------------- (not0 to ) -----------'); writeln(' ]: not0 to mask0 [: not0 to mask15'); writeln(' I: inc not0 D: dec not0'); writeln(' 5: slit x 6: slit y'); writeln(' 7: slit x + y 8: slit x - y'); writeln('--------------------------------------'); - writeln(' S: Scroll T: Sc_Trim 9: -90°trim'); - writeln(' X: X-Flip Y: Y-Flip '); + writeln(' X: X-flip Y: Y-flip 9: 90° (trim)'); + writeln(' S: Sroll T: sroll(Trim)'); write ('** Move method = '); readln(mm); mm := upcase(mm); @@ -194,12 +195,19 @@ start1: xx := 0; yy := 0; cx := 0; cy := 0; case mm of - 'S','T' : begin + 'E' : begin + writeln( ' 0: Bayer 配列 パターン'); + writeln( ' 1: 網点 配列 パターン'); + writeln( ' 2: 渦巻き配列 パターン'); + write('ditherパターンの種類 = '); readln(cl1); + write('転送元濃度 (0〜15) = '); readln(cl2) + end; + 'S','T' : begin write('X offset = '); readln(xx); write('Y offset = '); readln(yy) end; 'M' : begin - write('域値 = '); readln(cl1); + write('域値color = '); readln(cl1); writeln( ' ボケ足: 1-15'); writeln( ' 2値 : 0'); write('ボケ足 = '); readln(cl2); @@ -219,141 +227,155 @@ start1: gscreen; for x :=0 to maxhor do for y := 0 to maxver do - begin - c1 := point(x,y); - c2 := point(x+dx,y+dy); - case mm of - '1' : ccc := c1; - '2' : ccc := round((c1+c2)/2); - '+' : begin - ccc := c1 + c2; - if ccc > 15 then ccc := 15 - end; - '-' : begin - ccc := c2 - c1; - if ccc < 0 then ccc := 0 - end; - '*' : ccc := round((c1*c2)/15); - '/' : ccc := c1 xor c2; - '&' : ccc := c1 and c2; - '|' : ccc := c1 or c2; - '3' : ccc := abs(c1-c2); -{ '4' : ccc := round( (15-c1)*(15-c2)/15 ); } - '4' : ccc := round(15- (15-c1)*(15-c2)/15 ); - 'L' : if c1 > c2 then ccc := c1 - else ccc := c2; - 'K' : if c1 > c2 then ccc := c2 - else ccc := c1; - 'A' : ccc := round((c1*c1+(15-c1)*c2)/15); - 'W' : begin - ccc := c1 - 7; - ccc := ccc + c2; - if ccc > 15 then ccc := 15; - if ccc < 0 then ccc := 0 - end; - 'O' : if c1 = 0 then ccc := c2 - else ccc := c1; - 'U' : if c2 = 0 then ccc := c1 + begin + c1 := point(x,y); + c2 := point(x+dx,y+dy); + case mm of + 'E' : begin + case cl1 of + 0 : c := Dither[x mod 4 + 1][y mod 4 + 1]; + 1 : c := Dither2[x mod 4 + 1][y mod 4 + 1]; + 2 : c := Dither3[x mod 4 + 1][y mod 4 + 1]; + end; + if cl2 > c then ccc := c1 else ccc := c2; + end; + '1' : ccc := c1; + '2' : ccc := round((c1+c2)/2); + '+' : begin + ccc := c1 + c2; + if ccc > 15 then ccc := 15 + end; + '-' : begin + ccc := c2 - c1; + if ccc < 0 then ccc := 0 + end; + '*' : ccc := round((c1*c2)/15); + '/' : ccc := c1 xor c2; + '&' : ccc := c1 and c2; + '|' : ccc := c1 or c2; + '3' : ccc := abs(c1-c2); +{ '4' : ccc := round( (15-c1)*(15-c2)/15 ); } + '4' : ccc := round(15- (15-c1)*(15-c2)/15 ); + 'L' : if c1 > c2 then ccc := c1 else ccc := c2; - 'H' : if y < 100 then - begin - if c1 = 0 then ccc := c2 - else ccc := c1 - end else - begin - if c2 = 0 then ccc := c1 - else ccc := c2; - end; - 'V' : if x < 160 then - begin - if c1 = 0 then ccc := c2 - else ccc := c1 - end else - begin - if c2 = 0 then ccc := c1 - else ccc := c2; - end; - 'B' : begin - screenad(1,0); - c := point(x,y); - screenad(0,0); - if c = 0 then - begin - if c1 = 0 then ccc := c2 - else ccc := c1 - end else - begin - if c2 = 0 then ccc := c1 - else ccc := c2; - end; - end; - 'M' : if c1 >= cl1 then ccc := maxcolor - else if c1 < c then ccc := 0 - else ccc := c1; - '=' : if c1 = 0 then ccc := c2 - else ccc := round((c1+c2)/2); - '0' : if c1 = 0 then ccc := 0 - else ccc := c2; - ']' : begin - if c1 <> 0 then c2 := 0; - ccc := c2 - end; - '[' : begin - if c1 <> 0 then c2 := maxcolor; - ccc := c2 - end; - 'I' : begin - if c1 <> 0 then c2 := c2+1; - if c2 > maxcolor then c2 := maxcolor; - ccc := c2 - end; - 'D' : begin - if c1 <> 0 then c2 := c2-1; - if c2 < 0 then c2 := 0; - ccc := c2 - end; - '5' : if c1 = 0 then ccc := c2 - else if odd(x+1) then ccc := c1 - else ccc := c2; - '6' : if c1 = 0 then ccc := c2 - else if odd(y+1) then ccc := c1 - else ccc := c2; - '7' : if c1 = 0 then ccc := c2 - else if odd(x+y+1) then ccc := c1 - else ccc := c2; - '8' : if c1 = 0 then ccc := c2 - else if odd(x-y+200) then ccc := c1 - else ccc := c2; - 'S' : ccc := point(((-xx+x+640) mod 320), - ((-yy+y+400) mod 200)); - 'T' : begin - ccc := point(-xx+x,-yy+y); - if ((-xx+x) < 0) or ((-xx+x) > maxhor) - or ((-yy+y) < 0) or ((-yy+y) > maxver) then ccc := 0 - end; - 'X' : begin - ccc := c1; - cx := maxhor -x -x - end; - 'Y' : begin - ccc := c1; - cy := maxver -y -y - end; - end; - pset(x+dx+cx,y+dy+cy,ccc) - end; + 'K' : if c1 > c2 then ccc := c2 + else ccc := c1; + 'A' : ccc := round((c1*c1+(15-c1)*c2)/15); + 'W' : begin + ccc := c1 - 7; + ccc := ccc + c2; + if ccc > 15 then ccc := 15; + if ccc < 0 then ccc := 0 + end; + 'O' : if c1 = 0 then ccc := c2 + else ccc := c1; + 'U' : if c2 = 0 then ccc := c1 + else ccc := c2; + 'H' : if y < 100 then + begin + if c1 = 0 then ccc := c2 + else ccc := c1 + end else + begin + if c2 = 0 then ccc := c1 + else ccc := c2; + end; + 'V' : if x < 160 then + begin + if c1 = 0 then ccc := c2 + else ccc := c1 + end else + begin + if c2 = 0 then ccc := c1 + else ccc := c2; + end; + 'B' : begin + screenad(1,0); + c := point(x,y); + screenad(0,0); + if c = 0 then + begin + if c1 = 0 then ccc := c2 + else ccc := c1 + end else + begin + if c2 = 0 then ccc := c1 + else ccc := c2; + end; + end; + 'M' : if c1 >= cl1 then ccc := maxcolor + else if c1 < c then ccc := 0 + else ccc := c1; + '=' : if c1 = 0 then ccc := c2 + else ccc := round((c1+c2)/2); + '\' : if c1 = 0 then ccc := c2 + else if c2 = 0 then ccc := c1 + else ccc := round((c1+c2)/2); + '0' : if c1 = 0 then ccc := 0 + else ccc := c2; + ']' : begin + if c1 <> 0 then c2 := 0; + ccc := c2 + end; + '[' : begin + if c1 <> 0 then c2 := maxcolor; + ccc := c2 + end; + 'I' : begin + if c1 <> 0 then c2 := c2+1; + if c2 > maxcolor then c2 := maxcolor; + ccc := c2 + end; + 'D' : begin + if c1 <> 0 then c2 := c2-1; + if c2 < 0 then c2 := 0; + ccc := c2 + end; + '5' : if c1 = 0 then ccc := c2 + else if odd(x+1) then ccc := c1 + else ccc := c2; + '6' : if c1 = 0 then ccc := c2 + else if odd(y+1) then ccc := c1 + else ccc := c2; + '7' : if c1 = 0 then ccc := c2 + else if odd(x+y+1) then ccc := c1 + else ccc := c2; + '8' : if c1 = 0 then ccc := c2 + else if odd(x-y+200) then ccc := c1 + else ccc := c2; + 'S' : ccc := point(((-xx+x+640) mod 320), + ((-yy+y+400) mod 200)); + 'T' : begin + ccc := point(-xx+x,-yy+y); + if ((-xx+x) < 0) or ((-xx+x) > maxhor) + or ((-yy+y) < 0) or ((-yy+y) > maxver) then ccc := 0 + end; + 'X' : begin + ccc := c1; + cx := maxhor -x -x + end; + 'Y' : begin + ccc := c1; + cy := maxver -y -y + end; + end; + pset(x+dx+cx,y+dy+cy,ccc) + end; end; - '>' : begin gscreen; scrn0to1 end; - '<' : begin gscreen; scrn1to0 end; + '.' : begin gscreen; scrn0to1 end; + ',' : begin gscreen; scrn1to0 end; + 'J' : begin gscreen; SwapOverUnder end; 'F' : fixscreen; 'U' : undofix; - '6' : begin - getrgbpalette; - iffsave('PIC\TMP.IFF',1); - end; - '7' : iffload('PIC\TMP.IFF'); + '>' : if not vramsave('PIC\TMP.FRM') then writeln('Error!'); + '<' : if not vramload('PIC\TMP.FRM') then writeln('Error!'); '8' : scrntoems((2+1)*animofset+1); '9' : emstoscrn((2+1)*animofset+1); + 'W' : begin + emstoframe320(0,(2+1)*animofset+1); + scrntoems((2+1)*animofset+1); + frame320toframe0(0); + end; '^' : scrntoems((2+1)*animofset+3); 'B' : emstoscrn((2+1)*animofset+3); 'X' : color_op; diff --git a/memo_ATS_TODO.txt b/memo_ATS_TODO.txt index 89c5ecc..9be4951 100644 --- a/memo_ATS_TODO.txt +++ b/memo_ATS_TODO.txt @@ -1,122 +1,468 @@ +□まだ +■対応済み +------------------- -640X400(現画面) - frame(0,x,y) -640X400(fix, undo) - frame(1,x,y) -320X200(push0,pop0) - scrntoems((2+1)*animofset+1) -frame320(0) → ems - frame320toems(0,(2+1)*animofset+1) +640X400(現画面) frame(0,x,y) -procedure pushscreen, popscreen - ライトテーブルがオンの場合の scrntoems((2+1)*animofset+1) +640X400(fix, undo) frame(1,x,y) -frame320point(0,x,y) - ライトテーブルがオンの場合の描画画面 +frame320point(0,x,y) ライトテーブルがオンの場合の描画画面 + 320X200(push0,pop0) + 通常 scrntoems((2+1)*animofset+1) + lt_on frame320toems(0,(2+1)*animofset+1) -カットブラシの保存フレーム - cutbrushpage := (2+1)*animofset+3 - frame320toems(1,cutbrushpage) +frame320point(1,x,y) ブラシ, アニメブラシの作業画面 + ブラシ作業画面の退避フレーム cutbrushpage := (2+1)*animofset+3 + frame320toems(1,cutbrushpage) + □スペアブラシの退避フレーム (2+1)*animofset+4 + + アニメブラシの保存フレーム + AnimNo.2 ((1+1)*animofset+1〜n) -ブラシ, アニメブラシ の場合の参照フレーム - frame320point(1,x,y) + ブラシfig, アニメブラシfig の場合の参照フレーム + blbrushpoint(x,y) → frame320point(1,x,y) + 現状: 小数点を上下・左右のpointに振り分け、平均をとっている + □3X3=9point での処理に変更 -ブラシfig, アニメブラシfig の場合の参照フレーム - blbrushpoint(x,y) → frame320point(1,x,y) +paintframe(x,y) paintルーチンでの作業フレーム + paintframe は、frame320 なので 640X400 に対応不可 + → 訂正: paintframe は、640X400 1plane 単色 + + +■scrntoframe320ルーチン作成が必要か?(fix0, undo0) + (640X400(fix, undo) の場合は、実vramにマッピングされたframe間copy) + frame320toframe は、frame1 しか対応していない(実vramは、frame0) + GRAD2.PAS に類似ルーチン有 + ■frame320toframe → frame320toframe1 に名称変更(undoバッファにコピー) + FRAMELIB.PAS, PGLOBAL.PAS, USR2.PAS を変更 + ■frametoframe320 → frame1toframe320 に名称変更(undoバッファからコピー) + FRAMELIB.PAS, PGLOBAL.PAS, USR2.PAS を変更 + ■frame320toframe0 を追加(実vramにコピー) + FRAMELIB.PAS を変更 + ■frame0toframe320 を追加(実vramからコピー) + FRAMELIB.PAS を変更 + + +□(2+1)*animofset+1 をライトテーブルの追加フレームとして共有して問題ないか検討する + (2+1)*animofset+3 ブラシ作業画面の退避フレーム +□(2+1)*animofset+4 スペアブラシの退避フレーム (2+1)*animofset+4 +□(2+1)*animofset+5,6,7,8 を作業画面の退避用バッファとして確保 + 実装予定のスプライトチップ・エディタでの画面退避 -paintルーチンでの作業フレーム - paintframe(x,y) (paintframe は、frame320 なので 640X400 に対応不可) +screen0 → screen1 のコピールーチンは、paintframe と等価なバッファを new で確保 + □どちらも共通にして、必要時に new で確保するようにすることを検討 + USR2 に|grad塗|を追加する場合、paintframe をクリアせずに再利用する必要有り + +□マッピングされたEMSフレームを直接 frame320 として扱えないか検討 + ■アニムフレーム数を変えた場合、ブラシや退避フレームがズレる → setup2 で、EMSフレームの割り当てを animofset*3 以上で確保していなかった -□scrntoframe320ルーチン作成が必要か?(fix0, undo0) - (640X400(fix, undo) の場合は、実vramにマッピングされたframe間copy) - frame320toframe は、frame1 しか対応していない(実vramは、frame0) - GRAD2.PAS に重複ルーチン有 - -------------------------------------------------------------------------- ■Screen 640X400 の画像を保存するルーチンが無い - → AGRAPH2.PAS の iffsave ルーチンに、640X400画像モードを追加 + → AGRAPH2.PAS の IFFsave ルーチンに、640X400画像モードを追加 そのルーチンを呼び出している uemsop.pas, picop.pas を変更 - (640X400画像の色ソートは、picop.pas の compress1/n メニューの中) - -■テンポラリ画像ファイルへの入出力 >Tmp, tmp の処理を置換え(パレットはセーブしない) + ■AGRAPH2.PAS にFRM画像のload&saveルーチンを移行 + ■UPICOP.PAS のルーチンを入れ替え + ■SCREENOP.PAS のルーチンを入れ替え + ■PGLOBAL.PAS にルーチンを追加 + ■[<],[>],[,],[.]キー割り当ての変更・追加 + (copuanimnext, copyanimback とキーが重複するため) + ■[6],[7]の機能を入れ替えた + ■AGRAPH2.PAS にパレットのload&saveルーチンを移行 + ■PALOP.PAS の該当ルーチンを削除 + □CEL画像(KISS 着せ替えのパーツ)のロードをサポート + □KCFファイル画像(KISS 着せ替えのパレット)のロードをサポート + □ARV画像(アートマスター、キャラクタツクール)のロードをサポート + □ZIM画像(Z's staff Kid98)のロードをサポート + ■SMC画像(SMC-777C GEDIT)のロードをサポート + 仮想FDDイメージからファイルを取り出す 1DDTOOL.EXE は、16bitプログラム + (64bitOS環境では) msdos 1DDTOOL.EXE r 仮想FDDイメージ + 拡張子がPICのママだとX68Kの形式と区別できないので 'SMC' にリネーム + ボーダーカラーの設定は無視する + ■partfilename(pathname : flnam; var dir,name,ext : flnam ) → AGRAPH2.PAS + ■disk関連のルーチンを AGRAPH2.PAS に集約 + ■AGRAPH2.PAS から 常駐パレット, child communicate 関連を削除 ■\PST からの include を廃止、sysbrush.inc を親ディレクトリにコピー -□\PST に、リソース類を移動。(brush.ptn, tone.ptn, ... ) +■\PST に、リソース類を移動。(brush.ptn, tone.ptn, ... ) + +■HELP で、終了(右クリック)のチャタリング (PGLOBAL.PAS procedure help) + → waitrbutton の後に offbutton を追加 + +■PALEDIT で、パレットの fix,undo が機能していない + → 機能していた + + + +□AnimNoが0と決めうちしているところを修正して、任意のAnimNoに対応させる +□パレットの管理もAnimNoごとに行う + □UEMSOP.PAS も変更 + + + +□トップメニューの検討 (UPAINT.PAS) + 描画| | |拡大|特筆|実験| | |Anim|画面|色 |設定|Help|終了 ↓ + 描画|変形|加工|特筆|実験|拡大|CELL| BG |Anim|画面|色 |設定|Help|終了 + 描画|特筆|実験|図形|拡大|Brsh|CELL| BG |Anim|画面|色 |設定|Help|終了 + + +■システム設定メニューの検討 (PGLOBAL.PAS systemset) + Screen| Micky| Grid | BrOfs|Brwait|AutoBr|Frm0&1|ExelBr| | Info | Help ↓ + Screen|Micky /BrWait/ Grid /exclBr|Br_ofs|AutoBr/Frm0&1| | Info | Help + +□exclBr(グリッドが設定された場合のブラシカットのドット調整) の再検討 + ■初期設定をONに変更、gridx <> 1 の場合のチェックを導入 + □gridx <> 1 の場合だけではなく、gridy <> 1 もチェック + □それぞれで、処理を分ける(x:=x-1, y:=y-1) + □逆から選択された場合の調整の処理をチェック +■アニメautoscreen で、同座標に連続してブラシを置く場合、br_wait_ON だと不便すぎる + → br_wait_ON のまま、lineツールで座標を記憶させて始点と終点を一致させ描画 ■animframe0,1 の連動をデフォルトではOFFに変更 -■[複]→[鏡]、[対]→[源]、[ M]→[⇒] に変更 - 筆|色|覆|[]|B]|A]|複|対|効| M| ↓ - 筆|色|[]/[B/[A|源/効/M|鏡|⇒| + +■描画設定メニューの検討 (SUBMENU.PAS brushprefset) + b-Hand|a-Hand| |autoCt|dither| Light| | | | | Help ↓ + BrHand/AbHand/BrNot0/-Jaggy|階調塗/dither/autoCt/塗not0/ + 縁 |透過台| Help + +■/BrNot0/ ブラシの色0を透過色とみなす + brushtype = (brover,brbeta) で切り替え + ■アニメブラシをベタで適用したい場合の設定が、カットブラシ側にしかない + →こちらに移動(カットブラシ選択メニューも今後の予定で残す) + +■/-Jaggy| ブラシの拡大縮小処理の際、補完処理を行うかどうか + 明度順階調画像でない場合、補完処理をOFFできるようにする + br_jaggy : boolean で切り替え + PGLOBAL.PAS blbrushpoint ルーチンを変更 + PGLOBAL.PAS blpoint ルーチンもついでに変更 + [yes] バイリニア補完(デフォルト) + [no] c = point(x,y) + +■|階調塗| gradmaxcolor : boolean で切替え + [yes] 16色階調塗り(デフォルト) + [no] 2値化 組織的パターン(Dither配列) + ■2値塗りの場合、カラーによっては擬似階調がほとんど無くなる + → 2値塗りの場合、maxcolor を引数としてcurrentcolor,currentbgcolor振分けた + ■systemparam,color が引数なので、maxcolorに代入すると不具合 + → 一時的にsystemparam,colorをバックアップして処理したあと元に戻す + □2値塗りの場合、currentcolorの領域を増やすため、オフセット値を加算 + ■試しに、+4 して様子をみる + □|明度+ | として入力可能にする + ■'2値化 ランダム'の追加を検討 | 16階調 |2値:組織的| 2値:乱数 | で切替え + type gradmaxcolortype = (16col,2col_mat,2col_rnd) + var gradmaxcolorstyle: gradmaxcolortype + ■現在の'2値:組織的'の参照Dither配列をBayerパターンに変更 + http://www2.tbb.t-com.ne.jp/mark/diza.html + AGRAPH2.PAS の Dither を修正(Bayerパターンに準拠、似非キースと同等) + □'2値化 網点'の追加を検討 Dither配列を網点パターン + AGRAPH2.PAS に Dither2 を追加 + □'2値化 渦巻'の追加を検討 Dither配列を渦巻パターン + AGRAPH2.PAS に Dither3 を追加 + □'2値化 誤差拡散'の追加を検討 + filllineルーチンで誤差を拡散させる一時バッファの導入に見合う効果に疑問 + → 次(右隣)のピクセルのみ誤差を引き継がせて効果を確認する + □'8階調下'の追加を検討 パレット0〜 7を8階調明度順とみなして描画 + □'8階調上'の追加を検討 パレット8〜15を8階調明度順とみなして描画 +□|階調塗|メニューの検討 + |16階調 /8階調下/8階調上|2値Baye/2値網点/2値渦巻/2値誤差/2値乱数/明度+ + gradmaxcolortype = + (col16,col8_dw,col8_up,col2_bay,col2_tone,col2_spin,col2_err,col2_rnd) + 明度加算値 hilight_plus : integer + +■/dither/ グラデ塗りの場合、乱数でディザリングをかける + ditheron : real で切り替え + [yes] ディザリング有(デフォルト ditheron = 0.5) + [no] ディザリング無(ditheron = 0) + □現状0.5のディザリング乱数値を変更できるようにする + +■/autoCt/ 円外グラデ塗りの中心を自動に設定 + paintautocenter: boolean で切り替え + +□/塗not0/ ペイント系において、選択図形内の not0 のみ対象とするモードを追加する + ペイント処理で、マスクカラー0 との違いは、グラデーション塗りの場合 + □適用が限られるので、|設定| の項目で対応する + +□| + 縁 | ペイント処理後、外形線を既定ツールで描画する + □それぞれのペイントツールを選択した際に、いちいち指定させても良いかも? + +□グラデ塗りに、cyclic 循環数の設定 + □(usr2)|grad塗| で実装予定なので、こちらは無くても良いかも? + +□透過台(ライトテーブル) back2のフレーム番号を固定に切り替え可能に + → □現状の-1, -2 に追加フレームとして、emsframe (2+1)*animofset+5 + □emsframe (2+1)*animofset+1 と共有して問題ないか検討する + □画面 → 追加フレーム + □画面・グリッド表示 → 追加フレーム + □画面・パースガイド表示 → 追加フレーム + □画面・透視ガイド表示 → 追加フレーム + + + +□|画面|メニューの検討 (screenop.pas) + 表W裏|表>裏|表<裏| cls | rev |x反転|y反転|180転| >tmp| 裏| → |表>Ov| に変更 (|表>裏| は、キーコマンドでサポート) +□|表<裏| → |表Tmp, 32k で、real < -1) + → +0.001 を式に挿入 & 演算の順番を変更 (sbbrushfig, sbanimfig) + ■scanpaint ルーチンを介さず、直接fillline ルーチン を呼んだ方が効率的では? + paintframe 全体マップが必要な'グラデ塗り円外' の場合分けが必要となる + バケツ塗りでも、scanpaint が必須なので現状通り +□[Bf塗りの場合、x,y それぞれの繰り返し数を設定可能にする +□line系 & Ntatall の場合は、ブラシを進行ベクトルに向けて回転変形させる + カットブラシに対する基準角度を任意で設定可能にする +□line系 & continue の場合は、ブラシをビットマップストローク・ブラシに変形 + x,y それぞれの繰り返し数を反映できるようにする + + + +■|源| メニュー名称&並びの整理 色 |表画|裏画|Undo|Tile|Dist|Grad|Patn|PtCy|Brsh|Bfig|AniB|Afig ↓ - 色 /網 |裏画/Undo/下画/転写|Grad| [] | []c| [B | [Bf| [A | [Af + 色 |網 |裏画/Undo/下画/転写|Grad| [] | []c| [B | [Bf| [A | [Af + 色|網|裏/戻/下/離|[]|[B|Bf|[A|Af| | | | | | | | |階|特 sbinktype = (sbfill,sbmae,sbura,sbtemp,sbtile,sbsita,sbgrad, sbpatn,sbpacy,sbbrush,sbbrushfig,sbanim,sbanimfig) ↓ sbinktype = (sbfill,sbtile,sbura,sbtemp,sbsita,sbdist,sbgrad, sbpatn,sbpacy,sbbrush,sbbrushfig,sbanim,sbanimfig) -■[Dist] を [下画],[転写] に分ける。 + +■対象元[表画] 機能確認 point(x,y) と point(x,y) の効果となり、意味がない? + → 削除。表画の[inc],[dec]は、一旦コピーした先を参照先として行う +■[Dist] を [下画],[転写] に分ける → [Dist] 選択は、直接参照先を指定するようにする + □現在の指定が'参照先','参照元'なのか明示する ■[下画],[転写] で、参照元・参照先の二つのカーソルを表示 +□|Grad| に追加 + □paint_scanline ルーチンで、始点,終点の色を拾得して始点-終点グラデ + □paint_scanline ルーチンで、始点,終点の色を拾得して始点-Maxcolor-終点グラデ +□| []c| を廃止して、| [] | のメニューで選択できるようにする +□|[]| メニューの検討 + □基本の描画方法を選択できるようにする + □screen axis: 画面の位置を基準にしてタイルを並べる(デフォルト) + □brush axis : タイルを並べる基準となるのが、描画を開始した位置 + □paint brush: タイルパターンを筆定義パターンとみなして描画 +□| [A | (アニメカットブラシ)選択時、アニメブラシのカットフレーム数を選択可能にする + + + +□|効| メニュー名称&並びの整理 + 通常|平均|比明|比暗|差絶|加算|減算|乗算| inc| dec|Tone|scrn|Wr-B|AlpB|Over|Undr + +■| inc| dec| でブラシ側の色が +1, -1 されている + → 画面側の色を +1, -1 されるように修正 + + + +■|mk| メニュー名称&並びの整理 + Sp|Cr|Iv|bc|bD|bA|Ok| ? ↓ + sp/反/無|bA/bD/無|ok| ? + +■裏画面マスクの動作が逆では?(現状 0 がマスクされる) + → 逆にした。(マスク反転して転送では手間が増えるため) +■裏画面マスク-デジタルでの挙動が変。maxcolorのみがマスク + → プログラムミスを修正した(sysbrush.inc) +■裏画面マスク-アナログでの挙動が変。[比較明]が効かない、マスク対象でも描画される + → プログラムミスを修正した(sysbrush.inc) +□裏画面マスクに、|bX| を追加。maskに応じてオーバーレイ、アンダーレイの切り替え + □メニューに空きが無いので、|ok| を削除? +□裏画面マスクをZバッファとみなして重ね合わせをコントロール +□paintframe を裏画面に転送する機能があれば便利か?検討 + ペイントした領域を(undo で復帰させた画像にたいして)反転マスクとして利用 + (要は、マジックワンド範囲選択のような使い方) + ・新規転送(新規マスク範囲) + ・裏画面とOR合成(マスク範囲に追加) + ・裏画面から減算(マスク範囲から除外) + + +□|対| メニュー名称&並びの整理 + OFF |Cycle/ |Place|Centr|X -fp|Y -fp|XY-fp| Tile| 千鳥| 市松|x分割|y分割 + OFF :| 点対( /中心)|x-fp /y-fp /xy-fp| Tile/x千鳥/y千鳥/ 市松(x /y ) + +■|中心)選択で、[座標中心に復帰]を兼ねる + → positionchenge ルーチンを追加した +□エッシャーパターンを追加 + http://www.randmax.jp/escherpattern/ +□エッシャーの反転タイリング(モーフィング)を追加 + https://plaza.rakuten.co.jp/nakabisya/diary/201305110001/ + https://toyokeizai.net/articles/-/8776?page=2 + + +|⇒| TOOL-Morph メニューの検討 +□menu1: +□menu2: +□menu3: 線型 |放物線| Trail| Step / + + + + □ラインオプションで、N_Total の分割点ごとにエフェクトルーチンを呼べるようにする @@ -124,21 +470,21 @@ paint □先に、カットブラシでの sbbrushfig ルーチンを実装したほうが楽かも □アニムブラシでの sbanimfig ルーチンを実装 □[C_inc],[C_dec]モード時に、ブラシの拡大縮小 - □トゲを交互に + □角度をもったトゲを交互に □ツルマキの発生 □二分木の再帰図形 - ○多角形 ■di=0 の次のパラメータは何? → 回転角だった ■[正多],[星] で、回転角をマウス選択(or 数値入力)できるようにする - → 数値入力のまま(ツール・モーフィングのため) + → 数値入力のまま(TOOL-Morph のため) □di=0 のパラメータは、右回り 左回り のブーリアン型にして誤入力を防ぐべきか? □[自由]の追加 + TOOL-Morph を考慮すること □di=0 のパラメータを、[自由],[正多],[星] にも適用 - → 数値入力として、ツールモーフに対応させる + → 数値入力として、TOOL-Morphに対応させる ■バラの選択時、外円径を選択すると、外円径が0になるバグ → select の until → repeat 後に offbutton を追加 ■いつのまにか外円径が0になるバグ再び @@ -151,7 +497,7 @@ paint ○多角形ペイント □[自由] 、[正多]、[星]、メニューの追加 - + TOOL-Morph を考慮すること □[円],[楕円] で、右回り 左回り のパラメータを追加、 □[円],[楕円] で、回転角をマウス選択(or 数値入力)できるようにする @@ -159,53 +505,8 @@ paint □現在共有しているselectlinestyleを、line,curve,box と分ける必要がある -□筆形状カットブラシ[] → パターンブラシ[] に変更 - (筆ルーチンを利用したカットだと15X15になっていてタイルペイントがいまいち) -○パターンブラシ[] 選択時 - □全角文字選択の削除 - □2色タイルパターンの選択を追加(IFFファイル) - □3色タイルパターン生成の選択を追加 - □パターンの選択を追加(IFFファイル) - □パターンの選択(IFFファイル)で、アニメパターンへの対応 - □パターンの編集 - □ファイルから選択した文字列をアニメパターンとする -パターンブラシ[Patn] 選択時 - □[PtCy] を廃止して、[Patn] で選択できるようにする - - - -□グラデ塗りに、ベベルパターン(外形線より一定のグラデ)の追加 -□グラデ塗りに、cyclic 循環数の設定 - - - -○カットブラシ[B -□選択時の[文字列]の削除? - □ファイルから選択できるようにする -□現状、ems にコピーされてるブラシの数を1から複数選択可能にする - DeluxePaint のように、スペアブラシで十分? - □ブラシ→スペアブラシ間で変形アニムブラシ -□通常、not0、に追加「fix and Overlay/Underlay」 - 裏画面マスクに応じて、自動fixscreenした画像とブラシをOverlay/Underlay切替 -□対象元[Bfig] の場合、line系では、ブラシを進行ベクトルに向けて回転変形させる -□ブラシ変形モードを追加(x_flip,y_flip,x_bend,y-bend,拡大縮小回転,四隅自由変形,...) - 変形したブラシに新たなバッファを割当てるとバッファオーバーの可能性有 - → 変形フラグと変形座標のみで、いちいち毎度に変形させる。 - □ブラシ変形をアニムブラシに変換 - -□カットブラシ[B を、[回転・拡大・縮小・アニメ]に対応させるまでの暫定策を検討 - (回転だけなら、すでに渦潮が [utrans2 (かなり複雑なオプション)] にある) - → [回転・拡大・縮小・アニメ] に特化した別ルーチンを [utrans2] に用意 - - - -○アニメカットブラシ[A 選択時 -□アニメブラシのカットフレーム数を選択可能にする - - - -□ライトテーブル back2のフレーム番号を固定に切り替え可能に +□|塗| で、バケツ塗り と ブラシ塗り(グラデーション用途) を選択可能にする @@ -225,6 +526,7 @@ paint → temp_gridx, temp_gridy で、前回の選択を記憶する ■あらためて動作確認すると、グリッドがズレる → fmmouse.pas: x-(x mod gridx),y-(y mod gridy) に変更 + ■sWap push0 を追加 key[w] ■カーソルキーで、色・タイルパターン・筆の切り替え ■エミュのマウスホイールを↑↓に割り当てられるのを考慮して検討 key[→] max_number key[←] min_number @@ -243,22 +545,41 @@ paint Key[PU] 色pset +1 Key[PD] 色pset -1 + ○Usr1 -■メニュー名称&並びの整理 - → 水引 /ボケ /砂目 |滲み |cycle|流線 /流蔓 | +□メニュー名称&並びの整理 |水引 /ボケ /砂目 |滲み |cycle|流線 /流蔓 | + → 水引/ボケ/砂目|blot|cycl|grad|集中/射光| + □ブラシ形状に依存している筆ルーチンに、ブラシ選択メニューを追加 □cycle で、[Ctdec=(全長)],[Ctinc=(全長)],[全長] -■Hair で、[dec] の名称を [全長] として、現在値も表示 -■BRUSH.PTN の0-7の順番を逆にしたことでの不具合を修正 - ■SYSBRUSH.INC での該当ルーチンも修正 -□Hair で、total ごとに蔓を巻かせる -□Hair と Usr2 rope を統合? +□|grad| 画面を paintframe に転送して、ペイント・ルーチンを呼ぶ +paintframe をクリアしないで、色々塗りを試行錯誤可能に (DigiPaint3 での Undo Redo) + むしろ、グラデ塗り専用ルーチンでもイイのでは? + □cyclic 循環数の設定は、こちらのみのルーチンで検討 + □GRAD2.pas との住み分け + □画面を スキャンラインした結果を paintframe に転送 + □画面 ← paintframe + □グラデ塗りに、ベベルパターン(外形線より一定のグラデ)の追加 + □paintframe を Y-scanpaint + ○Usr2 -■rope 描画モードの Over と Under を切り替え(描画途中でも、キーで切り替え可能に) +□メニュー名称&並びの整理 + 流線/流蔓/ひも/鎖 |水流|煙 |火炎|電撃|雨雪|雲 |星 |岩石|草葉|花 | + → 索/蔓/紐/鎖|水|煙|火|電|雨/雪|雲|星|石|草/葉/花| + +□|流蔓|の検討 + ■[dec] の名称を [全長] として、現在値も表示 + ■BRUSH.PTN の0-7の順番を逆にしたことでの不具合を修正 + ■SYSBRUSH.INC での該当ルーチンも修正 + □total ごとに蔓を巻かせる + □|流蔓| と ひも を統合? + □一定間隔で、枝を発生するツタ + +■|ひも| 描画モードの Over と Under を切り替え(描画途中でも、キーで切り替え可能に) → 結局、Under の場合は、fixscreen を参照するようにした 自動fixscreenをやめて、手動fixscreenにした(任意の時点でコントロールできる) autoscreen がキーバッファをクリアするため、同等のルーチンを組み込んだ @@ -269,13 +590,37 @@ paint □スクリプト(pset,line,curve,...)をロードして、自動描画に対応 □スクリプト内の座標を変形させてのアニメーション -□一定間隔で、枝を発生するツタ +□|煙| の再検討 + 現在の円半径増加方法を変更 + □最小、最大半径を設定可能にする + □最初の座標からの距離に比例して半径を増加させる + 現在の描画方法を変更 + □加算 or inc で描画 + □円内の粒子密度を正規分布にする。粒子数を設定可能にする + 現在の描画方法に追加 + □セル画風(Amiga_16color パレットのうち3色) + http://www.geocities.jp/popqjp/Tips/Smoke01.html + http://www.geocities.jp/popqjp/Tips/Smoke02.html + +□|電撃| UFRACTAL 放電 の 簡易&マウスで座標指定バージョンとして実装 + ボカシ処理、残光処理は別プログラム(UEMSOP, UFILTER)にまかせる + ■中点変位法法による再帰分割アルゴリズム + ■arctan関数では、-π/2〜π/2までなので、場合わけが複雑 + https://detail.chiebukuro.yahoo.co.jp:443/qa/question_detail/q1423819324 + → θ = 2*arctan(b/(√(a^2+b^2) + a)) を使う + □中点からの乱数での変位量、再帰レベルを入力可能にする + □筆を四角として描画。大きさを変更可能にする + □box, circle, ellipse に対応 + □ランダムに分岐枝を発生させる頻度と再帰レベルを設定可能にする + ■アニメ対応: 単純繰り返し(固定点で実行の繰り返し) + □アニメ対応: 単純移動(ラインの始点・終点を移動しながら実行の繰り返し) + □アニメ対応: ピンポン移動 -□ビットマップストローク・ブラシの検討 +□|葉| の検討 + □ゆらゆら揺れるアニメーション + 親子関係をつけて根元側ほど低周波、先端ほど高周波で揺らす + http://www.geocities.jp/popqjp/Tips/Snake/ChildAndParents.html -□画面0を paintframe に転送して、ペイント・ルーチンを呼ぶ - □GRAD2.pas との住み分け -□画面0を スキャンラインした結果を paintframe に書き込み、ペイント・ルーチンを呼ぶ ----------------------------------------------------------------------------- @@ -288,15 +633,22 @@ paint 極座標変形で、スクロールアニメを参照して検討すること +□正三角形の線分120度2回転によるタイリング -□線形変換ルーチンを再検討 (UTRANS → s\vect.pas) - - - - -□UMAPPING.PAS に追加。TimeDisplace 時間置き換え After Effectsのエフェクトを参考 +□gradater.pas を変更。メニューによって処理を選択、8方向はテンキーに合わせる + □グラデ範囲の幅を指定可にして、その両側を 0,maxcolor に塗り分ける + □ワイプアニメ用マスクとして使えるように幅移動をアニメ化 +□GRAD2.pas(自動グラデーション) を変更 + □距離0の点のグラデ処理を色指定可能にする(0:現状) + ■グラデーションModeを追加。 3: →1← + □グラデーションModeを追加。 スキャンラインごとのmax,minをプリスキャン + □グラデーションModeを追加。 中心グラデ + グラデ中心: 画面中心(プリセット),入力,paintframeを全スキャン + □画面0を スキャンXラインした結果を paintframe に書き込み + □画面0を スキャンYラインした結果を paintframe に書き込み + □UFILTERカテゴリへ移動 ■かごめルーチンを検討 (upatgen2 → s\pt5.pas) @@ -345,6 +697,9 @@ paint □核二等分線より単純距離グラデーション・モード(ドロネー三角形分割) → 実装をあきらめた。替わりに「膜より一定距離で maxcolor->0」を実装 □アニメ対応 核回転, 核単振動 + □アニメ対応 布が波打つアニメーションのようなもの + http://blog.higashisanmyaku.jp/?page=6 + https://imgur.com/gallery/rEmclsS □アニメ対応 ランダムウォーク 要素の総和が0となる配列x,yをn個用意。乱数で要素をシャッフル カウント数 mod (n+1) で、適用する細胞を選ぶ @@ -376,7 +731,7 @@ paint fix0を変換行列とみなして、画面1を変換 画面分割サイズに応じてスクロール -□放電ラインの実装。PSTに組み込むのをやめ、UFRACTALのカテゴリに +□放電ラインの実装。PST Usr2 |電撃|とは別物をUFRACTALのカテゴリに AfterEffect での稲妻パラメータ http://aep-effects.com/category1/category27/entry46.html ■中点変位法法による再帰分割アルゴリズム @@ -410,6 +765,9 @@ paint / → /\ 数本の色をmaxcolorで残してから、3X3ボカシの適用 +□diffuser.pas で、端に色がかかっている場合にゴーストが出る + □画面外の取り込みを端から延長した色にて処理する + ■レリーフ(dif.pas)を削除(3X3 畳み込み演算フィルタで十分?) ■修正して、gradater.pas or dither.pas に再組み込みを検討 → dither.pas に組み込んだ @@ -420,19 +778,57 @@ paint → dither.pas に組み込んだ ■dither.pas を変更。それぞれの処理をモードで選択するようにする ■それぞれの処理の参照を画像1にするよう変更 - -□gradater.pas を変更。メニューによって処理を選択、8方向はテンキーに合わせる - □グラデ範囲の幅を指定可にして、その両側を 0,maxcolor に塗り分ける - □ワイプアニメ用マスクとして使えるように幅移動をアニメ化 + ■2値化 ランダム+ パターン の場合、色0をスキップする + ■AGRAPH2.PAS に追加した、組織的Ditherパターン配列に合わせて処理を追加する + Dither(Bayerパターン), Dither2(網点パターン), Dither3(渦巻パターン) + ■AGRAPH2.PAS のDITHPLOT(Bayer限定)を呼ぶのをやめて、自前で処理する + ■'2値化 ランダム' の場合、閾値を入力可能にする ■色0をスキップする ■edge.pas を変更。8方向はテンキーに合わせる ■iir.pas を変更。8方向はテンキーに合わせる +□edge2.pas を追加。任意の幅で、画像の縁取りと縁取りボカシを行う + ■hscopy(1), 近傍1(3X3)で、point(x,y+200)の加算>0 ならば指定カラーをpset + 指定カラーのデフォルトは maxcolor + 元画像の外側縁取りのみ残す + push(0), hscopy(1), cls(0), exe, pop(0), picop:move-'not0 to mask0' + 元画像の内側縁取りのみ残す + push(0), hscopy(1), cls(0), exe, pop(0), picop:move-' 0 to 切り取り' + □実行回数を指定可能にする + □指定カラーから回数ごとに color := color-1 (ただし、color > 0) + □指定カラーから回数ごとに color := color+1 (ただし、color <= 15) + □指定カラーから回数ごとに color := color*(1-回数/総回数) + □指定カラーから回数ごとに color := color-1, 1, color+1 の繰り返し + ■近傍(3X3)がスクリーン座標外の処理の変更(現状:0を返す) + → '近傍の値を代入'する処理に変更 + ■[T] トリミング処理を追加 (0..maxcol → maxcol, 0 と見なして処理) -□正三角形の線分120度2回転によるタイリング + +○UTRANS +□vect.pas 線形変換ルーチンを再検討 + + + + +○UMAPPING +□'TimeDisplace(時間置き換え)' を追加。 After Effectsのエフェクトを参考 + +□'Wave Map(減衰振動)' W-MAP2Z.pas を再検討 + ■scan実行で、runtime error 200。Animate実行では問題なし + → iii, fnr に初期値が代入されてなかった + W-MAP1Z.pas, W-MAP3Z.pas も細部修正した + ■reflection(屈折による歪量)を後から入力可能にする + W-MAP1Z.pas も変更 + ■'データファイルの書式'のヘルプをつける + W-MAP1Z.pas, W-MAP3Z.pas も変更した + □W-MAP1Z.pas と W-MAP2Z.pas の統合 + +□'Wave Map 3' W-MAP3Z.pas を再検討 + ■Depth(写像の回数)を後から入力可能にする + @@ -467,6 +863,8 @@ paint □あらたに masK OP を追加して、境界のボカシ等を追加 ■[M] effect Moveに追加。-90°回転(トリム) ■emsop の[M] effect Move anim も合わせて変更 +■[M] effect Moveに追加。Over/Under(相手が0の場合はそのまま)+平均 + ■emsop の[M] effect Move anim も合わせて変更 ■テンポラリ画像ファイルの入出力 to dark, to light は、削除(copy&effect の dec not0, inc not0 で代用) ■「パレットを明度順に並び替えて、色ソート」が不自然な結果になる @@ -476,8 +874,25 @@ paint ■トーンカーブ処理を追加。背景の0に影響を与えずに処理 ■UFILTER.PAS より トーンカーブ を削除 ■Amiga DigiView の色配置を明度順に変更するルーチンを復活した - □TIC-80 の色配置を変換 デフォルト ←→ 明度順 - +■PALOP.PAS に、TIC-80 のパレットを追加 +■PALOP.PAS の、サンプルパレットの名称変更 +□PALOP.PAS の、[D] が簡易版のため、'PAL\*.PAL'以外のディレクトリマスクが選択できない +■[4] pic ->frame [5] pic<- frame を追加 + ■アニメframe の任意の二枚を差し替えれるようにする + → swap frame を追加するより、swap push0 のほうが汎用的 + ■[W] sWap push0 を追加(frame320toframe0 も FRAMELIB.PAS に追加) + emstoframe320(0,(2+1)*animofset+1); + scrntoems((2+1)*animofset+1); + frame320toframe0(0); +■[J] swap page を追加 +■[O] dest[=] として、[=]の場合は destination := source; (上書き準備) +■[A] MAG画像のロードルーチンを削除 +■paint で、[6],[7] をアニメ関連で使用するため、裏画面関連とtemp画像関連キーを変更 + [.] ->page1 [,] <- page1 + [>] ->tmp_file [<] <- tmp_file + ■PGLOBAL.PAS animscreenルーチンも変更 +■[M] effect Moveに追加。組織的ディザの配分による合成 + ■emsop の[M] effect Move anim も合わせて変更 ○EMSOP @@ -495,11 +910,19 @@ paint ■UFILTER.PAS より スリット加工 を削除 ■[M] effect Move x-flip が不具合。ソース整形時、picop に合わせたためにエンバグ → scroll, trim scroll, x-flip, y-flip を修正した +■[4] pic ->first → [4] pic->frames に変更。範囲指定できるようにする +■[X] eX color OP を追加 + ■[%] 16 ->8color [#] swap 8color を eX color OP へ移動 +■[O] dest[=] として、[=]の場合は adestination := asource; (上書き準備) +■[M] %: srol(%) を追加。総移動量と見なしてanimframeごとの移動量を増加させる + ■picop の[M] effect Move anim も合わせてメニューのみ変更 +■[M] effect Moveに追加した'組織的ディザの配分による合成' を、閾値を変化してアニメ + ■WIPE.PAS の方に追加。dissolve(組織的ディザ: Bayer 配列) - +------------------------------------------ ease:インとアウトをなめらかに linear:一定 diff --git a/submenu.png b/submenu.png new file mode 100644 index 0000000000000000000000000000000000000000..7430ebc25cc4026831eab119b1656ccab0e08272 GIT binary patch literal 32883 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 literal 0 HcmV?d00001