From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "Elijah G." Newsgroups: gmane.emacs.devel Subject: Re: Stipples support in MS-Windows port Date: Mon, 20 May 2024 13:44:37 -0600 Message-ID: <86r0dww9ne.fsf@gmail.com> References: <87a5l49a53.fsf@yahoo.com> <87seyw7udp.fsf@yahoo.com> <87wmo0zzni.fsf@yahoo.com> <86r0e83gez.fsf@gnu.org> <861q661vgf.fsf@gmail.com> <86le4dvxx9.fsf@gmail.com> <87frulynby.fsf@yahoo.com> <86zfslctt8.fsf@gmail.com> <86r0dwag4n.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="16443"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: luangruo@yahoo.com, emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Mon May 20 21:47:35 2024 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1s98ys-00043w-FW for ged-emacs-devel@m.gmane-mx.org; Mon, 20 May 2024 21:47:34 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1s98yF-0007Z9-Pw; Mon, 20 May 2024 15:46:55 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1s98yB-0007Yr-1n for emacs-devel@gnu.org; Mon, 20 May 2024 15:46:51 -0400 Original-Received: from mail-oo1-xc43.google.com ([2607:f8b0:4864:20::c43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1s98y8-0000KI-R6; Mon, 20 May 2024 15:46:50 -0400 Original-Received: by mail-oo1-xc43.google.com with SMTP id 006d021491bc7-5b290669b0fso2433328eaf.2; Mon, 20 May 2024 12:46:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1716234406; x=1716839206; darn=gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=9RuRyPmzWsv2u9XDoGtyHkrCPa6ze+Ibgr4KUfg+UAI=; b=AZOJ6eikDeZsCUrvCnv4h8ANaQZwR9AlwFUPfSg5Hm8tf+sqrD3RoTWbKVglBocf9F 6r+a5Z+OjtGg3Mei5tdXY+OVls5pejCj+EPrtb7tpYuejWIPie2Y0kbH6SnAxqDorpFz HuYkwKyM58VGEfkMs/Agl1Em2K/kCTHFX9KZXDi4AmiT+OQIkHSR9+DErwXNhTJozsph 4kxv0QLuS04h2doUYwRucJGSRljYiqSdDP0ATPU6tDJZtWzyCq59uYfvQejbK/xJiJ2l xlFSJ4klYFhpfSwYuSo5u3AVT/rFDKqEhP5+k4f/9W5vWuTMHfNHJrMIo2/Xv8n+fdE1 eUyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1716234406; x=1716839206; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=9RuRyPmzWsv2u9XDoGtyHkrCPa6ze+Ibgr4KUfg+UAI=; b=LD67119XjIdJNZ53rRxiNnlfEI0yuVXNrqdtA2OpAc4sK+31qGia2bYgMYje5TVUF4 m97XfoT9e9iRLKDyjHjwSuJapHcw+3K3B86S+Zea/YFEPaQxAxbzxtb2skFvzmc2OH6Z e7fJ2DqC04qHRGH2BDvqDcWjwMFDGTH/7VeB9h2bMo3MRR7665jofPkxt61M0kysfBLt DA6LqDQcifXhENffWbXMa2dF8ARQY9+HGRRl23uG3hQ76K8Kx8GQtc71siy4+O69F/N2 W8jIrPAUxK38Zat5Z9zTY1IK5AqyVbnx5RTgnEz0cBrmwb9/BIBuhZZiCmNdnoHl0AZP TPMg== X-Forwarded-Encrypted: i=1; AJvYcCVlI/iF1ara/7F7tpGXxDSBMK4IezMYwRnb2BNntaft3MjqlocB5vBRs7DVvWoNmeSWTfxISIQyaOvIomNgsjnUib6m X-Gm-Message-State: AOJu0YzpQdKEUewnfz9LXEneKg9JkBlUCQL/JicVm0Mz6cnqxpX3V7gI cgEeXKHi2DAnYTDJQ5pV8vyeCtffCXnMcl9/loEacZkHwOsHldyYUgDw9PGh X-Google-Smtp-Source: AGHT+IE8/b+aNfhMy2G0NxVjZ0X0A1irw5ozDzUBfN4J1xUtT1hDOltLivU7a8x65GZAekeBUDLI6w== X-Received: by 2002:a05:6820:168b:b0:5b5:3d56:109 with SMTP id 006d021491bc7-5b53d562c01mr1300659eaf.7.1716234405981; Mon, 20 May 2024 12:46:45 -0700 (PDT) Original-Received: from LIBERO ([187.184.24.187]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-5b26dd4d916sm5127801eaf.4.2024.05.20.12.46.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 May 2024 12:46:44 -0700 (PDT) In-Reply-To: <86r0dwag4n.fsf@gnu.org> (Eli Zaretskii's message of "Mon, 20 May 2024 14:15:36 +0300") Received-SPF: pass client-ip=2607:f8b0:4864:20::c43; envelope-from=eg642616@gmail.com; helo=mail-oo1-xc43.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:319433 Archived-At: --=-=-= Content-Type: text/plain Eli Zaretskii writes: >> From: "Elijah G." >> Cc: emacs-devel@gnu.org >> Date: Sun, 19 May 2024 16:37:07 -0600 >> >> Good news, the stipple implementation is now done, now works using >> indent-bars package and other stipples, however there are some >> issues that i want to remark >> >> 1. Currently it only works for stipple data and not for X Bitmap files, >> I don't know where is stored the code for using X Bitmap in stipples. > > Please elaborate: what doesn't work yet with this implementation? It's kind of hard for me to explain, but I think that doesn't mean it's hard to solve. In the documentation (https://www.gnu.org/software/emacs/manual/html_node/elisp/Face-Attributes.html) specifies that stipples can be a filepath to an X Bitmap file: The value can be a string; that should be the name of a file containing external-format X bitmap data. The file is found in the directories listed in the variable x-bitmap-file-path. --=-=-= Content-Type: image/png Content-Disposition: inline; filename=stipple2.png Content-Transfer-Encoding: base64 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 /zVQdemBAAAAAElFTkSuQmCC --=-=-= Content-Type: text/plain That is not done yet, currently setting the bitmap as shown below from the documentation is done and works well: Alternatively, the value can specify the bitmap directly, with a list of the form (width height data). Here, width and height specify the size in pixels, and data is a string containing the raw bits of the bitmap, row by row. Each row occupies (width + 7) / 8 consecutive bytes in the string (which should be a unibyte string for best results). This means that each row always occupies at least one whole byte. >> 2. I had to use `w32_create_pixmap_from_bitmap_data` for make it usable, >> but it is defined before `image_create_bitmap_from_data`, i had to >> copy its code for use it, Is there a problem move that function >> before `image_create_bitmap_from_data` ? > > I don't understand the problem: in C there's no requirement to have a > function defined before it is used. All you need is its prototype to > be defined before the first use. It's now solved, thank you, i forgot that it is possible in C. >> 3. The bitmap created using the copied code have colors inverted, >> I fixed it setting text color to background color and bg to fg color, >> I'm not sure how w32_create_pixmap_from_bitmap_data works, as far as >> i could see it does some operations to the memory, something that i >> don't think i can help so much. >> >> After fixing 1 (and maybe 2), I will only need to format the code (and >> maybe rename XFillRectangle function) for send the final patch here. >> >> I'm attaching the work done if you all want to test it. > > Maybe I'm missing something, but where is the stipple in the attached > image? The stipples are the color lines. In case there are any doubt, here is another image showing another 2 stipples with whitespace-mode turned-on: --=-=-= Content-Type: image/png Content-Disposition: inline; filename=stipple.png Content-Transfer-Encoding: base64 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 nCs5UxbLQyYAAAAASUVORK5CYII= --=-=-=--