CSK.Blog--个人原创Weblog

MMX指令优化的32bit AlphaBlend

前一段时间再进行一个目前保密的项目:Prototype A (哈哈,知道的人不要说阿)

其中需要较高的运行效率,所以就写了一个将32bit位图渲染到目标32bit位图的AlphaBlend。支持Alpha通道。

代码指令参照了http://dev.gameres.com/Program/Visual/2D/mmxaddalpha.htm提供的代码,在此表示感谢。由于第一次写汇编优化。所以不知道这样写是不是最高效的。

如果对位深没有要求,可以采用intel提供的16bit的alphablend,网上很多了,这个号称是目前最快的.

参数:

pDest:目标渲染buffer,32bit的,通道情况:ARGB

wlined:pDest的扫描线宽(即横向的像素个数,即实际宽度/4)

hlined:pDest的扫描线行数,可以理解成实际高度

startX:pDest的开始坐标X

startY:pDest的开始坐标Y,采用倒置坐标系

pSrc:要渲染得图片,通道情况:ARGB

wlines,hlines和前面类似

Alpha:对pSrc做得整体alphaBlend,0-255级

返回:

如果图片得到渲染,返回TRUE

用在Prototype A中效果还好,采用GDI渲染一个100*100的图片可以有1000fps*

代码:

BOOL AlphaBlt(BYTE *pDest,DWORD wlined,DWORD hlined,int startX,int startY,BYTE *pSrc,DWORD wlines,DWORD hlines,DWORD Alpha)
{
 int Xd,Yd,Xs=0,Ys=0;
 int loopH,loopW;
 if (startX>=(int)wlined) return FALSE;
 if (startY>=(int)hlined) return FALSE;
 
 if (startX + (int)wlines <=0) return FALSE;
 if (startY + (int)hlines <=0) return FALSE;
 
 Xd = startX;
 Yd = startY;
 loopW = (startX + wlines);
 loopH = (startY + hlines);
 if (loopH>hlined) loopH = hlined;
 if (loopW>wlined) loopW = wlined;
 if (startX<0)
 {
  Xd = 0;
  Xs = -startX;
 }
 if (startY<0)
 {
  Yd = 0;
  Ys = -startY; 
 }
 
 DWORD factorA = hlines-Ys+Yd-1;
 for (DWORD j= Yd ; j< loopH ; j++)
 {
  DWORD dwOffSrc,dwOffDest;
  dwOffSrc = (factorA-j)*wlines;
  
  dwOffDest = (hlined-j-1)*wlined;
  DWORD srcPosX = Xs;
  for (DWORD i = Xd ; i< loopW ; i++)
  {
  
   BYTE *BufSrc = pSrc + (dwOffSrc + srcPosX)*4;
   DWORD dwSrc =((DWORD)BufSrc[3] << 24) |((DWORD)BufSrc[2] << 16) | ((WORD)BufSrc[1] << 8) | (BufSrc[0]);
   DWORD *dwpDest = (DWORD *)pDest + dwOffDest + i;
    __asm{
     pxor mm2,mm2

     mov edx,dwpDest
     movd mm0,[edx]
     movd mm1,dwSrc
     punpcklbw mm0,mm2
     punpcklbw mm1,mm2

     movq mm3,mm1
     punpckhwd mm3,mm3
     punpckhdq mm3,mm3

     movd mm4,Alpha

     punpcklwd mm4,mm4

     punpckldq mm4,mm4

     pmullw mm3,mm4 //Alpha * SrcAlpha
     psrlw mm3,8

     movq mm4,mm0

     movq mm5,mm1

     psubusw mm4,mm1

     psubusw mm5,mm0

     pmullw mm4,mm3

     pmullw mm5,mm3

     psrlw mm4,8

     psrlw mm5,8

     paddusw mm0,mm5

     psubusw mm0,mm4

     packuswb mm0,mm0


     movd [edx],mm0 //保存结果

     emms

   }


   srcPosX++;
  }
 }
 return TRUE;
}

写了个Tiger语言的IDE

编译大作业下周就要检查了,所以最近一直在完善它。不过我没时间去做真正的代码生成了,不过就目前做的东西总觉得太傻了些,所以今天集中精力写了下面这个东西:

功能和特点:
>源代码语法上色
>直接编译
>随意切换编译器
>产生图形化语法树(就是PrettyPrint)

IDE里面包括我写的tiger编译器,所以IDE可以直接运行,点击exec.bat即可
除了tiger编译器,我把IDE的所有原代码都放在一起了。 也可以把你写的编译器用于本IDE,而且不用修改任何代码也不用重新编译,只要把你编译
器的类路径放在本IDE目录下的配置文件里面,详见readme IDE会把Sytem.out.printf这类的输出,即stdout和stderr显示在ide环境里面,好比是cl
和vc ide关系

写的很匆忙,有bug多多包涵~

校内
ftp://Great_csk:public@public.sjtu.edu.cn/public-files/TigerBoxv1_csk.rar
校外:
http://www.csksoft.net/data/legacyftp/Products/APP/TigerBoxv1_csk.rar

2007的第一个作品,一个crack

昨天2006.12.31得知学校comic采取了条措施:一定要安装SJTU自己的windows自动更新服务才能访问网站内容。

我第一反应就是:流氓软件...

其实不是这样,SJTU的自动更新服务只不过是一个配置脚本,不过对于win9x和linux用户那样做也太过分了些..

所以一时兴致,写了这个伪装更新服务去完成所谓的“激活”的操作:

虽然comic的做法我很理解,但未必有些霸道,希望这个程序能给各位更多选择。

由于最近要为demo sence开发作准备,所以今后的crack程序都带有mod音乐

这次的是:floppi&zalza的snowballs_with_attitud

唉,希望今后老弟来提供给我音乐...

程序和代码:


