The Chat Game Fontificator (CGF) is a Twitch chat display that makes the chat look like the text boxes from various video games. Its intended use is as a part of a Twitch video game stream in place of less pretty chat windows.
The File menu contains options for Opening and Saving custom configurations. These files contain all the options you can specify on each of the tabs. The last file successfully loaded or saved will be automatically opened the next time the program runs. The files are plain text Java properties files with a .cgf extension, but the OAuth Token is encrypted before it is stored, so it cannot be read. The option to save a screenshot is also available, and will write a PNG image file of the graphical contents of the Chat Window.
The Presets menu contains all the built-in configurations for various games. Care was taken to approximate the appearance of the text from the respective games. These presets are configuration files, just like the custom ones that can be saved and opened using the options in the File menu, but they only contain any properties related to the font, border, and colors.
The View menu contains options for rendering the chat using Anti-Aliasing, making the chat window Always on Top, and for hiding the Configuration window so only the Chat window is displayed. Closing the Configuration window has the same effect as selecting the option to hide it. The Configuration window can be brought back by single clicking anywhere inside the Chat window on the chat display. The Anti-Aliasing and Always on Top selections are saved as part of the configuration.
The Message menu contains an option to display a pop-up dialog for managing messages, which includes the ability to post a manual message and to enable and edit message censorship and message censorship rules. All effects on messages from this popup are only for the chat display; they have no effect on the IRC server for either posting in the actual IRC chat or banning users or censoring messages.
Message censorship rules include a master option to enable or disable any message censorship, an option to censor messages that contain a specifiable percentage of extended characters (characters outside the ASCII range of 32 to 127), an option for censoring any message that contains a URL, and an option for censoring any message that contains a URL when that message is a user's first post of the session. The first post of the session URL censorship should censor any Twitch bot Spam that comes as a single message from a user that has never posted to the chat before.
The option to censor messages based on the number of unknown characters will censor messages whenever the percentage of characters that fall outside the standard ASCII range exceeds the specified percentage. When appropriately calibrated, this should censor any messages containing ASCII art, while permitting a few characters with umlauts or accents.
The user whitelist is a list of users who are exempt from any censorship. The messages of any user added to this list will not be subject to censorship from user blacklisting, the message containing banned words, or for the message containing URLs. The user blacklist is a list of users whose messages will always be censored regardless of content. And the banned word list contains words that will trigger message censorship when they are included in a message. Only single words can be included, not phrases, and words that may be turned into emoji are also banned word list candidates. The user whitelist, user blacklist, and banned word list are all case insensitive.
Manually toggling message censorship is possible with the checkboxes in the list of all the messages. Once a message is manually censored or uncensored, its status will remain unchanged by any rule changes. From the first instance of manual intervention on that message, it is only subject to further manual intervention. The Reapply Rules button will undo this manual intervention lock and will undo all manual censorship and re-enforce the rules. This will affect all manually censored or uncensored messages at once.
For the option to post manual messages, both the Username and Message fields are required. Checking the 'Retain message input after post' option will preserve the Username and Message input for reposting. The Post button posts the message to the chat display, and the clear button clears out any input in the Username and Message input fields.
The Help menu contains this information and an About pop-up option.
Any time a configuration is about to be loaded, if any unsaved changes exist, a pop-up dialog will prompt you to save the changes.
The Chat window can be dragged around the screen by clicking anywhere inside it and dragging the mouse.

