Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GIMP Plugin for Android

When developing for Android, many resolutions may be needed (or required) to take advantage of the screen of the device on which the application is running.

The GIMP plugin for Android helps with standard and 9-patch pixel density resolution independence by handling scaling issues sufficiently for most application purposes.

Annotation of 9-Patch Images

9-patch is an ingenious means of marking elastic and content zones of a normal PNG using a 1-pixel wide transparent border. Unfortunately, this border may only be 1 pixel wide regardless of the size of the image, and therefore cannot be included in an image before scaling.

The GIMP plugin allows annotation of a GIMP-native RGBA image using two layers for the elastic and content regions. The layers must be created by using the Prepare 9-patch menu option from this plugin. They are fully transparent, semi-opaque layers into which the content and elastic regions sholud be defined by non-transparent rectangles on their respective layers.

The rectangles will properly scale with the image, allowing a single source image to be used to make fully-compliant 9-patch images in several resolutions.

Elastic layer

In the normal 9-patch, the elastic region of an image is defined by the non-transparent stripes on the left and top border of the image. When the image is used in resources, the elastic region will be allowed to stretch to make the image fit any area larger than its original self.

The layer created by Prepare 9-patch is called 9-elastic. Fill a non-transparent rectangle somewhere over the image (in the 9-elastic layer). The horizontal and vertical elastic regions are defined by this rectangle.

Content layer

In the normal 9-patch, the content region of an image is defined by the intersection of stripes extending from the non-transparent pixels on the bottom and right borders of the image. When the image is used as a background drawable, the padding of the contents is adjusted to ensure that the non-content area of the image is visible outside the content of the View for which the image is the background.

The layer created by this plugin's Prepare 9-patch is called 9-content. Fill a non-transparent rectangle in this layer that overlays the desired content area of the image.

Resolution independence

This plugin uses the X and Y resolution -- not pixel density, rather the second set of numbers in the "Scale Image" dialog -- to determine how to scale the image into the density-specific project folders:

  • drawable-mdpi at a resolution of 160
  • drawable-hdpi at a resolution of 240
  • drawable-xhdpi at a resolution of 320

I recommend using a resolution of 960 for all images. 960 is the least common multiple of all three resolutions, and therefore scales without needing antialiasing of any kind.

Menu items added

All menu items presented by this plugin are under the /Image/Android menu.

  • Prepare 9-patch

    Prepares an image for 9-patch (resolution independent) annotation by adding the content and elastic layers.

  • Render 9-patch

    Render an 9-patch (resolution independent) annotated image directly to a 9-patch, without further scaling. This will add the 1-pixel border, draw the non-transparent strips along this border representing the opaque area of the elastic and content layers, and finally hide the annotation layers themselves.

  • Save to project

    Prompts for a project to which to save the images; uses the basename of the current image's filename, scales and saves PNG each of the res/drawable-*/$basename.png. If the image has 9-patch annotation layers, then it is instead saved to res/drawable-*/$basename.9.png after the 9-patch has been rendered at each resolution.

About

GIMP plugin for Android density and 9-patch independence.

Resources

Stars

19 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GIMP Plugin for Android

When developing for Android, many resolutions may be needed (or required) to take advantage of the screen of the device on which the application is running.

The GIMP plugin for Android helps with standard and 9-patch pixel density resolution independence by handling scaling issues sufficiently for most application purposes.

Annotation of 9-Patch Images

9-patch is an ingenious means of marking elastic and content zones of a normal PNG using a 1-pixel wide transparent border. Unfortunately, this border may only be 1 pixel wide regardless of the size of the image, and therefore cannot be included in an image before scaling.

The GIMP plugin allows annotation of a GIMP-native RGBA image using two layers for the elastic and content regions. The layers must be created by using the Prepare 9-patch menu option from this plugin. They are fully transparent, semi-opaque layers into which the content and elastic regions sholud be defined by non-transparent rectangles on their respective layers.

The rectangles will properly scale with the image, allowing a single source image to be used to make fully-compliant 9-patch images in several resolutions.

Elastic layer

