// source.txt // 8x8キャラ用のクリッピング関数。クリッピング範囲は画面いっぱいの(0,0)-(239,127)。 // いつも使っているライブラリの改造なので完全オリジナルではありません。転送部のこと。 // x,y,h:そのまんまの意味。 // src1,src2:元画像。明部と暗部の2つ。 // dst1,dst2:転送先。上に同じ。 // // xlshift:転送先のひとつのlongに合わせる為のつじつまあわせ。 // revm:はみ出した部分のためのマスク。 // offset:転送先の先頭アドレスからのオフセット。 // rdst1,rdst2:rdst=dst+offset。 void KCGSprite08M(short x,short y,short h, unsigned char* src1,unsigned char* src2, unsigned char* msk1,unsigned char* msk2, void* dst1,void* dst2) { register unsigned short xlshift; register unsigned char revm=0xff; register long offset; register long rdst1,rdst2; if(x>-8 && x<240 && y>-h && y<128){ if(y<0){ src1-=y; src2-=y; msk1-=y; msk2-=y; h+=y; y=0; } if(y>128-h)h=128-y; xlshift=24-(x&15); offset=(y<<5)-(y<<1)+((x>>3)&0x1e); rdst1=(long)dst1+offset; rdst2=(long)dst2+offset; if(x<0){ revm>>=-x; xlshift=24+(-x&15); } if(x>232)revm<<=(x-232); for(;h;h--,rdst1+=30,rdst2+=30){ *(long*)rdst1&=~((long)(~((*msk1++)|(~revm))&0xff)<>10して使う。 // xsx,xsy:nxの増加方向。 // ysx,ysy:nyの増加方向。 // nx,ny,ox,oy:dst、srcの(x,y)。 // // TIの電卓に集う男たちが今日も悲壮なデスマ顔で背の高い開発の壁を乗り越えてゆく。 // 睡眠を知らない心身を包むのは、3日目の洋服。 // 少しでも遅くしないように、期待できない最適化に頼らないように、 // とりあえずregisterをつけるのがここでのたしなみ。 // GCC for TI calculator。ここは、低レベルの園。 // // すいません、適当にregisterとかやってます。意味は無いと思います。 // でもアセンブラのソースを見たら一応レジスタで計算していたようなのでよしとしよう。 // 最適化でそうなっているだけのことですか、そうですか。 void KRSprite16(unsigned short *src,unsigned short *dst,short theta,char color) { register short cr=ksin2[(theta+64)&255]; register short sr=ksin2[theta]; register short xsx,xsy,ysx,ysy; register short nx,ny,ox,oy; xsx=cr*(-7)+sr*(-7)+(7<<10); xsy=-sr*(-7)+cr*(-7)+(7<<10); ysx=xsx; ysy=xsy; for(ny=0;ny<16;ny++,ysx+=sr,ysy+=cr,xsx=ysx,xsy=ysy){ for(nx=0;nx<16;nx++,xsx+=cr,xsy-=sr){ ox=xsx>>10; oy=xsy>>10; if(ox>=0 && ox<16 && oy>=0 && oy<16){ if((*(src+oy)&(1<<(15-ox)))!=0) *(dst+ny)|=(1<<(15-nx)); else *(dst+ny)&=~(1<<(15-nx)); } else{ if(color!=0) *(dst+ny)|=(1<<(15-nx)); else *(dst+ny)&=~(1<<(15-nx)); } } } }