return p;
}
- // return the address of the 4byte int at the specified offset (which must
- // be a multiple of 4. This does not allocate any new space, so the returned
- // address is only valid for 1 int.
- uint32_t* peek32(size_t offset) {
- SkASSERT(SkAlign4(offset) == offset);
- const int count = SkToInt(offset/4);
- SkASSERT(count < fCount);
-
- if (count < this->externalCount()) {
- return fExternal + count;
- }
- return &fInternal[count - this->externalCount()];
- }
+ // Read or write 4 bytes at offset, which must be a multiple of 4 <= size().
+ uint32_t read32At(size_t offset) { return this->atOffset(offset); }
+ void write32At(size_t offset, uint32_t val) { this->atOffset(offset) = val; }
bool writeBool(bool value) {
this->write32(value);
/**
* Move the cursor back to offset bytes from the beginning.
- * This has the same restrictions as peek32: offset must be <= size() and
- * offset must be a multiple of 4.
+ * offset must be a multiple of 4 no greater than size().
*/
void rewindToOffset(size_t offset) {
SkASSERT(SkAlign4(offset) == offset);
}
private:
+ uint32_t& atOffset(size_t offset) {
+ SkASSERT(SkAlign4(offset) == offset);
+ const int count = SkToInt(offset/4);
+ SkASSERT(count < fCount);
+
+ if (count < this->externalCount()) {
+ return fExternal[count];
+ }
+ return fInternal[count - this->externalCount()];
+ }
+
+
// Number of uint32_t written into fExternal. <= fExternalLimit.
int externalCount() const { return fCount - fInternal.count(); }
* Read the op code from 'offset' in 'writer' and extract the size too.
*/
static DrawType peek_op_and_size(SkWriter32* writer, int32_t offset, uint32_t* size) {
- uint32_t* peek = writer->peek32(offset);
+ uint32_t peek = writer->read32At(offset);
uint32_t op;
- UNPACK_8_24(*peek, op, *size);
+ UNPACK_8_24(peek, op, *size);
if (MASK_24 == *size) {
// size required its own slot right after the op code
- *size = *writer->peek32(offset+kUInt32Size);
+ *size = writer->read32At(offset+kUInt32Size);
}
return (DrawType) op;
}
// back up to the save block
// TODO: add a stack to track save*/restore offsets rather than searching backwards
while (offset > 0) {
- offset = *writer->peek32(offset);
+ offset = writer->read32At(offset);
}
int pattern[] = { SAVE_LAYER, kDRAW_BITMAP_FLAVOR, /* RESTORE */ };
* field alone so the NOOP can be skipped later.
*/
static void convert_command_to_noop(SkWriter32* writer, uint32_t offset) {
- uint32_t* ptr = writer->peek32(offset);
- *ptr = (*ptr & MASK_24) | (NOOP << 24);
+ uint32_t command = writer->read32At(offset);
+ writer->write32At(offset, (command & MASK_24) | (NOOP << 24));
}
/*
uint32_t slPaintOffset = getPaintOffset(SAVE_LAYER, saveLayerInfo.fSize);
// we have a match, now we need to get the paints involved
- uint32_t dbmPaintId = *writer->peek32(dbmInfo.fOffset+dbmPaintOffset);
- uint32_t saveLayerPaintId = *writer->peek32(saveLayerInfo.fOffset+slPaintOffset);
+ uint32_t dbmPaintId = writer->read32At(dbmInfo.fOffset+dbmPaintOffset);
+ uint32_t saveLayerPaintId = writer->read32At(saveLayerInfo.fOffset+slPaintOffset);
if (0 == saveLayerPaintId) {
// In this case the saveLayer/restore isn't needed at all - just kill the saveLayer
// In this case just make the DBM* use the saveLayer's paint, kill the saveLayer
// and signal the caller (by returning true) to not add the RESTORE op
convert_command_to_noop(writer, saveLayerInfo.fOffset);
- uint32_t* ptr = writer->peek32(dbmInfo.fOffset+dbmPaintOffset);
- SkASSERT(0 == *ptr);
- *ptr = saveLayerPaintId;
+ writer->write32At(dbmInfo.fOffset+dbmPaintOffset, saveLayerPaintId);
return true;
}
// kill the saveLayer and alter the DBMR2R's paint to be the modified one
convert_command_to_noop(writer, saveLayerInfo.fOffset);
- uint32_t* ptr = writer->peek32(dbmInfo.fOffset+dbmPaintOffset);
- SkASSERT(dbmPaintId == *ptr);
- *ptr = data->index();
+ writer->write32At(dbmInfo.fOffset+dbmPaintOffset, data->index());
return true;
}
// back up to the save block
// TODO: add a stack to track save*/restore offsets rather than searching backwards
while (offset > 0) {
- offset = *writer->peek32(offset);
+ offset = writer->read32At(offset);
}
int pattern[] = { SAVE_LAYER, SAVE, CLIP_RECT, kDRAW_BITMAP_FLAVOR, RESTORE, /* RESTORE */ };
// back up to the save block
while (offset > 0) {
- offset = *writer->peek32(offset);
+ offset = writer->read32At(offset);
}
// now offset points to a save
SkASSERT(kSaveSize == opSize);
// get the save flag (last 4-bytes of the space allocated for the opSize)
- SkCanvas::SaveFlags saveFlags = (SkCanvas::SaveFlags) *writer->peek32(offset+4);
+ SkCanvas::SaveFlags saveFlags = (SkCanvas::SaveFlags) writer->read32At(offset+4);
if (SkCanvas::kMatrixClip_SaveFlag != saveFlags) {
// This function's optimization is only correct for kMatrixClip style saves.
// TODO: set checkMatrix & checkClip booleans here and then check for the
void SkPictureRecord::fillRestoreOffsetPlaceholdersForCurrentStackLevel(uint32_t restoreOffset) {
int32_t offset = fRestoreOffsetStack.top();
while (offset > 0) {
- uint32_t* peek = fWriter.peek32(offset);
- offset = *peek;
- *peek = restoreOffset;
+ uint32_t peek = fWriter.read32At(offset);
+ fWriter.write32At(offset, restoreOffset);
+ offset = peek;
}
#ifdef SK_DEBUG