poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3] pickles: Add new pickle for jpeg


From: Mohammad-Reza Nabipoor
Subject: Re: [PATCH v3] pickles: Add new pickle for jpeg
Date: Mon, 26 Feb 2024 19:17:25 +0100

Hi Andreas,

On Sun, Feb 25, 2024 at 06:02:05PM +0100, Andreas Klinger wrote:
> diff --git a/pickles/jpeg.pk b/pickles/jpeg.pk
> new file mode 100644
> index 00000000..1c5c4856
> --- /dev/null
> +++ b/pickles/jpeg.pk
> +
>[...]
> +type JPEG_Segment =
> +  struct
> +  {
> +    uint<8> ff == 0xFF;
> +    uint<8> xx : xx != 0xD8 && xx != 0xDA && xx != 0xD9 && xx >= 0xC0 && xx 
> < 0xFF;
> +    uint<16> size : size >= 2;


I'd suggest: `offset<uint<16>,B> size : size >= 2#B;'


> +type JPEG_Tag =
> +  struct
> +  {
> +    type Image =
> +      union
> +      {
> +        uint<8>[2] pair: ((pair[1] != 0xFFUB) && (pair != [0xFFUB,0xD9UB])) 
> || (pair == [0xFFUB,0x00UB]);
> +        uint<8> single: single != 0xFFUB;
> +      };
> +    JPEG_STS soi: soi.xx == 0xD8UB;
> +    JPEG_Segment[] segments;
> +    JPEG_STS sos: sos.xx == 0xDAUB;
> +    Image[] image;
> +    JPEG_STS eoi: eoi.xx == 0xD9UB;
> +    method get_nsegs = uint<32>:
> +    {
> +      return segments'length;
> +    }
> +    method get_image = uint<8>[]:
> +    {
> +      var bytes = uint<8>[]();
> +      for (i in image)
> +        try bytes += i.pair;
> +        catch if E_elem { bytes += [i.single]; }
> +      return bytes;
> +    }
> +  };


Maybe having a function like this is also useful:

```poke

  method get_image_range = offset<uint<64>,B>[]:
    {
      var begin = image'offset,
          end = begin + image'size;
      return [begin, end];
    }
```

In case somebody want to Poke that range directly, e.g., like this:

```poke
var range = tag.get_image_range;
var img = uint<8>[range[1] - range[0]] @ range[0];

if (image'size > 0#B);
  img[1#B] = ~img[1#B];
```



Regards,
Mohammad-Reza



reply via email to

[Prev in Thread] Current Thread [Next in Thread]