void HiRes5Engine::loadSong(Common::ReadStream &stream) { while (true) { const byte period = stream.readByte(); if (stream.err() || stream.eos()) error("Error loading song"); if (period == 0xff) return; byte length = stream.readByte(); if (stream.err() || stream.eos()) error("Error loading song"); const uint kLoopCycles = 20; // Delay loop cycles double freq = 0.0; // This computation ignores CPU cycles spent on overflow handling and // speaker control. As a result, our tone frequencies will be slightly // higher than those on original hardware. if (period != 0) freq = kClock / 2.0 / (period * kLoopCycles); const double len = (length > 0 ? length - 1 : 255) * 256 * kLoopCycles * 1000 / (double)kClock; _song.push_back(Tone(freq, len)); } }
/** * Load a NULL-terminated string from the given stream. */ static Common::String loadString(Common::ReadStream &in, uint maxSize = 999) { Common::String result; while (!in.eos() && (result.size() < maxSize)) { char ch = (char)in.readByte(); if (ch == '\0') break; result += ch; } return result; }
DataBlockPtr AdlEngine_v2::readDataBlockPtr(Common::ReadStream &f) const { byte track = f.readByte(); byte sector = f.readByte(); byte offset = f.readByte(); byte size = f.readByte(); if (f.eos() || f.err()) error("Error reading DataBlockPtr"); if (track == 0 && sector == 0 && offset == 0 && size == 0) return DataBlockPtr(); return _disk->getDataBlock(track, sector, offset, size); }
Common::String XARCMember::readString(Common::ReadStream &stream) { Common::String str; // Read until we find a 0 char c = 1; while (c != 0) { c = stream.readByte(); if (stream.eos()) { c = 0; } else { str += c; } } return str; }
void Display::loadFrameBuffer(Common::ReadStream &stream) { byte *dst = _frameBuf; for (uint j = 0; j < 8; ++j) { for (uint i = 0; i < 8; ++i) { stream.read(dst, DISPLAY_PITCH); dst += DISPLAY_PITCH * 64; stream.read(dst, DISPLAY_PITCH); dst += DISPLAY_PITCH * 64; stream.read(dst, DISPLAY_PITCH); stream.readUint32LE(); stream.readUint32LE(); dst -= DISPLAY_PITCH * 120; } dst -= DISPLAY_PITCH * 63; } if (stream.eos() || stream.err()) error("Failed to read frame buffer"); }
void Graphics_v1::drawCorners(Common::ReadStream &corners, const Common::Point &pos, byte rotation, byte scaling, byte color) const { const byte stepping[] = { 0xff, 0xfe, 0xfa, 0xf4, 0xec, 0xe1, 0xd4, 0xc5, 0xb4, 0xa1, 0x8d, 0x78, 0x61, 0x49, 0x31, 0x18, 0xff }; byte quadrant = rotation >> 4; rotation &= 0xf; byte xStep = stepping[rotation]; byte yStep = stepping[(rotation ^ 0xf) + 1] + 1; Common::Point p(pos); while (true) { byte b = corners.readByte(); if (corners.eos() || corners.err()) error("Error reading corners"); if (b == 0) return; do { byte xFrac = 0x80; byte yFrac = 0x80; for (uint j = 0; j < scaling; ++j) { if (xFrac + xStep + 1 > 255) drawCornerPixel(p, color, b, quadrant); xFrac += xStep + 1; if (yFrac + yStep > 255) drawCornerPixel(p, color, b, quadrant + 1); yFrac += yStep; } b >>= 3; } while (b != 0); } }