/* * Bueno, vamos a ver si podemos obtener la pieza * */ int tipojuego_get_tpieza_png( Tipojuego* tj, char* color, char* tpieza, int flags, void** png, int* width, int* height ){ #if GRAPH_ENABLED Tipopieza* tp = tj->tipo_piezas->data[ GETTIPOPIEZA(tj,tpieza) ]; int col = GETCOLOR(tj,color); gdImagePtr gd = graph_tpieza_get_gd( tp, col ); int size = 0; if( flags == GETPNG_PIEZA_CAPTURADA ){ gdImagePtr gd2 = gdImageCreate( gdImageSX( gd ) / 2, gdImageSY( gd ) / 2 ); int transp = gdImageColorAllocate( gd2, 0, 255, 0 ); gdImageColorTransparent( gd2, transp ); gdImageFill( gd2, 0, 0 , transp ); gdImageCopyResized( gd2, gd, 0, 0, 0, 0, gdImageSX(gd2), gdImageSY(gd2), gdImageSX(gd), gdImageSY(gd) ); if( png ) *png = gdImagePngPtr( gd2, &size ); if( width ) *width = gdImageSX( gd2 ); if( height ) *height = gdImageSY( gd2 ); gdImageDestroy( gd2 ); return size; } else { if( png ) *png = gdImagePngPtr( gd, &size ); if( width ) *width = gdImageSX( gd ); if( height ) *height = gdImageSY( gd ); return size; } #endif LOGPRINT( 2, "No compilado con el modulo GD tpieza = %s", tpieza ); return 0; }
/* * findprefix - extract common prefix from cNFA * * Results are returned into the preallocated chr array string[], with * *slength (which must be preset to zero) incremented for each chr. */ static int /* regprefix return code */ findprefix(struct cnfa * cnfa, struct colormap * cm, chr *string, size_t *slength) { int st; int nextst; color thiscolor; chr c; struct carc *ca; /* * The "pre" state must have only BOS/BOL outarcs, else pattern isn't * anchored left. If we have both BOS and BOL, they must go to the * same next state. */ st = cnfa->pre; nextst = -1; for (ca = cnfa->states[st]; ca->co != COLORLESS; ca++) { if (ca->co == cnfa->bos[0] || ca->co == cnfa->bos[1]) { if (nextst == -1) nextst = ca->to; else if (nextst != ca->to) return REG_NOMATCH; } else return REG_NOMATCH; } if (nextst == -1) return REG_NOMATCH; /* * Scan through successive states, stopping as soon as we find one with * more than one acceptable transition character (either multiple colors * on out-arcs, or a color with more than one member chr). * * We could find a state with multiple out-arcs that are all labeled with * the same singleton color; this comes from patterns like "^ab(cde|cxy)". * In that case we add the chr "c" to the output string but then exit the * loop with nextst == -1. This leaves a little bit on the table: if the * pattern is like "^ab(cde|cdy)", we won't notice that "d" could be added * to the prefix. But chasing multiple parallel state chains doesn't seem * worth the trouble. */ do { st = nextst; nextst = -1; thiscolor = COLORLESS; for (ca = cnfa->states[st]; ca->co != COLORLESS; ca++) { /* We ignore lookahead constraints */ if (ca->co >= cnfa->ncolors) continue; /* We can also ignore BOS/BOL arcs */ if (ca->co == cnfa->bos[0] || ca->co == cnfa->bos[1]) continue; /* ... but EOS/EOL arcs terminate the search */ if (ca->co == cnfa->eos[0] || ca->co == cnfa->eos[1]) { thiscolor = COLORLESS; break; } if (thiscolor == COLORLESS) { /* First plain outarc */ thiscolor = ca->co; nextst = ca->to; } else if (thiscolor == ca->co) { /* Another plain outarc for same color */ nextst = -1; } else { /* More than one plain outarc color terminates the search */ thiscolor = COLORLESS; break; } } /* Done if we didn't find exactly one color on plain outarcs */ if (thiscolor == COLORLESS) break; /* The color must be a singleton */ if (cm->cd[thiscolor].nchrs != 1) break; /* * Identify the color's sole member chr and add it to the prefix * string. In general the colormap data structure doesn't provide a * way to find color member chrs, except by trying GETCOLOR() on each * possible chr value, which won't do at all. However, for the cases * we care about it should be sufficient to test the "firstchr" value, * that is the first chr ever added to the color. There are cases * where this might no longer be a member of the color (so we do need * to test), but none of them are likely to arise for a character that * is a member of a common prefix. If we do hit such a corner case, * we just fall out without adding anything to the prefix string. */ c = cm->cd[thiscolor].firstchr; if (GETCOLOR(cm, c) != thiscolor) break; string[(*slength)++] = c; /* Advance to next state, but only if we have a unique next state */ } while (nextst != -1); /* * If we ended at a state that only has EOS/EOL outarcs leading to the * "post" state, then we have an exact-match string. Note this is true * even if the string is of zero length. */ nextst = -1; for (ca = cnfa->states[st]; ca->co != COLORLESS; ca++) { if (ca->co == cnfa->eos[0] || ca->co == cnfa->eos[1]) { if (nextst == -1) nextst = ca->to; else if (nextst != ca->to) { nextst = -1; break; } } else { nextst = -1; break; } } if (nextst == cnfa->post) return REG_EXACT; /* * Otherwise, if we were unable to identify any prefix characters, say * NOMATCH --- the pattern is anchored left, but doesn't specify any * particular first character. */ if (*slength > 0) return REG_PREFIX; return REG_NOMATCH; }
ROBJ_IN_CPP int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR /*lpstrCmdLine*/, int /*nCmdShow*/) { //必须要调用OleInitialize来初始化运行环境 HRESULT hRes = OleInitialize(NULL); SASSERT(SUCCEEDED(hRes)); //LoadLibrary(L"E:\\soui.taobao\\richedit\\Debug\\riched20.dll"); /* XML预编译前面加载效率比较 pugi::xml_document doc; LARGE_INTEGER perf; QueryPerformanceFrequency(&perf); LARGE_INTEGER t1,t2; QueryPerformanceCounter(&t1); doc.load_file(L"e:\\play.xml",pugi::parse_default,pugi::encoding_utf8); QueryPerformanceCounter(&t2); doc.save_file(L"e:\\play1.xml"); doc.save_bin(L"e:\\paly.xml.bin"); pugi::xml_document doc2; LARGE_INTEGER t21,t22; QueryPerformanceCounter(&t21); doc2.load_bin_file(L"e:\\paly.xml.bin"); QueryPerformanceCounter(&t22); doc2.save_file(L"e:\\play2.xml"); LONGLONG SP1 = (t2.QuadPart-t1.QuadPart)*1000000/perf.QuadPart; LONGLONG SP2 = (t22.QuadPart-t21.QuadPart)*1000000/perf.QuadPart; SStringW str; str.Format(L"!!!!!sp2=%d,sp1=%d\n",(int)SP2,(int)SP1); MessageBoxW(GetActiveWindow(),str,L"span",MB_OK); return 0; */ int nRet = 0; //使用imgdecoder-png图片解码模块演示apng动画 SComMgr *pComMgr = new SComMgr(_T("imgdecoder-png")); { int nType=MessageBox(GetActiveWindow(),_T("选择渲染类型:\n[yes]: Skia\n[no]:GDI\n[cancel]:Quit"),_T("select a render"),MB_ICONQUESTION|MB_YESNOCANCEL); if(nType == IDCANCEL) { nRet = -1; goto exit; } //定义一组类SOUI系统中使用的类COM组件 //CAutoRefPtr是一个SOUI系统中使用的智能指针类 CAutoRefPtr<IImgDecoderFactory> pImgDecoderFactory; //图片解码器,由imagedecoder-wid.dll模块提供 CAutoRefPtr<IRenderFactory> pRenderFactory; //UI渲染模块,由render-gdi.dll或者render-skia.dll提供 CAutoRefPtr<ITranslatorMgr> trans; //多语言翻译模块,由translator.dll提供 CAutoRefPtr<IScriptFactory> pScriptLua; //lua脚本模块,由scriptmodule-lua.dll提供 CAutoRefPtr<ILog4zManager> pLogMgr; //log4z对象 BOOL bLoaded=FALSE; //从各组件中显式创建上述组件对象 if(nType == IDYES) bLoaded = pComMgr->CreateRender_Skia((IObjRef**)&pRenderFactory); else bLoaded = pComMgr->CreateRender_GDI((IObjRef**)&pRenderFactory); SASSERT_FMT(bLoaded,_T("load interface [%s] failed!"),nType==IDYES?_T("render_skia"):_T("render_gdi")); bLoaded=pComMgr->CreateImgDecoder((IObjRef**)&pImgDecoderFactory); SASSERT_FMT(bLoaded,_T("load interface [%s] failed!"),_T("imgdecoder")); bLoaded=pComMgr->CreateTranslator((IObjRef**)&trans); SASSERT_FMT(bLoaded,_T("load interface [%s] failed!"),_T("translator")); if(pComMgr->CreateLog4z((IObjRef**)&pLogMgr)) if(pLogMgr){ pLogMgr->createLogger("soui");//support output soui trace infomation to log pLogMgr->start(); } //为渲染模块设置它需要引用的图片解码模块 pRenderFactory->SetImgDecoderFactory(pImgDecoderFactory); //定义一个唯一的SApplication对象,SApplication管理整个应用程序的资源 SApplication *theApp=new SApplication(pRenderFactory,hInstance); theApp->SetLogManager(pLogMgr); LOGF("demo","test "<<100 << L"wchar"); SLOGFMTE("log output using ansi format,str=%s, tick=%u","test",GetTickCount()); SLOGFMTE(L"log output using unicode format,str=%s, tick=%u",L"中文",GetTickCount()); //控件注册要放到AddResProvider前: 2016年3月8日 //向SApplication系统中注册由外部扩展的控件及SkinObj类 SWkeLoader wkeLoader; if(wkeLoader.Init(_T("wke.dll"))) { theApp->RegisterWndFactory(TplSWindowFactory<SWkeWebkit>());//注册WKE浏览器 } theApp->RegisterWindowClass<SMatrixWindow>();// theApp->RegisterWindowClass<SFreeMoveWindow>();// theApp->RegisterWindowClass<SClock>();// theApp->RegisterWindowClass<SGifPlayer>();//theApp中增加方法:RegisterWindowClass,替换RegisterWndFactory(TplSWindowFactory<SGifPlayer>()) theApp->RegisterSkinFactory(TplSkinFactory<SSkinGif>());//注册SkinGif theApp->RegisterSkinFactory(TplSkinFactory<SSkinAPNG>());//注册SSkinAPNG theApp->RegisterSkinFactory(TplSkinFactory<SSkinVScrollbar>());//注册纵向滚动条皮肤 theApp->RegisterWndFactory(TplSWindowFactory<SIPAddressCtrl>());//注册IP控件 theApp->RegisterWndFactory(TplSWindowFactory<SPropertyGrid>());//注册属性表控件 theApp->RegisterWndFactory(TplSWindowFactory<SChromeTabCtrl>());//注册ChromeTabCtrl theApp->RegisterWndFactory(TplSWindowFactory<SIECtrl>());//注册IECtrl theApp->RegisterWndFactory(TplSWindowFactory<SChatEdit>());//注册ChatEdit theApp->RegisterWndFactory(TplSWindowFactory<SScrollText>());//注册SScrollText theApp->RegisterWndFactory(TplSWindowFactory<SDesktopDock>());//注册SDesktopDock theApp->RegisterWndFactory(TplSWindowFactory<SImageMaskWnd>());//注册SImageMaskWnd theApp->RegisterWndFactory(TplSWindowFactory<SRatingBar>());//注册SRatingBar if(SUCCEEDED(CUiAnimation::Init())) { theApp->RegisterWndFactory(TplSWindowFactory<SUiAnimationWnd>());//注册动画控件 } theApp->RegisterWndFactory(TplSWindowFactory<SFlyWnd>());//注册飞行动画控件 theApp->RegisterWndFactory(TplSWindowFactory<SFadeFrame>());//注册渐显隐动画控件 theApp->RegisterWndFactory(TplSWindowFactory<SRadioBox2>());//注册RadioBox2 theApp->RegisterWndFactory(TplSWindowFactory<SCalendar2>());//注册SCalendar2 SSkinGif::Gdiplus_Startup(); //如果需要在代码中使用R::id::namedid这种方式来使用控件必须要这一行代码:2016年2月2日,R::id::namedXmlID是由uiresbuilder 增加-h .\res\resource.h idtable 这3个参数后生成的。 theApp->InitXmlNamedID(namedXmlID,ARRAYSIZE(namedXmlID),TRUE); //将程序的运行路径修改到demo所在的目录 SStringT strResDir = theApp->GetAppDir(); strResDir += _T("\\..\\demos\\demo"); SetCurrentDirectory(strResDir); //SOUI系统总是从appdir去查找资源 theApp->SetAppDir(strResDir); //定义一人个资源提供对象,SOUI系统中实现了3种资源加载方式,分别是从文件加载,从EXE的资源加载及从ZIP压缩包加载 CAutoRefPtr<IResProvider> pResProvider; #if (RES_TYPE == 0)//从文件加载 CreateResProvider(RES_FILE,(IObjRef**)&pResProvider); if(!pResProvider->Init((LPARAM)_T("uires"),0)) { CreateResProvider(RES_PE,(IObjRef**)&pResProvider); if(!pResProvider->Init((WPARAM)hInstance,0)) { SASSERT(0); delete theApp; nRet = 1; goto exit; } } #elif (RES_TYPE==1)//从EXE资源加载 CreateResProvider(RES_PE,(IObjRef**)&pResProvider); pResProvider->Init((WPARAM)hInstance,0); #elif (RES_TYPE==2)//从ZIP包加载 bLoaded=pComMgr->CreateResProvider_ZIP((IObjRef**)&pResProvider); SASSERT_FMT(bLoaded,_T("load interface [%s] failed!"),_T("resprovider_zip")); ZIPRES_PARAM param; param.ZipFile(pRenderFactory, _T("uires.zip"),"souizip"); bLoaded = pResProvider->Init((WPARAM)¶m,0); SASSERT(bLoaded); #endif //将创建的IResProvider交给SApplication对象 theApp->AddResProvider(pResProvider); //创建一个http服务器,用来从资源中加载flash CMemFlash memFlash; CHTTPServer flashSvr(&memFlash); flashSvr.Start(CMemFlash::HomeDir(),"",82,0); if(trans) {//加载语言翻译包 theApp->SetTranslator(trans); pugi::xml_document xmlLang; if(theApp->LoadXmlDocment(xmlLang,_T("lang_cn"),_T("translator"))) { CAutoRefPtr<ITranslator> langCN; trans->CreateTranslator(&langCN); langCN->Load(&xmlLang.child(L"language"),1);//1=LD_XML trans->InstallTranslator(langCN); } } #if defined(DLL_CORE) && !defined(_WIN64) //加载LUA脚本模块,注意,脚本模块只有在SOUI内核是以DLL方式编译时才能使用。 bLoaded=pComMgr->CreateScrpit_Lua((IObjRef**)&pScriptLua); SASSERT_FMT(bLoaded,_T("load interface [%s] failed!"),_T("scirpt_lua")); theApp->SetScriptFactory(pScriptLua); #endif//DLL_CORE //加载系统资源 HMODULE hSysResource=LoadLibrary(SYS_NAMED_RESOURCE); if(hSysResource) { CAutoRefPtr<IResProvider> sysSesProvider; CreateResProvider(RES_PE,(IObjRef**)&sysSesProvider); sysSesProvider->Init((WPARAM)hSysResource,0); theApp->LoadSystemNamedResource(sysSesProvider); } //采用hook绘制菜单的边框 CMenuWndHook::InstallHook(hInstance,L"_skin.sys.menu.border"); //加载全局资源描述XML //theApp->Init(_T("xml_init")); 不再需要这句,在AddResProvider时自动执行初始化 //演示R.color.xxx,R.string.xxx在代码中的使用。 COLORREF crRed = GETCOLOR(R.color.red); SStringW strTitle = GETSTRING(R.string.title); SNotifyCenter *pNotifyCenter = new SNotifyCenter; { //创建并显示使用SOUI布局应用程序窗口,为了保存窗口对象的析构先于其它对象,把它们缩进一层。 CMainDlg dlgMain; dlgMain.Create(GetActiveWindow(),0,0,800,650); dlgMain.GetNative()->SendMessage(WM_INITDIALOG); dlgMain.CenterWindow(); dlgMain.ShowWindow(SW_SHOWNORMAL); SmileyCreateHook smileyHook; //不知道MainDlg里哪块和mhook冲突了,在win10中,如果hook放到dlgmain.create前会导致hook失败。 nRet=theApp->Run(dlgMain.m_hWnd); } delete pNotifyCenter; theApp->UnregisterWindowClass<SGifPlayer>(); //应用程序退出 delete theApp; if(pLogMgr) { pLogMgr->stop(); } flashSvr.Shutdown(); //卸载菜单边框绘制hook CMenuWndHook::UnInstallHook(); CUiAnimation::Free(); SSkinGif::Gdiplus_Shutdown(); } exit: delete pComMgr; OleUninitialize(); return nRet; }
/* - longest - longest-preferred matching engine ^ static chr *longest(struct vars *, struct dfa *, chr *, chr *, int *); */ static chr * /* endpoint, or NULL */ longest( struct vars *v, /* used only for debug and exec flags */ struct dfa *d, chr *start, /* where the match should start */ chr *stop, /* match must end at or before here */ int *hitstopp) /* record whether hit v->stop, if non-NULL */ { chr *cp; chr *realstop = (stop == v->stop) ? stop : stop + 1; color co; struct sset *css; struct sset *ss; chr *post; int i; struct colormap *cm = d->cm; /* * Initialize. */ css = initialize(v, d, start); cp = start; if (hitstopp != NULL) { *hitstopp = 0; } /* * Startup. */ FDEBUG(("+++ startup +++\n")); if (cp == v->start) { co = d->cnfa->bos[(v->eflags®_NOTBOL) ? 0 : 1]; FDEBUG(("color %ld\n", (long)co)); } else { co = GETCOLOR(cm, *(cp - 1)); FDEBUG(("char %c, color %ld\n", (char)*(cp-1), (long)co)); } css = miss(v, d, css, co, cp, start); if (css == NULL) { return NULL; } css->lastseen = cp; /* * Main loop. */ if (v->eflags®_FTRACE) { while (cp < realstop) { FDEBUG(("+++ at c%d +++\n", css - d->ssets)); co = GETCOLOR(cm, *cp); FDEBUG(("char %c, color %ld\n", (char)*cp, (long)co)); ss = css->outs[co]; if (ss == NULL) { ss = miss(v, d, css, co, cp+1, start); if (ss == NULL) { break; /* NOTE BREAK OUT */ } } cp++; ss->lastseen = cp; css = ss; } } else { while (cp < realstop) { co = GETCOLOR(cm, *cp); ss = css->outs[co]; if (ss == NULL) { ss = miss(v, d, css, co, cp+1, start); if (ss == NULL) { break; /* NOTE BREAK OUT */ } } cp++; ss->lastseen = cp; css = ss; } } /* * Shutdown. */ FDEBUG(("+++ shutdown at c%d +++\n", css - d->ssets)); if (cp == v->stop && stop == v->stop) { if (hitstopp != NULL) { *hitstopp = 1; } co = d->cnfa->eos[(v->eflags®_NOTEOL) ? 0 : 1]; FDEBUG(("color %ld\n", (long)co)); ss = miss(v, d, css, co, cp, start); /* * Special case: match ended at eol? */ if (ss != NULL && (ss->flags&POSTSTATE)) { return cp; } else if (ss != NULL) { ss->lastseen = cp; /* to be tidy */ } } /* * Find last match, if any. */ post = d->lastpost; for (ss = d->ssets, i = d->nssused; i > 0; ss++, i--) { if ((ss->flags&POSTSTATE) && (post != ss->lastseen) && (post == NULL || post < ss->lastseen)) { post = ss->lastseen; } } if (post != NULL) { /* found one */ return post - 1; } return NULL; }
/* - shortest - shortest-preferred matching engine ^ static chr *shortest(struct vars *, struct dfa *, chr *, chr *, chr *, ^ chr **, int *); */ static chr * /* endpoint, or NULL */ shortest( struct vars *v, struct dfa *d, chr *start, /* where the match should start */ chr *min, /* match must end at or after here */ chr *max, /* match must end at or before here */ chr **coldp, /* store coldstart pointer here, if nonNULL */ int *hitstopp) /* record whether hit v->stop, if non-NULL */ { chr *cp; chr *realmin = (min == v->stop) ? min : min + 1; chr *realmax = (max == v->stop) ? max : max + 1; color co; struct sset *css; struct sset *ss; struct colormap *cm = d->cm; /* * Initialize. */ css = initialize(v, d, start); cp = start; if (hitstopp != NULL) { *hitstopp = 0; } /* * Startup. */ FDEBUG(("--- startup ---\n")); if (cp == v->start) { co = d->cnfa->bos[(v->eflags®_NOTBOL) ? 0 : 1]; FDEBUG(("color %ld\n", (long)co)); } else { co = GETCOLOR(cm, *(cp - 1)); FDEBUG(("char %c, color %ld\n", (char)*(cp-1), (long)co)); } css = miss(v, d, css, co, cp, start); if (css == NULL) { return NULL; } css->lastseen = cp; ss = css; /* * Main loop. */ if (v->eflags®_FTRACE) { while (cp < realmax) { FDEBUG(("--- at c%d ---\n", css - d->ssets)); co = GETCOLOR(cm, *cp); FDEBUG(("char %c, color %ld\n", (char)*cp, (long)co)); ss = css->outs[co]; if (ss == NULL) { ss = miss(v, d, css, co, cp+1, start); if (ss == NULL) { break; /* NOTE BREAK OUT */ } } cp++; ss->lastseen = cp; css = ss; if ((ss->flags&POSTSTATE) && cp >= realmin) { break; /* NOTE BREAK OUT */ } } } else { while (cp < realmax) { co = GETCOLOR(cm, *cp); ss = css->outs[co]; if (ss == NULL) { ss = miss(v, d, css, co, cp+1, start); if (ss == NULL) { break; /* NOTE BREAK OUT */ } } cp++; ss->lastseen = cp; css = ss; if ((ss->flags&POSTSTATE) && cp >= realmin) { break; /* NOTE BREAK OUT */ } } } if (ss == NULL) { return NULL; } if (coldp != NULL) { /* report last no-progress state set, if any */ *coldp = lastcold(v, d); } if ((ss->flags&POSTSTATE) && cp > min) { assert(cp >= realmin); cp--; } else if (cp == v->stop && max == v->stop) { co = d->cnfa->eos[(v->eflags®_NOTEOL) ? 0 : 1]; FDEBUG(("color %ld\n", (long)co)); ss = miss(v, d, css, co, cp, start); /* * Match might have ended at eol. */ if ((ss == NULL || !(ss->flags&POSTSTATE)) && hitstopp != NULL) { *hitstopp = 1; } } if (ss == NULL || !(ss->flags&POSTSTATE)) { return NULL; } return cp; }
COLORREF Hex2Color(const SStringW & strColor,COLORREF crDef) { if(strColor.IsEmpty()) return crDef; return GETCOLOR(strColor); }
/* * longest - longest-preferred matching engine * * On success, returns match endpoint address. Returns NULL on no match. * Internal errors also return NULL, with v->err set. */ static chr * longest(struct vars * v, struct dfa * d, chr *start, /* where the match should start */ chr *stop, /* match must end at or before here */ int *hitstopp) /* record whether hit v->stop, if non-NULL */ { chr *cp; chr *realstop = (stop == v->stop) ? stop : stop + 1; color co; struct sset *css; struct sset *ss; chr *post; int i; struct colormap *cm = d->cm; /* prevent "uninitialized variable" warnings */ if (hitstopp != NULL) *hitstopp = 0; /* initialize */ css = initialize(v, d, start); if (css == NULL) return NULL; cp = start; /* startup */ FDEBUG(("+++ startup +++\n")); if (cp == v->start) { co = d->cnfa->bos[(v->eflags & REG_NOTBOL) ? 0 : 1]; FDEBUG(("color %ld\n", (long) co)); } else { co = GETCOLOR(cm, *(cp - 1)); FDEBUG(("char %c, color %ld\n", (char) *(cp - 1), (long) co)); } css = miss(v, d, css, co, cp, start); if (css == NULL) return NULL; css->lastseen = cp; /* * This is the main text-scanning loop. It seems worth having two copies * to avoid the overhead of REG_FTRACE tests here, even in REG_DEBUG * builds, when you're not actively tracing. */ #ifdef REG_DEBUG if (v->eflags & REG_FTRACE) { while (cp < realstop) { FDEBUG(("+++ at c%d +++\n", (int) (css - d->ssets))); co = GETCOLOR(cm, *cp); FDEBUG(("char %c, color %ld\n", (char) *cp, (long) co)); ss = css->outs[co]; if (ss == NULL) { ss = miss(v, d, css, co, cp + 1, start); if (ss == NULL) break; /* NOTE BREAK OUT */ } cp++; ss->lastseen = cp; css = ss; } } else #endif { while (cp < realstop) { co = GETCOLOR(cm, *cp); ss = css->outs[co]; if (ss == NULL) { ss = miss(v, d, css, co, cp + 1, start); if (ss == NULL) break; /* NOTE BREAK OUT */ } cp++; ss->lastseen = cp; css = ss; } } if (ISERR()) return NULL; /* shutdown */ FDEBUG(("+++ shutdown at c%d +++\n", (int) (css - d->ssets))); if (cp == v->stop && stop == v->stop) { if (hitstopp != NULL) *hitstopp = 1; co = d->cnfa->eos[(v->eflags & REG_NOTEOL) ? 0 : 1]; FDEBUG(("color %ld\n", (long) co)); ss = miss(v, d, css, co, cp, start); if (ISERR()) return NULL; /* special case: match ended at eol? */ if (ss != NULL && (ss->flags & POSTSTATE)) return cp; else if (ss != NULL) ss->lastseen = cp; /* to be tidy */ } /* find last match, if any */ post = d->lastpost; for (ss = d->ssets, i = d->nssused; i > 0; ss++, i--) if ((ss->flags & POSTSTATE) && post != ss->lastseen && (post == NULL || post < ss->lastseen)) post = ss->lastseen; if (post != NULL) /* found one */ return post - 1; return NULL; }
/* * matchuntil - incremental matching engine * * This is meant for use with a search-style NFA (that is, the pattern is * known to act as though it had a leading .*). We determine whether a * match exists starting at v->start and ending at probe. Multiple calls * require only O(N) time not O(N^2) so long as the probe values are * nondecreasing. *lastcss and *lastcp must be initialized to NULL before * starting a series of calls. * * Returns 1 if a match exists, 0 if not. * Internal errors also return 0, with v->err set. */ static int matchuntil(struct vars * v, struct dfa * d, chr *probe, /* we want to know if a match ends here */ struct sset ** lastcss, /* state storage across calls */ chr **lastcp) /* state storage across calls */ { chr *cp = *lastcp; color co; struct sset *css = *lastcss; struct sset *ss; struct colormap *cm = d->cm; /* initialize and startup, or restart, if necessary */ if (cp == NULL || cp > probe) { cp = v->start; css = initialize(v, d, cp); if (css == NULL) return 0; FDEBUG((">>> startup >>>\n")); co = d->cnfa->bos[(v->eflags & REG_NOTBOL) ? 0 : 1]; FDEBUG(("color %ld\n", (long) co)); css = miss(v, d, css, co, cp, v->start); if (css == NULL) return 0; css->lastseen = cp; } else if (css == NULL) { /* we previously found that no match is possible beyond *lastcp */ return 0; } ss = css; /* * This is the main text-scanning loop. It seems worth having two copies * to avoid the overhead of REG_FTRACE tests here, even in REG_DEBUG * builds, when you're not actively tracing. */ #ifdef REG_DEBUG if (v->eflags & REG_FTRACE) { while (cp < probe) { FDEBUG((">>> at c%d >>>\n", (int) (css - d->ssets))); co = GETCOLOR(cm, *cp); FDEBUG(("char %c, color %ld\n", (char) *cp, (long) co)); ss = css->outs[co]; if (ss == NULL) { ss = miss(v, d, css, co, cp + 1, v->start); if (ss == NULL) break; /* NOTE BREAK OUT */ } cp++; ss->lastseen = cp; css = ss; } } else #endif { while (cp < probe) { co = GETCOLOR(cm, *cp); ss = css->outs[co]; if (ss == NULL) { ss = miss(v, d, css, co, cp + 1, v->start); if (ss == NULL) break; /* NOTE BREAK OUT */ } cp++; ss->lastseen = cp; css = ss; } } *lastcss = ss; *lastcp = cp; if (ss == NULL) return 0; /* impossible match, or internal error */ /* We need to process one more chr, or the EOS symbol, to check match */ if (cp < v->stop) { FDEBUG((">>> at c%d >>>\n", (int) (css - d->ssets))); co = GETCOLOR(cm, *cp); FDEBUG(("char %c, color %ld\n", (char) *cp, (long) co)); ss = css->outs[co]; if (ss == NULL) ss = miss(v, d, css, co, cp + 1, v->start); } else { assert(cp == v->stop); co = d->cnfa->eos[(v->eflags & REG_NOTEOL) ? 0 : 1]; FDEBUG(("color %ld\n", (long) co)); ss = miss(v, d, css, co, cp, v->start); } if (ss == NULL || !(ss->flags & POSTSTATE)) return 0; return 1; }
/* * shortest - shortest-preferred matching engine * * On success, returns match endpoint address. Returns NULL on no match. * Internal errors also return NULL, with v->err set. */ static chr * shortest(struct vars * v, struct dfa * d, chr *start, /* where the match should start */ chr *min, /* match must end at or after here */ chr *max, /* match must end at or before here */ chr **coldp, /* store coldstart pointer here, if non-NULL */ int *hitstopp) /* record whether hit v->stop, if non-NULL */ { chr *cp; chr *realmin = (min == v->stop) ? min : min + 1; chr *realmax = (max == v->stop) ? max : max + 1; color co; struct sset *css; struct sset *ss; struct colormap *cm = d->cm; /* prevent "uninitialized variable" warnings */ if (coldp != NULL) *coldp = NULL; if (hitstopp != NULL) *hitstopp = 0; /* initialize */ css = initialize(v, d, start); if (css == NULL) return NULL; cp = start; /* startup */ FDEBUG(("--- startup ---\n")); if (cp == v->start) { co = d->cnfa->bos[(v->eflags & REG_NOTBOL) ? 0 : 1]; FDEBUG(("color %ld\n", (long) co)); } else { co = GETCOLOR(cm, *(cp - 1)); FDEBUG(("char %c, color %ld\n", (char) *(cp - 1), (long) co)); } css = miss(v, d, css, co, cp, start); if (css == NULL) return NULL; css->lastseen = cp; ss = css; /* * This is the main text-scanning loop. It seems worth having two copies * to avoid the overhead of REG_FTRACE tests here, even in REG_DEBUG * builds, when you're not actively tracing. */ #ifdef REG_DEBUG if (v->eflags & REG_FTRACE) { while (cp < realmax) { FDEBUG(("--- at c%d ---\n", (int) (css - d->ssets))); co = GETCOLOR(cm, *cp); FDEBUG(("char %c, color %ld\n", (char) *cp, (long) co)); ss = css->outs[co]; if (ss == NULL) { ss = miss(v, d, css, co, cp + 1, start); if (ss == NULL) break; /* NOTE BREAK OUT */ } cp++; ss->lastseen = cp; css = ss; if ((ss->flags & POSTSTATE) && cp >= realmin) break; /* NOTE BREAK OUT */ } } else #endif { while (cp < realmax) { co = GETCOLOR(cm, *cp); ss = css->outs[co]; if (ss == NULL) { ss = miss(v, d, css, co, cp + 1, start); if (ss == NULL) break; /* NOTE BREAK OUT */ } cp++; ss->lastseen = cp; css = ss; if ((ss->flags & POSTSTATE) && cp >= realmin) break; /* NOTE BREAK OUT */ } } if (ss == NULL) return NULL; if (coldp != NULL) /* report last no-progress state set, if any */ *coldp = lastcold(v, d); if ((ss->flags & POSTSTATE) && cp > min) { assert(cp >= realmin); cp--; } else if (cp == v->stop && max == v->stop) { co = d->cnfa->eos[(v->eflags & REG_NOTEOL) ? 0 : 1]; FDEBUG(("color %ld\n", (long) co)); ss = miss(v, d, css, co, cp, start); /* match might have ended at eol */ if ((ss == NULL || !(ss->flags & POSTSTATE)) && hitstopp != NULL) *hitstopp = 1; } if (ss == NULL || !(ss->flags & POSTSTATE)) return NULL; return cp; }
/* DrawMode = GrXOR, GrOR ..*/ void DrawLibPartAux(WinEDA_DrawPanel * panel,wxDC * DC, EDA_SchComponentStruct *Component, EDA_LibComponentStruct *Entry, const wxPoint & Pos, int TransMat[2][2], int Multi, int convert, int DrawMode, int Color, bool DrawPinText) { int i, x1, y1, x2, y2, t1, t2, orient; LibEDA_BaseStruct *DEntry = NULL; int CharColor; int fill_option; int SetHightColor; //#define GETCOLOR(l) Color < 0 ? (ReturnLayerColor(l)| SetHightColor) : Color; #define GETCOLOR(l) Color < 0 ? SetHightColor ? s_ItemSelectColor : (ReturnLayerColor(l)| SetHightColor) : Color; if (Entry->m_Drawings == NULL) return; GRSetDrawMode(DC, DrawMode); for( DEntry = Entry->m_Drawings; DEntry != NULL;DEntry = DEntry->Next()) { /* Elimination des elements non relatifs a l'unite */ if( Multi && DEntry->m_Unit && (DEntry->m_Unit != Multi) ) continue; if( convert && DEntry->m_Convert && (DEntry->m_Convert != convert) ) continue; if ( DEntry->m_Flags & IS_MOVED ) continue; // Element en deplacement non trace SetHightColor = (DEntry->m_Selected & IS_SELECTED) ? HIGHT_LIGHT_FLAG : 0; switch (DEntry->m_StructType) { case COMPONENT_ARC_DRAW_TYPE: { int xc,yc, x2, y2; LibDrawArc * Arc = (LibDrawArc *) DEntry; CharColor = GETCOLOR(LAYER_DEVICE); xc = Pos.x + TransMat[0][0] * Arc->m_Pos.x + TransMat[0][1] * Arc->m_Pos.y; yc = Pos.y + TransMat[1][0] * Arc->m_Pos.x + TransMat[1][1] * Arc->m_Pos.y; x2 = Pos.x + TransMat[0][0] * Arc->m_Start.x + TransMat[0][1] * Arc->m_Start.y;; y2 = Pos.y + TransMat[1][0] * Arc->m_Start.x + TransMat[1][1] * Arc->m_Start.y; x1 = Pos.x + TransMat[0][0] * Arc->m_End.x + TransMat[0][1] * Arc->m_End.y;; y1 = Pos.y + TransMat[1][0] * Arc->m_End.x + TransMat[1][1] * Arc->m_End.y; t1 = Arc->t1; t2 = Arc->t2; bool swap = MapAngles(&t1, &t2, TransMat); if ( swap ) { EXCHG(x1,x2); EXCHG(y1, y2) } fill_option = Arc->m_Fill & (~g_PrintFillMask); if ( Color < 0 ) // Normal Color Layer { if ( (fill_option == FILLED_WITH_BG_BODYCOLOR) && ! g_IsPrinting ) GRFilledArc(&panel->m_ClipBox, DC, xc, yc, t1, t2, Arc->m_Rayon, CharColor, ReturnLayerColor(LAYER_DEVICE_BACKGROUND)); else if ( fill_option == FILLED_SHAPE) GRFilledArc(&panel->m_ClipBox, DC, xc, yc, t1, t2, Arc->m_Rayon, CharColor, CharColor); #ifdef DRAW_ARC_WITH_ANGLE else GRArc(&panel->m_ClipBox, DC, xc, yc, t1, t2, Arc->m_Rayon, CharColor); #else else GRArc1(&panel->m_ClipBox, DC, x1, y1, x2, y2, xc, yc , CharColor); #endif } #ifdef DRAW_ARC_WITH_ANGLE else GRArc(&panel->m_ClipBox, DC, xc, yc, t1, t2, Arc->m_Rayon, CharColor); #else else GRArc1(&panel->m_ClipBox, DC, x1, y1, x2, y2, xc, yc, CharColor); #endif }