void DrawGeoBitmap(const RawBitmap &bitmap, PixelSize bitmap_size, const GeoBounds &bounds, const Projection &projection) { assert(bounds.IsValid()); const BulkPixelPoint vertices[] = { projection.GeoToScreen(bounds.GetNorthWest()), projection.GeoToScreen(bounds.GetNorthEast()), projection.GeoToScreen(bounds.GetSouthWest()), projection.GeoToScreen(bounds.GetSouthEast()), }; const ScopeVertexPointer vp(vertices); const GLTexture &texture = bitmap.BindAndGetTexture(); const PixelSize allocated = texture.GetAllocatedSize(); const GLfloat src_x = 0, src_y = 0, src_width = bitmap_size.cx, src_height = bitmap_size.cy; GLfloat x0 = src_x / allocated.cx; GLfloat y0 = src_y / allocated.cy; GLfloat x1 = (src_x + src_width) / allocated.cx; GLfloat y1 = (src_y + src_height) / allocated.cy; const GLfloat coord[] = { x0, y0, x1, y0, x0, y1, x1, y1, }; #ifdef USE_GLSL OpenGL::texture_shader->Use(); glEnableVertexAttribArray(OpenGL::Attribute::TEXCOORD); glVertexAttribPointer(OpenGL::Attribute::TEXCOORD, 2, GL_FLOAT, GL_FALSE, 0, coord); #else const GLEnable<GL_TEXTURE_2D> scope; OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, coord); #endif glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); #ifdef USE_GLSL glDisableVertexAttribArray(OpenGL::Attribute::TEXCOORD); OpenGL::solid_shader->Use(); #else glDisableClientState(GL_TEXTURE_COORD_ARRAY); #endif }
FlatBoundingBox OrderedTask::GetBoundingBox(const GeoBounds &bounds) const { if (!TaskSize()) { // undefined! return FlatBoundingBox(FlatGeoPoint(0,0),FlatGeoPoint(0,0)); } FlatGeoPoint ll = task_projection.ProjectInteger(bounds.GetSouthWest()); FlatGeoPoint lr = task_projection.ProjectInteger(bounds.GetSouthEast()); FlatGeoPoint ul = task_projection.ProjectInteger(bounds.GetNorthWest()); FlatGeoPoint ur = task_projection.ProjectInteger(bounds.GetNorthEast()); FlatGeoPoint fmin(std::min(ll.longitude, ul.longitude), std::min(ll.latitude, lr.latitude)); FlatGeoPoint fmax(std::max(lr.longitude, ur.longitude), std::max(ul.latitude, ur.latitude)); // note +/- 1 to ensure rounding keeps bb valid fmin.longitude -= 1; fmin.latitude -= 1; fmax.longitude += 1; fmax.latitude += 1; return FlatBoundingBox (fmin, fmax); }