From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3DA25EDB7D4 for ; Tue, 7 Apr 2026 09:26:06 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 74C8710E384; Tue, 7 Apr 2026 09:26:05 +0000 (UTC) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.223.131]) by gabe.freedesktop.org (Postfix) with ESMTPS id 44C0010E383 for ; Tue, 7 Apr 2026 09:26:03 +0000 (UTC) Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [IPv6:2a07:de40:b281:104:10:150:64:97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 2284F5BD7F; Tue, 7 Apr 2026 09:26:02 +0000 (UTC) Authentication-Results: smtp-out2.suse.de; none Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id CEBBB4A0B1; Tue, 7 Apr 2026 09:26:01 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id OIZHManN1GmDVwAAD6G6ig (envelope-from ); Tue, 07 Apr 2026 09:26:01 +0000 From: Thomas Zimmermann To: deller@gmx.de, gregkh@linuxfoundation.org, jirislaby@kernel.org, geert@linux-m68k.org, simona@ffwll.ch, sam@ravnborg.org Cc: linux-fbdev@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, Thomas Zimmermann Subject: [PATCH v2 05/10] lib/fonts: Implement glyph rotation Date: Tue, 7 Apr 2026 11:23:16 +0200 Message-ID: <20260407092555.58816-6-tzimmermann@suse.de> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260407092555.58816-1-tzimmermann@suse.de> References: <20260407092555.58816-1-tzimmermann@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Rspamd-Server: rspamd2.dmz-prg2.suse.org X-Spamd-Result: default: False [-4.00 / 50.00]; REPLY(-4.00)[] X-Rspamd-Queue-Id: 2284F5BD7F X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Rspamd-Action: no action X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" TW92ZSB0aGUgZ2x5cGggcm90YXRpb24gaGVscGVycyBmcm9tIGZiY29uIHRvIHRoZSBmb250IGxp YnJhcnkuIFdyYXAgdGhlbQpiZWhpbmQgY2xlYW4gaW50ZXJmYWNlcy4gQWxzbyBjbGVhciB0aGUg b3V0cHV0IG1lbW9yeSB0byB6ZXJvLiBQcmV2aW91c2x5LAp0aGUgaW1wbGVtZW50YXRpb24gcmVs aWVkIG9uIHRoZSBjYWxsZXIgdG8gZG8gdGhhdC4KCkdvIHRocm91Z2ggdGhlIGZiY29uIGNvZGUg YW5kIGNhbGxlcnMgb2YgdGhlIGdseXBoLXJvdGF0aW9uIGhlbHBlcnMuIEluCmFkZGl0aW9uIHRv IHRoZSBmb250IHJvdGF0aW9uLCB0aGVyZSdzIGFsc28gdGhlIGN1cnNvciBjb2RlLCB3aGljaCB1 c2VzCnRoZSByb3RhdGlvbiBoZWxwZXJzLgoKVGhlIGZvbnQtcm90YXRpb24gcmVsaWVkIG9uIGEg c2luZ2xlIG1lbXNldCB0byB6ZXJvIGZvciB0aGUgd2hvbGUgZm9udC4KVGhpcyBpcyBub3cgbXVs dGlwbGUgbWVtc2V0cyBvbiBlYWNoIGdseXBoLiBUaGlzIHdpbGwgYmUgc29ydGVkIG91dCB3aGVu CnRoZSBmb250IGxpYnJhcnkgYWxzbyBpbXBsZW1lbnRzIGZvbnQgcm90YXRpb24uCgpCdWlsZGlu ZyBnbHlwaCByb3RhdGlvbiBpbiB0aGUgZm9udCBsaWJyYXJ5IHN0aWxsIGRlcGVuZHMgb24KQ09O RklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT049eS4gSWYgd2UgZ2V0IG1vcmUgdXNlcnMg b2YgdGhlIGNvZGUsCndlIGNhbiBzdGlsbCBhZGQgYSBkZWRpY2F0ZWQgS2NvbmZpZyBzeW1ib2wg dG8gdGhlIGZvbnQgbGlicmFyeS4KCk5vIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGFj dHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcm90YXRlXyooKQphbmQgcGF0dGVybl8qKCkgZnVu Y3Rpb25zLiBUaGVzZSB3aWxsIGJlIHJlZmFjdG9yZWQgYXMgc2VwYXJhdGUgY2hhbmdlcy4KCnYy OgotIGZpeCB0eXBvcwoKU2lnbmVkLW9mZi1ieTogVGhvbWFzIFppbW1lcm1hbm4gPHR6aW1tZXJt YW5uQHN1c2UuZGU+Ci0tLQogZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZiY29uX2Njdy5jICAg IHwgICA0ICstCiBkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJjb25fY3cuYyAgICAgfCAgIDQg Ky0KIGRyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYmNvbl9yb3RhdGUuYyB8ICAxMiArLQogZHJp dmVycy92aWRlby9mYmRldi9jb3JlL2ZiY29uX3JvdGF0ZS5oIHwgIDcxIC0tLS0tLS0tLS0tCiBp bmNsdWRlL2xpbnV4L2ZvbnQuaCAgICAgICAgICAgICAgICAgICAgfCAgIDggKysKIGxpYi9mb250 cy9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICB8ICAgMSArCiBsaWIvZm9udHMvZm9udF9y b3RhdGUuYyAgICAgICAgICAgICAgICAgfCAxNTAgKysrKysrKysrKysrKysrKysrKysrKysrCiA3 IGZpbGVzIGNoYW5nZWQsIDE2NyBpbnNlcnRpb25zKCspLCA4MyBkZWxldGlvbnMoLSkKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBsaWIvZm9udHMvZm9udF9yb3RhdGUuYwoKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdmlkZW8vZmJkZXYvY29yZS9mYmNvbl9jY3cuYyBiL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29y ZS9mYmNvbl9jY3cuYwppbmRleCA5NmVmNDQ5ZWU2YWMuLjcyNDUzYTJhYWNhOCAxMDA2NDQKLS0t IGEvZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZiY29uX2Njdy5jCisrKyBiL2RyaXZlcnMvdmlk ZW8vZmJkZXYvY29yZS9mYmNvbl9jY3cuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxp bnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9m Yi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZvbnQuaD4KICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+ CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgpAQCAt MzQ0LDggKzM0NSw3IEBAIHN0YXRpYyB2b2lkIGNjd19jdXJzb3Ioc3RydWN0IHZjX2RhdGEgKnZj LCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgYm9vbCBlbmFibGUsCiAJCXNpemUgPSBjdXJfaGVpZ2h0 ICogd2lkdGg7CiAJCXdoaWxlIChzaXplLS0pCiAJCQl0bXBbaSsrXSA9IDB4ZmY7Ci0JCW1lbXNl dChtYXNrLCAwLCB3ICogdmMtPnZjX2ZvbnQud2lkdGgpOwotCQlyb3RhdGVfY2N3KHRtcCwgbWFz aywgdmMtPnZjX2ZvbnQud2lkdGgsIHZjLT52Y19mb250LmhlaWdodCk7CisJCWZvbnRfZ2x5cGhf cm90YXRlXzI3MCh0bXAsIHZjLT52Y19mb250LndpZHRoLCB2Yy0+dmNfZm9udC5oZWlnaHQsIG1h c2spOwogCQlrZnJlZSh0bXApOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYmRl di9jb3JlL2ZiY29uX2N3LmMgYi9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJjb25fY3cuYwpp bmRleCBlYTcxMjY1NGVkYWUuLjU2OTBmYzFkNzg1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRl by9mYmRldi9jb3JlL2ZiY29uX2N3LmMKKysrIGIvZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2Zi Y29uX2N3LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5j bHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxs aW51eC9mb250Lmg+CiAjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgogI2luY2x1ZGUgPGxpbnV4 L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KQEAgLTMyNyw4ICszMjgsNyBAQCBz dGF0aWMgdm9pZCBjd19jdXJzb3Ioc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAq aW5mbywgYm9vbCBlbmFibGUsCiAJCXNpemUgPSBjdXJfaGVpZ2h0ICogd2lkdGg7CiAJCXdoaWxl IChzaXplLS0pCiAJCQl0bXBbaSsrXSA9IDB4ZmY7Ci0JCW1lbXNldChtYXNrLCAwLCB3ICogdmMt PnZjX2ZvbnQud2lkdGgpOwotCQlyb3RhdGVfY3codG1wLCBtYXNrLCB2Yy0+dmNfZm9udC53aWR0 aCwgdmMtPnZjX2ZvbnQuaGVpZ2h0KTsKKwkJZm9udF9nbHlwaF9yb3RhdGVfOTAodG1wLCB2Yy0+ dmNfZm9udC53aWR0aCwgdmMtPnZjX2ZvbnQuaGVpZ2h0LCBtYXNrKTsKIAkJa2ZyZWUodG1wKTsK IAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYmNvbl9yb3RhdGUu YyBiL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYmNvbl9yb3RhdGUuYwppbmRleCAxODU3NWM1 MTgyZGIuLjU4OGRjOWQ2NzU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYmRldi9jb3Jl L2ZiY29uX3JvdGF0ZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYmNvbl9yb3Rh dGUuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRl IDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4 L2ZvbnQuaD4KICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvY29u c29sZS5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgpAQCAtNjAsMzAgKzYxLDI1IEBAIGludCBm YmNvbl9yb3RhdGVfZm9udChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZjX2RhdGEgKnZj KQogCX0KIAogCWRzdCA9IHBhci0+Zm9udGJ1ZmZlcjsKLQltZW1zZXQoZHN0LCAwLCBwYXItPmZk X3NpemUpOwogCiAJc3dpdGNoIChwYXItPnJvdGF0ZSkgewogCWNhc2UgRkJfUk9UQVRFX1VEOgog CQlmb3IgKGkgPSBsZW47IGktLTsgKSB7Ci0JCQlyb3RhdGVfdWQoc3JjLCBkc3QsIHZjLT52Y19m b250LndpZHRoLAotCQkJCSAgdmMtPnZjX2ZvbnQuaGVpZ2h0KTsKLQorCQkJZm9udF9nbHlwaF9y b3RhdGVfMTgwKHNyYywgdmMtPnZjX2ZvbnQud2lkdGgsIHZjLT52Y19mb250LmhlaWdodCwgZHN0 KTsKIAkJCXNyYyArPSBzX2NlbGxzaXplOwogCQkJZHN0ICs9IGRfY2VsbHNpemU7CiAJCX0KIAkJ YnJlYWs7CiAJY2FzZSBGQl9ST1RBVEVfQ1c6CiAJCWZvciAoaSA9IGxlbjsgaS0tOyApIHsKLQkJ CXJvdGF0ZV9jdyhzcmMsIGRzdCwgdmMtPnZjX2ZvbnQud2lkdGgsCi0JCQkJICB2Yy0+dmNfZm9u dC5oZWlnaHQpOworCQkJZm9udF9nbHlwaF9yb3RhdGVfOTAoc3JjLCB2Yy0+dmNfZm9udC53aWR0 aCwgdmMtPnZjX2ZvbnQuaGVpZ2h0LCBkc3QpOwogCQkJc3JjICs9IHNfY2VsbHNpemU7CiAJCQlk c3QgKz0gZF9jZWxsc2l6ZTsKIAkJfQogCQlicmVhazsKIAljYXNlIEZCX1JPVEFURV9DQ1c6CiAJ CWZvciAoaSA9IGxlbjsgaS0tOyApIHsKLQkJCXJvdGF0ZV9jY3coc3JjLCBkc3QsIHZjLT52Y19m b250LndpZHRoLAotCQkJCSAgIHZjLT52Y19mb250LmhlaWdodCk7CisJCQlmb250X2dseXBoX3Jv dGF0ZV8yNzAoc3JjLCB2Yy0+dmNfZm9udC53aWR0aCwgdmMtPnZjX2ZvbnQuaGVpZ2h0LCBkc3Qp OwogCQkJc3JjICs9IHNfY2VsbHNpemU7CiAJCQlkc3QgKz0gZF9jZWxsc2l6ZTsKIAkJfQpkaWZm IC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZiY29uX3JvdGF0ZS5oIGIvZHJpdmVy cy92aWRlby9mYmRldi9jb3JlL2ZiY29uX3JvdGF0ZS5oCmluZGV4IDhjYjAxOWU4YTljMC4uNzI1 YmNhZTJkZjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJjb25fcm90 YXRlLmgKKysrIGIvZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZiY29uX3JvdGF0ZS5oCkBAIC0x OSw3NyArMTksNiBAQAogICAgICAgICAoZmJfc2Nyb2xsbW9kZShzKSA9PSBTQ1JPTExfUkVEUkFX IHx8IGZiX3Njcm9sbG1vZGUocykgPT0gU0NST0xMX01PVkUgfHwgIShpKS0+Zml4LnhwYW5zdGVw KSA/IFwKICAgICAgICAgKGkpLT52YXIueHJlcyA6IChpKS0+dmFyLnhyZXNfdmlydHVhbDsgfSkK IAotCi1zdGF0aWMgaW5saW5lIGludCBwYXR0ZXJuX3Rlc3RfYml0KHUzMiB4LCB1MzIgeSwgdTMy IHBpdGNoLCBjb25zdCBjaGFyICpwYXQpCi17Ci0JdTMyIHRtcCA9ICh5ICogcGl0Y2gpICsgeCwg aW5kZXggPSB0bXAgLyA4LCAgYml0ID0gdG1wICUgODsKLQotCXBhdCArPWluZGV4OwotCXJldHVy biAoKnBhdCkgJiAoMHg4MCA+PiBiaXQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGF0dGVy bl9zZXRfYml0KHUzMiB4LCB1MzIgeSwgdTMyIHBpdGNoLCBjaGFyICpwYXQpCi17Ci0JdTMyIHRt cCA9ICh5ICogcGl0Y2gpICsgeCwgaW5kZXggPSB0bXAgLyA4LCBiaXQgPSB0bXAgJSA4OwotCi0J cGF0ICs9IGluZGV4OwotCi0JKCpwYXQpIHw9IDB4ODAgPj4gYml0OwotfQotCi1zdGF0aWMgaW5s aW5lIHZvaWQgcm90YXRlX3VkKGNvbnN0IGNoYXIgKmluLCBjaGFyICpvdXQsIHUzMiB3aWR0aCwg dTMyIGhlaWdodCkKLXsKLQlpbnQgaSwgajsKLQlpbnQgc2hpZnQgPSAoOCAtICh3aWR0aCAlIDgp KSAmIDc7Ci0KLQl3aWR0aCA9ICh3aWR0aCArIDcpICYgfjc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwg aGVpZ2h0OyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IHdpZHRoIC0gc2hpZnQ7IGorKykgewot CQkJaWYgKHBhdHRlcm5fdGVzdF9iaXQoaiwgaSwgd2lkdGgsIGluKSkKLQkJCQlwYXR0ZXJuX3Nl dF9iaXQod2lkdGggLSAoMSArIGogKyBzaGlmdCksCi0JCQkJCQloZWlnaHQgLSAoMSArIGkpLAot CQkJCQkJd2lkdGgsIG91dCk7Ci0JCX0KLQotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJv dGF0ZV9jdyhjb25zdCBjaGFyICppbiwgY2hhciAqb3V0LCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQp Ci17Ci0JaW50IGksIGosIGggPSBoZWlnaHQsIHcgPSB3aWR0aDsKLQlpbnQgc2hpZnQgPSAoOCAt IChoZWlnaHQgJSA4KSkgJiA3OwotCi0Jd2lkdGggPSAod2lkdGggKyA3KSAmIH43OwotCWhlaWdo dCA9IChoZWlnaHQgKyA3KSAmIH43OwotCi0JZm9yIChpID0gMDsgaSA8IGg7IGkrKykgewotCQlm b3IgKGogPSAwOyBqIDwgdzsgaisrKSB7Ci0JCQlpZiAocGF0dGVybl90ZXN0X2JpdChqLCBpLCB3 aWR0aCwgaW4pKQotCQkJCXBhdHRlcm5fc2V0X2JpdChoZWlnaHQgLSAxIC0gaSAtIHNoaWZ0LCBq LAotCQkJCQkJaGVpZ2h0LCBvdXQpOwotCi0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9p ZCByb3RhdGVfY2N3KGNvbnN0IGNoYXIgKmluLCBjaGFyICpvdXQsIHUzMiB3aWR0aCwgdTMyIGhl aWdodCkKLXsKLQlpbnQgaSwgaiwgaCA9IGhlaWdodCwgdyA9IHdpZHRoOwotCWludCBzaGlmdCA9 ICg4IC0gKHdpZHRoICUgOCkpICYgNzsKLQotCXdpZHRoID0gKHdpZHRoICsgNykgJiB+NzsKLQlo ZWlnaHQgPSAoaGVpZ2h0ICsgNykgJiB+NzsKLQotCWZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsK LQkJZm9yIChqID0gMDsgaiA8IHc7IGorKykgewotCQkJaWYgKHBhdHRlcm5fdGVzdF9iaXQoaiwg aSwgd2lkdGgsIGluKSkKLQkJCQlwYXR0ZXJuX3NldF9iaXQoaSwgd2lkdGggLSAxIC0gaiAtIHNo aWZ0LAotCQkJCQkJaGVpZ2h0LCBvdXQpOwotCQl9Ci0JfQotfQotCiBpbnQgZmJjb25fcm90YXRl X2ZvbnQoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2Y19kYXRhICp2Yyk7CiAKICNpZiBk ZWZpbmVkKENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OKQpkaWZmIC0tZ2l0IGEv aW5jbHVkZS9saW51eC9mb250LmggYi9pbmNsdWRlL2xpbnV4L2ZvbnQuaAppbmRleCAzYmQ0OWQ5 MTRiMjIuLjBhMjQwZGQ3MDQyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mb250LmgKKysr IGIvaW5jbHVkZS9saW51eC9mb250LmgKQEAgLTEwNCw2ICsxMDQsMTQgQEAgdW5zaWduZWQgaW50 IGZvbnRfZGF0YV9zaXplKGZvbnRfZGF0YV90ICpmZCk7CiBib29sIGZvbnRfZGF0YV9pc19lcXVh bChmb250X2RhdGFfdCAqbGhzLCBmb250X2RhdGFfdCAqcmhzKTsKIGludCBmb250X2RhdGFfZXhw b3J0KGZvbnRfZGF0YV90ICpmZCwgc3RydWN0IGNvbnNvbGVfZm9udCAqZm9udCwgdW5zaWduZWQg aW50IHZwaXRjaCk7CiAKKy8qIGZvbnRfcm90YXRlLmMgKi8KK3ZvaWQgZm9udF9nbHlwaF9yb3Rh dGVfOTAoY29uc3QgdW5zaWduZWQgY2hhciAqZ2x5cGgsIHVuc2lnbmVkIGludCB3aWR0aCwgdW5z aWduZWQgaW50IGhlaWdodCwKKwkJCSAgdW5zaWduZWQgY2hhciAqb3V0KTsKK3ZvaWQgZm9udF9n bHlwaF9yb3RhdGVfMTgwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmdseXBoLCB1bnNpZ25lZCBpbnQg d2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCQkgICB1bnNpZ25lZCBjaGFyICpvdXQpOwor dm9pZCBmb250X2dseXBoX3JvdGF0ZV8yNzAoY29uc3QgdW5zaWduZWQgY2hhciAqZ2x5cGgsIHVu c2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwKKwkJCSAgIHVuc2lnbmVkIGNo YXIgKm91dCk7CisKIC8qCiAgKiBGb250IGRlc2NyaXB0aW9uCiAgKi8KZGlmZiAtLWdpdCBhL2xp Yi9mb250cy9NYWtlZmlsZSBiL2xpYi9mb250cy9NYWtlZmlsZQppbmRleCBiMTc2YWY1M2Q1M2Uu LjcyMDJhNzBhNTZlZiAxMDA2NDQKLS0tIGEvbGliL2ZvbnRzL01ha2VmaWxlCisrKyBiL2xpYi9m b250cy9NYWtlZmlsZQpAQCAtMiw2ICsyLDcgQEAKICMgRm9udCBoYW5kbGluZwogCiBmb250LXkg Oj0gZm9udHMubworZm9udC0kKENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OKSAr PSBmb250X3JvdGF0ZS5vCiAKICMgQnVpbHQtaW4gZm9udHM7IHNvcnRlZCBieSBGYW1pbHktU2l6 ZSBpbiBhc2NlbmRpbmcgb3JkZXIKIGZvbnQtJChDT05GSUdfRk9OVF82eDgpICAgICAgICs9IGZv bnRfNng4Lm8KZGlmZiAtLWdpdCBhL2xpYi9mb250cy9mb250X3JvdGF0ZS5jIGIvbGliL2ZvbnRz L2ZvbnRfcm90YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5k MTA3YThkMGEyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9udHMvZm9udF9yb3RhdGUuYwpA QCAtMCwwICsxLDE1MCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25s eQorLyoKKyAqIEZvbnQgcm90YXRpb24KKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDUgQW50 b25pbm8gRGFwbGFzIDxhZGFwbGFzIEBwb2wubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJq ZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj CisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5 IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8 bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbWF0aC5oPgorI2luY2x1ZGUgPGxpbnV4 L3N0cmluZy5oPgorCisjaW5jbHVkZSAiZm9udC5oIgorCitzdGF0aWMgaW5saW5lIGludCBwYXR0 ZXJuX3Rlc3RfYml0KHUzMiB4LCB1MzIgeSwgdTMyIHBpdGNoLCBjb25zdCBjaGFyICpwYXQpCit7 CisJdTMyIHRtcCA9ICh5ICogcGl0Y2gpICsgeCwgaW5kZXggPSB0bXAgLyA4LCAgYml0ID0gdG1w ICUgODsKKworCXBhdCArPSBpbmRleDsKKwlyZXR1cm4gKCpwYXQpICYgKDB4ODAgPj4gYml0KTsK K30KKworc3RhdGljIGlubGluZSB2b2lkIHBhdHRlcm5fc2V0X2JpdCh1MzIgeCwgdTMyIHksIHUz MiBwaXRjaCwgY2hhciAqcGF0KQoreworCXUzMiB0bXAgPSAoeSAqIHBpdGNoKSArIHgsIGluZGV4 ID0gdG1wIC8gOCwgYml0ID0gdG1wICUgODsKKworCXBhdCArPSBpbmRleDsKKworCSgqcGF0KSB8 PSAweDgwID4+IGJpdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJvdGF0ZV9jdyhjb25zdCBj aGFyICppbiwgY2hhciAqb3V0LCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQpCit7CisJaW50IGksIGos IGggPSBoZWlnaHQsIHcgPSB3aWR0aDsKKwlpbnQgc2hpZnQgPSAoOCAtIChoZWlnaHQgJSA4KSkg JiA3OworCisJd2lkdGggPSAod2lkdGggKyA3KSAmIH43OworCWhlaWdodCA9IChoZWlnaHQgKyA3 KSAmIH43OworCisJZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwg dzsgaisrKSB7CisJCQlpZiAocGF0dGVybl90ZXN0X2JpdChqLCBpLCB3aWR0aCwgaW4pKQorCQkJ CXBhdHRlcm5fc2V0X2JpdChoZWlnaHQgLSAxIC0gaSAtIHNoaWZ0LCBqLAorCQkJCQkJaGVpZ2h0 LCBvdXQpOworCQl9CisJfQorfQorCisvKioKKyAqIGZvbnRfZ2x5cGhfcm90YXRlXzkwIC0gUm90 YXRlIGEgZ2x5cGggcGF0dGVybiBieSA5MMKwIGluIGNsb2Nrd2lzZSBkaXJlY3Rpb24KKyAqIEBn bHlwaDogVGhlIGdseXBoIHRvIHJvdGF0ZQorICogQHdpZHRoOiBUaGUgZ2x5cGggd2lkdGggaW4g Yml0cyBwZXIgc2NhbmxpbmUKKyAqIEBoZWlnaHQ6IFRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGlu IHRoZSBnbHlwaAorICogQG91dDogVGhlIHJvdGF0ZWQgZ2x5cGggYml0bWFwCisgKgorICogVGhl IHBhcmFtZXRlcnMgQHdpZHRoIGFuZCBAaGVpZ2h0IHJlZmVyIHRvIHRoZSBpbnB1dCBnbHlwaCBn aXZlbiBpbiBAZ2x5cGguCisgKiBUaGUgY2FsbGVyIGhhcyB0byBwcm92aWRlIHRoZSBvdXRwdXQg YnVmZmVyIEBvdXQgb2Ygc3VmZmljaWVudCBzaXplIHRvIGhvbGQKKyAqIHRoZSByb3RhdGVkIGds eXBoLiBSb3RhdGluZyBieSA5MMKwIGZsaXBzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGZvciB0aGUg b3V0cHV0CisgKiBnbHlwaC4gRGVwZW5kaW5nIG9uIHRoZSBnbHlwaCBwaXRjaCwgdGhlIHNpemUg b2YgdGhlIG91dHB1dCBnbHlwaCBjYW4gYmUKKyAqIGRpZmZlcmVudCB0aGFuIHRoZSBzaXplIG9m IHRoZSBpbnB1dC4gQ2FsbGVycyBoYXZlIHRvIHRha2UgdGhpcyBpbnRvIGFjY291bnQKKyAqIHdo ZW4gYWxsb2NhdGluZyB0aGUgb3V0cHV0IG1lbW9yeS4KKyAqLwordm9pZCBmb250X2dseXBoX3Jv dGF0ZV85MChjb25zdCB1bnNpZ25lZCBjaGFyICpnbHlwaCwgdW5zaWduZWQgaW50IHdpZHRoLCB1 bnNpZ25lZCBpbnQgaGVpZ2h0LAorCQkJICB1bnNpZ25lZCBjaGFyICpvdXQpCit7CisJbWVtc2V0 KG91dCwgMCwgZm9udF9nbHlwaF9zaXplKGhlaWdodCwgd2lkdGgpKTsgLyogZmxpcCB3aWR0aC9o ZWlnaHQgKi8KKworCXJvdGF0ZV9jdyhnbHlwaCwgb3V0LCB3aWR0aCwgaGVpZ2h0KTsKK30KK0VY UE9SVF9TWU1CT0xfR1BMKGZvbnRfZ2x5cGhfcm90YXRlXzkwKTsKKworc3RhdGljIGlubGluZSB2 b2lkIHJvdGF0ZV91ZChjb25zdCBjaGFyICppbiwgY2hhciAqb3V0LCB1MzIgd2lkdGgsIHUzMiBo ZWlnaHQpCit7CisJaW50IGksIGo7CisJaW50IHNoaWZ0ID0gKDggLSAod2lkdGggJSA4KSkgJiA3 OworCisJd2lkdGggPSAod2lkdGggKyA3KSAmIH43OworCisJZm9yIChpID0gMDsgaSA8IGhlaWdo dDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCB3aWR0aCAtIHNoaWZ0OyBqKyspIHsKKwkJCWlm IChwYXR0ZXJuX3Rlc3RfYml0KGosIGksIHdpZHRoLCBpbikpCisJCQkJcGF0dGVybl9zZXRfYml0 KHdpZHRoIC0gKDEgKyBqICsgc2hpZnQpLAorCQkJCQkJaGVpZ2h0IC0gKDEgKyBpKSwKKwkJCQkJ CXdpZHRoLCBvdXQpOworCQl9CisJfQorfQorCisvKioKKyAqIGZvbnRfZ2x5cGhfcm90YXRlXzE4 MCAtIFJvdGF0ZSBhIGdseXBoIHBhdHRlcm4gYnkgMTgwwrAKKyAqIEBnbHlwaDogVGhlIGdseXBo IHRvIHJvdGF0ZQorICogQHdpZHRoOiBUaGUgZ2x5cGggd2lkdGggaW4gYml0cyBwZXIgc2Nhbmxp bmUKKyAqIEBoZWlnaHQ6IFRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGluIHRoZSBnbHlwaAorICog QG91dDogVGhlIHJvdGF0ZWQgZ2x5cGggYml0bWFwCisgKgorICogVGhlIHBhcmFtZXRlcnMgQHdp ZHRoIGFuZCBAaGVpZ2h0IHJlZmVyIHRvIHRoZSBpbnB1dCBnbHlwaCBnaXZlbiBpbiBAZ2x5cGgu CisgKiBUaGUgY2FsbGVyIGhhcyB0byBwcm92aWRlIHRoZSBvdXRwdXQgYnVmZmVyIEBvdXQgb2Yg c3VmZmljaWVudCBzaXplIHRvIGhvbGQKKyAqIHRoZSByb3RhdGVkIGdseXBoLgorICovCit2b2lk IGZvbnRfZ2x5cGhfcm90YXRlXzE4MChjb25zdCB1bnNpZ25lZCBjaGFyICpnbHlwaCwgdW5zaWdu ZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LAorCQkJICAgdW5zaWduZWQgY2hhciAq b3V0KQoreworCW1lbXNldChvdXQsIDAsIGZvbnRfZ2x5cGhfc2l6ZSh3aWR0aCwgaGVpZ2h0KSk7 CisKKwlyb3RhdGVfdWQoZ2x5cGgsIG91dCwgd2lkdGgsIGhlaWdodCk7Cit9CitFWFBPUlRfU1lN Qk9MX0dQTChmb250X2dseXBoX3JvdGF0ZV8xODApOworCitzdGF0aWMgaW5saW5lIHZvaWQgcm90 YXRlX2Njdyhjb25zdCBjaGFyICppbiwgY2hhciAqb3V0LCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQp Cit7CisJaW50IGksIGosIGggPSBoZWlnaHQsIHcgPSB3aWR0aDsKKwlpbnQgc2hpZnQgPSAoOCAt ICh3aWR0aCAlIDgpKSAmIDc7CisKKwl3aWR0aCA9ICh3aWR0aCArIDcpICYgfjc7CisJaGVpZ2h0 ID0gKGhlaWdodCArIDcpICYgfjc7CisKKwlmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisJCWZv ciAoaiA9IDA7IGogPCB3OyBqKyspIHsKKwkJCWlmIChwYXR0ZXJuX3Rlc3RfYml0KGosIGksIHdp ZHRoLCBpbikpCisJCQkJcGF0dGVybl9zZXRfYml0KGksIHdpZHRoIC0gMSAtIGogLSBzaGlmdCwK KwkJCQkJCWhlaWdodCwgb3V0KTsKKwkJfQorCX0KK30KKworLyoqCisgKiBmb250X2dseXBoX3Jv dGF0ZV8yNzAgLSBSb3RhdGUgYSBnbHlwaCBwYXR0ZXJuIGJ5IDI3MMKwIGluIGNsb2Nrd2lzZSBk aXJlY3Rpb24KKyAqIEBnbHlwaDogVGhlIGdseXBoIHRvIHJvdGF0ZQorICogQHdpZHRoOiBUaGUg Z2x5cGggd2lkdGggaW4gYml0cyBwZXIgc2NhbmxpbmUKKyAqIEBoZWlnaHQ6IFRoZSBudW1iZXIg b2Ygc2NhbmxpbmVzIGluIHRoZSBnbHlwaAorICogQG91dDogVGhlIHJvdGF0ZWQgZ2x5cGggYml0 bWFwCisgKgorICogVGhlIHBhcmFtZXRlcnMgQHdpZHRoIGFuZCBAaGVpZ2h0IHJlZmVyIHRvIHRo ZSBpbnB1dCBnbHlwaCBnaXZlbiBpbiBAZ2x5cGguCisgKiBUaGUgY2FsbGVyIGhhcyB0byBwcm92 aWRlIHRoZSBvdXRwdXQgYnVmZmVyIEBvdXQgb2Ygc3VmZmljaWVudCBzaXplIHRvIGhvbGQKKyAq IHRoZSByb3RhdGVkIGdseXBoLiBSb3RhdGluZyBieSAyNzDCsCBmbGlwcyB0aGUgd2lkdGggYW5k IGhlaWdodCBmb3IgdGhlIG91dHB1dAorICogZ2x5cGguIERlcGVuZGluZyBvbiB0aGUgZ2x5cGgg cGl0Y2gsIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgZ2x5cGggY2FuIGJlCisgKiBkaWZmZXJlbnQg dGhhbiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQuIENhbGxlcnMgaGF2ZSB0byB0YWtlIHRoaXMgaW50 byBhY2NvdW50CisgKiB3aGVuIGFsbG9jYXRpbmcgdGhlIG91dHB1dCBtZW1vcnkuCisgKi8KK3Zv aWQgZm9udF9nbHlwaF9yb3RhdGVfMjcwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmdseXBoLCB1bnNp Z25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCQkgICB1bnNpZ25lZCBjaGFy ICpvdXQpCit7CisJbWVtc2V0KG91dCwgMCwgZm9udF9nbHlwaF9zaXplKGhlaWdodCwgd2lkdGgp KTsgLyogZmxpcCB3aWR0aC9oZWlnaHQgKi8KKworCXJvdGF0ZV9jY3coZ2x5cGgsIG91dCwgd2lk dGgsIGhlaWdodCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmb250X2dseXBoX3JvdGF0ZV8yNzAp OwotLSAKMi41My4wCgo=