summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java
diff options
context:
space:
mode:
authorSimon Rettberg2015-08-26 15:51:31 +0200
committerSimon Rettberg2015-08-26 15:51:31 +0200
commit025699e6fe0abf7266704696231d2e841694d60b (patch)
treef6e183a1af4b7f54f6233be957b4c5ee90a6061b /dozentenmodul/src/main/java
parent[client] LectureImageList Page for Wizard (diff)
downloadtutor-module-025699e6fe0abf7266704696231d2e841694d60b.tar.gz
tutor-module-025699e6fe0abf7266704696231d2e841694d60b.tar.xz
tutor-module-025699e6fe0abf7266704696231d2e841694d60b.zip
[client] Simplify ListTable interfaces, add util class for color handling
Diffstat (limited to 'dozentenmodul/src/main/java')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/PersonLabel.java25
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImagePermissionTable.java11
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageTable.java52
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageVersionTable.java25
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LecturePermissionTable.java3
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LectureTable.java98
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ListTable.java74
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/UserTable.java3
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/ColorUtil.java59
9 files changed, 209 insertions, 141 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/PersonLabel.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/PersonLabel.java
index 8299cb35..d4422ca8 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/PersonLabel.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/PersonLabel.java
@@ -10,6 +10,7 @@ import javax.swing.JLabel;
import javax.swing.UIManager;
import org.openslx.bwlp.thrift.iface.UserInfo;
+import org.openslx.dozmod.gui.helper.ColorUtil;
import org.openslx.dozmod.util.FormatHelper;
import org.openslx.dozmod.util.OpenLinks;
@@ -24,6 +25,9 @@ public class PersonLabel extends JLabel {
private PersonLabelClickEvent callback = defaultCallback;
+ private static final Color linkColor = ColorUtil.add(UIManager.getColor("Label.foreground"), new Color(0,
+ 0, .75f), .5f);
+
public PersonLabel() {
this(defaultCallback);
}
@@ -43,25 +47,6 @@ public class PersonLabel extends JLabel {
});
}
- private Color linkColor() {
- // Create color for links
- Color tc = UIManager.getColor("Label.foreground");
- int r = tc.getRed() * tc.getRed();
- int g = tc.getGreen() * tc.getGreen();
- int b = tc.getBlue() * tc.getBlue();
- b += 30000;
- double factor = 65025 / b;
- if (factor < 1) {
- r = (int)((double)r * factor);
- g = (int)((double)g * factor);
- b = (int)((double)b * factor);
- }
- r = (int) Math.sqrt(r);
- g = (int) Math.sqrt(g);
- b = (int) Math.sqrt(b);
- return new Color(r, g, b);
- }
-
/**
* Set the callback to call when the user clicks this label using the left
* mouse button. Only called if a user is set.
@@ -91,7 +76,7 @@ public class PersonLabel extends JLabel {
} else {
setToolTipText("Klicken, um eine Mail an diese Person zu senden");
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
- setForeground(linkColor());
+ setForeground(linkColor);
}
}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImagePermissionTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImagePermissionTable.java
index 75347950..869e0f1a 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImagePermissionTable.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImagePermissionTable.java
@@ -13,15 +13,15 @@ public class ImagePermissionTable extends ListTable<UserImagePermissions> {
private static String[] columnNames = { "Benutzer", "Link", "Download", "Bearbeiten", "Admin" };
- private static Class<?>[] columnClasses = { String.class, Boolean.class, Boolean.class, Boolean.class, Boolean.class };
+ private static Class<?>[] columnClasses = { String.class, Boolean.class, Boolean.class, Boolean.class,
+ Boolean.class };
public ImagePermissionTable() {
super(columnNames, columnClasses);
}
@Override
- protected Object getValueAtInternal(int rowIndex, int columnIndex) {
- UserImagePermissions row = getModelRow(rowIndex);
+ protected Object getValueAtInternal(UserImagePermissions row, int columnIndex) {
if (columnIndex == 0)
return FormatHelper.userName(UserCache.find(row.userId));
if (columnIndex == 1)
@@ -34,15 +34,18 @@ public class ImagePermissionTable extends ListTable<UserImagePermissions> {
return row.permissions.admin;
throw new IndexOutOfBoundsException();
}
+
@Override
public boolean isCellEditable(int row, int col) {
// TODO actual permission checks
return col != 0;
}
+
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
// aValue must be boolean
- if (!(aValue instanceof Boolean)) return;
+ if (!(aValue instanceof Boolean))
+ return;
// TODO convert index to model index
UserImagePermissions row = getViewRow(rowIndex);
if (columnIndex == 1)
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageTable.java
index f67fdb31..9db22ed0 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageTable.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageTable.java
@@ -1,10 +1,7 @@
package org.openslx.dozmod.gui.control.table;
-import java.awt.Component;
import java.util.Comparator;
-import javax.swing.JTable;
-
import org.openslx.bwlp.thrift.iface.ImageSummaryRead;
import org.openslx.dozmod.thrift.Sorters;
import org.openslx.dozmod.thrift.cache.MetaDataCache;
@@ -34,8 +31,6 @@ public class ImageTable extends ListTable<ImageSummaryRead> {
}
});
- this.setDefaultRenderer(Object.class, new ImageTableRenderer());
- // --------- set comparators for different columns ------------------------------
// first column doesn't have to be set, because standard comparator already compares strings
// second column, compares the OS
getRowSorter().setComparator(1, Sorters.osNameById);
@@ -44,13 +39,11 @@ public class ImageTable extends ListTable<ImageSummaryRead> {
// fourth and fifth column are both longs (last update and size), use default
// sixth column (version id) is string again, doesn't have to be set
// seventh column is boolean, use default
- // --------- end of comparators -------------------------------------------------
}
// return the right value of our image (row) depending on given column
@Override
- protected Object getValueAtInternal(int rowIndex, int columnIndex) {
- ImageSummaryRead row = getModelRow(rowIndex);
+ protected Object getValueAtInternal(ImageSummaryRead row, int columnIndex) {
if (columnIndex == 0)
return row.getImageName();
if (columnIndex == 1)
@@ -67,32 +60,25 @@ public class ImageTable extends ListTable<ImageSummaryRead> {
return row.isTemplate;
throw new IndexOutOfBoundsException();
}
-}
-/**
- * This renderer formats the given value to a readable string for the table
- * cell, depending on the column
- */
-@SuppressWarnings("serial")
-class ImageTableRenderer extends TableRenderer {
@Override
- public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
- boolean hasFocus, int row, int column) {
- if (value == null)
- value = "-";
- // column 0, 5 and 6 don't have to be changed ( already string/ checkbox)
- if (column == 1)
- value = FormatHelper.osName(MetaDataCache.getOsById((int) value));
- if (column == 2)
- value = FormatHelper.userName(UserCache.find((String) value));
- if (column == 3)
- value = FormatHelper.shortDate((long) value);
- if (column == 4)
- value = FormatHelper.bytes((long) value, false);
- if (column > 6 || column < 0)
+ public Object modelValueToDisplayFormat(Object value, int column) {
+ switch (column) {
+ case 0:
+ case 5:
+ case 6:
+ return value;
+ case 1:
+ return FormatHelper.osName(MetaDataCache.getOsById((int) value));
+ case 2:
+ return FormatHelper.userName(UserCache.find((String) value));
+ case 3:
+ return FormatHelper.shortDate((long) value);
+ case 4:
+ return FormatHelper.bytes((long) value, false);
+ default:
throw new IndexOutOfBoundsException();
-
- super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
- return this;
+ }
}
-} \ No newline at end of file
+
+}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageVersionTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageVersionTable.java
index a197c65c..2cc507c0 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageVersionTable.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ImageVersionTable.java
@@ -10,27 +10,28 @@ public class ImageVersionTable extends ListTable<ImageVersionDetails> {
private final static Logger LOGGER = Logger.getLogger(ImageVersionTable.class);
- private static String[] columnNames = { "Datum", "Uploader", "Valid", "Größe", "Id" };
+ private static String[] columnNames = { "Datum", "Uploader", "Valid", "Größe", "Id" };
- private static Class<?>[] columnClasses = { String.class, String.class, Boolean.class, String.class, String.class};
+ private static Class<?>[] columnClasses = { String.class, String.class, Boolean.class, String.class,
+ String.class };
public ImageVersionTable() {
super(columnNames, columnClasses);
}
@Override
- protected Object getValueAtInternal(int rowIndex, int columnIndex) {
- ImageVersionDetails row = getModelRow(rowIndex);
+ protected Object getValueAtInternal(ImageVersionDetails row, int columnIndex) {
if (columnIndex == 0)
return FormatHelper.longDate(row.getCreateTime());
if (columnIndex == 1)
- return FormatHelper.userName(UserCache.find(row.getUploaderId()));;
- if (columnIndex == 2)
- return row.isValid;
- if (columnIndex == 3)
- return FormatHelper.bytes(row.getFileSize(), false);
- if (columnIndex == 4)
- return row.getVersionId();
- throw new IndexOutOfBoundsException();
+ return FormatHelper.userName(UserCache.find(row.getUploaderId()));
+ ;
+ if (columnIndex == 2)
+ return row.isValid;
+ if (columnIndex == 3)
+ return FormatHelper.bytes(row.getFileSize(), false);
+ if (columnIndex == 4)
+ return row.getVersionId();
+ throw new IndexOutOfBoundsException();
}
}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LecturePermissionTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LecturePermissionTable.java
index b30783e8..fe3b800c 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LecturePermissionTable.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LecturePermissionTable.java
@@ -17,8 +17,7 @@ public class LecturePermissionTable extends ListTable<UserLecturePermissions> {
}
@Override
- protected Object getValueAtInternal(int rowIndex, int columnIndex) {
- UserLecturePermissions row = getModelRow(rowIndex);
+ protected Object getValueAtInternal(UserLecturePermissions row, int columnIndex) {
if (columnIndex == 0)
return FormatHelper.userName(UserCache.find(row.userId));
if (columnIndex == 1)
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LectureTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LectureTable.java
index a1147567..22771307 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LectureTable.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/LectureTable.java
@@ -1,11 +1,13 @@
package org.openslx.dozmod.gui.control.table;
+import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
-import javax.swing.JTable;
+import javax.swing.UIManager;
import org.openslx.bwlp.thrift.iface.LectureSummary;
+import org.openslx.dozmod.gui.helper.ColorUtil;
import org.openslx.dozmod.thrift.Session;
import org.openslx.dozmod.thrift.Sorters;
import org.openslx.dozmod.thrift.cache.UserCache;
@@ -18,21 +20,24 @@ public class LectureTable extends ListTable<LectureSummary> {
private static Class<?>[] columnClasses = { String.class, String.class, Long.class, Long.class,
Boolean.class, Boolean.class };
+ private final Font boldFont;
+
+ private final Color invalidColor;
+
public LectureTable() {
super(columnNames, columnClasses);
- this.setDefaultRenderer(Object.class, new LectureTableRenderer(this));
-
- // --------- set comparators for different columns ------------------------------
// first column doesn't have to be set, because standard comparator already compares strings
// second column compares the owner
getRowSorter().setComparator(1, Sorters.userNameById);
// third and fourth column are both longs (last update and size), use default comparator
- // --------- end of comparators -------------------------------------------------
+ boldFont = getFont().deriveFont(Font.BOLD);
+ Color fg = UIManager.getColor("Table.foreground");
+ Color bg = UIManager.getColor("Table.background");
+ invalidColor = ColorUtil.blend(fg, bg, .66f);
}
@Override
- protected Object getValueAtInternal(int rowIndex, int columnIndex) {
- LectureSummary row = getModelRow(rowIndex);
+ protected Object getValueAtInternal(LectureSummary row, int columnIndex) {
if (columnIndex == 0)
return row.getLectureName();
if (columnIndex == 1)
@@ -48,52 +53,45 @@ public class LectureTable extends ListTable<LectureSummary> {
throw new IndexOutOfBoundsException();
}
- /**
- * This renderer formats the given value to a readable string for the table
- * cell, depending on the column
- */
- private static class LectureTableRenderer extends TableRenderer {
-
- private final Font bold;
-
- private LectureTableRenderer(JTable table) {
- bold = table.getFont().deriveFont(Font.BOLD);
+ @Override
+ public void prepareRenderHook(Component component, LectureSummary row, int column, boolean isSelected) {
+ Color fgOverride = null;
+ if (Session.getUserId().equals(row.ownerId)) {
+ component.setFont(boldFont);
}
-
- @Override
- public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
- boolean hasFocus, int row, int column) {
- boolean setBold = false;
- switch (column) {
- case 0: // Image name
- case 4: // isEnabled
- case 5: // hasValidImage
- break;
- case 1: // Owner
- String ownerId = (String) value;
- value = FormatHelper.userName(UserCache.find(ownerId));
- if (Session.getUserId().equals(ownerId)) {
- setBold = true;
- }
- break;
- case 2: // Start time
- case 3: // End time
- long columnDate = (long) value;
- long now = System.currentTimeMillis() / 1000;
- value = FormatHelper.shortDate(columnDate);
- if ((column == 2 && columnDate > now) || (column == 3 && columnDate < now)) {
- setBold = true;
- }
- break;
- default:
- throw new IndexOutOfBoundsException();
+ long now = System.currentTimeMillis() / 1000;
+ boolean dateInvalid = ((column == 2 && row.startTime > now) || (column == 3 && row.endTime < now));
+ if (column == 2 || column == 3) {
+ if (dateInvalid) {
+ fgOverride = Color.RED;
}
- super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
-
- if (setBold) {
- setFont(bold);
+ }
+ if (fgOverride == null) {
+ if (dateInvalid || !row.isImageVersionUsable) {
+ component.setForeground(invalidColor);
+ } else {
+ component.setForeground(getForeground());
}
- return this;
+ } else {
+ component.setForeground(Color.RED);
}
}
+
+ @Override
+ public Object modelValueToDisplayFormat(Object value, int column) {
+ switch (column) {
+ case 0: // Image name
+ case 4: // isEnabled
+ case 5: // hasValidImage
+ return value;
+ case 1: // Owner
+ return FormatHelper.userName(UserCache.find((String) value));
+ case 2: // Start time
+ case 3: // End time
+ return FormatHelper.shortDate((long) value);
+ default:
+ throw new IndexOutOfBoundsException();
+ }
+ }
+
}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ListTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ListTable.java
index 741e2b77..bfd8879e 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ListTable.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/ListTable.java
@@ -11,6 +11,7 @@ import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableRowSorter;
import org.apache.log4j.Logger;
@@ -56,7 +57,7 @@ public abstract class ListTable<T> extends JTable {
this.createDefaultColumnsFromModel();
this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
this.getTableHeader().setReorderingAllowed(false);
- this.setDefaultRenderer(Object.class, new TableRenderer());
+ this.setDefaultRenderer(Object.class, new ListTableRenderer());
this.setDefaultRenderer(Boolean.class, getDefaultRenderer(Boolean.class));
this.setDefaultEditor(Boolean.class, getDefaultEditor(Boolean.class));
this.setRowSelectionAllowed(true);
@@ -64,7 +65,7 @@ public abstract class ListTable<T> extends JTable {
}
- protected abstract Object getValueAtInternal(int rowIndex, int columnIndex);
+ protected abstract Object getValueAtInternal(T item, int columnIndex);
public T getModelRow(int rowIndex) {
if (rowIndex < 0 || rowIndex >= model.getRowCount())
@@ -135,6 +136,40 @@ public abstract class ListTable<T> extends JTable {
}
/**
+ * Called when rendering a column is being prepared. This is a good time to
+ * change the color or font for the given cell.
+ *
+ * @param component The component representing the cell being rendered
+ * @param row item of the row being rendered
+ * @param column column index (model-based) of the cell being rendered
+ * @param isSelected whether the row is currently selected
+ */
+ public void prepareRenderHook(Component component, T row, int column, boolean isSelected) {
+ // Nothing by default
+ }
+
+ /**
+ * Called when the value of the given column needs to be transformed into a
+ * displayable item. By default this is the identity function, returning the
+ * value as-is.
+ *
+ * @param value Value to render
+ * @param column Column index (model-based) being rendered
+ * @return Rendered version of value. This should match the column class
+ */
+ public Object modelValueToDisplayFormat(Object value, int column) {
+ return value;
+ }
+
+ @Override
+ public final Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
+ Component c = super.prepareRenderer(renderer, row, column);
+ T item = getViewRow(row);
+ prepareRenderHook(c, item, convertColumnIndexToModel(column), isRowSelected(row));
+ return c;
+ }
+
+ /**
* Model for our table
*/
private class ListModel extends AbstractTableModel {
@@ -184,25 +219,28 @@ public abstract class ListTable<T> extends JTable {
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
- return getValueAtInternal(rowIndex, columnIndex);
+ T item = getModelRow(rowIndex);
+ int realColumn = convertColumnIndexToModel(columnIndex);
+ return getValueAtInternal(item, realColumn);
}
}
-}
-
-/**
- * This renderer simply removes the default dotted border when
- * a cell is selected
- *
- */
-@SuppressWarnings("serial")
-class TableRenderer extends DefaultTableCellRenderer {
- @Override
- public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
- boolean hasFocus, int row, int column) {
- super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
- setBorder(null);
- return this;
+ /**
+ * This renderer simply removes the default dotted border when
+ * a cell is selected
+ *
+ */
+ private class ListTableRenderer extends DefaultTableCellRenderer {
+ @Override
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
+ boolean hasFocus, int row, int column) {
+ super.getTableCellRendererComponent(table,
+ modelValueToDisplayFormat(value, convertColumnIndexToModel(column)), isSelected,
+ hasFocus, row, column);
+ setBorder(null);
+ return this;
+ }
}
+
}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/UserTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/UserTable.java
index 99eac35b..447444c2 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/UserTable.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/UserTable.java
@@ -13,8 +13,7 @@ public class UserTable extends ListTable<UserInfo> {
}
@Override
- protected Object getValueAtInternal(int rowIndex, int columnIndex) {
- UserInfo row = getModelRow(rowIndex);
+ protected Object getValueAtInternal(UserInfo row, int columnIndex) {
if (columnIndex == 0)
return FormatHelper.userName(row);
if (columnIndex == 1)
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/ColorUtil.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/ColorUtil.java
new file mode 100644
index 00000000..6b30a8cd
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/ColorUtil.java
@@ -0,0 +1,59 @@
+package org.openslx.dozmod.gui.helper;
+
+import java.awt.Color;
+
+public class ColorUtil {
+
+ private static float[] squared(Color color) {
+ float[] vals = color.getRGBComponents(null);
+ vals[0] *= vals[0];
+ vals[1] *= vals[1];
+ vals[2] *= vals[2];
+ return vals;
+ }
+
+ private static Color sqrt(float... floatVals) {
+ floatVals[0] = (float) Math.sqrt(floatVals[0]);
+ floatVals[1] = (float) Math.sqrt(floatVals[1]);
+ floatVals[2] = (float) Math.sqrt(floatVals[2]);
+ return new Color(floatVals[0], floatVals[1], floatVals[2]);
+ }
+
+ public static Color blendFast(Color color1, Color color2, float wc1) {
+ float[] c1 = color1.getColorComponents(null);
+ float[] c2 = color2.getColorComponents(null);
+ float wc2 = 1f - wc1;
+ return new Color(c1[0] * wc1 + c2[0] * wc2, c1[1] * wc1 + c2[1] * wc2, c1[2] * wc1 + c2[2] * wc2);
+ }
+
+ public static Color blend(Color color1, Color color2, float wc1) {
+ float[] c1 = squared(color1);
+ float[] c2 = squared(color2);
+ float wc2 = 1f - wc1;
+ return sqrt(c1[0] * wc1 + c2[0] * wc2, c1[1] * wc1 + c2[1] * wc2, c1[2] * wc1 + c2[2] * wc2);
+ }
+
+ public static Color add(Color color1, Color color2, float wc1) {
+ float[] c1 = squared(color1);
+ float[] c2 = squared(color2);
+ c1[0] += c2[0];
+ c1[1] += c2[1];
+ c1[2] += c2[2];
+ float max = Math.max(Math.max(c1[0], c1[1]), c1[2]);
+ if (max > 1f) {
+ c1[0] /= max;
+ c1[1] /= max;
+ c1[2] /= max;
+ }
+ return sqrt(c1[0], c1[1], c1[2]);
+ }
+
+ public static float getBrightness(Color color) {
+ return Color.RGBtoHSB(color.getRed(), color.getBlue(), color.getGreen(), null)[2];
+ }
+
+ public static Color contrastColor(Color color) {
+ return new Color(color.getRed() ^ 0x80, color.getGreen() ^ 0x80, color.getBlue() ^ 0x80);
+ }
+
+}