In the normal 9-patch, the elastic region of an image is defined by the non-transparent stripes on the left and top border of the image. When the image is used in resources, the elastic region will be allowed to stretch to make the image fit any area larger than its original self.

The layer created by Prepare 9-patch is called 9-elastic. Fill a non-transparent rectangle somewhere over the image (in the 9-elastic layer). The horizontal and vertical elastic regions are defined by this rectangle.

Content layer

In the normal 9-patch, the content region of an image is defined by the intersection of stripes extending from the non-transparent pixels on the bottom and right borders of the image. When the image is used as a background drawable, the padding of the contents is adjusted to ensure that the non-content area of the image is visible outside the content of the View for which the image is the background.

The layer created by this plugin's Prepare 9-patch is called 9-content. Fill a non-transparent rectangle in this layer that overlays the desired content area of the image.

Resolution independence

This plugin uses the X and Y resolution -- not pixel density, rather the second set of numbers in the "Scale Image" dialog -- to determine how to scale the image into the density-specific project folders:

  • drawable-mdpi at a resolution of 160
  • drawable-hdpi at a resolution of 240
  • drawable-xhdpi at a resolution of 320

I recommend using a resolution of 960 for all images. 960 is the least common multiple of all three resolutions, and therefore scales without needing antialiasing of any kind.

Menu items added

All menu items presented by this plugin are under the /Image/Android menu.

  • Prepare 9-patch

    Prepares an image for 9-patch (resolution independent) annotation by adding the content and elastic layers.

  • Render 9-patch

    Render an 9-patch (resolution independent) annotated image directly to a 9-patch, without further scaling. This will add the 1-pixel border, draw the non-transparent strips along this border representing the opaque area of the elastic and content layers, and finally hide the annotation layers themselves.

  • Save to project

    Prompts for a project to which to save the images; uses the basename of the current image's filename, scales and saves PNG each of the res/drawable-*/$basename.png. If the image has 9-patch annotation layers, then it is instead saved to res/drawable-*/$basename.9.png after the 9-patch has been rendered at each resolution.

About

GIMP plugin for Android density and 9-patch independence.

Resources

Stars

19 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GIMP Plugin for Android

When developing for Android, many resolutions may be needed (or required) to take advantage of the screen of the device on which the application is running.

The GIMP plugin for Android helps with standard and 9-patch pixel density resolution independence by handling scaling issues sufficiently for most application purposes.

Annotation of 9-Patch Images

9-patch is an ingenious means of marking elastic and content zones of a normal PNG using a 1-pixel wide transparent border. Unfortunately, this border may only be 1 pixel wide regardless of the size of the image, and therefore cannot be included in an image before scaling.

The GIMP plugin allows annotation of a GIMP-native RGBA image using two layers for the elastic and content regions. The layers must be created by using the Prepare 9-patch menu option from this plugin. They are fully transparent, semi-opaque layers into which the content and elastic regions sholud be defined by non-transparent rectangles on their respective layers.

The rectangles will properly scale with the image, allowing a single source image to be used to make fully-compliant 9-patch images in several resolutions.

Elastic layer

In the normal 9-patch, the elastic region of an image is defined by the non-transparent stripes on the left and top border of the image. When the image is used in resources, the elastic region will be allowed to stretch to make the image fit any area larger than its original self.

The layer created by Prepare 9-patch is called 9-elastic. Fill a non-transparent rectangle somewhere over the image (in the 9-elastic layer). The horizontal and vertical elastic regions are defined by this rectangle.

Content layer

In the normal 9-patch, the content region of an image is defined by the intersection of stripes extending from the non-transparent pixels on the bottom and right borders of the image. When the image is used as a background drawable, the padding of the contents is adjusted to ensure that the non-content area of the image is visible outside the content of the View for which the image is the background.

The layer created by this plugin's Prepare 9-patch is called 9-content. Fill a non-transparent rectangle in this layer that overlays the desired content area of the image.

Resolution independence

This plugin uses the X and Y resolution -- not pixel density, rather the second set of numbers in the "Scale Image" dialog -- to determine how to scale the image into the density-specific project folders:

  • drawable-mdpi at a resolution of 160
  • drawable-hdpi at a resolution of 240
  • drawable-xhdpi at a resolution of 320