http://www.csksoft.net/data/legacyftp/Products/Crack/ComicCracker.rar


http://www.csksoft.net/data/legacyftp/Products/Crack/comic_cheater_src.rar

[开源]抽象语法树图形化显示程序

最近在做编译大作业需要将语法翻译好的抽象语法树(Abstract Syntax Tree)显示出来,教材使用了ANDREW W. APPEL的Modern Compiler Implementation in Java一书。

看过的人都知道其中要求将他定义的一种叫做tiger的语言先翻译成一棵抽象书,我们的大作业就到此为止,至于将这颗树显示可以采用作者提供的print.java以文本展现出来,也就是这样:

LetExp(
DecList(
TypeDec(myint,
NameTy(int),TypeDec(arrtype,
ArrayTy(myint))),
DecList(
VarDec(arr1,
arrtype,
ArrayExp(arrtype,
IntExp(10),
IntExp(0)),
true),
DecList())),
SeqExp(
ExpList(
varExp(
SimpleVar(arr1)))))finished

不过这样难免和我们直观的语法树理解差太远了,于是我就写了个程序,效果是这样的:

自认为还不赖,程序和原有的print.java类似,直接接受抽象树根节点,你再指定给他保存到的图片文件名和保存的格式就可以了。

我将源代码公布在下面,如果大家需要也可以用来玩玩^_^

下载地址:

公网:http://www.csksoft.net/data/legacyftp/Products/code_and_lib/PrettyTree_BY_CSK.rar

教育网:ftp://great_csk:public@public.sjtu.edu.cn/public-files/PrettyTree_BY_CSK.rar

说明:

作者保留源代码的著作权利,可以在不修改删除作者信息的前提下任意使用和分发。作者不对由于本代码产生的问题负责

代码采用SWT库开发,请将swt.jar以及相关的系统相关库文件复制到程序的根目录

使用例子:

package XTiger.parsersys;
import XTiger.parsersys.Absyn.Print;
import net.csksoft.PrettyTree.*;
public class Main {

public static void main(String argv[]) {
String filename = argv[0];
Parse myXParse = new Parse(filename);
if (myXParse.absyn !=null)
{
System.out.println("parse succeed");
System.out.println("Dump Trees");
System.out.println("Please Wait...it takes time :-)");
TreeMaker myTree=new TreeMaker();
myTree.renderToFile(myXParse.absyn,"dumpedTree.bmp",0);
System.out.println("finished");
myTree.dispose();
}
}

}

由于采用了SWT库,所以必须显式调用TreeMaker.dispose释放资源,否则将可能导致系统崩溃。

函数:renderToFile(absyn.Exp e,String destFile,int Type);

Type = 0/bmp 1/jpg 2/png

已知问题:在编译较大程序,比如queen.tig时候,由于产生的语法树图片过大会产生heap溢出异常。

有很多事情要交待~

首先是推荐老弟的新作:Angel Fall (Original Mix)。本Blog的周二进站音乐便是这首。不错的

明天就要真正意义上结束这个暑假开学了,其实对我来说只是休息了1周又重新上课...CS本学期在8.5号就开学了...回想一周前还是满脑子飞的EZ-UML、答辩、头脑秀逗得老师、GeneralLinkableXXXXX(为了保护小组各成员不至于再度发疯,部分字符已用XXX表示),这学期真的算不了什么。

下面是我最想说的

Flash Website v2

项目开工:2005.7.10

起因:我对我自己Flash网站v1的强烈不满

过程:想出了个ReformCore概念,设计了新的logo,弄来了嵌入式编译器

目的:制作更漂亮、更人性化、更加符合我审美的新Flash网站(后期加上的目标:符合web2.1)

结果:由于当时暑假考驾照,网站把ReformUI的雏形完毕即告流产

复工:2006.1.x

原因:放寒假了,没事可做

过程:完善ReformUI

结果:由于每天要赶早去徐汇上GRE,同时PRP项目在身,项目搁浅

复工x2:2006.7

原因:实在看不下这个难产的项目了+原先的设计不符合当前审美

过程:重新设计界面+开始写主要构架

结果:主要构架完成,但明天要开学了...

项目截至今天已经超过一年的建设时间了...天哪~

为了逼自己去完成这个项目,现把一些内部代码资料公布...

我不做解释,大家看情况理解吧~

mainsite.obj_main.AddBlock("test");

CreateWindow("GraphWin",40,50,true,Script_win);
GraphWin.SetClientSize(300,300);
GraphWin.SetWindowText("DoModal测试");

CreateUIHost(this,"obj",33);
obj.SetHostSize(1440,1000);
obj.StretchPic(false);
obj.CompleteLook(false);
obj.ShowBorder(false);
obj.LoadObject("http://www.csksoft.net/data/dawnofReform.jpg");

CreateWindow("OldSiteWin");
OldSiteWin.SetWindowText("以前的Flash网站-CSKSOFT WEBSITE v1 All right reserved");
OldSiteWin.SetWindowSize(753,580);
OldSiteWin.Attach("/fla/main.swf",true);


CreateWindow("win2");
win2.SetWindowText("PicWindow");
win2.SetWindowSize(500,350);
win2.Attach("http://www.csksoft.net/data/dawnofReform.jpg",true);
win2.container.objhost.SetLinkURL("http://www.csksoft.net/data/dawnofReform.jpg");

CreateWindow("rwin");
rwin.SetWindowText("外部组件调用");
rwin.SetClientSize(250,150);
rwin.Attach("fla/load_test.swf",true);

CreateUIHost(this,"obj",33);
obj.SetHostSize(250,150);
obj.LoadObject("fla/load_tedst.swf");

i=100;
t = setInterval(script, 10,
 "if (i<=0) {clearInterval(t); t = undefined;}msgout(i);i--;",
 this);

