void pelet::UCharBufferedFileClass::Close() { CleanupBuffer(); if (NULL != File) { u_fclose(File); File = NULL; } Buffer = NULL; Eof = NULL; File = NULL; BufferCapacity = 0; CharacterPos = 0; HasReachedEof = false; Current = NULL; TokenStart = NULL; Marker = NULL; Limit = NULL; }
void SaveScreen::Resize(int NewX,int NewY, DWORD Corner, bool SyncWithConsole) // Corner definition: // 0 --- 1 // | | // 2 --- 3 { const auto OWi = width(); const auto OHe = height(); int iY = 0; if (OWi==NewX && OHe==NewY) { return; } int NX1 = 0, NX2 = 0, NY1 = 0, NY2 = 0; matrix<FAR_CHAR_INFO> NewBuf(NewY, NewX); CleanupBuffer(NewBuf.data(), NewBuf.size()); const auto NewWidth = std::min(OWi, NewX); const auto NewHeight = std::min(OHe, NewY); int iYReal; int ToIndex=0; int FromIndex=0; if (Corner & 2) { NY2 = m_Y1 + NewY - 1; NY1 = NY2 - NewY + 1; } else { NY1 = m_Y1; NY2 = NY1 + NewY - 1; } if (Corner & 1) { NX2 = m_X1 + NewX - 1; NX1 = NX2 - NewX + 1; } else { NX1 = m_X1; NX2 = NX1 + NewX - 1; } for (iY=0; iY<NewHeight; iY++) { if (Corner & 2) { if (OHe>NewY) { iYReal=OHe-NewY+iY; FromIndex=iYReal*OWi; ToIndex=iY*NewX; } else { iYReal=NewY-OHe+iY; ToIndex=iYReal*NewX; FromIndex=iY*OWi; } } if (Corner & 1) { if (OWi>NewX) { FromIndex+=OWi-NewX; } else { ToIndex+=NewX-OWi; } } std::copy_n(ScreenBuf.data() + FromIndex, NewWidth, NewBuf.data() + ToIndex); } // achtung, experimental if((Corner&2) && SyncWithConsole) { Console().ResetPosition(); if(NewY!=OHe) { matrix<FAR_CHAR_INFO> Tmp(abs(OHe - NewY), std::max(NewX, OWi)); if(NewY>OHe) { SMALL_RECT ReadRegion={0, 0, static_cast<SHORT>(NewX-1), static_cast<SHORT>(NewY-OHe-1)}; Console().ReadOutput(Tmp, ReadRegion); for(size_t i = 0; i != Tmp.height(); ++i) { std::copy_n(Tmp[i].data(), Tmp.width(), NewBuf[i].data()); } } else { SMALL_RECT WriteRegion={0, static_cast<SHORT>(NewY-OHe), static_cast<SHORT>(NewX-1), -1}; for(size_t i = 0; i != Tmp.height(); ++i) { std::copy_n(ScreenBuf[i].data(), Tmp.width(), Tmp[i].data()); } Console().WriteOutput(Tmp, WriteRegion); Console().Commit(); } } if(NewX!=OWi) { matrix<FAR_CHAR_INFO> Tmp(std::max(NewY, OHe), abs(NewX - OWi)); if(NewX>OWi) { SMALL_RECT ReadRegion={static_cast<SHORT>(OWi), 0, static_cast<SHORT>(NewX-1), static_cast<SHORT>(NewY-1)}; Console().ReadOutput(Tmp, ReadRegion); for(size_t i = 0; i != NewBuf.height(); ++i) { std::copy_n(Tmp[i].data(), Tmp.width(), &NewBuf[i][OWi]); } } else { SMALL_RECT WriteRegion={static_cast<SHORT>(NewX), static_cast<SHORT>(NewY-OHe), static_cast<SHORT>(OWi-1), static_cast<SHORT>(NewY-1)}; for(size_t i = 0; i != Tmp.height(); ++i) { if (static_cast<int>(i) < OHe) std::copy_n(&ScreenBuf[i][NewX], Tmp.width(), Tmp[i].data()); else CleanupBuffer(Tmp[i].data(), Tmp.width()); } Console().WriteOutput(Tmp, WriteRegion); Console().Commit(); } } } ScreenBuf.swap(NewBuf); m_X1 = NX1; m_Y1 = NY1; m_X2 = NX2; m_Y2 = NY2; }
void SaveScreen::Resize(int NewX,int NewY, DWORD Corner, bool SyncWithConsole) // Corner definition: // 0 --- 1 // | | // 2 --- 3 { int OWi=X2-X1+1, OHe=Y2-Y1+1, iY=0; if (OWi==NewX && OHe==NewY) { return; } int NX1,NX2,NY1,NY2; NX1=NX2=NY1=NY2=0; std::vector<FAR_CHAR_INFO> NewBuf(NewX * NewY); CleanupBuffer(NewBuf.data(), NewBuf.size()); int NewWidth=std::min(OWi,NewX); int NewHeight=std::min(OHe,NewY); int iYReal; int ToIndex=0; int FromIndex=0; if (Corner & 2) { NY2=Y1+NewY-1; NY1=NY2-NewY+1; } else { NY1=Y1; NY2=NY1+NewY-1; } if (Corner & 1) { NX2=X1+NewX-1; NX1=NX2-NewX+1; } else { NX1=X1; NX2=NX1+NewX-1; } for (iY=0; iY<NewHeight; iY++) { if (Corner & 2) { if (OHe>NewY) { iYReal=OHe-NewY+iY; FromIndex=iYReal*OWi; ToIndex=iY*NewX; } else { iYReal=NewY-OHe+iY; ToIndex=iYReal*NewX; FromIndex=iY*OWi; } } if (Corner & 1) { if (OWi>NewX) { FromIndex+=OWi-NewX; } else { ToIndex+=NewX-OWi; } } CharCopy(&NewBuf[ToIndex], &ScreenBuf[FromIndex], NewWidth); } // achtung, experimental if((Corner&2) && SyncWithConsole) { Global->Console->ResetPosition(); if(NewY!=OHe) { COORD Size={static_cast<SHORT>(std::max(NewX,OWi)), static_cast<SHORT>(abs(OHe-NewY))}; COORD Coord={}; std::vector<FAR_CHAR_INFO> Tmp(Size.X * Size.Y); if(NewY>OHe) { SMALL_RECT ReadRegion={0, 0, static_cast<SHORT>(NewX-1), static_cast<SHORT>(NewY-OHe-1)}; Global->Console->ReadOutput(Tmp.data(), Size, Coord, ReadRegion); for(int i=0; i<Size.Y;i++) { CharCopy(&NewBuf[i*Size.X], &Tmp[i*Size.X], Size.X); } } else { SMALL_RECT WriteRegion={0, static_cast<SHORT>(NewY-OHe), static_cast<SHORT>(NewX-1), -1}; for(int i=0; i<Size.Y;i++) { CharCopy(&Tmp[i*Size.X], &ScreenBuf[i*OWi], Size.X); } Global->Console->WriteOutput(Tmp.data(), Size, Coord, WriteRegion); Global->Console->Commit(); } } if(NewX!=OWi) { COORD Size={static_cast<SHORT>(abs(NewX-OWi)), static_cast<SHORT>(std::max(NewY,OHe))}; COORD Coord={}; std::vector<FAR_CHAR_INFO> Tmp(Size.X * Size.Y); if(NewX>OWi) { SMALL_RECT ReadRegion={static_cast<SHORT>(OWi), 0, static_cast<SHORT>(NewX-1), static_cast<SHORT>(NewY-1)}; Global->Console->ReadOutput(Tmp.data(), Size, Coord, ReadRegion); for(int i=0; i<NewY;i++) { CharCopy(&NewBuf[i*NewX+OWi], &Tmp[i*Size.X], Size.X); } } else { SMALL_RECT WriteRegion={static_cast<SHORT>(NewX), static_cast<SHORT>(NewY-OHe), static_cast<SHORT>(OWi-1), static_cast<SHORT>(NewY-1)}; for(int i=0; i<Size.Y;i++) { if (i < OHe) CharCopy(&Tmp[i*Size.X], &ScreenBuf[i*OWi+NewX], Size.X); else CleanupBuffer(&Tmp[i*Size.X], Size.X); } Global->Console->WriteOutput(Tmp.data(), Size, Coord, WriteRegion); Global->Console->Commit(); } } } ScreenBuf.swap(NewBuf); X1=NX1; Y1=NY1; X2=NX2; Y2=NY2; }