I recommend using a resolution of 960 for all images. 960 is the least common multiple of all three resolutions, and therefore scales without needing antialiasing of any kind.

Menu items added

All menu items presented by this plugin are under the /Image/Android menu.

  • Prepare 9-patch

    Prepares an image for 9-patch (resolution independent) annotation by adding the content and elastic layers.

  • Render 9-patch

    Render an 9-patch (resolution independent) annotated image directly to a 9-patch, without further scaling. This will add the 1-pixel border, draw the non-transparent strips along this border representing the opaque area of the elastic and content layers, and finally hide the annotation layers themselves.

  • Save to project

    Prompts for a project to which to save the images; uses the basename of the current image's filename, scales and saves PNG each of the res/drawable-*/$basename.png. If the image has 9-patch annotation layers, then it is instead saved to res/drawable-*/$basename.9.png after the 9-patch has been rendered at each resolution.

About

GIMP plugin for Android density and 9-patch independence.

Resources

Stars

19 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GIMP Plugin for Android

When developing for Android, many resolutions may be needed (or required) to take advantage of the screen of the device on which the application is running.

The GIMP plugin for Android helps with standard and 9-patch pixel density resolution independence by handling scaling issues sufficiently for most application purposes.

Annotation of 9-Patch Images

9-patch is an ingenious means of marking elastic and content zones of a normal PNG using a 1-pixel wide transparent border. Unfortunately, this border may only be 1 pixel wide regardless of the size of the image, and therefore cannot be included in an image before scaling.

The GIMP plugin allows annotation of a GIMP-native RGBA image using two layers for the elastic and content regions. The layers must be created by using the Prepare 9-patch menu option from this plugin. They are fully transparent, semi-opaque layers into which the content and elastic regions sholud be defined by non-transparent rectangles on their respective layers.

The rectangles will properly scale with the image, allowing a single source image to be used to make fully-compliant 9-patch images in several resolutions.

Elastic layer

In the normal 9-patch, the elastic region of an image is defined by the non-transparent stripes on the left and top border of the image. When the image is used in resources, the elastic region will be allowed to stretch to make the image fit any area larger than its original self.

The layer created by Prepare 9-patch is called 9-elastic. Fill a non-transparent rectangle somewhere over the image (in the 9-elastic layer). The horizontal and vertical elastic regions are defined by this rectangle.

Content layer

In the normal 9-patch, the content region of an image is defined by the intersection of stripes extending from the non-transparent pixels on the bottom and right borders of the image. When the image is used as a background drawable, the padding of the contents is adjusted to ensure that the non-content area of the image is visible outside the content of the View for which the image is the background.

The layer created by this plugin's Prepare 9-patch is called 9-content. Fill a non-transparent rectangle in this layer that overlays the desired content area of the image.

Resolution independence

This plugin uses the X and Y resolution -- not pixel density, rather the second set of numbers in the "Scale Image" dialog -- to determine how to scale the image into the density-specific project folders:

  • drawable-mdpi at a resolution of 160
  • drawable-hdpi at a resolution of 240
  • drawable-xhdpi at a resolution of 320

I recommend using a resolution of 960 for all images. 960 is the least common multiple of all three resolutions, and therefore scales without needing antialiasing of any kind.

Menu items added

All menu items presented by this plugin are under the /Image/Android menu.

  • Prepare 9-patch

    Prepares an image for 9-patch (resolution independent) annotation by adding the content and elastic layers.

  • Render 9-patch

    Render an 9-patch (resolution independent) annotated image directly to a 9-patch, without further scaling. This will add the 1-pixel border, draw the non-transparent strips along this border representing the opaque area of the elastic and content layers, and finally hide the annotation layers themselves.

  • Save to project

    Prompts for a project to which to save the images; uses the basename of the current image's filename, scales and saves PNG each of the res/drawable-*/$basename.png. If the image has 9-patch annotation layers, then it is instead saved to res/drawable-*/$basename.9.png after the 9-patch has been rendered at each resolution.

About

GIMP plugin for Android density and 9-patch independence.

Resources

Stars