dwColor =  0x1a67f4;
CreateWindow("GraphWin",50,50);
GraphWin.SetClientSize(50,50);
GraphWin.container.beginFill(dwColor,0xFF);
GraphWin.container.moveTo(10, 10);
GraphWin.container.lineTo(10, 40);
GraphWin.container.lineTo(40, 40);
GraphWin.container.lineTo(40, 10);
GraphWin.container.lineTo(10, 10);
GraphWin.container.endFill();

CreateWindow("GraphWin",40,50);
GraphWin.SetClientSize(300,300);
GraphWin.SetWindowText("绘图窗口");


GraphWin.container.createEmptyMovieClip("graph",2);
with (GraphWin.container.graph) {
    lineStyle (0, 0xFF0000, 100);
    for (x = -5; x<5; x+=0.2) {
         y= Math.sin(x)*30;
         if (x==-5)
         {
           moveTo(x*30+150,150-y);
         }
         else
         {
           lineTo (x*30+150,150-y);
         }
    }
}

 

t = setInterval(script, 500,
 "today_date = new Date();msgcls();msgout(today_date.toString());",
 this);

CreateTween(Script_win,"_x","elastic.easein",10,400,50,100);

var sXML;

sXML=XML_CreateRPCRequest("GetBlogConfig",Array("bIsMiniMode","strToken"),Array("false",GLOBAL_strTokenID));

sXML.send("/sitecmd.asp","_blank");


var myObj;
myObj = new Object();
myObj.item1 = "aaa";
myObj.attributes=new Object();
myObj.attributes.id=3;
myObj.value = "ddd";
myObj.node = new Object();
myObj.node.value="ccc";
var myxml;
myxml = new XML("");
ConstructXmlSubTree(myxml,"ss",myObj,myxml);
msgout(myxml);

//XWindow   //ReformUI.XWindow
  SetWindowSize(nWidth:Number, nHeight:Number);
  SetClientSize(nWidth:Number, nHeight:Number);
  SetWindowText(sTitle:String);
  GetWindowText():String;
  SetWindowFocus();
  GetListID():Number;
  Attach(strObjID:String, bIsFromURL:Boolean):Boolean;
  OnClose(); //CallBack
  Destroy():Boolean; //return false if refused by OnClose();
  ExpendWindow(bExpend:Boolean);
  GetWindowState(nStateID:Number);  
        //nStateID=1 :IsTransAble
 //nStateID=0 :IsExpend
  AlphaBlendWindow(bAlpha:Boolean);
  //---------------------------------------------------members
    TitleBar //ReformUI.XWindow.TilteBar
    container //ReformUI.XWindow.Container
                 var bIsObjFromURL:Boolean;
                 var bIsContained:Boolean;
                 generalObj,objhost
                 SetObj(strObjID:String,bIsFromURL:Boolean):Boolean
                 DestroyAll();
                
    BottomBarA //ReformUI.XWindow.BottomBar
    var nWindowID:Number;
    var strHostID:String;
    var nWindowHeight:Number;
    var nWindowWidth:Number;
    var bIsWindowExpend:Boolean;
    var fInterval;
  //----------------------------------------------------ReleatedAPI
    GetTopLevelWindowID():Number;
    GetWindowTopLevel():Number;
    CloseAllWindow();
    CreateWindow(strWindowID:String, nX:Number, nY:Number , bIsDoModal:Boolean , objParent);
    XWindowList:Array;
    var nXWinBoundWidth:Number,nXWinBoundHeight:Number;
    GetXWinBoundBox():Array;
    SetXWinBoundBox(nWidth:Number,nHeight:Number);

//UIHost    //RefromUI.UIhost
   LoadObject(sURL:String,bIsRes:Boolean);
   IsObjLoaded():Boolean;
   LoadPrecent():Number;
   GetObjSize():Number;
   StretchPic(bIsStretch:Boolean);
   GetObjVersion():Number;
   CustomFunction(FuncName:String, Arg1, Arg2);  //var CustomResult
   SetHostSize(nWidth:Number, nHeight:Number);
   SetHostIDTitle(strTitle:String);
   SetLinkURL(sURL:String);
   ShowBorder(bIsShow:Boolean);
   ShowDataInfo(bIsShow:Boolean);
   CompleteLook(bIsShow:Boolean);
   EnableClick(bEnable:Boolean);
   Destroy();
  //Events
   OnClick(); return false when cancel
   OnLoadComplete();
  //---------------------------------------------------members
    var HostWidth:Number, HostHeight:Number;
    var IsContendObj:Boolean;
    var ObjURL:String;
    var HostIDName:String;
    var ObjVersion:Number;
    var LinkURL:String;
    var IsShowBorder:Boolean;
    var bIsSretchPic:Boolean;
    var CustomArg1, CustomArg2, CustomResult;
    objcontainer
  //----------------------------------------------------ReleatedAPI
    CreateUIHost(strParentID:String, strHostID:String, nLevel:Number, nX:Number, nY:Number)

//TxtHolder     //ReformUI.TxtHolder
   SetSize(nWidth:Number, nHeight:Number);
   GetSize():Array;
   EnableScrollBar(bEnabled:Boolean);
   EnableEditable(bEnabled:Boolean);
   UpdateLayout();
   EnableWordWrap(bEnabled:Boolean);
/////////////////////////////////
//Not complete yet!
   LoadTxt(strURL:String, bIsHtml:Boolean, nPostMethod:Number);
//////////////////////////////////
   SetText(strT:String, bIsHtml:Boolean);
   GetText(bNeedSrc:Boolean):String;
   UpdateScrollBar();
   ClearText();
   Destroy();
  //---------------------------------------------------members
     var nSelfHeight:Number, nSelfWidth:Number;
     var bIsEnableScrollBar:Boolean;
     var bIsEnableWordwrap:Boolean;
     hbar,scrollbar;
  //----------------------------------------------------ReleatedAPI
     CreateTxtHolder(strParentID:String, strHolderID:String, nLevel:Number, nX:Number, nY:Number);

