SkTypeface* SkTypeface::Deserialize(SkStream* stream) { SkFontDescriptor desc(stream); size_t length = stream->readPackedUInt(); if (length > 0) { void* addr = sk_malloc_flags(length, 0); if (addr) { SkAutoTUnref<SkMemoryStream> localStream(SkNEW(SkMemoryStream)); localStream->setMemoryOwned(addr, length); if (stream->read(addr, length) == length) { return SkTypeface::CreateFromStream(localStream.get()); } else { // Failed to read the full font data, so fall through and try to create from name. // If this is because of EOF, all subsequent reads from the stream will be EOF. // If this is because of a stream error, the stream is in an error state, // do not attempt to skip any remaining bytes. } } else { // failed to allocate, so just skip and create-from-name stream->skip(length); } } return SkTypeface::CreateFromName(desc.getFamilyName(), desc.getStyle()); }
/////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// // // // Get a reading stream for the buffer // // /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// ptr<streamReader> buffer::getStreamReader() { PUNTOEXE_FUNCTION_START(L"buffer::getStreamReader"); // Lock the object /////////////////////////////////////////////////////////// lockObject lockAccess(this); // If the object must be loaded from the original stream, // then return the original stream /////////////////////////////////////////////////////////// if(m_originalStream != 0 && (m_memory == 0 || m_memory->empty()) ) { ptr<streamReader> reader(new streamReader(m_originalStream, m_originalBufferPosition, m_originalBufferLength)); return reader; } // Build a stream from the buffer's memory /////////////////////////////////////////////////////////// ptr<streamReader> reader; ptr<handlers::dataHandlerRaw> tempHandlerRaw = getDataHandlerRaw(false); if(tempHandlerRaw != 0) { ptr<baseStream> localStream(new bufferStream(tempHandlerRaw)); reader = ptr<streamReader>(new streamReader(localStream)); } return reader; PUNTOEXE_FUNCTION_END(); }
/////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// // // // Get a writing stream for the buffer // // /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// ptr<streamWriter> buffer::getStreamWriter() { PUNTOEXE_FUNCTION_START(L"buffer::getStreamReader"); // Lock the object /////////////////////////////////////////////////////////// lockObject lockAccess(this); // Build a stream from the buffer's memory /////////////////////////////////////////////////////////// ptr<streamWriter> writer; ptr<handlers::dataHandlerRaw> tempHandlerRaw = getDataHandlerRaw(true); if(tempHandlerRaw != 0) { ptr<baseStream> localStream(new bufferStream(tempHandlerRaw)); writer = ptr<streamWriter>(new streamWriter(localStream, tempHandlerRaw->getSize())); } return writer; PUNTOEXE_FUNCTION_END(); }