19 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GIMP Plugin for Android

When developing for Android, many resolutions may be needed (or required) to take advantage of the screen of the device on which the application is running.

The GIMP plugin for Android helps with standard and 9-patch pixel density resolution independence by handling scaling issues sufficiently for most application purposes.

Annotation of 9-Patch Images

9-patch is an ingenious means of marking elastic and content zones of a normal PNG using a 1-pixel wide transparent border. Unfortunately, this border may only be 1 pixel wide regardless of the size of the image, and therefore cannot be included in an image before scaling.

The GIMP plugin allows annotation of a GIMP-native RGBA image using two layers for the elastic and content regions. The layers must be created by using the Prepare 9-patch menu option from this plugin. They are fully transparent, semi-opaque layers into which the content and elastic regions sholud be defined by non-transparent rectangles on their respective layers.

The rectangles will properly scale with the image, allowing a single source image to be used to make fully-compliant 9-patch images in several resolutions.

Elastic layer

In the normal 9-patch, the elastic region of an image is defined by the non-transparent stripes on the left and top border of the image. When the image is used in resources, the elastic region will be allowed to stretch to make the image fit any area larger than its original self.

The layer created by Prepare 9-patch is called 9-elastic. Fill a non-transparent rectangle somewhere over the image (in the 9-elastic layer). The horizontal and vertical elastic regions are defined by this rectangle.

Content layer

In the normal 9-patch, the content region of an image is defined by the intersection of stripes extending from the non-transparent pixels on the bottom and right borders of the image. When the image is used as a background drawable, the padding of the contents is adjusted to ensure that the non-content area of the image is visible outside the content of the View for which the image is the background.

The layer created by this plugin's Prepare 9-patch is called 9-content. Fill a non-transparent rectangle in this layer that overlays the desired content area of the image.

Resolution independence

This plugin uses the X and Y resolution -- not pixel density, rather the second set of numbers in the "Scale Image" dialog -- to determine how to scale the image into the density-specific project folders:

  • drawable-mdpi at a resolution of 160
  • drawable-hdpi at a resolution of 240
  • drawable-xhdpi at a resolution of 320

I recommend using a resolution of 960 for all images. 960 is the least common multiple of all three resolutions, and therefore scales without needing antialiasing of any kind.

Menu items added

All menu items presented by this plugin are under the /Image/Android menu.

  • Prepare 9-patch

    Prepares an image for 9-patch (resolution independent) annotation by adding the content and elastic layers.

  • Render 9-patch

    Render an 9-patch (resolution independent) annotated image directly to a 9-patch, without further scaling. This will add the 1-pixel border, draw the non-transparent strips along this border representing the opaque area of the elastic and content layers, and finally hide the annotation layers themselves.

  • Save to project

    Prompts for a project to which to save the images; uses the basename of the current image's filename, scales and saves PNG each of the res/drawable-*/$basename.png. If the image has 9-patch annotation layers, then it is instead saved to res/drawable-*/$basename.9.png after the 9-patch has been rendered at each resolution.

About

GIMP plugin for Android density and 9-patch independence.

Resources

Stars

19 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GIMP Plugin for Android

When developing for Android, many resolutions may be needed (or required) to take advantage of the screen of the device on which the application is running.

The GIMP plugin for Android helps with standard and 9-patch pixel density resolution independence by handling scaling issues sufficiently for most application purposes.

Annotation of 9-Patch Images

9-patch is an ingenious means of marking elastic and content zones of a normal PNG using a 1-pixel wide transparent border. Unfortunately, this border may only be 1 pixel wide regardless of the size of the image, and therefore cannot be included in an image before scaling.

The GIMP plugin allows annotation of a GIMP-native RGBA image using two layers for the elastic and content regions. The layers must be created by using the Prepare 9-patch menu option from this plugin. They are fully transparent, semi-opaque layers into which the content and elastic regions sholud be defined by non-transparent rectangles on their respective layers.

The rectangles will properly scale with the image, allowing a single source image to be used to make fully-compliant 9-patch images in several resolutions.

Elastic layer