//ScrollBar   //ReformUI.ScrollBar
   UpdateBar();
   SetStepLength(nStep:Number);
   GetStepLength():Number;
   SetBarLength(nHeight:Number);  //def=100;
   GetBarLength():Number;
   SetRange(nMaxPos:Number); //startup with 100
   GetRange():Number;
   OnPosChange(nPos); //CallBack,return false for undo
   SetPos(nPos:Number);
   GetPos():Number;
   Destroy();
  //---------------------------------------------------members
     var nCurrentPos:Number;
     var nStepLength:Number;
     var nMax:Number;
     var nSelfHeight:Number, nDragLength:Number;
     var fInterval;
     var bIsStartDrag:Boolean;
  //----------------------------------------------------ReleatedAPI
    CreateScrollBar(strParentID:String, strBarID:String, nLevel:Number, nX:Number, nY:Number);

//progressBar    //ReformUI.progressBar
   SetPos(Pos:Number);
   GetPos():Number;
   Destroy();
  //---------------------------------------------------members
     var nPos:Number = 0;
  //----------------------------------------------------ReleatedAPI
     CreateProgressBar(strParentID:String, strBarID:String, nLevel:Number, nX:Number, nY:Number);

//LoadUI.MainLogo  //reformUI.LoadUI.MainLogo
   OnCancel=function() //CallBack
   OnRetry=function() //CallBack
   SetLoadCnt(ObjCnt);
   SetTitle(StrTxt:String);
   ShowCancelBtn(bShow:Boolean);
   SetFailedFlag(bShow:Boolean);
   Destroy();
  //-----------------------------------------------------ReleatedAPI
      CreateLoadUI(strParentID:String, strLogoID:String, nLevel:Number, nX:Number, nY:Number,nType:Number);
          //nType:0 for MainLogo

FlatButton   //ReformUI.Button
   SetLabel(strNewLabel:String):String;
   GetLabel():String;
   SetBtnSize(nWidth:Number, nHeight:Number);
   Destroy();
   EnableBtn(bEnable:Boolean):Boolean;
   SetLabelColor(newColor:Color);
   //Event
   OnRollOver;OnRollOut;OnMouseDown;OnMouseUp;OnClick
  //-----------------------------------------------------ReleatedAPI
      CreateButton(strParentID:String, strBtnID:String, nLevel:Number, nX:Number, nY:Number);
dragbar //ReformUI.dragbar
   SetWidth(nWidth:Number):Number;
   UpdateUI();
   SetPos(Pos:Number):Number;
   GetPos():Number;
   SetRange(nMin:Number,nMax:Number):Boolean;
   GetMin():Number;
   GetMax():Number;
   //----var
   Width:Number;
   nPos,nMin,nMax:Number;
   //----events
   UpdateUI,onChange,onDrag(x,total) //use addListener
  //-----------------------------------------------------ReleatedAPI
 CreateDragBar(strParentID:String, strID:String, nLevel:Number, nX:Number, nY:Number);

/*
url tip define:
 SubView=3&subdir...&UUID=

*/

//SiteObjs
obj:mainsite
 addProxyAlignObj(objRef:Object, strAlignType:String):Boolean //strAlignType "l","r","m"
 RemoveProxyAlignObj(objRef:Object):Boolean
 SetWidth(nWidth:Number):Number
 ParseUrlCmd(strCmd:String):Boolean
  events:
 broadcast:OnWidthChg(x:int);

obj:mainsite.obj_main
 SetBlockWidth(size:Number):Boolean
 GetBlockSize(strName:String, nID:Number):MovieClip
 RemoveBlockByID(nID:Number):Boolean
 RemoveBlock(objBlock:Object):Boolean
 OnItemSizeChg(objBlock:Object)
 GetBlockID(objBlock:Object):Number
 Display(strCmd:String):Boolean //cmd:show;hide;distroy
  events:
 broadcast:OnHolderSizeChg(size:int);

 


//End of SiteObjs
var GLOBAL_nDownloadingSpeed:Number; //kb per sec
var GLOBAL_strMainSwfURL:String;
var GLOBAL_strTokenID:String;
//BAISC
     parseBoolean(string:String) :Boolean
