size_t SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) { if (fRestoreOffsetStack.isEmpty()) { return -1; } // The RestoreOffset field is initially filled with a placeholder // value that points to the offset of the previous RestoreOffset // in the current stack level, thus forming a linked list so that // the restore offsets can be filled in when the corresponding // restore command is recorded. int32_t prevOffset = fRestoreOffsetStack.top(); if (regionOpExpands(op)) { // Run back through any previous clip ops, and mark their offset to // be 0, disabling their ability to trigger a jump-to-restore, otherwise // they could hide this clips ability to expand the clip (i.e. go from // empty to non-empty). this->fillRestoreOffsetPlaceholdersForCurrentStackLevel(0); // Reset the pointer back to the previous clip so that subsequent // restores don't overwrite the offsets we just cleared. prevOffset = 0; } size_t offset = fWriter.bytesWritten(); this->addInt(prevOffset); fRestoreOffsetStack.top() = SkToU32(offset); return offset; }
void SkPictureRecord::recordOffsetForRestore(SkRegion::Op op) { if (regionOpExpands(op)) { // Run back through any previous clip ops, and mark their offset to // be 0, disabling their ability to trigger a jump-to-restore, otherwise // they could hide this clips ability to expand the clip (i.e. go from // empty to non-empty). uint32_t offset = fRestoreOffsetStack.top(); while (offset) { uint32_t* peek = fWriter.peek32(offset); offset = *peek; *peek = 0; } } size_t offset = fWriter.size(); addInt(fRestoreOffsetStack.top()); fRestoreOffsetStack.top() = offset; }
void SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) { if (fRestoreOffsetStack.isEmpty()) { return; } if (regionOpExpands(op)) { // Run back through any previous clip ops, and mark their offset to // be 0, disabling their ability to trigger a jump-to-restore, otherwise // they could hide this clips ability to expand the clip (i.e. go from // empty to non-empty). fillRestoreOffsetPlaceholdersForCurrentStackLevel(0); } size_t offset = fWriter.size(); // The RestoreOffset field is initially filled with a placeholder // value that points to the offset of the previous RestoreOffset // in the current stack level, thus forming a linked list so that // the restore offsets can be filled in when the corresponding // restore command is recorded. addInt(fRestoreOffsetStack.top()); fRestoreOffsetStack.top() = offset; }