In the normal 9-patch, the elastic region of an image is defined by the non-transparent stripes on the left and top border of the image. When the image is used in resources, the elastic region will be allowed to stretch to make the image fit any area larger than its original self.

The layer created by Prepare 9-patch is called 9-elastic. Fill a non-transparent rectangle somewhere over the image (in the 9-elastic layer). The horizontal and vertical elastic regions are defined by this rectangle.

Content layer

In the normal 9-patch, the content region of an image is defined by the intersection of stripes extending from the non-transparent pixels on the bottom and right borders of the image. When the image is used as a background drawable, the padding of the contents is adjusted to ensure that the non-content area of the image is visible outside the content of the View for which the image is the background.

The layer created by this plugin's Prepare 9-patch is called 9-content. Fill a non-transparent rectangle in this layer that overlays the desired content area of the image.

Resolution independence

This plugin uses the X and Y resolution -- not pixel density, rather the second set of numbers in the "Scale Image" dialog -- to determine how to scale the image into the density-specific project folders:

  • drawable-mdpi at a resolution of 160
  • drawable-hdpi at a resolution of 240
  • drawable-xhdpi at a resolution of 320

I recommend using a resolution of 960 for all images. 960 is the least common multiple of all three resolutions, and therefore scales without needing antialiasing of any kind.

Menu items added

All menu items presented by this plugin are under the /Image/Android menu.

  • Prepare 9-patch

    Prepares an image for 9-patch (resolution independent) annotation by adding the content and elastic layers.

  • Render 9-patch

    Render an 9-patch (resolution independent) annotated image directly to a 9-patch, without further scaling. This will add the 1-pixel border, draw the non-transparent strips along this border representing the opaque area of the elastic and content layers, and finally hide the annotation layers themselves.

  • Save to project

    Prompts for a project to which to save the images; uses the basename of the current image's filename, scales and saves PNG each of the res/drawable-*/$basename.png. If the image has 9-patch annotation layers, then it is instead saved to res/drawable-*/$basename.9.png after the 9-patch has been rendered at each resolution.

About

GIMP plugin for Android density and 9-patch independence.

Resources

Stars

19 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GIMP Plugin for Android

When developing for Android, many resolutions may be needed (or required) to take advantage of the screen of the device on which the application is running.

The GIMP plugin for Android helps with standard and 9-patch pixel density resolution independence by handling scaling issues sufficiently for most application purposes.

Annotation of 9-Patch Images

9-patch is an ingenious means of marking elastic and content zones of a normal PNG using a 1-pixel wide transparent border. Unfortunately, this border may only be 1 pixel wide regardless of the size of the image, and therefore cannot be included in an image before scaling.

The GIMP plugin allows annotation of a GIMP-native RGBA image using two layers for the elastic and content regions. The layers must be created by using the Prepare 9-patch menu option from this plugin. They are fully transparent, semi-opaque layers into which the content and elastic regions sholud be defined by non-transparent rectangles on their respective layers.

The rectangles will properly scale with the image, allowing a single source image to be used to make fully-compliant 9-patch images in several resolutions.

Elastic layer

In the normal 9-patch, the elastic region of an image is defined by the non-transparent stripes on the left and top border of the image. When the image is used in resources, the elastic region will be allowed to stretch to make the image fit any area larger than its original self.

The layer created by Prepare 9-patch is called 9-elastic. Fill a non-transparent rectangle somewhere over the image (in the 9-elastic layer). The horizontal and vertical elastic regions are defined by this rectangle.

Content layer

In the normal 9-patch, the content region of an image is defined by the intersection of stripes extending from the non-transparent pixels on the bottom and right borders of the image. When the image is used as a background drawable, the padding of the contents is adjusted to ensure that the non-content area of the image is visible outside the content of the View for which the image is the background.

The layer created by this plugin's Prepare 9-patch is called 9-content. Fill a non-transparent rectangle in this layer that overlays the desired content area of the image.

Resolution independence

This plugin uses the X and Y resolution -- not pixel density, rather the second set of numbers in the "Scale Image" dialog -- to determine how to scale the image into the density-specific project folders:

  • drawable-mdpi at a resolution of 160
  • drawable-hdpi at a resolution of 240
  • drawable-xhdpi at a resolution of 320