//API
   //Site Config Var:
     var strSiteInfo_Title:String, strSiteInfo_Version:String, strSiteInfo_LastUpdate:Date;
     var bSiteConfig_UI_EnableShadow:Boolean;
     var nSiteConfig_ScriptWinX:Number, nSiteConfig_ScriptWinY:Number, strSiteConfig_ScriptWinCnt:String,bSiteConfig_ScriptWinShow:Boolean;
     var bSiteConfig_SndEnabled:Boolean, strSiteConfig_SndSrc:String;
     var strSiteConfig_ExecScript:String;
     var nSiteCnt_DefView:Number;
     var nSiteCnt_ViewNum:Number;
     var lstSiteView_ImgURL:Array;
     var lstSiteView_ConfigURL:Array;
     var lstSiteView_IsExpend:Array;
     var lstSiteView_Title:Array;
     var lstSiteView_TitleEn:Array;
     var lstSiteView_Description:Array;
     var lstSiteLink_LnkIcon:Array;
     var lstSiteLink_LnkDest:Array;
     var lstSiteLink_LnkType:Array;
     var lstSiteLink_LnkTitle:Array;
   //
   _split(str);
   GetRandomToken:String
   CreateTween(objDestObj:Object,strEffectProperty:String,strTweenType:String,StartVal,EndVal,nDuration:Number,nFPS:Number);
   GetMajorFlaVer();
   GetQueryString(strURL:String,strStringName:String):String;
   GetSiteInfo(strInfoType:String);
 //SiteWidth;SiteHeight;SiteTitle;SiteVersion;DefSrciptTxt;LastUpdate;UI_EnableShadow
 //ScriptWinIniPosX;ScriptWinIniPosY;ShowScriptWinAuto;Snd_EnableAuto;Snd_SrcURL;
 //AutoExecScript;DefViewID;SiteViewTotal;lstViewIconURL;lstViewConfigURL;lstViewExpend;
 //lstViewTitle;lstViewTitleEn;lstViewDescription;lstSiteLnkIcon;lstSiteLnkDest;lstSiteLnkType
 //lstSiteLnkTitle
   ReadSiteConfig(ConfigXML:XML);
   CreateXMLPost(PostType:String);
   VerifyCmdResponse(SrcXml:XML);
   XML_CreateDataRequest(strDataName:String, lstInfoArg:String):XML
   SolveRPCResponseXML(xmlRawDest:XML):Object
   SolveRPCResponse(xmlRawDest:XML):Object
   XML_CreateRPCRequest2(strRPCName:String, objArgList:Object):XML
   XML_CreateRPCRequest(strRPCName:String, lstArgNameLst:Array, lstArgValLst:Array):XML
   CreateXMLPost2(PostType:String):XML
   CreateScriptWindow();
   msgout(strMsg:String);
   msgcls();
   ShowScriptWindow(bShow:Boolean);
   SetScriptTxt(strScriptTxt:String);
   XOR_Encode(strSrc:String,strPWD:String):String;
   IsScriptWindowVisible();
   CallRPC(strRPCName:String, objArg:Object, funcOnResponse:Function):Boolean;
   UpdateBrowseState(strBrowStr:String);
  
   objBrowseState.strAction
   objBrowseState.addListener
 @Event.OnBrowCmd

//Component
  ScriptWindow_core     //mov_main.ScriptWindow.Cont
-------------------------------
      SetScriptBuf(strNewVal:String)
      ClsTxt(nClsType:Number)
               // -2 clear current
               // -1 clear all
               //0 \ 1
      PostPrint(strPrintStr:String);
      SetEditorVal(strNewVal:String);
      GetEditorVal():String;
      GetBufVal(nBufType:Number):String;
      SetPostBuf(strNewVal:String);
      UpdateBuf(nBufType:Number, bSetBuf:Boolean);
      Execute(strScriptStr:String);
      SetView(nState:Number);

以上只是一些函数的原形定义,我不是要开源的,不过只要你足够敏锐,这些信息就够你做很多有趣的事了~

请不要用于非法用途和任何我不愿看到的行为


 

把CrazyBall的所有代码开源~

按照原先的计划,是因该去开源了。


已经在emsky上发布,这里也象征性的贴上来吧~

如果有可能,暑假里会把CrazyGT完成

CrazyBall.这个令我在高三差点吧高考给Crazy掉的东西

主要包括了我当时制作的所有版本的Crazyball的代码,以及原始的图片资源文件,和windows端的地图编辑器的VC工程代码。

其中还包括我编写的VC程序的通用界面库Cl的代码。


地址:ftp://FTP_visitor:visitor@ftp.csksoft.net/Public/Products/OtherOS/WQX_LAVA/crazyball_final_src_csk.rar

Crazyball

呵呵,不知今后会不会出现CrazyBall xxx修改版这种东西呢~

总之,wqx祝你一路走好

--------------------------------------

作者保留原代码和程序的版权,请在引用时注明原作者信息

ActiveX不再Active了……

标题说的有点夸张了,其实是M$的KB912945对今后IE的一些修改

据说是和专利纠纷有关,M$打算在不久后发布一个新的IE补丁,同时也将被IE7采用。这个补丁十分的荒唐:

After you install this update, you cannot interact with ActiveX controls from certain Web pages until these controls are enabled. To enable an ActiveX control, manually click the control.

大意是:在安装好本次更新后,除非你事先手动将页面上的ActiveX控件激活,否则无法和他们交户

直白点就是比如网页上的一个Flash游戏,你先要去点击他一下,让IE把它激活,然后开能开始进行正常操作,下面是装了这个补丁的IE的画面:

 

如果不做修改,以后我Blog上的那个Flash鼠标移上去是这样的,然后你必须去点一下激活它,而且如果页面上有3个Flash或者是MeidaPlayer控件或者是Java程序,那么每个都需要你去手动激活……

真不明白这样有什么好处……幸好只是阻断了与用户的交互,相当于调用了EnableWindow(hActiveXWin,flase);这样的API,插件的非交互性操作都是正常的,但每次要去点一下总是很不爽的。这个补丁在2个月内就会公开发表,所以还是早做准备为好

在MSDN上有一篇教开发人员如何应对此改动的文章,地址是:

http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/overview/activating_activex.asp

里面最有价值的就是可以用JScript来绕过IE的阻挡,无须用户手动激活插件,大致方法就是把Object或者Applet块用document.write动态写入,同时包含此语句的JS必须是外部的.js文件,如果是该页面内的(inline)代码就无效了。

当然你也可以专门写个函数放在外部文件里,页面内再调用这个函数,以便应对不同情况,省得每个flash都要写长长的document.write了。

