void KIASectionCrimes::draw(Graphics::Surface &surface) { const char *text = nullptr; if (_suspectPhotoShapeId != -1) { _suspectPhotoShape->draw(surface, 201 - _suspectPhotoShape->getWidth() / 2, 223 - _suspectPhotoShape->getHeight() / 2); } if (_suspectPhotoShapeId == 14 || _suspectPhotoShapeId == 13) { text = _vm->_textKIA->getText(49); _vm->_mainFont->drawColor(text, surface, 201 - _vm->_mainFont->getTextWidth(text) / 2, 218, 0x7FFF); } surface.fillRect(Common::Rect(120, 134, 250, 145), 0); surface.hLine(120, 133, 250, 0x18A5); surface.hLine(120, 146, 250, 0x2D4C); surface.vLine(119, 134, 145, 0x18A5); surface.vLine(251, 134, 145, 0x2D4C); surface.hLine(251, 146, 251, 0x2509); if (_crimeSelected == -1) { text = _vm->_textKIA->getText(49); } else { text = _vm->_textCrimes->getText(_crimeSelected); } _vm->_mainFont->drawColor(text, surface, 185 - _vm->_mainFont->getTextWidth(text) / 2, 136, 0x46BF); surface.fillRect(Common::Rect(136, 304, 266, 315), 0); surface.hLine(136, 303, 266, 0x18A5); surface.hLine(136, 316, 266, 0x2D4C); surface.vLine(135, 304, 315, 0x18A5); surface.vLine(267, 304, 315, 0x2D4C); surface.hLine(267, 316, 267, 0x2509); char generatedText[64]; if (_suspectSelected == -1) { text = _vm->_textKIA->getText(22); } else { const char *suspectName = _vm->_suspectsDatabase->get(_suspectSelected)->getName(); if (_suspectsWithIdentity[_suspectSelected]) { text = suspectName; } else if (_vm->_suspectsDatabase->get(_suspectSelected)->getSex()) { sprintf(generatedText, "%s %s", _vm->_textKIA->getText(20), KIASectionSuspects::scrambleSuspectsName(suspectName)); text = generatedText; } else { sprintf(generatedText, "%s %s", _vm->_textKIA->getText(21), KIASectionSuspects::scrambleSuspectsName(suspectName)); text = generatedText; } } _vm->_mainFont->drawColor(text, surface, 201 - _vm->_mainFont->getTextWidth(text) / 2, 306, 0x46BF); _uiContainer->draw(surface); _buttons->draw(surface); _buttons->drawTooltip(surface, _mouseX, _mouseY); }
void DropHighlight::draw(const Common::Rect &) { Graphics::Surface *screen = ((PegasusEngine *)g_engine)->_gfx->getWorkArea(); // Since this is only used in two different ways, I'm only // going to implement it in those two ways. Deal with it. Common::Rect rect = _bounds; rect.grow(-_thickness); screen->frameRect(rect, _highlightColor); rect.grow(1); screen->frameRect(rect, _highlightColor); if (_cornerDiameter == 8 && _thickness == 4) { rect.grow(1); screen->frameRect(rect, _highlightColor); screen->hLine(rect.left + 1, rect.top - 1, rect.right - 2, _highlightColor); screen->hLine(rect.left + 1, rect.bottom, rect.right - 2, _highlightColor); screen->vLine(rect.left - 1, rect.top + 1, rect.bottom - 2, _highlightColor); screen->vLine(rect.right, rect.top + 1, rect.bottom - 2, _highlightColor); } }
/** * Show any active hotspot areas in the scene */ bool Debugger::Cmd_Hotspots(int argc, const char **argv) { int colIndex = 16; const Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds; // Lock the background surface for access Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface(); // Iterate through the scene items SynchronizedList<SceneItem *>::iterator i; for (i = g_globals->_sceneItems.reverse_begin(); i != g_globals->_sceneItems.end(); --i, ++colIndex) { SceneItem *o = *i; // Draw the contents of the hotspot area if (o->_sceneRegionId == 0) { // Scene item doesn't use a region, so fill in the entire area if ((o->_bounds.right > o->_bounds.left) && (o->_bounds.bottom > o->_bounds.top)) destSurface.fillRect(Rect(o->_bounds.left - sceneBounds.left, o->_bounds.top - sceneBounds.top, o->_bounds.right - sceneBounds.left - 1, o->_bounds.bottom - sceneBounds.top - 1), colIndex); } else { // Scene uses a region, so get it and use it to fill out only the correct parts SceneRegions::iterator ri = g_globals->_sceneRegions.begin(); while ((ri != g_globals->_sceneRegions.end()) && ((*ri)._regionId != o->_sceneRegionId)) ++ri; if (ri != g_globals->_sceneRegions.end()) { // Fill out the areas defined by the region Region &r = *ri; for (int y = r._bounds.top; y < r._bounds.bottom; ++y) { LineSliceSet set = r.getLineSlices(y); for (uint p = 0; p < set.items.size(); ++p) destSurface.hLine(set.items[p].xs - sceneBounds.left, y - sceneBounds.top, set.items[p].xe - sceneBounds.left - 1, colIndex); } } } } // Release the surface g_globals->_sceneManager._scene->_backSurface.unlockSurface(); // Mark the scene as requiring a full redraw g_globals->_paneRefreshFlag[0] = 2; return false; }
/** * This command draws the walk regions onto the screen */ bool Debugger::Cmd_WalkRegions(int argc, const char **argv) { if (argc != 1) { DebugPrintf("Usage: %s\n", argv[0]); return true; } // Color index to use for the first walk region int color = 16; // Lock the background surface for access Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface(); // Loop through drawing each walk region in a different color to the background surface Common::String regionsDesc; for (uint regionIndex = 0; regionIndex < g_globals->_walkRegions._regionList.size(); ++regionIndex, ++color) { WalkRegion &wr = g_globals->_walkRegions._regionList[regionIndex]; // Skip the region if it's in the list of explicitly disabled regions if (contains(g_globals->_walkRegions._disabledRegions, (int)regionIndex + 1)) continue; for (int yp = wr._bounds.top; yp < wr._bounds.bottom; ++yp) { LineSliceSet sliceSet = wr.getLineSlices(yp); for (uint idx = 0; idx < sliceSet.items.size(); ++idx) destSurface.hLine(sliceSet.items[idx].xs - g_globals->_sceneOffset.x, yp, sliceSet.items[idx].xe - g_globals->_sceneOffset.x, color); } regionsDesc += Common::String::format("Region #%d d bounds=%d,%d,%d,%d\n", regionIndex, wr._bounds.left, wr._bounds.top, wr._bounds.right, wr._bounds.bottom); } // Release the surface g_globals->_sceneManager._scene->_backSurface.unlockSurface(); // Mark the scene as requiring a full redraw g_globals->_paneRefreshFlag[0] = 2; DebugPrintf("Total regions = %d\n", g_globals->_walkRegions._regionList.size()); DebugPrintf("%s\n", regionsDesc.c_str()); return false; }