I recommend using a resolution of 960 for all images. 960 is the least common multiple of all three resolutions, and therefore scales without needing antialiasing of any kind.

Menu items added

All menu items presented by this plugin are under the /Image/Android menu.

  • Prepare 9-patch

    Prepares an image for 9-patch (resolution independent) annotation by adding the content and elastic layers.

  • Render 9-patch

    Render an 9-patch (resolution independent) annotated image directly to a 9-patch, without further scaling. This will add the 1-pixel border, draw the non-transparent strips along this border representing the opaque area of the elastic and content layers, and finally hide the annotation layers themselves.

  • Save to project

    Prompts for a project to which to save the images; uses the basename of the current image's filename, scales and saves PNG each of the res/drawable-*/$basename.png. If the image has 9-patch annotation layers, then it is instead saved to res/drawable-*/$basename.9.png after the 9-patch has been rendered at each resolution.

About

GIMP plugin for Android density and 9-patch independence.

Resources

Stars

19 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GIMP Plugin for Android

When developing for Android, many resolutions may be needed (or required) to take advantage of the screen of the device on which the application is running.

The GIMP plugin for Android helps with standard and 9-patch pixel density resolution independence by handling scaling issues sufficiently for most application purposes.

Annotation of 9-Patch Images

9-patch is an ingenious means of marking elastic and content zones of a normal PNG using a 1-pixel wide transparent border. Unfortunately, this border may only be 1 pixel wide regardless of the size of the image, and therefore cannot be included in an image before scaling.

The GIMP plugin allows annotation of a GIMP-native RGBA image using two layers for the elastic and content regions. The layers must be created by using the Prepare 9-patch menu option from this plugin. They are fully transparent, semi-opaque layers into which the content and elastic regions sholud be defined by non-transparent rectangles on their respective layers.

The rectangles will properly scale with the image, allowing a single source image to be used to make fully-compliant 9-patch images in several resolutions.

Elastic layer

In the normal 9-patch, the elastic region of an image is defined by the non-transparent stripes on the left and top border of the image. When the image is used in resources, the elastic region will be allowed to stretch to make the image fit any area larger than its original self.

The layer created by Prepare 9-patch is called 9-elastic. Fill a non-transparent rectangle somewhere over the image (in the 9-elastic layer). The horizontal and vertical elastic regions are defined by this rectangle.

Content layer

In the normal 9-patch, the content region of an image is defined by the intersection of stripes extending from the non-transparent pixels on the bottom and right borders of the image. When the image is used as a background drawable, the padding of the contents is adjusted to ensure that the non-content area of the image is visible outside the content of the View for which the image is the background.

The layer created by this plugin's Prepare 9-patch is called 9-content. Fill a non-transparent rectangle in this layer that overlays the desired content area of the image.

Resolution independence

This plugin uses the X and Y resolution -- not pixel density, rather the second set of numbers in the "Scale Image" dialog -- to determine how to scale the image into the density-specific project folders:

  • drawable-mdpi at a resolution of 160
  • drawable-hdpi at a resolution of 240
  • drawable-xhdpi at a resolution of 320

I recommend using a resolution of 960 for all images. 960 is the least common multiple of all three resolutions, and therefore scales without needing antialiasing of any kind.

Menu items added

All menu items presented by this plugin are under the /Image/Android menu.

  • Prepare 9-patch

    Prepares an image for 9-patch (resolution independent) annotation by adding the content and elastic layers.

  • Render 9-patch

    Render an 9-patch (resolution independent) annotated image directly to a 9-patch, without further scaling. This will add the 1-pixel border, draw the non-transparent strips along this border representing the opaque area of the elastic and content layers, and finally hide the annotation layers themselves.

  • Save to project

    Prompts for a project to which to save the images; uses the basename of the current image's filename, scales and saves PNG each of the res/drawable-*/$basename.png. If the image has 9-patch annotation layers, then it is instead saved to res/drawable-*/$basename.9.png after the 9-patch has been rendered at each resolution.

About

GIMP plugin for Android density and 9-patch independence.

Resources

Stars

19 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages