Unable to write Serialized SkPicture into a File

273 views
Skip to first unread message

Steven Whelan

unread,
Apr 30, 2024, 11:59:06 AM4/30/24
to blink-dev
Hi 
I have modified the Serialize method to Record all PaintOp as SKPicture. 
I want to replay this SKPicture on a remote browser. So, I am trying to save this SKPicture to a file, but I am not able to do so, since file.isOpen gives false.
Please help here

void PaintOpBufferSerializer::Serialize(const PaintOpBuffer& buffer,
                                        const std::vector<size_t>* offsets,
                                        const Preamble& preamble) {
  DCHECK_EQ(serialized_op_count_, 0u);

  std::unique_ptr<SkCanvas> canvas = MakeAnalysisCanvas(options_);
  // These PlaybackParams use the initial (identity) canvas matrix, as they are
  // only used for serializing the preamble and the initial save / final restore
  // SerializeBuffer will create its own PlaybackParams based on the
           
  SkPictureRecorder recorder;
  SkCanvas* recordingCanvas = recorder.beginRecording(canvas->getLocalClipBounds());        
  // post-preamble canvas.
  PlaybackParams params = MakeParams(canvas.get());
  int save_count = canvas->getSaveCount();
  Save(canvas.get(), params);
  SerializePreamble(canvas.get(), preamble, params);
  SerializeBuffer(canvas.get(), buffer, offsets);
  SerializeBuffer(recordingCanvas, buffer, offsets);
  sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
  SkSerialProcs sProcs;
  sk_sp<SkData> readableData = picture->serialize(&sProcs);

  // Assuming the byte array is stored in the 'data' field of the SkData object
  const void* data = readableData->data();
  size_t size = readableData->size();

 <HOW TO SAVE READABLE DATA TO A FILE>
  /*sk_sp<SkData> receievedData = SkData::MakeWithoutCopy(data, size);
  sk_sp<SkPicture> copy =
      SkPicture::MakeFromData(receievedData->data(), receievedData->size());
  copy->playback(recordingCanvas);*/
  RestoreToCount(canvas.get(), save_count, params);
}

Ken Russell

unread,
Apr 30, 2024, 12:28:43 PM4/30/24
to Steven Whelan, blink-dev
Are you trying to do this within Chrome's renderer or GPU processes? If so, the sandbox will prevent you from touching the local disk. You would need to extend the sandbox policies to allow writing to a directory on disk - some place that will not collide with other programs, so that if a bad actor causes data to be written to that directory, no harm will be caused. See https://source.chromium.org/chromium/chromium/src/+/main:sandbox/policy/mac/ for the macOS sandbox policies.

-Ken



--
You received this message because you are subscribed to the Google Groups "blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+...@chromium.org.
To view this discussion on the web visit https://groups.google.com/a/chromium.org/d/msgid/blink-dev/97946d8b-27dc-43c4-a262-e4f6288be9d6n%40chromium.org.

Steven Whelan

unread,
May 1, 2024, 1:46:22 AM5/1/24
to Ken Russell, blink-dev
Yes, trying to do this in renderer process. Would it work if I run Chromium with --nosandbox flag.

Ken Russell

unread,
May 1, 2024, 8:04:48 PM5/1/24
to Steven Whelan, blink-dev
Yes - you can confirm this yourself - but we strongly recommend against disabling the renderer sandbox.

Steven Whelan

unread,
May 4, 2024, 9:21:15 AM5/4/24
to blink-dev, k...@chromium.org, blink-dev, Steven Whelan
Hi I am able to write the serialized SKData (captured from Serialize method of  paint_op_buffer_serializer as shown in the first mail) to a file and was also able to use this file for playback on canvas.
However, it only played back the text. How do I ensure that images also get captured in my SKPicture recording? Do I have to have multiple SKPictureRecording at multiple places?
Goal : To record everything being written on a canvas while loading  a page so that it can be played back on another browser.

Thanks

Ken Russell

unread,
May 4, 2024, 6:19:24 PM5/4/24
to Steven Whelan, blink-dev
I'm not sure exactly how SkPicture recording works - please join https://groups.google.com/a/chromium.org/g/graphics-dev and email graphi...@chromium.org .

-Ken


Steven Whelan

unread,
May 6, 2024, 3:32:39 AM5/6/24
to Ken Russell, blink-dev
Hi, 
Also found out that through paint_op_helper's tostring method  , all the PaintOps related information can be printed. It includes all the information- coordinates, paint info etc.
Wondering, can these be converted directly into SKIA commands to render the page?
Please help me finalize the correct approach.

Vladimir Levin

unread,
May 6, 2024, 11:22:11 AM5/6/24
to Steven Whelan, Ken Russell, blink-dev
Hey Steven,

The path to convert information necessary for rendering into SkPictures may or may not exist in the Chromium codebase, but it's certainly not actively maintained or developed. Ultimately all information is available, but it may come from several different sources. 

For images, for example, it's likely that the Skia information stores them in an encoded format backed by one of the decoders in Blink. The cc codebase has classes that extracts the encoded information and schedules decoding and upload which is then rasterized and presented as necessary. It isn't necessarily trivial to convert this whole process to a few Skia commands, and largely depends on what you're looking to accomplish. 

Here's a thread from skia-discuss@ roughly talking about the same thing: https://groups.google.com/g/skia-discuss/c/hd1ZCRkM4OA. As Brian mentions there, SkPictures are an important primitive (as are other Skia commands) but it's not the only thing. Chromium uses display lists and paint ops to draw its contents. You can probably look at the serialization code as the closest thing that does all the right serialization (this is used in Out of Process Rasterization): https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/paint_op_buffer_serializer.h;l=21;drc=e09826065bb5964f247be565890dcabda54ac9e3. As I mentioned previously in a different thread, this won't help you with images. Those need to be either decoded and serialized or serialized in encoded form and dealt with on the client side. 

As Ken also mentioned, graphics-dev (and also skia-discuss) may be better forums for this type of discussion

Thanks,
Vlad

Reply all
Reply to author
Forward
0 new messages