<divid="app"><divclass="Layout"data-v-5d98c3a5><!--[--><!--]--><!--[--><spantabindex="-1"data-v-0f60ec36></span><ahref="#VPContent"class="VPSkipLink visually-hidden"data-v-0f60ec36> Skip to content </a><!--]--><!----><headerclass="VPNav"data-v-5d98c3a5data-v-ae24b3ad><divclass="VPNavBar has-sidebar top"data-v-ae24b3addata-v-ccf7ddec><divclass="wrapper"data-v-ccf7ddec><divclass="container"data-v-ccf7ddec><divclass="title"data-v-ccf7ddec><divclass="VPNavBarTitle has-sidebar"data-v-ccf7ddecdata-v-ab179fa1><aclass="title"href="/"data-v-ab179fa1><!--[--><!--]--><!--[--><!--[--><!--[--><imgclass="VPImage dark logo"src="/badge-community-dark.svg"altdata-v-8426fc1a><!--]--><!--[--><imgclass="VPImage light logo"src="/badge-community-light.svg"altdata-v-8426fc1a><!--]--><!--]--><!--]--><!----><!--[--><!--]--></a></div></div><divclass="content"data-v-ccf7ddec><divclass="content-body"data-v-ccf7ddec><!--[--><!--]--><divclass="VPNavBarSearch search"data-v-ccf7ddec><!--[--><!----><divid="local-search"><buttontype="button"class="DocSearch DocSearch-Button"aria-label="Search"><spanclass="DocSearch-Button-Container"><spanclass="vp-icon DocSearch-Search-Icon"></span><spanclass="DocSearch-Button-Placeholder">Search</span></span><spanclass="DocSearch-Button-Keys"><kbdclass="DocSearch-Button-Key"></kbd><kbdclass="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><navaria-labelledby="main-nav-aria-label"class="VPNavBarMenu menu"data-v-ccf7ddecdata-v-7f418b0f><spanid="main-nav-aria-label"class="visually-hidden"data-v-7f418b0f>Main Navigation</span><!--[--><!--[--><aclass="VPLink link VPNavBarMenuLink"href="./"tabindex="0"data-v-7f418b0fdata-v-9c663999><!--[--><spandata-v-9c663999>Home</span><!--]--></a><!--]--><!--]--></nav><!----><divclass="VPNavBarAppearance appearance"data-v-ccf7ddecdata-v-e6aabb21><buttonclass="VPSwitch VPSwitchAppearance"type="button"role="switch"title="Switch to dark theme"aria-checked="false"data-v-e6aabb21data-v-d1f28634data-v-1d5665e3><spanclass="check"data-v-1d5665e3><spanclass="icon"data-v-1d5665e3><!--[--><spanclass="vpi-sun sun"data-v-d1f28634></span><spanclass="vpi-moon moon"data-v-d1f28634></span><!--]--></span></span></button></div><divclass="VPSocialLinks VPNavBarSocialLinks social-links"data-v-ccf7ddecdata-v-0394ad82data-v-7bc22406><!--[--><aclass="VPSocialLink no-icon"href="https://reddit.com/r/olkb"aria-labeltarget="_blank"rel="noopener"data-v-7bc22406data-v-eee4e7cb><svgxmlns="http://www.w3.org/2000/svg"viewBox="0 0 50 50"width="50px"height="50px"><pathd="M293C28.0625327.1640633.38281326.54C25.8359384.61718825.3632815.433594256.40625C24.3554698.14062524.08593810.39453124.0312513.03125C19.23437513.17968814.82031314.42187511.2812516.46875C10.21484415.468758.85546914.968757.514.96875C6.08984414.968754.67578115.5117193.5937516.59375C1.42578118.7617191.42578122.2382813.5937524.40625L3.8437524.65625C3.312526.035156327.488281329C333.5273445.56640637.5859389.562540.4375C13.55859443.28906319.007813452545C30.9921884536.44140643.28906340.437540.4375C44.43359437.5859384733.5273444729C4727.48828146.687526.03515646.1562524.65625L46.4062524.40625C48.57421922.23828148.57421918.76171946.4062516.59375C45.32421915.51171943.91015614.9687542.514.96875C41.14453114.9687539.78515615.4687538.7187516.46875C35.19531314.43359430.80078113.19140626.0312513.03125C26.0937510.54687526.3632818.4687526.8757.09375C27.1640636.31640627.5273445.75781327.8755.4375C28.2226565.11718828.5390635295C29.460938529.6835945.12530.031255.40625C30.3789065.687530.7851566.14843831.31256.6875C32.2539067.65234433.6953138.71484436.093758.9375C36.53906311.23828138.574219134113C43.75134610.75468C465.2543.753413C38.605469336.5742194.71093836.093756.96875C34.31256.79687533.5273446.10937532.755.3125C32.3007814.85156331.8867194.312531.31253.843
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> type_id;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // See each respective block type</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> neg_type_id;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Negated type ID, used for detecting parsing errors</span></span>
<spanclass="line"><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> uint24_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> length;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 24-bit blob length, allowing for block sizes of a maximum of 16MB</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// _Static_assert(sizeof(qgf_block_header_v1_t) == 5, "qgf_block_header_v1_t must be 5 bytes in v1 of QGF");</span></span></code></pre></div><p>The <em>length</em> describes the number of octets in the data following the block header -- a block header may specify a <em>length</em> of <code>0</code> if no blob is specified.</p><h2id="qgf-graphics-descriptor"tabindex="-1">Graphics descriptor block <aclass="header-anchor"href="#qgf-graphics-descriptor"aria-label="Permalink to "Graphics descriptor block {#qgf-graphics-descriptor}""></a></h2><ul><li><em>typeid</em> = 0x00</li><li><em>length</em> = 18</li></ul><p>This block must be located at the start of the file contents, and can exist a maximum of once in an entire QGF file. It is always followed by the <em>frame offset block</em>.</p><p><em>Block</em> format:</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">typedef</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> struct</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> __attribute__</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((packed)) </span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">qgf_graphics_descriptor_v1_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> uint24_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> magic;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // constant, equal to 0x464751 ("QGF")</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> qgf_version;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // constant, equal to 0x01</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint32_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> total_file_size;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // total size of the entire file, starting at offset zero</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint32_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> neg_total_file_size;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // negated value of total_file_size, used for detecting parsing errors</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint16_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> image_width;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // in pixels</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint16_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> image_height;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // in pixels</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint16_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> frame_count;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // minimum of 1</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// _Static_assert(sizeof(qgf_graphics_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 18), "qgf_graphics_descriptor_v1_t must be 23 bytes in v1 of QGF");</span></span></code></pre></div><h2id="qgf-frame-offset-descriptor"tabindex="-1">Frame offset block <aclass="header-anchor"href="#qgf-frame-offset-descriptor"aria-label="Permalink to "Frame offset block {#qgf-frame-offset-descriptor}""></a></h2><ul><li><em>typeid</em> = 0x01</li><li><em>length</em> = variable</li></ul><p>This block denotes the offsets within the file to each frame's <em>frame descriptor block</em>, relative to the start of the file. The <em>frame offset block</em> always immediately follows the <em>graphics descriptor block</em>. The contents of this block are an array of U32's, with one entry for each frame.</p><p>Duplicate frame offsets in this block are allowed, if a certain frame is to be shown multiple times during animation.</p><p><em>Block</em> format:</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">typedef</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> struct</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> __attribute__</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((packed)) </span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">qgf_frame_offsets_v1_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint32_t</span><spanstyle="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> offset</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[N];</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // where 'N' is the number of frames in the file</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">qgf_frame_offsets_v1_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span></code></pre></div><h2id="qgf-frame-descriptor"tabindex="-1">Frame descriptor block <aclass="header-anchor"href="#qgf-frame-descriptor"aria-label="Permalink to "Frame descriptor block {#qgf-frame-descriptor}""></a></h2><ul><li><em>typeid</em> = 0x02</li><li><em>length</em> = 5</li></ul><p>This block denotes the start of a frame.</p><p><em>Block</em> format:</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">typedef</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> struct</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> __attribute__</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((packed)) </span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">qgf_frame_v1_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> format;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Frame format, see below.</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> flags;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Frame flags, see below.</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> compression_scheme;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Compression scheme, see below.</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> transparency_index;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // palette index used for transparent pixels (not yet implemented)</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint16_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> delay;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // frame delay time for animations (in units of milliseconds)</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// _Static_assert(sizeof(qgf_frame_v1_t) == (sizeof(qgf_block_header_v1_t) + 6), "qgf_frame_v1_t must be 11 bytes in v1 of QGF");</span></span></code></pre></div><p>If this frame is grayscale, the <em>frame descriptor block</em> (or <em>frame delta block</em> if flags denote a delta frame) is immediately followed by this frame's corresponding <em>frame data block</em>.</p><p>If the frame uses an indexed palette, the <em>frame descriptor block</em> (or <em>frame delta block</em> if flags denote a delta frame) is immediately followed by this frame's corresponding <em>frame palette block</em>.</p><p>Frame format possible values:</p><ul><li><code>0x00</code>: 1bpp grayscale, no palette, <code>0</code> = black, <code>1</code> = white, LSb first pixel</li><li><code>0x01</code>: 2bpp grayscale, no palette, <code>0</code> = black, <code>3</code> = white, linear interpolation of brightness, LSb first pixel</li><li><code>0x02</code>: 4bpp grayscale, no palette, <code>0</code> = black, <code>15</code> = white, linear interpolation of brightness, LSb first pixel</li><li><code>0x03</code>: 8bpp grayscale, no palette, <code>0</code> = black, <code>255</code> = white, linear interpolation of brightness, LSb first pixel</li><li><code>0x04</code>: 1bpp indexed palette, 2 colors, LSb first pixel</li><li><code>0x05</code>: 2bpp indexed palette, 4 colors, LSb first pixel</li><li><code>0x06</code>: 4bpp indexed palette, 16 colors, LSb first pixel</li><li><code>0x07</code>: 8bpp indexed palette, 256 colors, LSb first pixel</li></ul><p>Frame flags is a bitmask with the following format:</p><table><thead><tr><th><code>bit 7</code></th><th><code>bit 6</code></th><th><code>bit 5</code></th><th><code>bit 4</code></th><th><code>bit 3</code></th><th><code>bit 2</code></th><th><code>bit 1</code></th><th><code>bit 0</code></th></tr></thead><tbody><tr><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>Delta</td><td>Transparency</td></tr></tbody></table><ul><li><code>[1]</code> -- Delta: Signifies that the current frame is a delta frame, which specifies only a sub-image. The <em>frame delta block</em> follows the <em>frame palette block</em> if the image format specifies a palette, otherwise it directly follows the <em>frame descriptor block</em>.</li><li><code>[0]</code> -- Transparency: The transparent palette index in the <em>blob</em> is considered valid and should be used when considering which pixels should be transparent during rendering this frame, if possible.</li></ul><p>Compression scheme possible values:</p><ul><li><code>0x00</code>: No compression</li><li><code>0x01</code>: <ahref="./quantum_painter_rle">QMK RLE</a></li></ul><h2id="qgf-frame-palette-descriptor"tabindex="-1">Frame palette block <aclass="header-anchor"href="#qgf-frame-palette-descriptor"aria-label="Permalink to "Frame palette block {#qgf-frame-palette-descriptor}""></a></h2><ul><li><em>typeid</em> = 0x03</li><li><em>length</em> = variable</li></ul><p>This block describes the palette used for the frame. The <em>blob</em> contains an array of palette entries -- one palette entry is present for each color used -- each palette entry is in QMK HSV888 format:</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">typedef</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> struct</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> __attribute__</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((packed)) </span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">qgf_palette_v1_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> struct</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // container for a single HSV palette entry</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> h;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // hue component: `[0,360)` degrees is mapped to `[0,255]` uint8_t.</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> s;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // saturation component: `[0,1]` is mapped to `[0,255]` uint8_t.</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> v;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // value component: `[0,1]` is mapped to `[0,255]` uint8_t.</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><spanstyle="--shiki-light:#E36209;--shiki-dark:#FFAB70;">hsv</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[N];</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // N * hsv, where N is the number of palette entries depending on the frame format in the descriptor</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">qgf_palette_v1_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span></code></pre></div><h2id="qgf-frame-delta-descriptor"tabindex="-1">Frame delta block <aclass="header-anchor"href="#qgf-frame-delta-descriptor"aria-label="Permalink to "Frame delta block {#qgf-frame-delta-descriptor}""></a></h2><ul><li><em>typeid</em> = 0x04</li><li><em>length</em> = 8</li></ul><p>This block describes where the delta frame should be drawn, with respect to the top left location of the image.</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">typedef</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> struct</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> __attribute__</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((packed)) </span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">qgf_delta_v1_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint16_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> left;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // The left pixel location to draw the delta image</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint16_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> top;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // The top pixel location to draw the delta image</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint16_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> right;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // The right pixel location to to draw the delta image</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint16_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> bottom;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // The bottom pixel location to to draw the delta image</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// _Static_assert(sizeof(qgf_delta_v1_t) == 13, "qgf_delta_v1_t must be 13 bytes in v1 of QGF");</span></span></code></pre></div><h2id="qgf-frame-data-descriptor"tabindex="-1">Frame data block <aclass="header-anchor"href="#qgf-frame-data-descriptor"aria-label="Permalink to "Frame data block {#qgf-frame-data-descriptor}""></a></h2><ul><li><em>typeid</em> = 0x05</li><li><em>length</em> = variable</li></ul><p>This block describes the data associated with the frame. The <em>blob</em> contains an array of bytes containing the data corresponding to the frame's image format:</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">typedef</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> struct</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> __attribute__</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((packed)) </span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">qgf_data_v1_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> uint8_t</span><spanstyle="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> data</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[N];</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // N data octets</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">qgf_data_v1_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span></code></pre></div></div></div></main><footerclass="VPDocFooter"data-v-39a288b8data-v-09de1c0f><!--[--><!--]--><!----><navclass="prev-next"data-v-09de1c0f><divclass="pager"data-v-09de1c0f><!----></div><divclass="pager"data-v-09de1c0f><aclass="VPLink link pager-link next"href="/newbs"data-v-09de1c0f><!--[--><spanclass="desc"data-v-09de1c0f>Next page</span><spanclass="title"data-v-09de1c0f>Introduction</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>