From 8fc4df78c18eec465d3b2c0594a8d2f4da8a5fff Mon Sep 17 00:00:00 2001 From: francisli Date: Thu, 24 Mar 2005 23:36:33 +0000 Subject: [PATCH] HSB/RGB fixes --- mobile/core/processing/core/PCanvas.java | 85 +++++++++++++----------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/mobile/core/processing/core/PCanvas.java b/mobile/core/processing/core/PCanvas.java index 193cc7632..990551ed3 100755 --- a/mobile/core/processing/core/PCanvas.java +++ b/mobile/core/processing/core/PCanvas.java @@ -678,46 +678,53 @@ public class PCanvas extends Canvas { value3 = value3 * 255 / colorMaxZ; } else { //// convert from HSB to RGB - int y = (value2 << PMIDlet.FP_PRECISION) / colorMaxY; - int z = (value3 << PMIDlet.FP_PRECISION) / colorMaxZ; + if (value2 == 0) { + //// gray + value1 = value3 * 255 / colorMaxZ; + value2 = value3 * 255 / colorMaxZ; + value3 = value3 * 255 / colorMaxZ; + } else { + int y = (value2 << PMIDlet.FP_PRECISION) / colorMaxY; + int z = (value3 << PMIDlet.FP_PRECISION) / colorMaxZ; - int h = value1 * 6 / colorMaxX % 6; - - int f = (value1 << PMIDlet.FP_PRECISION) * 6 / colorMaxX - (h << PMIDlet.FP_PRECISION); - int p = midlet.mul(z, PMIDlet.ONE - y); - int q = midlet.mul(z, PMIDlet.ONE - midlet.mul(y, f)); - int t = midlet.mul(z, PMIDlet.ONE - midlet.mul(y, PMIDlet.ONE - f)); - switch (h) { - case 0: - value1 = (z * 255) >> PMIDlet.FP_PRECISION; - value2 = (t * 255) >> PMIDlet.FP_PRECISION; - value3 = (p * 255) >> PMIDlet.FP_PRECISION; - break; - case 1: - value1 = (q * 255) >> PMIDlet.FP_PRECISION; - value2 = (z * 255) >> PMIDlet.FP_PRECISION; - value3 = (p * 255) >> PMIDlet.FP_PRECISION; - break; - case 2: - value1 = (p * 255) >> PMIDlet.FP_PRECISION; - value2 = (z * 255) >> PMIDlet.FP_PRECISION; - value3 = (t * 255) >> PMIDlet.FP_PRECISION; - break; - case 3: - value1 = (p * 255) >> PMIDlet.FP_PRECISION; - value2 = (q * 255) >> PMIDlet.FP_PRECISION; - value3 = (z * 255) >> PMIDlet.FP_PRECISION; - break; - case 4: - value1 = (t * 255) >> PMIDlet.FP_PRECISION; - value2 = (p * 255) >> PMIDlet.FP_PRECISION; - value3 = (z * 255) >> PMIDlet.FP_PRECISION; - break; - case 5: - value1 = (z * 255) >> PMIDlet.FP_PRECISION; - value2 = (p * 255) >> PMIDlet.FP_PRECISION; - value3 = (q * 255) >> PMIDlet.FP_PRECISION; - break; + int h = value1 * 6 / colorMaxX % 6; + + int f = (value1 << PMIDlet.FP_PRECISION) * 6 / colorMaxX - (h << PMIDlet.FP_PRECISION); + int p = midlet.mul(z, PMIDlet.ONE - y); + int q = midlet.mul(z, PMIDlet.ONE - midlet.mul(y, f)); + int t = midlet.mul(z, PMIDlet.ONE - midlet.mul(y, PMIDlet.ONE - f)); + switch (h) { + case 0: + value1 = (z * 255) >> PMIDlet.FP_PRECISION; + value2 = (t * 255) >> PMIDlet.FP_PRECISION; + value3 = (p * 255) >> PMIDlet.FP_PRECISION; + break; + case 1: + value1 = (q * 255) >> PMIDlet.FP_PRECISION; + value2 = (z * 255) >> PMIDlet.FP_PRECISION; + value3 = (p * 255) >> PMIDlet.FP_PRECISION; + break; + case 2: + value1 = (p * 255) >> PMIDlet.FP_PRECISION; + value2 = (z * 255) >> PMIDlet.FP_PRECISION; + value3 = (t * 255) >> PMIDlet.FP_PRECISION; + break; + case 3: + value1 = (p * 255) >> PMIDlet.FP_PRECISION; + value2 = (q * 255) >> PMIDlet.FP_PRECISION; + value3 = (z * 255) >> PMIDlet.FP_PRECISION; + break; + case 4: + value1 = (t * 255) >> PMIDlet.FP_PRECISION; + value2 = (p * 255) >> PMIDlet.FP_PRECISION; + value3 = (z * 255) >> PMIDlet.FP_PRECISION; + break; + case 5: + value1 = (z * 255) >> PMIDlet.FP_PRECISION; + value2 = (p * 255) >> PMIDlet.FP_PRECISION; + value3 = (q * 255) >> PMIDlet.FP_PRECISION; + break; + } } } }