void main(int argc,String *argv) { ArgParser a=ArgParser(argc,argv); String fname=a.argafter("-i","Font file (.jf)"); float size=scrhei/2.0; // float size=scrhei/2.0*5; JBmp j=JBmp(scrwid,scrhei,0); j.setupfastsmooth(6); JFont font=JFont(fname); // String word="retro asymptotic cyberdruid"; String word=Salphabet(); int l=1; allegrosetup(scrwid,scrhei); makepalette(&greypalette); randomise(); while (!keypressed()) { // String c=Smid(word,intrnd(1,Slen(word)),1); String c=Smid(word,l,1); if (myrnd()<0.07) font.writeString(Smid(word,intrnd(1,Slen(word)),1),&j,myrnd()*scrwid,myrnd()*scrhei,0.5+0.5*myrnd()*size,255); if (myrnd()<0.07) font.centerString("retro",&j,myrnd()*scrwid,myrnd()*scrhei,0.5+0.5*myrnd()*size,255); if (myrnd()<0.07) font.centerString("asymptotic",&j,myrnd()*scrwid,myrnd()*scrhei,0.5+0.5*myrnd()*size,255); if (myrnd()<0.07) font.centerString("cyber druid",&j,myrnd()*scrwid,myrnd()*scrhei,0.5+0.5*myrnd()*size,255); j.fadeby(10); j.randomfastsmooth(); j.writetoscreen(); //l=(l%Slen(word))+1; } }
void main(int argc,String *argv) { randomise(); ArgParser a=ArgParser(argc,argv); String fname=a.argafter("-i","GF lines filename","ls.gf"); cdclip=a.floatafter("-ed","Maximum end distance of lines",30); creepintoline=a.floatafter("-ic","Intersection can creep in this much of the line",0.02); dotabove=a.floatafter("-pd","Parallelity: dot product must be above this",0.5); minlen=a.floatafter("-ml","Minimum length of a line",20); bool displaying=!a.argexists("nod","Don't display"); String imname=a.argafter("-oi","Original image","none"); oiscale=a.floatafter("-ois","Scale to original image",2); bool overlaylines=a.argexists("-ol","Overlay lines"); int imwidth=a.intafter("-rqw","width of recovered quad images (pixels)",200); // float favourlarge=a.floatafter("-fl","Favour large by",0.8); // old method float favourlarge=a.floatafter("-fl","Favour large by",1.2); dividebyarea=!a.argexists("-dd","Don't divide V by area"); oldmethod=a.argexists("-osm","Old stats method (area not sum mags, score reciprocal not -ve)"); a.done(); // Specific to my images printf("Auto scale? "); String tmp=imname; if (Sinstrlast(tmp,"/")) tmp=Sfrom(tmp,Sinstrlast(tmp,"/")+1); if (Sstarts(tmp,"image")) { printf("2.5"); oiscale=2.5; } if (Sstarts(tmp,"img") || Slen(Sbefore(tmp,"."))==2) { printf("2.0"); oiscale=2.0; } printf("\n"); // Read list from file and find quads (looks easy!) List<QuadsLine2d> ls=readgfset(fname); helloworld(); printf("Finding quads\n"); List<Polygon2d> qs=findquads(ls); printf("df..."); JFont coolfont=JFont(0.5); printf("fd...\n"); if (!Seq(imname,"none")) { printf("Trying to read original file (%s)...",imname); oi=RGBmp::readfile(imname); Map2d<float> *gs=oi->getgreyscale(); jbmp=JBmp(oi->width*0.5,oi->height*0.5); jbmp.clear(255); for (int i=1; i<=ls.len; i++) { QuadsLine2d l=ls.num(i)*oiscale*0.5; jbmp.line(l,0); //jbmp.thickline(l,1,255); } jbmp.writefile("lines.bmp"); // Simple quad map Map2d<bool> jb=Map2d<bool>(oi->width*0.5,oi->height*0.5,255); for (int i=1; i<=qs.len; i++) { // jb.clear(); Polygon2d p=qs.num(i); for (int j=1; j<=p.vs.len; j++) { jb.line(p.linefrom(j)*0.5*oiscale,0); } } jb.writefile("quads.bmp"); // Edge detection printf("Doing edge detection\n"); gs->edgedetection(Map2d<float>::sobel(),&mag,&angs); // angs->display(); // exit(0); qs.applycall(&scalepoly); // No need for oiscale after this point for (int i=1; i<=qs.len; i++) { Polygon2d *quad=qs.p2num(i); quad->name=Schr(Sasc("A")+(i-1)%26); } // Overlay lines on original if (overlaylines) { RGBmp *linesover=oi->scaledby(0.5); for (int i=1; i<=ls.len; i++) linesover->thickline(0.5*oiscale*ls.num(i),myRGB(0,0,0),4); for (int i=1; i<=ls.len; i++) linesover->line(0.5*oiscale*ls.num(i),myRGB(255,255,255)); linesover->writefile("linesover.bmp"); } // Overlay quads on original RGBmp *rgbmp=oi->scaledby(0.5); for (int i=1; i<=qs.len; i++) { Polygon2d p=qs.num(i); for (int j=1; j<=p.vs.len; j++) { rgbmp->thickline(0.5*p.linefrom(j),myRGB(0,0,0),4); } } for (int i=1; i<=qs.len; i++) { Polygon2d p=qs.num(i); for (int j=1; j<=p.vs.len; j++) { rgbmp->line(0.5*p.linefrom(j),myRGB(255,255,255)); } } rgbmp->writefile("overlay.bmp"); RGBmp *detailed=new RGBmp(oi->width/2.0,oi->height/2.0,myRGB(255,255,255));//oi->scaledby(1); for (int i=1; i<=qs.len; i++) { Polygon2d p=qs.num(i); for (int j=1; j<=p.vs.len; j++) { detailed->line(p.linefrom(j)*0.5,myRGB(0,0,0)); } // V2d t=(p.vs.num(1)+p.vs.num(2)+p.vs.num(3)+p.vs.num(4))/4.0/2.0+V2d::random()*100/2.0; V2d t=V2d(myrnd()*detailed->width,myrnd()*detailed->height); for (int k=1; k<=4; k++) { V2d c=p.vs.num(k)/2.0; detailed->line(c,t,myRGB(0,0,0)); } String data=Sformat("%s",p.name); coolfont.centerString(data,detailed,t.x,t.y,8,myRGB(0,0,0)); } detailed->writefile("data.bmp"); List<String> left; List<String> right; for (int i=1; i<=qs.len; i++) { Polygon2d *p=qs.p2num(i); String s=Sformat("%s score %.3f, area %.3f",p->name,scorefor(p),p->area()); if (p->centroid().x<oi->width/2.0) left.add(s); else right.add(s); } List<String> data; // data.add(Sformat("GF %s td=%.2f ti=%.2d tp=%.2f minlen=%.2f Image %s scale=%.2f widthofrecquad=%.2f favourlarge=%.2f",fname,cdclip,creepintoline,dotabove,minlen,imname,oiscale,favourlarge)); String tmp=""; if (dividebyarea) tmp=Sconc(tmp,"Dividing V by area. "); data.add(tmp); data.add(""); data.add("-- Left:"); data.add(left); data.add("-- Right:"); data.add(right); writelinestofile(data,"data.txt"); /* printf("Ordering\n"); qs=qs.qsort(&offness); printf("Done ordering.\n");*/ printf("Removing overlapping quads (%i) ...\n",qs.len); data.add("-- Rejection:"); // Check all containers first for (int i=1; i<=qs.len; i++) { Polygon2d *quad=qs.p2num(i); bool done=false; for (int j=1; j<=qs.len && !done; j++) { // Compare to all others (one-directional) printf("Comparing (%i/%i) to %i : ",i,qs.len,j); if (i!=j) { Polygon2d *oquad=qs.p2num(j); data.add(Sformat("Comparing %s to %s %i %i",quad->name,oquad->name,i,j)); bool overlaps=quad->overlaps(oquad,0.99); if (overlaps==Polygon2d::container) { // quad envelops oquad if (scorefor(quad)>0.8*scorefor(oquad)) { // data.add(ql(&qs)); data.add(Sformat("%s contained %s and rejected it",quad->name,oquad->name)); qs.remnum(j); j--; if (i>j) { i--; done=true; } printf("Contained quad rejected"); // data.add(ql(&qs)); } } } printf("\n"); } } // Then overlapping in general for (int i=1; i<=qs.len; i++) { Polygon2d *quad=qs.p2num(i); bool done=false; for (int j=i+1; j<=qs.len && !done; j++) { // bi-derectional printf("Comparing (%i/%i) to %i : ",i,qs.len,j); Polygon2d *oquad=qs.p2num(j); bool overlaps=quad->overlaps(oquad); if (overlaps) { if (scorefor(quad)>scorefor(oquad)) { // data.add(ql(&qs)); data.add(Sformat("%s beat %s.",quad->name,oquad->name)); qs.remnum(j); j--; printf("Second quad rejected"); // data.add(ql(&qs)); } else { // data.add(ql(&qs)); data.add(Sformat("%s beat %s,",oquad->name,quad->name)); qs.remnum(i); i--; done=true; printf("First quad rejected"); //data.add(ql(&qs)); } } printf("\n"); } } printf("Done: now (%i) quads.\n",qs.len); // Overlay again RGBmp *rgbmp2=oi->scaledby(0.5); for (int i=1; i<=qs.len; i++) { Polygon2d p=qs.num(i); for (int j=1; j<=p.vs.len; j++) { rgbmp2->thickline(0.5*p.linefrom(j),myRGB(0,0,0),4); } } for (int i=1; i<=qs.len; i++) { Polygon2d p=qs.num(i); for (int j=1; j<=p.vs.len; j++) { rgbmp2->line(0.5*p.linefrom(j),myRGB(255,255,255)); } V2d t=0.5*p.centroid(); // rgbmp2->line(oiscale*p.num(1),t,V3d(1,0,0)); String data=Sformat("%.3f",scorefor(qs.p2num(i))); //coolfont.centerString(data,rgbmp2,t.x,t.y,9,myRGB(255,0,0)); } rgbmp2->writefile("overlay2.bmp"); // Simple quad map again Map2d<bool> jbq=Map2d<bool>(oi->width*0.5,oi->height*0.5,255); for (int i=1; i<=qs.len; i++) { // jb.clear(); Polygon2d p=qs.num(i); for (int j=1; j<=p.vs.len; j++) { jbq.line(p.linefrom(j)*0.5,0); } } jbq.writefile("quads2.bmp"); // Recover text List<RGBmp *> rec; // oi->display(); for (int i=1; i<=qs.len && i<=5; i++) { List<V2d> *l=&qs.num(i).vs; RGBmp *n=oi->recoverquad(l,1,imwidth); n->writefile(getnextfilename("recquad","bmp")); rec.add(n); } if (displaying) { // waitforkeypress(); jbmp.display(); jb.display(); for (int i=1; i<=rec.len; i++) rec.num(i)->display(); } data.add("-- Final quads:"); for (int i=1; i<=qs.len; i++) { Polygon2d *p=qs.p2num(i); String s=Sformat("%s %.3f",p->name,scorefor(p)); data.add(s); } writelinestofile(data,"data.txt"); } // allegroexit(); printf("%i quadrilaterals found\n",qs.len); }
void main(int argc,String *argv) { randomise(); ArgParser a=ArgParser(argc,argv); String fname=a.argafter("-i","GF lines filename","ls.gf"); cdclip=a.floatafter("-ed","Maximum end distance of lines",30); creepintoline=a.floatafter("-ic","Intersection can creep in this much of a the line",0.02); dotabove=a.floatafter("-pd","Parallelity: dot product must be above this",0.5); minlen=a.floatafter("-ml","Minimum length of a line",20); bool displaying=!a.argexists("nod","Don't display"); String imname=a.argafter("-oi","Original image","none"); oiscale=a.floatafter("-ois","Scale to original image",2); // Read list from file and find quads (looks easy!) List<QuadsLine2d> ls=readgfset(fname); helloworld(); printf("Finding quads\n"); jbmp.clear(0); for (int i=1;i<=ls.len;i++) { QuadsLine2d l=ls.num(i)*1.8; jbmp.line(l,255); //jbmp.thickline(l,1,255); } List<Polygon2d> qs=findquads(ls); jbmp.writefile("lines.bmp"); // Simple quad map Map2d<bool> jb=Map2d<bool>(640,480,15); for (int i=1;i<=qs.len && !key[KEY_ESC];i++) { // jb.clear(); Polygon2d p=qs.num(i); for (int j=1;j<=p.vs.len;j++) { jb.line(p.linefrom(j)*1.8,0); } } jb.writefile("quads.bmp"); if (displaying) { jbmp.display(); jb.display(); allegroexit(); } JFont coolfont=JFont("c:/joey/code/c/gfx2d/jfont/cool.jf",0.5); printf("fd...\n"); if (!Seq(imname,"none")) { oi=RGBmp::readfile(imname); Map2d<float> *gs=oi->getgreyscale(); // Edge detection printf("Doing edge detection\n"); gs->edgedetection(Map2d<float>::sobel(),&mag,&angs); // angs->display(); // exit(0); qs.applycall(&scalepoly); // Overlay quads on original RGBmp *rgbmp=oi->scaledby(0.5); for (int i=1;i<=qs.len && !key[KEY_ESC];i++) { Polygon2d p=qs.num(i); for (int j=1;j<=p.vs.len;j++) { rgbmp->thickline(0.5*p.linefrom(j),myRGB(0,0,0),3); } } for (int i=1;i<=qs.len && !key[KEY_ESC];i++) { Polygon2d p=qs.num(i); for (int j=1;j<=p.vs.len;j++) { rgbmp->line(0.5*p.linefrom(j),myRGB(0,255,255)); } } rgbmp->writefile("overlay.bmp"); RGBmp *detailed=new RGBmp(oi->width/2.0,oi->height/2.0,myRGB(255,255,255));//oi->scaledby(1); for (int i=1;i<=qs.len && !key[KEY_ESC];i++) { Polygon2d p=qs.num(i); for (int j=1;j<=p.vs.len;j++) { detailed->thickline(p.linefrom(j)*0.5,myRGB(0,0,0),1); } if (myrnd()<1.0/4.0) { V2d c=p.vs.num(intrnd(1,4)); V2d t=c+V2d::random()*100; //detailed->line(c,t,myRGB(0,0,0)); String data=Sformat("%.2f",scorefor(qs.p2num(i))); coolfont.centerString(data,detailed,t.x,t.y,8,myRGB(0,0,32)); } } detailed->writefile("data.bmp"); List<String> left; List<String> right; for (int i=1;i<=qs.len;i++) { Polygon2d *p=qs.p2num(i); String s=Sformat("%.3f",scorefor(p)); if (p->centroid().x<oi->width/2.0) left.add(s); else right.add(s); } List<String> data; data.add("-- Left:"); data.add(left); data.add("-- Right:"); data.add(right); writelinestofile(data,"data.txt"); /* printf("Ordering\n"); qs=qs.qsort(&offness); printf("Done ordering.\n");*/ printf("Removing overlapping quads (%i) ...\n",qs.len); // Check all containers first for (int i=1;i<=qs.len;i++) { Polygon2d *quad=qs.p2num(i); bool done=false; for (int j=1;j<=qs.len && !done;j++) { // Compare to all others (one-directional) printf("Comparing (%i/%i) to %i : ",i,qs.len,j); if (i!=j) { Polygon2d *oquad=qs.p2num(j); bool overlaps=quad->overlaps(oquad,0.99); if (overlaps==Polygon2d::container) { // quad envelops oquad if (scorefor(quad)>0.8*scorefor(oquad)) { qs.remnum(j); j--; if (i>j) i--; printf("Contained quad rejected"); } } } printf("\n"); } } // Then overlapping in general for (int i=1;i<=qs.len;i++) { Polygon2d *quad=qs.p2num(i); bool done=false; for (int j=i+1;j<=qs.len && !done;j++) { // bi-derectional printf("Comparing (%i/%i) to %i : ",i,qs.len,j); Polygon2d *oquad=qs.p2num(j); bool overlaps=quad->overlaps(oquad); if (overlaps) { if (scorefor(quad)>scorefor(oquad)) { qs.remnum(j); j--; printf("Second quad rejected"); } else { qs.remnum(i); i--; done=true; printf("First quad rejected"); } } printf("\n"); } } printf("Done: now (%i) quads.\n",qs.len); // Overlay again RGBmp *rgbmp2=oi->scaledby(0.5); for (int i=1;i<=qs.len && !key[KEY_ESC];i++) { Polygon2d p=qs.num(i); for (int j=1;j<=p.vs.len;j++) { rgbmp2->thickline(0.5*p.linefrom(j),myRGB(0,0,0),3); } } for (int i=1;i<=qs.len && !key[KEY_ESC];i++) { Polygon2d p=qs.num(i); for (int j=1;j<=p.vs.len;j++) { rgbmp2->line(0.5*p.linefrom(j),myRGB(0,255,255)); } V2d t=0.5*p.centroid(); // rgbmp2->line(oiscale*p.num(1),t,V3d(1,0,0)); String data=Sformat("%.3f",scorefor(qs.p2num(i))); //coolfont.centerString(data,rgbmp2,t.x,t.y,9,myRGB(255,0,0)); } rgbmp2->writefile("overlay2.bmp"); // Recover text List<RGBmp *> rec; // oi->display(); for (int i=1;i<=qs.len && i<=5;i++) { List<V2d> *l=&qs.num(i).vs; RGBmp *n=oi->recoverquad(l,1); n->writefile(getnextfilename("recquad","bmp")); rec.add(n); } if (displaying) { waitforkeypress(); jbmp.display(); jb.display(); for (int i=1;i<=rec.len && !key[KEY_ESC];i++) rec.num(i)->display(); } data.add("-- Final quads:"); for (int i=1;i<=qs.len;i++) { Polygon2d *p=qs.p2num(i); String s=Sformat("%.3f",scorefor(p)); data.add(s); } writelinestofile(data,"data.txt"); } allegroexit(); printf("%i quadrilaterals found\n",qs.len); }
void JTEStyler::UpdateStyles ( const JTextEditor* te, const JString& text, JRunArray<JFont>* styles, JIndexRange* recalcRange, JIndexRange* redrawRange, const JBoolean deletion, JArray<TokenData>* tokenStartList ) { if (!itsActiveFlag) { tokenStartList->RemoveAll(); return; } const JSize textLength = text.GetLength(); if (textLength == 0) { tokenStartList->RemoveAll(); return; } TokenData tokenData; if (recalcRange->first == 1 && recalcRange->last >= text.GetLength()) { itsRedoAllFlag = kJTrue; itsCheckRange.Set(1, text.GetLength()); tokenStartList->RemoveAll(); tokenData = TokenData(1, GetFirstTokenExtraData()); tokenStartList->AppendElement(tokenData); styles->RemoveAll(); } else { itsRedoAllFlag = kJFalse; // calculate the range that needs to be checked JIndex firstIndex = recalcRange->first; JIndex lastIndex = recalcRange->last; if ((deletion && firstIndex > 1) || firstIndex > textLength) { // This fixes the case when the last character of the token is deleted. firstIndex--; // This fixes the case when the style run and the token both // end at the inserted text. (e.g. "x [ y ]" <- "x // y ]") lastIndex++; } if (lastIndex > textLength) { // We can't decrease recalcRange's end index, and we can't find // textLength+1 in *styles. lastIndex = textLength; } JIndex runIndex1, firstIndexInRun1; JBoolean ok = styles->FindRun(firstIndex, &runIndex1, &firstIndexInRun1); assert( ok ); JIndex runIndex2 = runIndex1; JIndex firstIndexInRun2 = firstIndexInRun1; ok = styles->FindRun(firstIndex, lastIndex, &runIndex2, &firstIndexInRun2); assert( ok ); run_assert(styles, lastIndex, runIndex2, firstIndexInRun2); itsCheckRange.Set(firstIndexInRun1, firstIndexInRun2 + styles->GetRunLength(runIndex2)-1); // let derived class expand the range JIndexRange savedRange = itsCheckRange; PreexpandCheckRange(text, *styles, *recalcRange, deletion, &itsCheckRange); assert( itsCheckRange.Contains(savedRange) && itsCheckRange.last <= styles->GetElementCount() ); // find nearest token in front of itsCheckRange if (tokenStartList->IsEmpty()) { tokenData = TokenData(1, GetFirstTokenExtraData()); tokenStartList->AppendElement(tokenData); } else { JBoolean foundTokenStart; TokenData target(itsCheckRange.first, TokenExtra()); JIndex tokenStartIndex = tokenStartList->SearchSorted1(target, JOrderedSetT::kAnyMatch, &foundTokenStart); if (!foundTokenStart) { tokenStartIndex--; // wants to insert -after- the value } tokenData = tokenStartList->GetElement(tokenStartIndex); // the rest of the token starts are invalid const JSize tokenStartCount = tokenStartList->GetElementCount(); if (tokenStartIndex < tokenStartCount) { tokenStartList->RemoveNextElements(tokenStartIndex+1, tokenStartCount - tokenStartIndex); } } // While typing in one place, it is much faster to back up from itsCheckRange // than to start from the top. itsTokenRunIndex = runIndex1; itsTokenFirstInRun = firstIndexInRun1; ok = styles->FindRun(firstIndex, tokenData.startIndex, &itsTokenRunIndex, &itsTokenFirstInRun); assert( ok ); run_assert(styles, tokenData.startIndex, itsTokenRunIndex, itsTokenFirstInRun); } // prepare to accumulate new token starts itsTokenStartList = tokenStartList; itsTokenStartCount = 0; itsTokenStart = tokenData.startIndex; // scan the text and adjust the styles std::istrstream input(text.GetCString(), text.GetLength()); JSeekg(input, itsTokenStart-1); itsTE = te; itsFontMgr = te->TEGetFontManager(); itsDefFont = jnew JFont(te->GetDefaultFont()); itsText = &text; itsStyles = styles; itsRecalcRange = recalcRange; itsRedrawRange = redrawRange; #if DEBUG_TIMING_INFO JStopWatch timer; timer.StartTimer(); #endif Scan(input, tokenData.data); #if DEBUG_TIMING_INFO timer.StopTimer(); std::cout << "JTEStyler: " << timer.PrintTimeInterval() << std::endl; #endif itsTE = NULL; itsFontMgr = NULL; itsText = NULL; itsStyles = NULL; itsRecalcRange = NULL; itsRedrawRange = NULL; itsTokenStartList = NULL; jdelete itsDefFont; itsDefFont = NULL; }
#include "JFont.h" #include "JDictionary.h" #include "JWindow.hpp" extern JDictionary JFontTable; JFont JFont::standard; char* theJFont = JFont().Register(); void JFont::writeContent(JOutputStream& os) { JObject::writeContent(os); putObject(os, "name", name); putInteger(os, "style", style); putInteger(os, "size", size); } void JFont::readContent(JDictionary& dict) { JObject::readContent(dict); name = *(JString*)getObject(dict, "name"); style = getInteger(dict, "style"); size = getInteger(dict, "size"); } const char* JFont::className() const { return "JFont";} int JFont::hashCode() const { return (name.hashCode()^style^size)&hashMask;} JObject* JFont::clone() const { return new JFont(*this);} int JFont::compareTo(const JObject& s) const { if (className() != s.className()) return JObject::compareTo(s); JFont &obj = *(JFont*)&s;