CGF is highly configurable and customizable. The configuration is broken down into 6 sections, each on its own tab:
Connection: Specify all the settings required to connect to an IRC server. Also has a button for clearing the chat
Username | The username with which to log onto the IRC server. This will be the same as your Twitch username if you are trying to connect to a Twitch IRC server. It is case-insensitive.
Channel | The channel on the IRC server to connect to. The hashtag prefix is optional for this input field.
Read Only | This is a Twitch-specific option to connect to a channel in read-only mode. When using this mode, custom channel Twitch badges will still require an OAuth code to load.
OAuth Token | The authentication token for the username used to log onto the IRC server. The token text should include both the 'oauth:' protocol text and all the letters and numbers that follow.
Get OAuth Token | This button links to the website where you can get an OAuth Token for a Twitch username when you click it. The URL it links to is: www.twitchapps.com/tmi.
Host | The IRC server to log onto. For Twitch servers, the host is irc.twitch.tv.
Port | The port on which to log onto the IRC server. This is just another configurable part of the server, and its default value is typically 6667.
Connect / Disconnect | Button to connect or disconnect to the specified IRC server using the specified credentials
Clear Chat | Clear the contents of the chat display. This doesn't affect the actual IRC chat; it only clears out the messages that are currently being displayed in this program.
Connection Log Area | Below all the connection options is the logging area which keeps track of all the posts and IRC connection information.
Chat Window: Modify the chat window and optional chroma border
Chat Window Size | This allows you to manually specify a width and height for the chat window size. It is the size of the whole window including the top menu bar, not just the chat inside the window. The Update Chat Size button will become enabled whenever the width and height values that are typed are both valid and different than the current size of the chat window.
Resize Chat by Dragging | If this option is checked, the chat window will be resizable by the traditional means of clicking and dragging the mouse on the window border. The intent of this option is to allow resizing, but then prevent accidental changes to the window size after a size that looks right is chosen.
Mouse Wheel Scrolls Chat | If this option is checked, the mouse wheel button will scroll through the chat message when the mouse pointer is located over the chat window. If this option is unchecked, the chat display will scroll back so the most recent message is displayed. There is no visual indication that the chat has been scrolled through, so if the newest messages in the chat aren't being displayed, it could be that this option is checked and the messages have been scrolled up through.
Reverse Chat Order | This option will reverse the order messages are displayed in the chat window. The most recent message will appear on top and older messages will scroll below.
Chat Starts from Bottom | When the chat has too few messages to fill the available space vertically, this determines whether the chat starts from the bottom and builds upward, or from the top and builds downward.
Enable Chroma Key Border | Check this option to enable displaying the chroma key border. The chroma key border is intended to be a solid block of color that can be selected by streaming software to become transparent. The chroma key border sizes must be non-zero for the chroma key border to be seen in the chat display.
Chroma Key Border Size | The left, top, right, and bottom widths of the border are configurable here. The input fields for the border size are disabled while the Enable Chroma Key Border option is unchecked. The Update Chroma Border button becomes enabled whenever the values are both valid and different than the current size of the border.
Invert Chroma Key Border | This option inverts the region covered by the solid block of chroma color. All regions previously covered by the chroma color border will become the background color, and the region that was previously the background color will become the chroma color. If the border sizes are zero for the left, top, right, and bottom edges, selecting to invert the chroma key border will fill the entire window with the chroma color block, enabling the entire background to become transparent in a chroma keyed window capture.
Corner Radius | The chroma key border corner radius permits rounding the edges of the chroma border up to a radius of 128 pixels. This is useful if the border you're attempting to run the chroma key border up to has rounded edges. A chroma key border corner radius of zero means the corners of the chroma key border will be square angles.
Font / Border: Specify the font, border, and all the associated customizations
Font Selection | The font selection is which font you wish to use in the chat display. Preset fonts exist for several games, but a custom font can be defined as well. A preset font will have a default associated font type (fixed width or variable width) which will automatically fill when that font is selected, but this can be overridden by selecting the font type manually. A custom font should be in a PNG image containing a grid of 8 by 12 uniform-sized cells each containing a single character. The characters should be ASCII characters 32 (space) through 127 (delete), for a total of 96 characters, in order from left to right, top to bottom. Pixels in the image with any level of transparency will be drawn to that level of transparency onto the underlying color (typically the background or chroma key color, depending on configuration). If the font color tint option is desired to customize the color of the font via this program, the degree to which a pixel is white will be tinted to the specified tint color on the Color tab.
Font Selection Filter | To the left of the font selection dropdown menu is a place to enter filters. Anything typed in this filter will be used to trim down the list of fonts to make finding the desired selection easier, and to manage the problem of the font selection menu being too large for lower resolution screens.
Font Size | This is the magnification of the font, from 1 to 8 times the original size. Selecting 1 will draw the border at its original size and selecting any other number will magnify it by that amount. There is no anti-aliasing done with this magnification, so highly magnified fonts may appear jaggy or rounded edges may appear more like stair steps. This was done intentionally to match the art style of retro games.
Line Spacing | This is the distance between each row of messages in pixels, from -16 to 32 pixels. This value is magnified by the font scale, so for example a value of 2 pixels with a font magnification of 3 would space lines 6 pixels apart on the screen. The negative values can be used to bring lines closer together if you desire some characters to overlap, like the bottom of a 'y' hitting the top of a '^'.
Char Spacing | This is the distance added between characters for both fixed width and variable width fonts, from -16 to 32 pixels. This value is magnified by the font scale, so for example a value of 2 pixels with a font magnification of 3 would space characters 6 pixels apart on the screen. For a fixed with font, this would be in addition to whatever white space existed around the character already as it is sized by its grid, but for a variable width font, it would be the distance from the non-transparent pixel edge of one character to the next.
Message Spacing | This is the vertical distance added between messages, from 0 to 64 pixels. This space is in addition to the Line Spacing distance, which separates every line. It is added only between messages, not within a single message spanning multiple lines due to text wrapping.
Variable Width Characters | Font characters can be drawn with either fixed or variable width spacing. Fixed width (or mono-spaced) fonts use a set character width to display each letter in series, so even traditionally slimmer characters, like 'i' will be spaced to take up the same space as traditionally wider characters like 'W'. For this program, the width of a fixed width font is determined by the size of the grid of the font image, and is typically the widest character, although if the widest character still has extra space on its left or right side, the width of each character will include that space as well. Typically older games employ these types of fonts because they are easier to lay out, but the result is sometimes awkwardly blocky when periods or commas are buffered with much more space than they would normally take up. Variable width fonts can have different widths per letter. This program calculates the width of all non-transparent pixels per character and makes that value the width of that character. Each font has an associated font type: fixed or variable width. When a font is selected, this checkbox will be set automatically to match. However, this can be overridden if you would like a normally fixed width font to be variable width, or a variable width font to be fixed width.
Space Width | For variable width fonts only, there is no defined width for a space character which has no non-transparent pixels, so this width is set by this value as a percentage of the maximum possible width of that font. The maximum possible width of that font is determined as it would be for a fixed width font, based on the font image grid size.
Baseline Height Offset | The baseline offset is the distance from the bottom of a font's characters to the place where the characters would be written on a line. For example, the tail a lowercase 'p' character would hang below the baseline. When the baseline offset value is zero, the very bottom of the entire character height is the baseline. If the baseline of the font is higher, this offset can indicate that offset so calculations made to place things like badges or extended characters can be based on the baseline rather than the whole character height.
Border Selection | The border selection is which border you wish to use in the chat display. Preset borders exist for several games, but a custom border can be defined as well. A custom border should be in a PNG image containing a grid of 3 by 3 uniform-sized cells, each containing its part of the border. Each corner has its respective corner, and each edge piece contains its respective edge piece, which will be displayed in series as a tile along that edge to extend to the width of the chat display. Pixels in the image with any level of transparency will be drawn to that level of transparency onto the underlying color (typically the background or chroma key color, depending on configuration). If the border color tint option is desired to customize the color of the border via this program, the degree to which a pixel is white will be tinted to the specified tint color on the Color tab.
Border Selection Filter | To the left of the border selection dropdown menu is a place to enter filters. Anything typed in this filter will be used to trim down the list of borders to make finding the desired selection easier, and to manage the problem of the border selection menu being too large for lower resolution screens.
Border Size | This is the magnification of the border, from 0 to 8 times the original size. Selecting 0 will prevent any border from being drawn, selecting 1 will draw the border at its original size, and selecting any other number will magnify it by that amount. There is no anti-aliasing done with this magnification, so highly magnified borders may appear jaggy or rounded edges may appear more like stair steps. This was done intentionally to match the art style of retro games.
Font Insets Off Border X/Y | This is the distance in pixels that the messages are displayed from the borders in the horizontal (x) and vertical (y) directions, which run from -256 to 256 pixels in both directions. These distances are not affected by any scale settings, so even if a border or a font is scaled up, this distance will remain the same. These values can be negative, which will set the distance between the font and the border to one that overlaps. This is typically desirable when the border has extra blank space on the inside on which the messages can be displayed without actually overlapping any non-transparent part of the border.
Display Extended Characters | The option to display extended characters means that for characters outside the inclusive game-themed font character range between ASCII space (#32) and ASCII delete (#127), the character from the available native font will be substituted. If this option is unchecked, any extended characters will be replaced with the Missing Character Substitute selection.
Missing Character Substitute | The substitute missing character is used whenever a character is typed that does not have an ASCII value in the font. All the preset fonts have characters for ASCII values 32 to 127 inclusively. This covers pretty much anything you can type on a standard US keyboard without pressing special key combinations. Things like foreign characters with accents or characters from non-English alphabets do not have a character and will use this selected character as a replacement for them. By default it is the ASCII character for Delete (#127), because that character isn't typically typable, but it has some symbol character assigned to it for all the presets, but in place of that symbol, you might wish to select a blank space, a dash, or a question mark, which are other traditional substitutions when a character is unknown.
Message: Change which components of the messages (posts to the channel) are displayed and how.
Show Usernames | Whether to display the user's name on the messages.
Show Joins | Whether to display messages that show users joining the channel. You may want to turn this type of message off if there are lots of users in your channel, because it will flood the display and the message queue with nothing but notifications. When this is turned off, join messages aren't stored in the message queue, so the information is not maintained at all, meaning if it is turned off and back on again, only new joins will show up, rather than back fill the joins that happened while this option was unchecked.
Show Timestamps | Whether to display a timestamp with the messages. This timestamp will be local to your time zone, and it will be formatted using the specified time format pattern. The time data are always stored with each message regardless of whether this option is selected, so checking it will display the time information for any message already in the queue as well as new messages being posted.
Username Format | This is the pattern used to format the username, should the show username option be selected. The Update Username Format button will become enabled whenever the show username option is selected and the username format pattern value is different than the currently specified pattern. The text %user% is the variable to include in this format that represents the actual username.
Time Format | This is the pattern used to format the timestamps, should the show timestamps option be selected. The Update Time Format button will become enabled whenever the show timestamps option is selected and the time format pattern value is valid and different than the currently specified pattern.
Content Breaker | This is the text used to separate the timestamp and or username from the actual content of the message. The Update Content Breaker button will become enabled whenever the content breaker text is different than the current value.
Message Queue Size | This is the number of messages that are stored in the queue. It should be higher than the number of rows you can see on the screen to avoid any wasted empty space in the chat display, but smaller message queue sizes will use less space. The queue size is changed when the mouse button on the slider is released, so if you drag it all the way down to 1, but take it back up to a more reasonable size before letting go, the messages in the queue will not be removed should another message be added, causing the culling process to run. If the enable scrolling option is selected on the chat window tab, this message queue size will represent the farthest back you can scroll.
Message Speed | This is the speed with which the messages are added to the display, character by character. It is intended to mimic the way a message is displayed in a game text box, where characters are printed out in order one at a time. The value can be specified from 1 character per second up to 120 characters per second, with an additional option to display the messages as fast as possible, which is denoted MAX. It is possible for the message speed to be set too slow for a channel. If the rate of new messages in a channel is faster than the message speed allows those messages to be fully displayed, the message queue will get backed up. In the event that this happens, this backing up effect can be avoided by selecting the MAX characters per second by taking the slider all the way to the right.
Hide Messages After | This is the control for whether to hide messages after a certain amount of specified time in seconds. Setting this slider all the way to the left, which is denoted NEVER, means messages will never be hidden no matter how old they become. In conjunction with the option to Hide Border When No Messages Are Displayed this option can be used to effectively disappear the chat if there are no current messages to display. The messages are not purged from the message queue, but are simply not displayed. Messages will reappear as this value is adjusted to a duration smaller than their ages.
Hide Border When No Messages Are Displayed | If selected, this option will prevent the border from being drawn if there are no messages to display. There are no messages to display if no messages have yet been posted, the Clear Chat button was used to clear out any existing messages, all messages are censored, or the messages have been expired using the Hide Messages After option.
Hide Background When No Messages Are Displayed | If selected, this option will prevent the background color from being drawn if there are no messages to display. The background will be replaced with the chroma key color regardless of whether it is enabled. There are no messages to display if no messages have yet been posted, the Clear Chat button was used to clear out any existing messages, all messages are censored, or the messages have been expired using the Hide Messages After option.
Default Method for Handling Username Casing | Much to the consternation of many users, Twitch only capitalizes the first letter of a username in its chats. These are descriptions of the options for dealing with casing usernames:
Do not modify the capitalization of usernames> | This just leaves the username casing as whatever the IRC server dictates it to be. This should probably be the default selection for any non-Twitch IRC server.
Only the first username letter is capitalized | This is the way Twitch handles usernames by default, where only the first letter is capitalized, and all the remaining letters are lowercase.
All username letters are lowercase | This selection makes all the letters in the username lowercase.
All username letters are capitalized | This selection makes all the letters in the username uppercase.
Look up capitalization with call to Twitch API | This option is only available for Twitch IRC servers. Attempting to look up usernames on the Twitch API that don't exist on Twitch will obviously not work.
This casing only works in the chat display for this program. It has no effect on the username casing in the actual IRC chat or Twitch. Some font presets only have uppercase letters because they game it represents only had uppercase letters. This is done by simply duplicating the uppercase characters into the lowercase character grid spaces, which will of course overrides any username case selection made here in the display, even though the actual characters underlying the display font will still be modified. Whenever a change is made to this list, the cache of username casing is cleared out, including any specified by the user via a post.
Permit users to specify their own username case in posts | When this is checked, users can override the default method for handling username casing whenever she posts a message containing her own username. Whatever casing a poster uses for her username in that message will be how her username is cased in the display. Subsequent posts containing the user's username will continue to update the casing. Whenever a change is made to this option, the cache of username casing is cleared out.
Force upper or lower case | This option can be used to capitalize all letters, or force all letters into lowercase, effective only for fonts that have distinct upper and lowercase letters. The third option, mixed case, will leave the characters unmodified.

Color: Specify all the colors used in the chat display

Background | This is the color to make the background of the chat display.
Chroma Key | This is the color to make the chroma key border. The chroma key border must be enabled and the border size must be set to non-zero values to see this color in the chat display.
Text Tint | This is the color to tint the text of messages. Select pure white if no tint is desired.
Highlight Tint | This is the default highlight tint color. It is used for join messages if the color join messages option is selected, and for usernames if the color usernames option is selected and the no palette colors are specified.
Border Tint | This is the color to tint the border. Select pure white if no tint is desired.
Palette of Colors drawn from, per Username | This is the collection of colors with which to tint usernames, timestamps, and messages, if the option to color these message components is selected. Each username is hashed in a case-insensitive manner to select a color from this palette, so any change to the palette can possibly alter any previously determined username color assignment.
Override Palette with Twitch Username Colors when Available | This option colors usernames with the Twitch username colors instead of the palette whenever those colors are set by the user on Twitch. If no color has been set, the program defaults to the palette colors.
Color Join Messages | This option colors join messages with the highlight tint color.
Color Usernames | This option colors usernames with the palette colors, or with the highlight tint color should no palette colors be specified.
Color Timestamps | This option colors timestamp of the messages with the palette colors, or with the highlight tint color should no palette colors be specified.
Color Messages | This option colors the text of the messages with the palette colors, or with the highlight tint color should no palette colors be specified.

Emoji: Specify all the configuration for emoji

Enable Emoji | This option acts as a master switch to toggle the use of emoji from any source
Enable Twitch Badges | This option acts as a switch to toggle the use of Twitch badges. Badges are considered a different feature than emoji, so the master Enable Emoji switch will not affect whether badges are displayed.
Enable FrankerFaceZ Badges | This option acts as a switch to toggle the use of FrankerFaceZ badges. This option includes the FrankerFaceZ supporter badge, in addition to replacement moderator and bot badges.
Enable Twitch Emotes | This option acts to toggle the use of Twitch emotes. A few of the Twitch emotes that are of poor quality will be modified to remove non-transparent backgrounds algorithmically.
Cache Global Twitch Emotes | Clicking this button will cache the global Twitch emotes. This caching downloads the actual emote images into memory so there is no delay in displaying them in the chat.
Enable FrankerFaceZ Emotes | This option acts to toggle the use of FrankerFaceZ emotes. Even if the channel being connected to does not have FrankerFaceZ emotes, the global emotes will be available in the chat, and the replacements for the few Twitch emotes of poor quality will also be used.
Cache FrankerFaceZ Emotes | Clicking this button will cache all global and channel-based FrankerFaceZ emotes. This caching downloads the actual emote images into memory so there is no delay in displaying them in the chat.
Enable BetterTTV Emotes | This option acts to toggle the use of BetterTTV emotes. Even if the channel being connected to does not have BetterTTV emotes, the global emotes will be available in the chat. Animated GIF emotes will display only the initial frame of the animation.
Cache BetterTTV Emotes | Clicking this button will cache all global and channel-based BetterTTV emotes. This caching downloads the actual emote images into memory so there is no delay in displaying them in the chat.
Emoji and Badge Scale | This slider value is the percent of the to scale the emoji or badge images by. The scale value is multiplied by the actual size of the emoji or badge image, unless the Scale to Line Height option is checked, in which case the emoji or badges will be scaled to the line height multiplied by whatever percent the scale slider is at.
Badge Height Offset | This slider value represents the number of pixels to offset the height of badges. This value, in conjunction with the Font Baseline Height is used to calculate where to center the badge on the line.
Relative to Line Height (For emoji and badges respectively) | Checking this option will cause emoji or badges to be scaled relative to the height of a line, rather than the height of the actual emoji. The scaling will maintain the width to height aspect ratio of the image, so no stretch distortion will occur.
Emoji Loading Display Strategy | This identifies the method for displaying emoji that haven't yet been or are unable to be loaded from the specified emoji URL.
Emoji and Badge Loading, Caching and Logging | The bottom part of the Emoji tab contains a log of what emoji have been loaded and or cached, and whether any errors were encountered during the process. The progress bar at the very bottom of the tab documents any work currently being done to load or cache emoji or badges. The job of loading and caching emoji and badges will commence automatically whenever the program makes a connection. Alternately, if emoji are enabled after a connection is established, the loading will occur then. If emoji options are unchecked while loading is happening, the specific jobs related to the options that were unchecked will be canceled and removed from the queue.
Manual Emoji and Badge Buttons | The Cancel, Load/Cache, and Reset buttons on the bottom right of the Emoji tab are for manually managing emoji and badge jobs. The Cancel button will cancel any currently running loading or caching job. The Load/Cache button will load and or cache any required emoji or badges based on the configuration of the tab. The Reset button will remove all record the program has of what is loaded. The emoji and badges will remain loaded in memory as they were, but this reset will re-enable their manual reloading or re-caching.