下面是我写的一个函数,常用的设置都包含了,不需要的项目就留空

 function WirteFlashBlock(strURL,nWidth,nHeight,strBkColor,strID,strAlignMode,strQuality,strFlashVars)
{
 var embedTxt;
 embedTxt = <embed;
 if (strURL==null)
 {
  return;
 }
 embedTxt += src=+strURL+;
 document.write(<object classid=clsid:d27cdb6e-ae6d-11cf-96b8-444553540000 codebase=http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0);
 if (nHeight)
 {
  document.write( height=+nHeight+);
  embedTxt += height=+nHeight+;
 }
 if (nWidth)
 {
  document.write( width=+nWidth+);
  embedTxt += width=+nWidth+;
 }
 if (strID)
 { 
  document.write( id=+strID+);
  embedTxt += name=+strID+;
 }
 if (strAlignMode)
 {
  document.write( align=+strAlignMode+);
  embedTxt += align=+strAlignMode+;
 }
 
 document.write(>);
 document.writeln(<param name=menu value=false>);
 embedTxt += menu=false;
 document.writeln(<param name=allowScriptAccess value=always />);
 embedTxt += allowScriptAccess=always;
 if (strFlashVars)
 {
  document.writeln(<PARAM NAME=FlashVars VALUE=+strFlashVars+>);
  embedTxt += FlashVars=+strFlashVars+;
 }
 
 document.writeln(<param name=movie value=+strURL+ />);
 if (strQuality)
 {
  document.writeln(<param name=quality value=+strQuality+ />);
  embedTxt += quality=+strQuality+;
 }
 else
 {
  document.writeln(<param name=quality value=High />);
  embedTxt += quality=High;
 }
 if (strBkColor)
 {
  document.writeln(<param name=bgcolor value=+strBkColor+ />);
  embedTxt += bgcolor=+strBkColor+;
 }
 embedTxt += type=application/x-shockwave-flash pluginspage=http://www.macromedia.com/go/getflashplayer  swLiveConnect=true ></embed>;
 document.writeln(embedTxt);
 document.writeln(</object>);
}

最后提醒的是,如果IE将“禁用脚本调试”的选项勾去掉了,那么还是不会起作用,但普通用户不太可能会去调试脚本的,所以也无所谓,而且M$也承诺在后续的更新中解决此问题:

External script technique does not work when the Disable Script Debugging (Internet Explorer) check box is cleared

Microsoft is investigating this problem and plans to fix it in a future cumulative update.

好了,继续作PRP去了……

ajax缺陷的解决和自动xml分析器

可恶……你现在看到的文章之前我已经写过几乎一样的一篇,但随着IE突然崩溃,我也只好重新打了一篇,也就是你看到的……

最近要同时开发PRP的“强人隧道”网站、法学院网站的第2期开发,同时要管理计协,当然还有学业。所以基本上时间要精确到秒来用了。不过周末还是能和gf稍微过一点悠闲的生活,哪怕那只有短暂的2小时。

那么这个blog似乎又要死下去了,不过我承诺过每周至少一篇文章,所以就把最近开发中对ajax的体会和一些作品发布出来吧。

首先允许我评论下这个目前正被捧得大红大紫的AJAX技术。如果你不知道他是什么就先去google以下,关于他的教程和介绍到处都是。

ajax并不是最近才有的,更不是有些人所说的在asp.net中附带而来的。她很早就被MS采用,大家看看msdn网站的那个树形目录,如果你展开一个分支,它就会“非同步的”去更新这个分支的内容。我想似乎也只有js+xml才能做到吧。而且在我上高一时,第一次上msdn就有这个功能了,我现在读大二,那么就算算这项技术出现了多少年吧……

那么为什么他现在如此的红火呢?我想其中一个原因是gmail,他的web管理界面就是彻底的ajax应用。google似乎正企图破坏微软帝国的神话,成为新一代霸主,他对新技术的使用自然是空前的。第二个原因就是企图用这个技术来达到Flash网站同样的效果。也就是不需要刷新页面来获取新内容。Flash中可以采用loadMovie方法来加载新的对象,同时也支持xml文报(我的ReformPost就是很好的例子)。我想比起asp.net中的采用,更多的可能应该是需要模拟出和flash具有同样效果的页面罢了。

不过ajax似乎并没有传说的那么十全十美。

首先

它需要浏览器支持,并不是所有平台和所有浏览器都能显示ajax页面,而且一但不支持,整个页面可能都无法显示。

第二个缺陷

由于它不需要刷新页面而获得新的数据,很多人认为这有违于利用URL来唯一定位资源的规范。因为同一个url指向的页面可以用ajax显示截然不同的数据。那么你如果需要把你正在浏览的信息给别人看的话,复制url给他显然就是没有用的。

不过我并不这样认为,首先这并不是ajax才有的问题,使用flash的页面也是如此。而且所谓“有违于利用URL来唯一定位资源的规范”是错误的。我见过很多聪明的flash网站已经做到了解决方法,下面我稍微介绍一下:

如果你原先采用静态页面,那么很自然,每篇文章都是和url地址挂钩的:

比如本文保存在:http://www.csksoft.net/blog/post/XML_Parser_and_comments.html

那么用url地址就能来访问本文。

现在我把文章保存在数据库,采用asp页面动态的显示本文,那么利用QueryString还是能用url地址唯一的去定义本文:

http://www.csksoft.net/blog/cmd.asp?act=tb&id=84

那么在ajax和flash网站的情况下,我们也可以采用类似于QueryString的做法:把上面的?改为#即可

众所周知,url字符串中#字符之后的内容都会在发送http请求时被略去,所以网页的书签就是在页面url后面加上一个以#为前缀的参数,这样一方面不影响服务器获取正确的参数,另一方面可以在客户端利用JS来获取#之后的参数。

那么,在今后的flash网站中,或者今后本blog采用了ajax,这篇文章也能采用如下的url地址获得了:

http://www.csksoft.net/blog/index.asp#act=tb&id=84

不过这个页面目前是不起作用的。

下面提供一个能从像上面url地址格式中提取像指定参数数据的函数,它本是action代码,相信稍作修改就能用于js。

使用和转载时请保留我的作者信息。

//from ReformCore::mainsite

//Copyrights 2005-2006 CSK,csk@citiz.net

