void RenderBackend::popClipArea() { assert(!m_clipstack.empty()); m_clipstack.pop(); if (m_clipstack.empty()) { setClipArea(getArea(), false); } else { ClipInfo ci = m_clipstack.top(); setClipArea(ci.r, ci.clearing); } }
void RenderBackend::popClipArea() { assert(!m_clipstack.empty()); m_clipstack.pop(); if (m_clipstack.empty()) { setClipArea(getArea(), false); } else { ClipInfo ci = m_clipstack.top(); // instead of using ci.clearing, we set it to false // to avoid double clearing setClipArea(ci.r, false); } }
void Image::pushClipArea(const Rect& cliparea, bool clear) { ClipInfo ci; ci.r = cliparea; ci.clearing = clear; m_clipstack.push(ci); setClipArea(cliparea, clear); }
void Image::popClipArea() { assert(!m_clipstack.empty()); m_clipstack.pop(); if (m_clipstack.empty()) { clearClipArea(); } else { ClipInfo ci = m_clipstack.top(); setClipArea(ci.r, ci.clearing); } }
void renderTopSceneView(gameLevel *gl,BMPimage *view,viewGame *vg) { scene *sc; float xfc,yfc; boxArea v2d; int color; int numCelViewX=vg->celx; // maximo igual = sc->sizex int numCelViewY=vg->cely; // maximo igual = sc->sizey int tamViewX; int tamViewY; int xof=vg->x; int yof=vg->y; int xc,yc; int dx,dy; int x,y; int x1,y1,x2,y2; int xcel,ycel,xcel2,ycel2; float rx,ry,rsx,rsy; unsigned short *bp; Actor *ac; int xmax,ymax; //tamanho da janela em pixels tamViewX=vg->tamx; tamViewY=vg->tamy; v2d.x1=0;v2d.y1=0;v2d.x2=tamViewX-1;v2d.y2=tamViewY-1; //Define uma clip area do tamanho da area da janela posicionada na tela setClipArea(v2d.x1+xof,v2d.y1+yof,v2d.x2+xof+1,v2d.y2+yof+1,view); //Calcula o fator de escala de acordo com as dimensoes da janela sc = gl->sceneLevel; rx=(float)(sc->realSizeTiledx/KDD_FIX); rx*=numCelViewX; rx=rx/tamViewX; ry=(float)(sc->realSizeTiledy/KDD_FIX); ry*=numCelViewY; ry=ry/tamViewY; rsy=(float)(sc->realSizeTiledy/KDD_FIX); rsy/=ry; rsx=(float)(sc->realSizeTiledx/KDD_FIX); rsx/=rx; //calcula o valor das dimensoes maxima do cenario xc=(sc->sizex-numCelViewX)*sc->realSizeTiledx; yc=(sc->sizey-numCelViewY)*sc->realSizeTiledy; xmax=xc>>(PDD_FIX+1); ymax=yc>>(PDD_FIX+1); //calcula posição do mouse no view if(vg->flgTouch) { xc=gl->mouse->x; yc=gl->mouse->y; xfc=(float)(xc-xof-tamViewX/2); yfc=(float)(yc-yof-tamViewY/2); xfc*=rx; yfc*=ry; xc=(int)(xfc+vg->xTopView); yc=(int)(yfc+vg->yTopView); vg->mouse.status=gl->mouse->status; vg->mouse.x=xc; vg->mouse.y=yc; gl->mouseView.status=vg->mouse.status; gl->mouseView.x=vg->mouse.x; gl->mouseView.y=vg->mouse.y; gl->mouseView.z=0; } //calcula foco da camera if(vg->flgTopView==0) { vg->flgTopView=1; vg->xTopView=vg->cam.x; vg->yTopView=vg->cam.y; } xfc=(float)(vg->cam.x-vg->xTopView); yfc=(float)(vg->cam.y-vg->yTopView); xfc/=rx; yfc/=ry; xc=(int)(xfc); yc=(int)(yfc); //reposiciona scroll da tela em funcao da area da camera 1/3 da tela centralizada if((xc>(tamViewX/3)) ) { if(vg->xTopView<=xmax) { xfc=(float)(xc-(tamViewX/3)); xfc*=rx; xc=(int)xfc; vg->xTopView+=xc; } } if( (xc<-(tamViewX/3)) ) { if(vg->xTopView>=-xmax) { xfc=(float)(xc+(tamViewX/3)); xfc*=rx; xc=(int)xfc; vg->xTopView+=xc; } } if((yc>(tamViewY/3)) ) { if(vg->yTopView<=ymax) { yfc=(float)(yc-(tamViewY/3)); yfc*=ry; yc=(int)yfc; vg->yTopView+=yc; } } if( (yc<-(tamViewY/3)) ) { if(vg->yTopView>=-ymax) { yfc=(float)(yc+(tamViewY/3)); yfc*=ry; yc=(int)yfc; vg->yTopView+=yc; } } //Desenha box com as dimensoes do cenario todo xc=(0-sc->sizex)*sc->realSizeTiledx; yc=(0-sc->sizey)*sc->realSizeTiledy; xc=xc>>(PDD_FIX+1); yc=yc>>(PDD_FIX+1); xfc=(float)(xc-vg->xTopView); yfc=(float)(yc-vg->yTopView); xfc/=rx; yfc/=ry; xc=(int)(xof+xfc+tamViewX/2); yc=(int)(yof+yfc+tamViewY/2); dx=(int)(rsx*sc->sizex); dy=(int)(rsy*sc->sizey); x1=xc;y1=yc;x2=xc+dx;y2=yc+dy; // drawRetangle (x1,y1,x2,y2,COLOR_BLUE,view); drawBOX (x1,y1,x2,y2,PIXEL(0x7f,0x7f,0x7f),vg->flagAlpha,view); // desenha os box com tamanho maior que zero xcel=((((vg->xTopView)<<(PDD_FIX))/sc->realSizeTiledx))+sc->sizex/2; ycel=((((vg->yTopView)<<(PDD_FIX))/sc->realSizeTiledy))+sc->sizey/2; xcel=xcel-numCelViewX/2-1; ycel=ycel-numCelViewY/2-1; if(xcel<0) xcel=0; if(ycel<0) ycel=0; xcel2=xcel+numCelViewX+3; ycel2=ycel+numCelViewY+3; if(xcel2>sc->sizex) xcel2=sc->sizex; if(ycel2>sc->sizey) ycel2=sc->sizey; for(y=ycel;y<ycel2;y++) { bp=sc->map+y*sc->sizex+xcel; for(x=xcel;x<xcel2;x++) { if(sc->listTiled[*bp]->sizez>0) { xc=(x-sc->sizex/2)*sc->realSizeTiledx; yc=(y-sc->sizey/2)*sc->realSizeTiledy; xc=xc>>(PDD_FIX); yc=yc>>(PDD_FIX); xfc=(float)(xc-vg->xTopView); yfc=(float)(yc-vg->yTopView); xfc/=rx; yfc/=ry; xc=(int)(xof+xfc+tamViewX/2); yc=(int)(yof+yfc+tamViewY/2); dx=(int)((rsx/2.0)+0.5);//dx++; dy=(int)((rsy/2.0)+0.5);//dy++; x1=xc-dx;y1=yc-dy;x2=xc+dx;y2=yc+dy; if(!((x1>v2d.x2+xof) | (x2<v2d.x1+xof) | (y1>v2d.y2+yof) | (y2<v2d.y1+yof))) { //drawRetangle (x1,y1,x2,y2,COLOR_BLUE,view); drawBOX (x1,y1,x2,y2,COLOR_BLACK,vg->flagAlpha,view); } } bp++; } }
void Image::clearClipArea() { setClipArea(m_area, true); }
void RenderBackend::clearClipArea() { setClipArea(getArea(), true); }