/** ** Resize the video screen. ** ** @return True if the resolution changed, false otherwise */ bool CVideo::ResizeScreen(int w, int h) { if (VideoValidResolution(w, h)) { #if defined(USE_OPENGL) || defined(USE_GLES) if (UseOpenGL) { FreeOpenGLGraphics(); FreeOpenGLFonts(); UI.Minimap.FreeOpenGL(); } #endif TheScreen = SDL_SetVideoMode(w, h, TheScreen->format->BitsPerPixel, TheScreen->flags); #if defined(USE_OPENGL) || defined(USE_GLES) ViewportWidth = w; ViewportHeight = h; if (ZoomNoResize) { ReloadOpenGL(); } else { Width = w; Height = h; SetClipping(0, 0, Video.Width - 1, Video.Height - 1); if (UseOpenGL) { ReloadOpenGL(); } } #else Width = w; Height = h; SetClipping(0, 0, Video.Width - 1, Video.Height - 1); #endif return true; } return false; }
/** ** Draw message(s). */ void MessagesDisplay::DrawMessages() { // background so the text is easier to read if (MessagesCount) { Uint32 color = Video.MapRGB(TheScreen->format, 38, 38, 78); Video.FillTransRectangleClip(color, UI.MapArea.X + 8, UI.MapArea.Y + 8, UI.MapArea.EndX - UI.MapArea.X - 16, MessagesCount * (UI.MessageFont->Height() + 1) - MessagesScrollY, 0x80); } // Draw message line(s) for (int z = 0; z < MessagesCount; ++z) { if (z == 0) { PushClipping(); SetClipping(UI.MapArea.X + 8, UI.MapArea.Y + 8, Video.Width - 1, Video.Height - 1); } VideoDrawTextClip(UI.MapArea.X + 8, UI.MapArea.Y + 8 + z * (UI.MessageFont->Height() + 1) - MessagesScrollY, UI.MessageFont, Messages[z]); if (z == 0) { PopClipping(); } } if (MessagesCount < 1) { MessagesSameCount = 0; } }
rViewport::rViewport(const rString& name, rViewportType type){ m_type = type; m_camera = NULL; m_rect.Set(0,0,0,0); m_name = name; SetClipping(1.0f, 100.0f); }
/** ** Draw status line. */ void CStatusLine::Draw() { if (!this->StatusLine.empty()) { PushClipping(); SetClipping(this->TextX, this->TextY, this->TextX + this->Width - 1, Video.Height - 1); CLabel(*this->Font).DrawClip(this->TextX, this->TextY, this->StatusLine); PopClipping(); } }
/** ** Draw status line. */ void CStatusLine::Draw(void) { if (!this->StatusLine.empty()) { PushClipping(); SetClipping(this->TextX, this->TextY, this->TextX + this->Width - 1, Video.Height - 1); VideoDrawTextClip(this->TextX, this->TextY, this->Font, this->StatusLine); PopClipping(); } }
/** ** Resize the video screen. ** ** @return True if the resolution changed, false otherwise */ bool CVideo::ResizeScreen(int w, int h) { if (VideoValidResolution(w, h)) { Width = w; Height = h; TheScreen = SDL_SetVideoMode(w, h, TheScreen->format->BitsPerPixel, TheScreen->flags); SetClipping(0, 0, Video.Width - 1, Video.Height - 1); return true; } return false; }
void TextEntry::Draw() { m_justFocused = false; float size[2]; GetSize(size); // find cursor position float curs_x, curs_y; Gui::Screen::MeasureCharacterPos(m_text, m_cursPos, curs_x, curs_y, m_font); glColor3f(1,0,0); if (curs_x - m_scroll > size[0]*0.75f) { m_scroll += size[0]*0.25f; } else if (curs_x - m_scroll < size[0]*0.25f) { m_scroll -= size[0]*0.25f; if (m_scroll < 0) m_scroll = 0; } glColor3f(0,0,0); glBegin(GL_TRIANGLE_FAN); glVertex2f(0,size[1]); glVertex2f(size[0],size[1]); glVertex2f(size[0],0); glVertex2f(0,0); glEnd(); if (IsFocused()) glColor3f(1,1,1); else glColor3f(.75f, .75f, .75f); glBegin(GL_LINE_LOOP); glVertex2f(0,0); glVertex2f(size[0],0); glVertex2f(size[0],size[1]); glVertex2f(0,size[1]); glEnd(); SetClipping(size[0], size[1]); Gui::Screen::RenderString(m_text, 1.0f - m_scroll, 1.0f, m_font); /* Cursor */ glColor3f(0.5,0.5,0.5); glBegin(GL_LINES); glVertex2f(curs_x + 1.0f - m_scroll, curs_y - Gui::Screen::GetFontHeight(m_font) - 1.0); glVertex2f(curs_x + 1.0f - m_scroll, curs_y + 1.0); glEnd(); EndClipping(); }
void CFont::drawString(gcn::Graphics *graphics, const std::string &txt, int x, int y) { const gcn::ClipRectangle &r = graphics->getCurrentClipArea(); int right = std::min(r.x + r.width - 1, Video.Width - 1); int bottom = std::min(r.y + r.height - 1, Video.Height - 1); if (r.x > right || r.y > bottom) { return; } PushClipping(); SetClipping(r.x, r.y, right, bottom); VideoDrawTextClip(x + r.xOffset, y + r.yOffset, this, txt); PopClipping(); }
/* virtual */ void CFont::drawString(gcn::Graphics *graphics, const std::string &txt, int x, int y) { DynamicLoad(); const gcn::ClipRectangle &r = graphics->getCurrentClipArea(); int right = std::min<int>(r.x + r.width - 1, Video.Width - 1); int bottom = std::min<int>(r.y + r.height - 1, Video.Height - 1); if (r.x > right || r.y > bottom) { return; } PushClipping(); SetClipping(r.x, r.y, right, bottom); CLabel(*this).DrawClip(x + r.xOffset, y + r.yOffset, txt); PopClipping(); }
/** ** Resize the video screen. ** ** @return True if the resolution changed, false otherwise */ bool CVideo::ResizeScreen(int w, int h) { if (VideoValidResolution(w, h)) { if (UseOpenGL) { FreeOpenGLGraphics(); FreeOpenGLFonts(); UI.Minimap.FreeOpenGL(); } Width = w; Height = h; TheScreen = SDL_SetVideoMode(w, h, TheScreen->format->BitsPerPixel, TheScreen->flags); SetClipping(0, 0, Video.Width - 1, Video.Height - 1); if (UseOpenGL) { ReloadOpenGL(); } return true; } return false; }
/** ** Draw message(s). ** ** @todo FIXME: make message font configurable. */ void DrawMessages(void) { // Draw message line(s) for (int z = 0; z < MessagesCount; ++z) { if (z == 0) { PushClipping(); SetClipping(UI.MapArea.X + 8, UI.MapArea.Y + 8, Video.Width - 1, Video.Height - 1); } VideoDrawTextClip(UI.MapArea.X + 8, UI.MapArea.Y + 8 + z * (GameFont->Height() + 1) - MessagesScrollY, GameFont, Messages[z]); if (z == 0) { PopClipping(); } } if (MessagesCount < 1) { MessagesSameCount = 0; } }
void VScrollPortal::Draw() { float size[2]; GetSize(size); SetClipping(size[0], size[1]); m_scrollY = vscrollAdjust.GetValue(); float toScroll = m_childSizeY - size[1]; if (toScroll < 0) toScroll = 0; float scale[2]; Screen::GetCoords2Pixels(scale); glPushMatrix(); // scroll to whole pixel locations whatever the resolution glTranslatef(0, floor((-m_scrollY*toScroll)/scale[1])*scale[1], 0); Container::Draw(); glPopMatrix(); EndClipping(); }
void nuiGLDrawContext::DrawGradient(const nuiGradient& rGradient, const nuiRect& rEnclosingRect, nuiSize x1, nuiSize y1, nuiSize x2, nuiSize y2) { nglVector2f vec(x2 - x1, y2 - y1); nglVector2f para(-vec[1], vec[0]); nglVector2f vec1(vec); nglVector2f para1(para); vec1.Normalize(); para1.Normalize(); // What Quadrant are we in?: // | // a | b // | // ---------------- // | // c | d // | float xa, xb, xc, xd; float ya, yb, yc, yd; float x, y; float xp, yp; float xx, yy; float xxp, yyp; xa = xc = rEnclosingRect.Left(); xb = xd = rEnclosingRect.Right(); ya = yb = rEnclosingRect.Top(); yc = yd = rEnclosingRect.Bottom(); if (x1 < x2) { // Go from a to d or c to b if (y1 == y2) { x = xa; y = ya; xp = xc; yp = yc; xx = xd; yy = yd; xxp= xb; yyp= yb; } else if (y1 < y2) { // a to d IntersectLines(xa,ya, para1[0], para1[1], xb, yb, vec1[0], vec1[1], x, y); IntersectLines(xa,ya, para1[0], para1[1], xc, yc, vec1[0], vec1[1], xp, yp); IntersectLines(xd,yd, para1[0], para1[1], xc, yc, vec1[0], vec1[1], xx, yy); IntersectLines(xd,yd, para1[0], para1[1], xb, yb, vec1[0], vec1[1], xxp, yyp); } else { // c to d IntersectLines(xc,yc, para1[0], para1[1], xa, ya, vec1[0], vec1[1], x, y); IntersectLines(xc,yc, para1[0], para1[1], xd, yd, vec1[0], vec1[1], xp, yp); IntersectLines(xb,yb, para1[0], para1[1], xd, yd, vec1[0], vec1[1], xx, yy); IntersectLines(xb,yb, para1[0], para1[1], xa, ya, vec1[0], vec1[1], xxp, yyp); } } else { if (y1 == y2) { x = xd; y = yd; xp = xb; yp = yb; xx = xa; yy = ya; xxp= xc; yyp= yc; } else if (y1 < y2) { // b to c IntersectLines(xb,yb, para1[0], para1[1], xd, yd, vec1[0], vec1[1], x, y); IntersectLines(xb,yb, para1[0], para1[1], xa, ya, vec1[0], vec1[1], xp, yp); IntersectLines(xc,yc, para1[0], para1[1], xa, ya, vec1[0], vec1[1], xx, yy); IntersectLines(xc,yc, para1[0], para1[1], xd, yd, vec1[0], vec1[1], xxp, yyp); } else { // d to a IntersectLines(xd,yd, para1[0], para1[1], xc, yc, vec1[0], vec1[1], x, y); IntersectLines(xd,yd, para1[0], para1[1], xb, yb, vec1[0], vec1[1], xp, yp); IntersectLines(xa,ya, para1[0], para1[1], xb, yb, vec1[0], vec1[1], xx, yy); IntersectLines(xa,ya, para1[0], para1[1], xc, yc, vec1[0], vec1[1], xxp, yyp); } } float startx,starty; float startxp,startyp; float stopx,stopy; float stopxp,stopyp; if (y1 != y2) { IntersectLines(x1, y1, para1[0], para1[1], x, y, vec1[0], vec1[1], startx, starty); IntersectLines(x1, y1, para1[0], para1[1], xp, yp, vec1[0], vec1[1], startxp, startyp); IntersectLines(x2, y2, para1[0], para1[1], x, y, vec1[0], vec1[1], stopx, stopy); IntersectLines(x2, y2, para1[0], para1[1], xp, yp, vec1[0], vec1[1], stopxp, stopyp); } else { startx = x1; starty = y; startxp = x1; startyp = yp; stopx = x2; stopy = y; stopxp = x2; stopyp = yp; } nuiGradientStopList::const_iterator it = rGradient.GetStopList().begin(); nuiGradientStopList::const_iterator end = rGradient.GetStopList().end(); float px1, py1; float px2, py2; PushClipping(); nuiRect r = rEnclosingRect; nglMatrixf m(GetMatrix()); nglVectorf v1(r.Left(), r.Top(), 0); v1 = m * v1; nglVectorf v2 = nglVectorf(r.Right(), r.Bottom(), 0); v2 = m * v2; r.Set(v1[0], v1[1], v2[0], v2[1], false); Clip(r); SetClipping(true); std::vector<nuiShape::CacheElement::Vertex> vertices; nuiColor col = it->second; vertices.push_back(nuiShape::CacheElement::Vertex(x, y, col)); vertices.push_back(nuiShape::CacheElement::Vertex(xp, yp, col)); for ( ; it != end; ++it) { float r = it->first; float rm = 1.0f - r; px1 = startx * rm + stopx * r; py1 = starty * rm + stopy * r; px2 = startxp * rm + stopxp * r; py2 = startyp * rm + stopyp * r; col = it->second; vertices.push_back(nuiShape::CacheElement::Vertex(px1, py1, col)); vertices.push_back(nuiShape::CacheElement::Vertex(px2, py2, col)); } vertices.push_back(nuiShape::CacheElement::Vertex(xxp, yyp, col)); vertices.push_back(nuiShape::CacheElement::Vertex(xx, yy, col)); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glColorPointer(4, GL_FLOAT, sizeof(nuiShape::CacheElement::Vertex), vertices[0].mColor); glVertexPointer(3, GL_FLOAT, sizeof(nuiShape::CacheElement::Vertex), vertices[0].mCoord); glDrawArrays(GL_QUAD_STRIP, 0, vertices.size()); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); PopClipping(); }
/** ** Draw cursor for selecting building position. */ local void DrawBuildingCursor(void) { int x; int y; int x1; int y1; int mx; int my; int color; int f; int w; int w0; int h; int mask; x=((CursorX-MAP_X)/TileSizeX)*TileSizeX+MAP_X; // Align to grid y=((CursorY-MAP_Y)/TileSizeY)*TileSizeY+MAP_Y; mx=Screen2MapX(x); my=Screen2MapY(y); // // Draw building // PlayerPixels(ThisPlayer); SetClipping(MAP_X,MAP_Y,MAP_X+MapWidth*TileSizeX,MAP_Y+MapHeight*TileSizeY); DrawUnitType(CursorBuilding,0,x,y); // FIXME: This is dangerous here SetClipping(0,0,VideoWidth,VideoHeight); // // Draw the allow overlay // f=CanBuildHere(CursorBuilding,mx,my); // FIXME: Should be moved into unittype structure, and allow more types. if( CursorBuilding->ShoreBuilding ) { mask=MapFieldLandUnit | MapFieldSeaUnit | MapFieldBuilding // already occuppied | MapFieldWall | MapFieldRocks | MapFieldForest // wall,rock,forest not 100% clear? | MapFieldLandAllowed // can't build on this //| MapFieldUnpassable // FIXME: I think shouldn't be used | MapFieldNoBuilding; } else switch( CursorBuilding->UnitType ) { case UnitTypeLand: mask=MapFieldLandUnit | MapFieldBuilding // already occuppied | MapFieldWall | MapFieldRocks | MapFieldForest // wall,rock,forest not 100% clear? | MapFieldCoastAllowed | MapFieldWaterAllowed // can't build on this | MapFieldUnpassable // FIXME: I think shouldn't be used | MapFieldNoBuilding; break; case UnitTypeNaval: mask=MapFieldSeaUnit | MapFieldBuilding // already occuppied | MapFieldCoastAllowed | MapFieldLandAllowed // can't build on this | MapFieldUnpassable // FIXME: I think shouldn't be used | MapFieldNoBuilding; break; case UnitTypeFly: default: DebugLevel1(__FUNCTION__": Were moves this unit?\n"); return; } h=CursorBuilding->TileHeight; if( my+h>MapY+MapHeight ) { // reduce to view limits h=MapY+MapHeight-my; } w0=CursorBuilding->TileWidth; // reduce to view limits if( mx+w0>MapX+MapWidth ) { w0=MapX+MapWidth-mx; } while( h-- ) { w=w0; while( w-- ) { if( f && (CanBuildOn(mx+w,my+h,mask) || (Selected[0]->X==mx+w && Selected[0]->Y==my+h)) && (TheMap.Fields[mx+w+(my+h)*TheMap.Width].Flags &MapFieldExplored) ) { color=ColorGreen; } else { color=ColorRed; } // FIXME: Could do this faster+better for( y1=0; y1<TileSizeY; ++y1 ) { for( x1=y1&1; x1<TileSizeX; x1+=2 ) { DrawPointUnclipped(color ,x+w*TileSizeX+x1,y+h*TileSizeY+y1); } } } } }
/** ** The main program: initialise, parse options and arguments. ** ** @param argc Number of arguments. ** @param argv Vector of arguments. */ int stratagusMain(int argc, char **argv) { #ifdef USE_BEOS // Parse arguments for BeOS beos_init(argc, argv); #endif #ifdef USE_WIN32 SetUnhandledExceptionFilter(CreateDumpFile); #endif #if defined(USE_WIN32) && ! defined(REDIRECT_OUTPUT) SetupConsole(); #endif // Setup some defaults. #ifndef MAC_BUNDLE StratagusLibPath = "."; #else freopen("/tmp/stdout.txt", "w", stdout); freopen("/tmp/stderr.txt", "w", stderr); // Look for the specified data set inside the application bundle // This should be a subdir of the Resources directory CFURLRef pluginRef = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR(MAC_BUNDLE_DATADIR), NULL, NULL); CFStringRef macPath = CFURLCopyFileSystemPath(pluginRef, kCFURLPOSIXPathStyle); const char *pathPtr = CFStringGetCStringPtr(macPath, CFStringGetSystemEncoding()); Assert(pathPtr); StratagusLibPath = pathPtr; #endif #ifdef USE_PHYSFS if (PHYSFS_init(argv[0])) { PHYSFS_mount(PHYSFS_DATAFILE, "/", 0); } #endif #ifdef USE_STACKTRACE try { #endif Parameters ¶meters = Parameters::Instance; parameters.SetDefaultValues(); parameters.SetLocalPlayerNameFromEnv(); #ifdef REDIRECT_OUTPUT RedirectOutput(); #endif if (argc > 0) { parameters.applicationName = argv[0]; } // FIXME: Parse options before or after scripts? ParseCommandLine(argc, argv, parameters); // Init the random number generator. InitSyncRand(); makedir(parameters.GetUserDirectory().c_str(), 0777); // Init Lua and register lua functions! InitLua(); LuaRegisterModules(); // Initialise AI module InitAiModule(); LoadCcl(parameters.luaStartFilename, parameters.luaScriptArguments); PrintHeader(); PrintLicense(); // Setup video display InitVideo(); // Setup sound card if (!InitSound()) { InitMusic(); } #ifndef DEBUG // For debug it's better not to have: srand(time(NULL)); // Random counter = random each start #endif // Show title screens. SetDefaultTextColors(FontYellow, FontWhite); LoadFonts(); SetClipping(0, 0, Video.Width - 1, Video.Height - 1); Video.ClearScreen(); ShowTitleScreens(); // Init player data ThisPlayer = NULL; //Don't clear the Players structure as it would erase the allowed units. // memset(Players, 0, sizeof(Players)); NumPlayers = 0; UnitManager.Init(); // Units memory management PreMenuSetup(); // Load everything needed for menus MenuLoop(); Exit(0); #ifdef USE_STACKTRACE } catch (const std::exception &e) { fprintf(stderr, "Stratagus crashed!\n"); //Wyrmgus start // fprintf(stderr, "Please send this call stack to our bug tracker: https://github.com/Wargus/stratagus/issues\n"); fprintf(stderr, "Please send this call stack to our bug tracker: https://github.com/Andrettin/Wyrmgus/issues\n"); //Wyrmgus end fprintf(stderr, "and tell us what caused this bug to occur.\n"); fprintf(stderr, " === exception state traceback === \n"); fprintf(stderr, "%s", e.what()); exit(1); } #endif return 0; }
/** ** Draw message(s). ** ** @todo FIXME: make message font configurable. */ void MessagesDisplay::DrawMessages() { if (show && Preference.ShowMessages) { CLabel label(*UI.MessageFont); #ifdef DEBUG if (showBuilList && ThisPlayer->Ai) { char buffer[256]; int count = ThisPlayer->Ai->UnitTypeBuilt.size(); // Draw message line(s) for (int z = 0; z < count; ++z) { if (z == 0) { PushClipping(); SetClipping(UI.MapArea.X + 8, UI.MapArea.Y + 8, Video.Width - 1, Video.Height - 1); } snprintf(buffer, 256, "%s (%d/%d) Wait %lu [%d,%d]", ThisPlayer->Ai->UnitTypeBuilt[z].Type->Name.c_str(), ThisPlayer->Ai->UnitTypeBuilt[z].Made, ThisPlayer->Ai->UnitTypeBuilt[z].Want, ThisPlayer->Ai->UnitTypeBuilt[z].Wait, ThisPlayer->Ai->UnitTypeBuilt[z].Pos.x, ThisPlayer->Ai->UnitTypeBuilt[z].Pos.y); label.DrawClip(UI.MapArea.X + 8, UI.MapArea.Y + 8 + z * (UI.MessageFont->Height() + 1), buffer); if (z == 0) { PopClipping(); } } } else { #endif // background so the text is easier to read if (MessagesCount) { int textHeight = MessagesCount * (UI.MessageFont->Height() + 1); Uint32 color = Video.MapRGB(TheScreen->format, 38, 38, 78); Video.FillTransRectangleClip(color, UI.MapArea.X + 7, UI.MapArea.Y + 7, UI.MapArea.EndX - UI.MapArea.X - 16, textHeight - MessagesScrollY + 1, 0x80); Video.DrawRectangle(color, UI.MapArea.X + 6, UI.MapArea.Y + 6, UI.MapArea.EndX - UI.MapArea.X - 15, textHeight - MessagesScrollY + 2); } // Draw message line(s) for (int z = 0; z < MessagesCount; ++z) { if (z == 0) { PushClipping(); SetClipping(UI.MapArea.X + 8, UI.MapArea.Y + 8, Video.Width - 1, Video.Height - 1); } /* * Due parallel drawing we have to force message copy due temp * std::string(Messages[z]) creation because * char * pointer may change during text drawing. */ label.DrawClip(UI.MapArea.X + 8, UI.MapArea.Y + 8 + z * (UI.MessageFont->Height() + 1) - MessagesScrollY, std::string(Messages[z])); if (z == 0) { PopClipping(); } } if (MessagesCount < 1) { MessagesSameCount = 0; } #ifdef DEBUG } #endif } }
// prepare internal structures for clipping and alignment // returns true if realignment was performed bool RealignImp::compute_alignment ( const char* q_seq, unsigned q_len, const char* r_seq, unsigned r_len, int r_pos, bool forward, const uint32_t* cigar, unsigned cigar_sz, uint32_t*& cigar_dest, unsigned& cigar_dest_sz, int& new_pos, bool& already_perfect, bool& clip_failed, bool& alignment_failed, bool& unclip_failed) { already_perfect = false; alignment_failed = false; unclip_failed = false; unsigned oplen; const char* q_seq_clipped = q_seq; const uint32_t* cigar_clipped = cigar; unsigned cigar_sz_clipped = cigar_sz; unsigned sclip_q_len, sclip_r_len, sclip_al_len; assert (cigar_sz); // reset realigner Reset (); // set clipping SetClipping ((int) cliptype_, forward); // clip out the hard and soft clipping zones from 5" and 3" // The 'cut out' of the q_seq is done by switching to downstream pointer. if (bam_cigar_op (*cigar) == BAM_CSOFT_CLIP) { oplen = bam_cigar_oplen (*cigar); ClipStart (oplen); q_seq_clipped += oplen; ++cigar_clipped; --cigar_sz_clipped; } if (cigar_sz > 1 && bam_cigar_op (cigar [cigar_sz - 1]) == BAM_CSOFT_CLIP) { oplen = bam_cigar_oplen (cigar [cigar_sz - 1]); ClipEnd (oplen); --cigar_sz_clipped; } // cigar defines q_seq and t_seq lengths sclip_al_len = seq_lens_from_bin_cigar (cigar_clipped, cigar_sz_clipped, &sclip_q_len, &sclip_r_len); const std::string query (q_seq_clipped, sclip_q_len); const std::string target (r_seq, sclip_r_len); std::string pretty_al; pretty_al.reserve (sclip_al_len); pretty_al_from_bin_cigar (cigar_clipped, cigar_sz_clipped, q_seq_clipped, r_seq, pretty_al); // Realigner requires strings of proper size to be passed to SetSequences SetSequences (query, target, pretty_al, forward); if (!ClipAnchors (clip_failed)) { already_perfect = true; return false; // alignment already good, no imperfect zone to realign found } // TODO avoid automatic vectors to prevent unneeded heap usage vector<MDelement> new_md_vec; vector<CigarOp> new_cigar_vec; unsigned int start_pos_shift; if (!computeSWalignment(new_cigar_vec, new_md_vec, start_pos_shift)) { alignment_failed = true; return false; } if (!addClippedBasesToTags(new_cigar_vec, new_md_vec, q_len)) { unclip_failed = true; return false; // error adding back clipped out zones } if (!LeftAnchorClipped () && start_pos_shift != 0) { // build cigar data only if it is needed // TODO avoid automatic vectors to prevent unneeded heap usage std::vector <CigarOp> cigar_vec; cigar_vector_from_bin (cigar, cigar_sz, cigar_vec); new_pos = updateReadPosition (cigar_vec, start_pos_shift, r_pos); } else new_pos = r_pos; // free (cigar_dest); // TODO: switch to better alignment memory management, avoid heap operations cigar_dest = (uint32_t*) tmap_malloc (sizeof (uint32_t) * new_cigar_vec.size (), "cigar_dest"); cigar_dest_sz = new_cigar_vec.size (); cigar_vector_to_bin (new_cigar_vec, cigar_dest); return true; }
/** ** The main program: initialise, parse options and arguments. ** ** @param argc Number of arguments. ** @param argv Vector of arguments. */ int main(int argc, char **argv) { #ifdef REDIRECT_OUTPUT RedirectOutput(); #endif #ifdef USE_BEOS // Parse arguments for BeOS beos_init(argc, argv); #endif // Setup some defaults. #ifndef MAC_BUNDLE StratagusLibPath = "."; #else freopen("/tmp/stdout.txt", "w", stdout); freopen("/tmp/stderr.txt", "w", stderr); // Look for the specified data set inside the application bundle // This should be a subdir of the Resources directory CFURLRef pluginRef = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR(MAC_BUNDLE_DATADIR), NULL, NULL); CFStringRef macPath = CFURLCopyFileSystemPath(pluginRef, kCFURLPOSIXPathStyle); const char *pathPtr = CFStringGetCStringPtr(macPath, CFStringGetSystemEncoding()); Assert(pathPtr); StratagusLibPath = pathPtr; #endif Parameters ¶meters = Parameters::Instance; parameters.SetDefaultValues(); parameters.LocalPlayerName = GetLocalPlayerNameFromEnv(); if (argc > 0) { parameters.applicationName = argv[0]; } // FIXME: Parse options before or after scripts? ParseCommandLine(argc, argv, parameters); // Init the random number generator. InitSyncRand(); makedir(parameters.GetUserDirectory().c_str(), 0777); // Init Lua and register lua functions! InitLua(); LuaRegisterModules(); // Initialise AI module InitAiModule(); LoadCcl(parameters.luaStartFilename); PrintHeader(); PrintLicense(); // Setup video display InitVideo(); // Setup sound card if (!InitSound()) { InitMusic(); } #ifndef DEBUG // For debug it's better not to have: srand(time(NULL)); // Random counter = random each start #endif // Show title screens. SetDefaultTextColors(FontYellow, FontWhite); LoadFonts(); SetClipping(0, 0, Video.Width - 1, Video.Height - 1); Video.ClearScreen(); ShowTitleScreens(); // Init player data ThisPlayer = NULL; //Don't clear the Players strucure as it would erase the allowed units. // memset(Players, 0, sizeof(Players)); NumPlayers = 0; UnitManager.Init(); // Units memory management PreMenuSetup(); // Load everything needed for menus MenuLoop(); Exit(0); return 0; }
/** ** Draw cursor for selecting building position. */ local void DrawBuildingCursor(void) { int x; int y; int x1; int y1; int mx; int my; int color; int f; int w; int w0; int h; int mask; const Viewport* vp; // Align to grid vp = TheUI.MouseViewport; x=CursorX-(CursorX - vp->X)%TileSizeX; y=CursorY-(CursorY - vp->Y)%TileSizeY; BuildingCursorSX = mx = Viewport2MapX(vp, x); BuildingCursorSY = my = Viewport2MapY(vp, y); // // Draw building // PushClipping(); SetClipping(vp->X, vp->Y, vp->EndX, vp->EndY); GraphicPlayerPixels(ThisPlayer,CursorBuilding->Sprite); if( VideoGraphicFrames(CursorBuilding->Sprite)>5 ) { DrawUnitType(CursorBuilding,4,x,y); } else { DrawUnitType(CursorBuilding,0,x,y); } PopClipping(); // // Draw the allow overlay // f=CanBuildHere(CursorBuilding,mx,my); mask = CursorBuilding->MovementMask; h=CursorBuilding->TileHeight; BuildingCursorEY=my+h-1; if (my+h > vp->MapY + vp->MapHeight) { // reduce to view limits h = vp->MapY + vp->MapHeight - my; } w0 = CursorBuilding->TileWidth; // reduce to view limits BuildingCursorEX=mx+w0-1; if (mx+w0 > vp->MapX + vp->MapWidth) { w0 = vp->MapX + vp->MapWidth - mx; } while( h-- ) { w=w0; while( w-- ) { int basex, basey; // FIXME: The field is covered by fog of war! if( f && CanBuildOn(mx+w,my+h,mask & ((Selected[0] && Selected[0]->X==mx+w && Selected[0]->Y==my+h) ? ~(MapFieldLandUnit|MapFieldSeaUnit) : -1)) && IsMapFieldExplored(ThisPlayer,mx+w,my+h) ) { color=ColorGreen; } else { color=ColorRed; } // FIXME: I could do this faster+better /* latimerius: I'm not sure what you have in mind but I can * at least move invariants out of the loops. */ basex = x + w*TileSizeX; basey = y + h*TileSizeY; for( y1=0; y1<TileSizeY; ++y1 ) { int j = basey+y1; for( x1=y1&1; x1<TileSizeX; x1+=2 ) { int i = basex+x1; if (i > vp->EndX) break; VideoDrawPixel (color, i, j); } if (j > vp->EndY) break; } } } }