function GetQueryString(strURL:String, strStringName:String):String {
if (strURL == undefined || strURL == ) {
strURL = _root._url;
}
var strQueryStub:String;
strQueryStub = strURL.slice(strURL.lastIndexOf(#)+1);
if (strStringName == undefined || strStringName == ) {
return strQueryStub;
}
var nSubPosA:Number, nSubPosB:Number;
strQueryStub = &+strQueryStub;
nSubPosA = strQueryStub.lastIndexOf(&+strStringName+=);
if (nSubPosA == -1) {
return ;
}
nSubPosA += length(&+strStringName+=);
nSubPosB = strQueryStub.indexOf(&, nSubPosA);
if (nSubPosB == -1) {
nSubPosB = strQueryStub.length;
}
return unescape(strQueryStub.slice(nSubPosA, nSubPosB));
};

 

如果要获取www.csksoft.net/mypage#id=3 中的id的内容,只要这样写:

 

var id=GetQueryString(www.csksoft.net/mypage#id=3,id);

用了上述的方法,这个缺陷自然也就不复存在了

第三个缺陷

是由于很多情况下需要对xml文档进行翻译,因而即使像获取服务器时间这样简单的功能,也要专门写xml分析代码来从服务器传回的xml中得到需要的时间信息。

如果flash或者ajax页面需要采用高级的xml文报实现与服务器进行更强大的RPC远程交互(类似于SOAP),那么就需要编写常常的xml分析代码。

对于ReformPost,如果需要获得主服务器的时间,客户端的发送的文报是这样的:

<ReformCorePost>
<Type Ver=1.0>generaPost</Type>
<PosterInfo type=desktop;fla>FlashMainSite</PosterInfo>
<Core_RPC>
<Name>GetServerTime</Name>
<args />
</Core_RPC>
</ReformCorePost>

ReformCore传回的xml文报是这样的:

<ReformCorePost>
<Type Ver=1.0>CmdResponse</Type>
<PosterInfo type=WebCoreServer />
<RPC_result>
<DTYPE>date;servertime</DTYPE>
<CurrentTime>2006-3-5 15:20:09</CurrentTime>
</RPC_result>
</ReformCorePost>

如果要实现上面的xml交互,首先客户端必须编写生成指定格式xml的代码,而对于每种请求xml的不同,也需要不同的代码,同时分析服务器返回的xml也需要相当多的代码来完成。

这样无疑是加重了ajax开发的复杂性和延长了开发周期。

我在开发PRP项目时写了一套函数,它可以做到下面的功能:

1.如果我要生成如下的xml文档:

<MyXML>
<MyItem>
<Item>a</Item>
</MyItem>
</MyXML>

里用接下来提供的函数,开发者只需要写如下代码:

var objXML,objArglist;
objArglist = new Object();
objArglist.MyItem = new Object();
objArglist.MyItem.Item = a;
objXML=ConstructXmlDoc(MyXML,objArguList);

这样,上述xml已经自动产生并保存在objXML中了。这样就免去了繁琐的CreateElements、appendChild之类的操作函数了。

2.如果服务器传回了下面的xml文档:

<ReformCorePost>
<Type Ver=1.0>CmdResponse</Type>
<PosterInfo type=WebCoreServer />
<RPC_result>
<DTYPE>date;servertime</DTYPE>
<CurrentTime>2006-3-5 15:20:09</CurrentTime>
</RPC_result>
</ReformCorePost>
假设采用objResponseXML保存这个文报,那么采用下面代码:
var objParsedXML;
objParsedXML = ParseXml(objResponseXML);
上述XML已经自动转化为等价的object类型,如果我要读取xml中CurrentTime字段的数据,只需用代码:
var strCurrentTime = objParsedXML.RPC_result[0].CurrentTime[0].value;
是不是简单多了?
这两个函数就是将Object对象中的成员数据和xml文档进行了互换,由于篇幅有限,其中的函数我就作为附件给出下载地址。具体的使用可以直接来询问我。对于asp版本暂时不打算公开
转载和修改时请保留原作者信息。
上述函数库js下载地址:
http://www.csksoft.net/data/legacyftp/Products/code_and_lib/reformcore_xmlparser.rar
好了,终于写完了

如何自动让你的blog和msn space同步内容

好东西自然不敢独享,于是我把ReformCore的这部分代码专门抽出来写了个插件,如果你有自己的空间,并且使用Z-blog([url]http://www.rainbowsoft.org/zblog/[/url]),那你直接就可以用这个插件并且按照此文的设置便可实现将你在blog上的文章自动发往MSN space。 不过我希望你在传播和修改这些文件时保留里面的原始作者信息,不但是我的,也最好能保留Z-blog的作者信息。 首先简要介绍下原理:其实我都不好意思说,因为比较没“技术含量”呵呵。 这以前能轻松实现要多亏MSN space支持通过发送给他email内容作为新发布的文章。如果你的网站空间支持通过编写脚本来发送邮件,那么只要修改下你使用的blog的代码,让他在你发表新文章以后自动发一份带有文章内容和标题的email到msn space的专门地址后便能做到自动更新MSN space了。 所以这里很遗憾的是如果你有自己的空间,但Blog仍旧是其他运营商提供的话,那仍旧没有办法实现的。 下面来看看MSN space这头如何设置: 1.进入space的管理页面,选择[设置]->[电子邮件发布]: 2.就像上图看到的那样,先把“打开电子邮件发布”钩上 3.填入你用来发送日志的email地址。这里要注意,如果你的空间附带了企业邮局,建议用它,外面服务上提供的email地址最好不要作为发送email。当然你也可以留一个自己常用的邮箱 4.填写机密字,其实只要胡乱填写一通便可,他只是简单的加载生成的用以接受你日志的email地址用户名后面罢了 5.选择"立即发布网络日志项"。这个不用解释了 6.记下那个"xxx.xxx@spaces.msn.com"的邮件地址,今后日志就是发到这里面去的,最好不要将他公布。 ok,MSN space的必要设置已经结束了,如果你在用Z-blog。那么只要把我写的插件覆盖到blog目录下,并且修改下那个"helper_mail_packer.asp"里面关于你email信息的配置就能使用了。在编写文章时,你会发现编辑页面多出了“将此文发送至MSN space”。把它钩上就以为这系统会把这篇文章发送到space上。 对于其他blog系统的朋友我就稍微说明一些注意点了。首先我推荐用CDO组件而不是Jmail。其中的原因是我原先使用Jmail一旦文章正文由中文字符,msn上就会显示乱码。我怀疑是编码不一致,但jmail把发信编码改为utf-8后发出的信件也成乱码了。但可能是我水平不够,所以你也可以尝试一下。 对于CDO组件唯一缺点就是有些人反映支持他的空间服务商不多,如果你的空间不支持那就只能用jmail了,至少发过去的标题是正常的。CDO的使用外面有很多资料,我就不多说了,同时这里提供的Z-blog的插件中发信时作为单独的函数提供的,所以也可以直接用里面的代码。 至于具体如何修改你的blog就看各位本事了,也可以问问这个blog的开发者,如果是自己做的那就更不用说了吧。 好了,下面是Z-blog的msn space同步更新插件下载地址: [url]ftp://FTP_visitor:visitor@ftp.csksoft.net/Public/Products/Misc/pug_msnspace_updater_by_csk.rar[/url]

数据结构课程实践

这个学期的数据结构课终于告一段落了,虽然数构我高中就看过一些,但现在学好了还是觉得这是门比较复杂的学科。今天附上的就是这门课的每章的大作业。 虽然我不想对学校这门课作太多评价,感觉上的很不好,而且其实没有多少人是自己完成作业的(其实那应该是学校造成的)。但如果每次每道题目都能去做,尤其是那些打星号的题目也作的话,那的确能学到不少知识的。 我附上的文件是我的作业代码,当然我放上来的目的不是为了让大家抄袭,而且也不可能,因为关键代码我都留有个人信息。主要目的有这几个: 1.每次大作业对我都是个相当不好受的经历,每次都要花2-4天的时间去完成(当然我可以保证作业质量)。特别是最近刚完成的图那一章的作业更是令我痛苦。每次大作业其实已经不亚于编写Stereoic一半的工程量了。同时里面大部分题目我都尽力做了,除了AVL树和AOV网络求所有可能的拓扑序列这2道外。所以即使作业中仍有不足,我相信能给各位起到一些微弱的参考意义可已经足够了 2.我编写作业过程中尽力以符合工程强度的要求来书写代码,而不是简单的应付作业,所以其中每个组建,每个数据类型都可以立刻用于其他的实际应用中,同时可以保证运行的效率和健壮性。 这一套作业集是自成体系的,比如前面实现的双向链表,堆栈,将会在后面的使用中用到。 作业中已经提供的现成数据结构有: 双向链表,单链表,和他们的相关常用操作函数 多项式类,支持多项式乘法和加法 基于链表的队列和堆栈 基于数组的共享堆栈 带有父节点指针的二叉树 BST树 基于多重邻接表的无向图、基于十字链表的有向图 基于数组的并查集 二叉树的前序、中序、后序、广度优先遍历算法 图的广度、深度优先算法 图的KRUSKAL \ Dijkstra算法 有向图求解强连同分量的算法 以上的类型和相关算法在作业中是以单独的类形式封装的,同时以独立的头文件保存。所有代码采用C++模版。程序没有采用任何STL元素,同时支持异常处理。 正如我前面说的,实现数据结构并非是什么轻松的事,所以如果需要也可以采用我现成的代码来实现更高级的功能,而不需要花大力气去实现原始结构了。至于具体如何大家还是开代码吧。 同时程序中还附上一个自己写的将二叉树打印成文本形式的函数,这个在编写二叉树相关的程序是使相当直观的。比如下面就是函数直接显示的一颗BST的画面:
==================Asc Tree View===================
       H
      / \
   D       J
  / \       \
 A   F       K
  \
  B
================== End Of View ===================

好了不说废话了,附上一次作业程序的运行画面和下载地址:

Data Structure Act 5 Demos Designed By CSK(www.csksoft.net)

 ---------------------------------------- Please Select Demos:

[1].Get Strongly Spanning Graphs(Problem 1,2)

[2].KRUSKAL algorithm Demo(Problem 1,3)

[3].Dijkstra algorithm Demo(Problem 1,4)

[4].DFS & BFS Demo(Problem 1,4)

[0].Exit Load Demo Num:

=============================

Act 1 Problem 2:Multiply two polynomials

=============================

Would you like to use the default two polynomials?[Y/N]y

the first default polynomial is +7x^2+3.5x^3+2x^4+2x^9

the second default polynomial is +2.3x^2+4.4x^3+1x^4+6x^10

请按任意键继续. . .

polynomial1 * polynomial2 = +16.1x^4+38.85x^5+27x^6+12.3x^7+2x^8+4.6x^11+50.8x^1 2+23x^13+12x^14+12x^19

----------------------------

 Demo Finished

请按任意键继续. . .

我的实践作业下载:

http://www.csksoft.net/data/legacyftp/Products/APP/DataStructProduct_BY_CSK.rar

 

 原题下载(可能SJTU有版权..):

ftp://FTP_visitor:visitor@ftp.csksoft.net/Public/Article/DataStruct_Instruction.rar

 最后真心祝愿每一位将要考数构的朋友都能通过

分页:[«][1]2[3][»]

日历

<< 2015-6 >>

Sun

Mon

Tue

Wed

Thu

Fri

Sat

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)