package com.dairymoose.modernlife.blocks.gui; import com.dairymoose.modernlife.core.ModernLifeCommon; import com.dairymoose.modernlife.core.ModernLifeConfig; import com.dairymoose.modernlife.core.ModernLifeNetwork; import com.dairymoose.modernlife.network.play.client.ServerboundMultipartEaselPacket; import com.dairymoose.modernlife.util.CanvasData; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Deque; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Set; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.ImageButton; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraft.network.chat.TextColor; import net.minecraft.network.chat.TextComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.FormattedCharSequence; import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @OnlyIn(Dist.CLIENT) /* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/gui/EaselScreen.class */ public class EaselScreen extends Screen { final int GUI_WIDTH = 256; final int GUI_HEIGHT = 216; private final int CANVAS_AREA_WIDTH = 128; private final int CANVAS_AREA_HEIGHT = 128; private Level world; private BlockPos pos; List> colorRowRgbs; private int colorRgb; private int colorRgbLeft; private int colorRgbRight; private int lastMouseButton; /* renamed from: H */ private double f6H; /* renamed from: S */ private double f7S; /* renamed from: V */ private double f8V; CanvasData canvasData; Deque undoStack; private boolean dragStart; int dragStartX; int dragStartY; int lastX; int lastY; private DynamicTexture texture; private TextureManager textureManager; private ResourceLocation dynamicTextureResource; private boolean firstRender; private BlockPos easelPos; private long introTimestamp; private final int UNDO_STACK_MAX_SIZE = 10; private static final Logger LOGGER = LogManager.getLogger(); private static final ResourceLocation CANVAS_UI = new ResourceLocation("modernlife", "textures/gui/canvas_ui.png"); private static final ResourceLocation COLOR_PICKER_UI = new ResourceLocation("modernlife", "textures/gui/ui_color_picker.png"); private static ImageButton pencil = null; private static ImageButton paintbrush = null; private static ImageButton line = null; private static ImageButton bucket = null; private static ImageButton colorPicker = null; private static ImageButton undo = null; private static ImageButton cancel = null; private static ImageButton accept = null; public EaselScreen(Level world, BlockPos easelBlock) { super(new TextComponent("Canvas").m_6270_(Style.EMPTY.withColor(TextColor.fromRgb(4210752)))); this.GUI_WIDTH = 256; this.GUI_HEIGHT = 216; this.CANVAS_AREA_WIDTH = 128; this.CANVAS_AREA_HEIGHT = 128; this.world = null; this.pos = null; this.colorRgb = 0; this.colorRgbLeft = 0; this.colorRgbRight = 0; this.lastMouseButton = 0; this.f6H = -1.0d; this.f7S = 0.0d; this.f8V = 1.0d; this.canvasData = new CanvasData(); this.undoStack = new LinkedList(); this.dragStart = false; this.dragStartX = -1; this.dragStartY = -1; this.lastX = -1; this.lastY = -1; this.texture = null; this.textureManager = Minecraft.getInstance().getTextureManager(); this.dynamicTextureResource = null; this.firstRender = true; this.easelPos = null; this.UNDO_STACK_MAX_SIZE = 10; this.world = world; this.pos = easelBlock; this.introTimestamp = System.currentTimeMillis(); this.colorRowRgbs = new ArrayList(); ArrayList rgbRow = new ArrayList<>(); rgbRow.add(13152666); rgbRow.add(7929856); rgbRow.add(10422798); rgbRow.add(15604517); rgbRow.add(16017996); rgbRow.add(16160633); rgbRow.add(15604517); rgbRow.add(16711680); this.colorRowRgbs.add(rgbRow); ArrayList rgbRow2 = new ArrayList<>(); rgbRow2.add(10127476); rgbRow2.add(8072704); rgbRow2.add(10568204); rgbRow2.add(16082463); rgbRow2.add(16289878); rgbRow2.add(16559489); rgbRow2.add(16512000); rgbRow2.add(16776960); this.colorRowRgbs.add(rgbRow2); ArrayList rgbRow3 = new ArrayList<>(); rgbRow3.add(7561815); rgbRow3.add(8210432); rgbRow3.add(10838281); rgbRow3.add(16356635); rgbRow3.add(16560477); rgbRow3.add(16697228); rgbRow3.add(42574); rgbRow3.add(65280); this.colorRowRgbs.add(rgbRow3); ArrayList rgbRow4 = new ArrayList<>(); rgbRow4.add(5457729); rgbRow4.add(8682496); rgbRow4.add(11378944); rgbRow4.add(16775017); rgbRow4.add(16775322); rgbRow4.add(16775322); rgbRow4.add(45549); rgbRow4.add(65535); this.colorRowRgbs.add(rgbRow4); ArrayList rgbRow5 = new ArrayList<>(); rgbRow5.add(3551277); rgbRow5.add(4154648); rgbRow5.add(5867303); rgbRow5.add(9422910); rgbRow5.add(11326578); rgbRow5.add(12771228); rgbRow5.add(2896020); rgbRow5.add(255); this.colorRowRgbs.add(rgbRow5); ArrayList rgbRow6 = new ArrayList<>(); rgbRow6.add(12885100); rgbRow6.add(89379); rgbRow6.add(1735216); rgbRow6.add(3716935); rgbRow6.add(8176757); rgbRow6.add(10605725); rgbRow6.add(15597709); rgbRow6.add(16515325); this.colorRowRgbs.add(rgbRow6); ArrayList rgbRow7 = new ArrayList<>(); rgbRow7.add(10910546); rgbRow7.add(23330); rgbRow7.add(28982); rgbRow7.add(42574); rgbRow7.add(3913592); rgbRow7.add(8768156); rgbRow7.add(9145227); rgbRow7.add(16777215); this.colorRowRgbs.add(rgbRow7); ArrayList rgbRow8 = new ArrayList<>(); rgbRow8.add(9265721); rgbRow8.add(22608); rgbRow8.add(29546); rgbRow8.add(43677); rgbRow8.add(1817268); rgbRow8.add(8113864); rgbRow8.add(8158332); rgbRow8.add(15461355); this.colorRowRgbs.add(rgbRow8); ArrayList rgbRow9 = new ArrayList<>(); rgbRow9.add(7686948); rgbRow9.add(22914); rgbRow9.add(30372); rgbRow9.add(45806); rgbRow9.add(48116); rgbRow9.add(7262711); rgbRow9.add(7434609); rgbRow9.add(14803682); this.colorRowRgbs.add(rgbRow9); ArrayList rgbRow10 = new ArrayList<>(); rgbRow10.add(6371347); rgbRow10.add(144743); rgbRow10.add(19837); rgbRow10.add(29117); rgbRow10.add(4361676); rgbRow10.add(8169946); rgbRow10.add(6513507); rgbRow10.add(14145495); this.colorRowRgbs.add(rgbRow10); ArrayList rgbRow11 = new ArrayList<>(); rgbRow11.add(4605510); rgbRow11.add(8533); rgbRow11.add(13674); rgbRow11.add(21929); rgbRow11.add(5600441); rgbRow11.add(8754636); rgbRow11.add(5460819); rgbRow11.add(13487565); this.colorRowRgbs.add(rgbRow11); ArrayList rgbRow12 = new ArrayList<>(); rgbRow12.add(4605510); rgbRow12.add(786507); rgbRow12.add(1840227); rgbRow12.add(2896020); rgbRow12.add(6315177); rgbRow12.add(9077695); rgbRow12.add(4605510); rgbRow12.add(12829635); this.colorRowRgbs.add(rgbRow12); ArrayList rgbRow13 = new ArrayList<>(); rgbRow13.add(4605510); rgbRow13.add(3145801); rgbRow13.add(4525921); rgbRow13.add(6630290); rgbRow13.add(8806312); rgbRow13.add(10520768); rgbRow13.add(3552822); rgbRow13.add(12040119); this.colorRowRgbs.add(rgbRow13); ArrayList rgbRow14 = new ArrayList<>(); rgbRow14.add(4605510); rgbRow14.add(4915273); rgbRow14.add(6489183); rgbRow14.add(9578129); rgbRow14.add(10838946); rgbRow14.add(12291260); rgbRow14.add(2434341); rgbRow14.add(11382189); this.colorRowRgbs.add(rgbRow14); ArrayList rgbRow15 = new ArrayList<>(); rgbRow15.add(4605510); rgbRow15.add(7929926); rgbRow15.add(10485853); rgbRow15.add(15597709); rgbRow15.add(15888042); rgbRow15.add(16162243); rgbRow15.add(987664); rgbRow15.add(10592672); this.colorRowRgbs.add(rgbRow15); ArrayList rgbRow16 = new ArrayList<>(); rgbRow16.add(4605510); rgbRow16.add(7929895); rgbRow16.add(10420280); rgbRow16.add(15733595); rgbRow16.add(15953018); rgbRow16.add(16226462); rgbRow16.add(0); rgbRow16.add(9868692); this.colorRowRgbs.add(rgbRow16); } public void setTextureSize(int w, int h) { if (w > 0 && h > 0) { this.canvasData.setTextureSize(w, h); } } public void setInitialData(byte[] initialData) { if (initialData != null) { this.canvasData.fromCompressedNbt(initialData); } } public void setBlockPos(BlockPos easelPos) { this.easelPos = easelPos; } public boolean blendColorIntoCanvas(int rgb, int pickedX, int pickedY, double blendFactor) { if (pickedX >= this.canvasData.textureWidth() || pickedY >= this.canvasData.textureHeight() || pickedX < 0 || pickedY < 0) { return false; } int newRgb = this.canvasData.applyBlend(rgb, this.canvasData.getRgbPixel(pickedX, pickedY), blendFactor); this.canvasData.setRgbPixel(pickedX, pickedY, newRgb); this.texture.getPixels().setPixelRGBA(pickedX, pickedY, this.canvasData.getRgbOutputPixel(pickedX, pickedY)); return true; } public List lineTo(int fromX, int fromY, int toX, int toY) { int direction; List output = new ArrayList<>(); output.add(new HPoint(fromX, fromY)); int newX = fromX; int newY = fromY; int iterCount = 0; int fnX = 1; int xDiff = toX - fromX; int yDiff = -(toY - fromY); boolean inverted = false; if (Math.abs(yDiff) > Math.abs(xDiff)) { xDiff = yDiff; yDiff = xDiff; inverted = true; } int nIterations = Math.abs(xDiff); if (xDiff > 0) { direction = 1; } else { direction = -1; } double angle = Math.atan(yDiff / xDiff); if (Math.toDegrees(angle) == 90.0d) { return output; } for (int i = 0; i < nIterations; i++) { iterCount++; if (iterCount >= 1000) { break; } int yValue = (int) Math.round(Math.tan(angle) * fnX); if (!inverted) { newX = fromX + (fnX * direction); newY = fromY - (yValue * direction); } if (inverted) { newX = fromX + (yValue * direction); newY = fromY - (fnX * direction); } newX = Math.min(Math.max(newX, 0), this.canvasData.textureWidth() - 1); newY = Math.min(Math.max(newY, 0), this.canvasData.textureHeight() - 1); output.add(new HPoint(newX, newY)); fnX++; } return output; } boolean pointIsValid(HPoint point) { int x = point.x; int y = point.y; if (x < 0 || x >= this.canvasData.textureWidth() || y < 0 || y >= this.canvasData.textureHeight()) { return false; } return true; } void iterativeFloodFill(int newRgb, int originalRgb, int startX, int startY) { Set visited = new HashSet<>(((int) (4097.0f / 0.75f)) + 1, 0.75f); Queue toVisit = new LinkedList<>(); HPoint firstPoint = new HPoint(startX, startY); visited.add(firstPoint); toVisit.add(firstPoint); int visitCount = 0; while (!toVisit.isEmpty()) { visitCount++; HPoint current = toVisit.remove(); int x = current.x; int y = current.y; if (pointIsValid(current)) { int currentRgb = this.canvasData.getRgbPixel(x, y); if (currentRgb == originalRgb) { blendColorIntoCanvas(newRgb, x, y, 1.0d); HPoint right = new HPoint(x + 1, y); if (pointIsValid(right) && !visited.contains(right)) { visited.add(right); toVisit.add(right); } HPoint left = new HPoint(x - 1, y); if (pointIsValid(left) && !visited.contains(left)) { visited.add(left); toVisit.add(left); } HPoint up = new HPoint(x, y - 1); if (pointIsValid(up) && !visited.contains(up)) { visited.add(up); toVisit.add(up); } HPoint down = new HPoint(x, y + 1); if (pointIsValid(down) && !visited.contains(down)) { visited.add(down); toVisit.add(down); } } } } } public void assignHsvFromRgb() { Boolean extendedColorPicker = (Boolean) ModernLifeConfig.CLIENT.extendedEaselColorPicker.get(); if (extendedColorPicker != null && extendedColorPicker.booleanValue()) { double dR = CanvasData.getRValue(this.colorRgb) / 255.0d; double dG = CanvasData.getGValue(this.colorRgb) / 255.0d; double dB = CanvasData.getBValue(this.colorRgb) / 255.0d; boolean rMax = false; boolean gMax = false; boolean bMax = false; if (dR >= dG && dR >= dB) { rMax = true; } else if (dG >= dR && dG >= dB) { gMax = true; } else if (dB >= dR && dB >= dG) { bMax = true; } double cMax = Math.max(Math.max(dR, dG), dB); double cMin = Math.min(Math.min(dR, dG), dB); double delta = cMax - cMin; if (delta == 0.0d) { this.f6H = 0.0d; } else if (rMax) { this.f6H = 60.0d * (((dG - dB) / delta) % 6.0d); } else if (gMax) { this.f6H = 60.0d * (((dB - dR) / delta) + 2.0d); } else if (bMax) { this.f6H = 60.0d * (((dR - dG) / delta) + 4.0d); } this.f6H %= 360.0d; if (this.f6H < 0.0d) { this.f6H += 360.0d; } ModernLifeCommon.LOGGER.debug("H = " + this.f6H); if (cMax == 0.0d) { this.f7S = 0.0d; } else { this.f7S = delta / cMax; } this.f8V = cMax; return; } this.f6H = -1.0d; } public void assignRgbFromHsv(int mouseButton) { double dR; double dG; double dB; double C = this.f8V * this.f7S; double X = C * (1.0d - Math.abs(((this.f6H / 60.0d) % 2.0d) - 1.0d)); double m = this.f8V - C; if (this.f6H >= 0.0d && this.f6H < 60.0d) { dR = C; dG = X; dB = 0.0d; } else if (this.f6H < 120.0d) { dR = X; dG = C; dB = 0.0d; } else if (this.f6H < 180.0d) { dR = 0.0d; dG = C; dB = X; } else if (this.f6H < 240.0d) { dR = 0.0d; dG = X; dB = C; } else if (this.f6H < 300.0d) { dR = X; dG = 0.0d; dB = C; } else { dR = C; dG = 0.0d; dB = X; } int r = (int) ((dR + m) * 255.0d); int g = (int) ((dG + m) * 255.0d); int b = (int) ((dB + m) * 255.0d); if (mouseButton == 0) { this.colorRgbLeft = CanvasData.toRgb(r, g, b); } else if (mouseButton == 1) { this.colorRgbRight = CanvasData.toRgb(r, g, b); } } public void handleMouseEvent(double clickX, double clickY, boolean mouseDown, int mouseButton) { List rgbRow; Integer rgb; if (this.texture == null || !this.canvasData.isValid()) { return; } long timestamp = System.currentTimeMillis(); long timeDiff = timestamp - this.introTimestamp; if (timeDiff <= 350) { return; } int uiStartX = (this.width - 256) / 2; int uiStartY = (this.height - 216) / 2; if (clickX > uiStartX + 7.0d && clickX < uiStartX + 62.0d && clickY > uiStartY + 21.0d && clickY < uiStartY + 127.0d) { double cellWidth = 53 / 8; double cellHeight = 105 / 16; double yOffsetInPicker = clickY - (uiStartY + 21.0d); double xOffsetInPicker = clickX - (uiStartX + 7.0d); int pickedColumn = (int) (yOffsetInPicker / cellHeight); int pickedRow = (int) (xOffsetInPicker / cellWidth); if (pickedColumn < this.colorRowRgbs.size() && (rgbRow = this.colorRowRgbs.get(pickedColumn)) != null && pickedRow < rgbRow.size() && (rgb = rgbRow.get(pickedRow)) != null) { if (mouseButton == 0) { this.colorRgbLeft = rgb.intValue(); } else if (mouseButton == 1) { this.colorRgbRight = rgb.intValue(); } assignHsvFromRgb(); } } if (mouseButton == 0) { this.colorRgb = this.colorRgbLeft; } else if (mouseButton == 1) { this.colorRgb = this.colorRgbRight; } Boolean extendedColorPicker = (Boolean) ModernLifeConfig.CLIENT.extendedEaselColorPicker.get(); if (extendedColorPicker != null && extendedColorPicker.booleanValue() && clickX > xStartColorPicker() - 2 && clickX < xStartColorPicker() + colorPickerWidth() + 2 && clickY > yStartColorPicker() - 2 && clickY < yStartColorPicker() + colorPickerHeight() + 2) { double pickerX = clickX - xStartColorPicker(); double pickerY = clickY - yStartColorPicker(); double xPercent = pickerX / colorPickerWidth(); double yPercent = pickerY / colorPickerHeight(); if (xPercent < 0.0d) { xPercent = 0.0d; } else if (xPercent > 1.0d) { xPercent = 1.0d; } if (yPercent < 0.0d) { yPercent = 0.0d; } if (yPercent > 1.0d) { yPercent = 1.0d; } this.f6H = xPercent * 360.0d; this.f7S = 1.0d - yPercent; assignRgbFromHsv(mouseButton); } if (clickX > uiStartX + 94.0d && clickX < uiStartX + 223.0d && clickY > uiStartY + 25.0d && clickY < uiStartY + 154.0d) { int canvasWidth = canvasAspectedWidth(); int canvasHeight = canvasAspectedHeight(); int canvasMaxX = this.canvasData.textureWidth(); int canvaxMaxY = this.canvasData.textureHeight(); double cellWidth2 = canvasWidth / canvasMaxX; double cellHeight2 = canvasHeight / canvaxMaxY; double yOffsetInCanvas = clickY - (uiStartY + 25.0d); double xOffsetInCanvas = clickX - (uiStartX + 94.0d); int pickedY = (int) (yOffsetInCanvas / cellHeight2); int pickedX = (int) (xOffsetInCanvas / cellWidth2); if (pickedX < this.canvasData.textureWidth() && pickedY < this.canvasData.textureHeight() && (!mouseDown || pickedX != this.lastX || pickedY != this.lastY)) { if (!this.dragStart && m_7282_()) { if (this.undoStack.size() >= 10) { this.undoStack.removeLast(); } CanvasData undoData = new CanvasData(); undoData.copyDataFrom(this.canvasData); this.undoStack.push(undoData); this.dragStart = true; this.dragStartX = pickedX; this.dragStartY = pickedY; } if (pencil.m_93696_()) { blendColorIntoCanvas(this.colorRgb, pickedX, pickedY, 1.0d); this.texture.upload(); } else if (paintbrush.m_93696_() && mouseDown) { blendColorIntoCanvas(this.colorRgb, pickedX, pickedY, 0.8d); blendColorIntoCanvas(this.colorRgb, pickedX + 1, pickedY, 0.3125d); blendColorIntoCanvas(this.colorRgb, pickedX - 1, pickedY, 0.3125d); blendColorIntoCanvas(this.colorRgb, pickedX, pickedY + 1, 0.3125d); blendColorIntoCanvas(this.colorRgb, pickedX, pickedY - 1, 0.3125d); blendColorIntoCanvas(this.colorRgb, pickedX + 1, pickedY + 1, 0.04d); blendColorIntoCanvas(this.colorRgb, pickedX - 1, pickedY + 1, 0.04d); blendColorIntoCanvas(this.colorRgb, pickedX - 1, pickedY - 1, 0.04d); blendColorIntoCanvas(this.colorRgb, pickedX + 1, pickedY - 1, 0.04d); this.texture.upload(); } else if (line.m_93696_()) { ModernLifeCommon.LOGGER.debug("line focus"); if (this.dragStart || !m_7282_()) { if (this.dragStart && m_7282_()) { updateTexture(this.canvasData, this.texture); List linePixels = lineTo(this.dragStartX, this.dragStartY, pickedX, pickedY); for (int i = 0; i < linePixels.size(); i++) { HPoint HPoint = linePixels.get(i); this.texture.getPixels().setPixelRGBA(HPoint.x, HPoint.y, this.canvasData.convertToRgbOutput(this.colorRgb)); } this.texture.upload(); } else if (this.dragStart && !m_7282_()) { List linePixels2 = lineTo(this.dragStartX, this.dragStartY, pickedX, pickedY); for (int i2 = 0; i2 < linePixels2.size(); i2++) { HPoint HPoint2 = linePixels2.get(i2); blendColorIntoCanvas(this.colorRgb, HPoint2.x, HPoint2.y, 1.0d); } this.texture.upload(); } } } else if (bucket.m_93696_()) { iterativeFloodFill(this.colorRgb, this.canvasData.getRgbPixel(pickedX, pickedY), pickedX, pickedY); this.texture.upload(); } else if (colorPicker.m_93696_() && mouseDown) { if (mouseButton == 0) { this.colorRgbLeft = this.canvasData.getRgbPixel(pickedX, pickedY); } else if (mouseButton == 1) { this.colorRgbRight = this.canvasData.getRgbPixel(pickedX, pickedY); } assignHsvFromRgb(); } if (this.dragStart && !m_7282_()) { ModernLifeCommon.LOGGER.debug("drag end"); this.dragStart = false; this.dragStartX = -1; this.dragStartY = -1; } } if (mouseDown) { this.lastX = pickedX; this.lastY = pickedY; } else { this.lastX = -1; this.lastY = -1; } } this.lastMouseButton = mouseButton; } public boolean m_7979_(double dragX, double dragY, int mouseButton, double p_231045_6_, double p_231045_8_) { if (mouseButton == 0 || mouseButton == 1) { handleMouseEvent(dragX, dragY, true, mouseButton); } return super.m_7979_(dragX, dragY, mouseButton, p_231045_6_, p_231045_8_); } public boolean m_6375_(double clickX, double clickY, int mouseButton) { if (mouseButton == 0 || mouseButton == 1) { m_7897_(true); handleMouseEvent(clickX, clickY, true, mouseButton); } return super.m_6375_(clickX, clickY, mouseButton); } public boolean m_6348_(double clickX, double clickY, int mouseButton) { m_7897_(false); if (mouseButton == 0 || mouseButton == 1) { handleMouseEvent(clickX, clickY, false, mouseButton); } return super.m_6348_(clickX, clickY, mouseButton); } public static void unfocusAll() { if (pencil != null && pencil.m_93696_()) { pencil.changeFocus(false); } if (paintbrush != null && paintbrush.m_93696_()) { paintbrush.changeFocus(false); } if (line != null && line.m_93696_()) { line.changeFocus(false); } if (bucket != null && bucket.m_93696_()) { bucket.changeFocus(false); } if (colorPicker != null && colorPicker.m_93696_()) { colorPicker.changeFocus(false); } } public boolean keyPressed(int key, int p_231046_2_, int p_231046_3_) { if (key == 80) { pencil.onPress(); return false; } if (key == 66) { paintbrush.onPress(); return false; } if (key == 76) { line.onPress(); return false; } if (key == 70) { bucket.onPress(); return false; } if (key == 67) { colorPicker.onPress(); return false; } if (key == 90 && Screen.hasControlDown()) { undo.onPress(); return false; } return super.keyPressed(key, p_231046_2_, p_231046_3_); } protected void init() { int startX = ((this.width - 256) / 2) + 77; int startY = ((this.height - 216) / 2) + 164; pencil = addRenderableWidget(new ImageButton(startX, startY, 20, 18, 0, 219, 19, CANVAS_UI, new Button.OnPress() { // from class: com.dairymoose.modernlife.blocks.gui.EaselScreen.1 C00761() { } public void onPress(Button button) { EaselScreen.unfocusAll(); button.changeFocus(true); } })); paintbrush = addRenderableWidget(new ImageButton(startX + 22, startY, 20, 18, 21, 219, 19, CANVAS_UI, new Button.OnPress() { // from class: com.dairymoose.modernlife.blocks.gui.EaselScreen.2 C00772() { } public void onPress(Button button) { EaselScreen.unfocusAll(); button.changeFocus(true); } })); line = addRenderableWidget(new ImageButton(startX + 44, startY, 20, 18, 42, 219, 19, CANVAS_UI, new Button.OnPress() { // from class: com.dairymoose.modernlife.blocks.gui.EaselScreen.3 C00783() { } public void onPress(Button button) { EaselScreen.unfocusAll(); button.changeFocus(true); } })); bucket = addRenderableWidget(new ImageButton(startX + 66, startY, 20, 18, 63, 219, 19, CANVAS_UI, new Button.OnPress() { // from class: com.dairymoose.modernlife.blocks.gui.EaselScreen.4 C00794() { } public void onPress(Button button) { EaselScreen.unfocusAll(); button.changeFocus(true); } })); colorPicker = addRenderableWidget(new ImageButton(startX + 88, startY, 20, 18, 84, 219, 19, CANVAS_UI, new Button.OnPress() { // from class: com.dairymoose.modernlife.blocks.gui.EaselScreen.5 C00805() { } public void onPress(Button button) { EaselScreen.unfocusAll(); button.changeFocus(true); } })); undo = addRenderableWidget(new ImageButton(startX + 110, startY, 20, 18, 105, 219, 19, CANVAS_UI, new Button.OnPress() { // from class: com.dairymoose.modernlife.blocks.gui.EaselScreen.6 C00816() { } public void onPress(Button button) { if (!EaselScreen.this.undoStack.isEmpty()) { CanvasData undoData = EaselScreen.this.undoStack.pop(); if (undoData.isValid()) { EaselScreen.this.canvasData.copyDataFrom(undoData); EaselScreen.updateTexture(EaselScreen.this.canvasData, EaselScreen.this.texture); } } } })); cancel = addRenderableWidget(new ImageButton(startX + 132, startY, 20, 18, 126, 219, 19, CANVAS_UI, new Button.OnPress() { // from class: com.dairymoose.modernlife.blocks.gui.EaselScreen.7 C00827() { } public void onPress(Button button) { Minecraft.getInstance().setScreen((Screen) null); } })); accept = addRenderableWidget(new ImageButton(startX + 154, startY, 20, 18, 147, 219, 19, CANVAS_UI, new Button.OnPress() { // from class: com.dairymoose.modernlife.blocks.gui.EaselScreen.8 C00838() { } public void onPress(Button button) { if (EaselScreen.this.easelPos != null) { byte[] compressed = EaselScreen.this.canvasData.toCompressedNbt(); List parts = new ArrayList<>(); for (int i = 0; i < Math.ceil(compressed.length / 30000); i++) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); int startIndex = i * 30000; int bytesToWrite = Math.min(compressed.length - startIndex, 30000); stream.write(compressed, startIndex, bytesToWrite); byte[] part = stream.toByteArray(); parts.add(part); } for (int i2 = 0; i2 < parts.size(); i2++) { int seqNo = i2 + 1; boolean last = false; if (seqNo == parts.size()) { last = true; } ModernLifeNetwork.INSTANCE.sendToServer(new ServerboundMultipartEaselPacket(seqNo, last, parts.get(i2), EaselScreen.this.canvasData.textureWidth(), EaselScreen.this.canvasData.textureHeight(), EaselScreen.this.easelPos)); } } Minecraft.getInstance().setScreen((Screen) null); } })); pencil.changeFocus(true); } /* renamed from: com.dairymoose.modernlife.blocks.gui.EaselScreen$1 */ /* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/gui/EaselScreen$1.class */ class C00761 implements Button.OnPress { C00761() { } public void onPress(Button button) { EaselScreen.unfocusAll(); button.changeFocus(true); } } /* renamed from: com.dairymoose.modernlife.blocks.gui.EaselScreen$2 */ /* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/gui/EaselScreen$2.class */ class C00772 implements Button.OnPress { C00772() { } public void onPress(Button button) { EaselScreen.unfocusAll(); button.changeFocus(true); } } /* renamed from: com.dairymoose.modernlife.blocks.gui.EaselScreen$3 */ /* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/gui/EaselScreen$3.class */ class C00783 implements Button.OnPress { C00783() { } public void onPress(Button button) { EaselScreen.unfocusAll(); button.changeFocus(true); } } /* renamed from: com.dairymoose.modernlife.blocks.gui.EaselScreen$4 */ /* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/gui/EaselScreen$4.class */ class C00794 implements Button.OnPress { C00794() { } public void onPress(Button button) { EaselScreen.unfocusAll(); button.changeFocus(true); } } /* renamed from: com.dairymoose.modernlife.blocks.gui.EaselScreen$5 */ /* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/gui/EaselScreen$5.class */ class C00805 implements Button.OnPress { C00805() { } public void onPress(Button button) { EaselScreen.unfocusAll(); button.changeFocus(true); } } /* renamed from: com.dairymoose.modernlife.blocks.gui.EaselScreen$6 */ /* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/gui/EaselScreen$6.class */ class C00816 implements Button.OnPress { C00816() { } public void onPress(Button button) { if (!EaselScreen.this.undoStack.isEmpty()) { CanvasData undoData = EaselScreen.this.undoStack.pop(); if (undoData.isValid()) { EaselScreen.this.canvasData.copyDataFrom(undoData); EaselScreen.updateTexture(EaselScreen.this.canvasData, EaselScreen.this.texture); } } } } /* renamed from: com.dairymoose.modernlife.blocks.gui.EaselScreen$7 */ /* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/gui/EaselScreen$7.class */ class C00827 implements Button.OnPress { C00827() { } public void onPress(Button button) { Minecraft.getInstance().setScreen((Screen) null); } } /* renamed from: com.dairymoose.modernlife.blocks.gui.EaselScreen$8 */ /* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/gui/EaselScreen$8.class */ class C00838 implements Button.OnPress { C00838() { } public void onPress(Button button) { if (EaselScreen.this.easelPos != null) { byte[] compressed = EaselScreen.this.canvasData.toCompressedNbt(); List parts = new ArrayList<>(); for (int i = 0; i < Math.ceil(compressed.length / 30000); i++) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); int startIndex = i * 30000; int bytesToWrite = Math.min(compressed.length - startIndex, 30000); stream.write(compressed, startIndex, bytesToWrite); byte[] part = stream.toByteArray(); parts.add(part); } for (int i2 = 0; i2 < parts.size(); i2++) { int seqNo = i2 + 1; boolean last = false; if (seqNo == parts.size()) { last = true; } ModernLifeNetwork.INSTANCE.sendToServer(new ServerboundMultipartEaselPacket(seqNo, last, parts.get(i2), EaselScreen.this.canvasData.textureWidth(), EaselScreen.this.canvasData.textureHeight(), EaselScreen.this.easelPos)); } } Minecraft.getInstance().setScreen((Screen) null); } } public static void updateTexture(CanvasData canvasData, DynamicTexture texture) { if (!canvasData.isValid()) { return; } for (int i = 0; i < canvasData.textureHeight(); i++) { for (int j = 0; j < canvasData.textureWidth(); j++) { if (texture != null && texture.getPixels() != null && canvasData.isValid()) { try { texture.getPixels().setPixelRGBA(j, i, canvasData.getRgbOutputPixel(j, i)); } catch (IllegalStateException e) { ModernLifeCommon.LOGGER.warn("Unallocated image error"); } } } } if (texture != null) { try { if (canvasData.isValid()) { texture.upload(); } } catch (IllegalStateException e2) { ModernLifeCommon.LOGGER.warn("Unallocated image error"); } } } public static void updateTextureDownsampled(CanvasData canvasData, DynamicTexture texture, int newSize) { if (!canvasData.isValid()) { return; } int ratio = canvasData.textureWidth() / newSize; for (int i = 0; i < newSize; i++) { for (int j = 0; j < newSize; j++) { int sampleX = j * ratio; int sampleY = i * ratio; texture.getPixels().setPixelRGBA(j, i, canvasData.getRgbOutputPixel(sampleX, sampleY)); } } texture.upload(); } public boolean isPauseScreen() { return false; } private void drawCenteredStringNoShadow(PoseStack p_238472_0_, Font p_238472_1_, Component p_238472_2_, int p_238472_3_, int p_238472_4_, int p_238472_5_) { FormattedCharSequence lvt_6_1_ = p_238472_2_.getVisualOrderText(); p_238472_1_.draw(p_238472_0_, lvt_6_1_, p_238472_3_ - (p_238472_1_.width(lvt_6_1_) / 2), p_238472_4_, p_238472_5_); } public boolean m_6050_(double a, double b, double c) { Boolean extendedColorPicker = (Boolean) ModernLifeConfig.CLIENT.extendedEaselColorPicker.get(); if (extendedColorPicker != null && extendedColorPicker.booleanValue()) { if (c > 0.0d) { if (Screen.hasShiftDown()) { this.f8V += 0.01d; } else { this.f8V += 0.1d; } } else if (Screen.hasShiftDown()) { this.f8V -= 0.01d; } else { this.f8V -= 0.1d; } if (this.f8V > 1.0d) { this.f8V = 1.0d; } if (this.f8V < 0.0d) { this.f8V = 0.0d; } assignRgbFromHsv(this.lastMouseButton); } return super.m_6050_(a, b, c); } public void render(PoseStack matrixStack, int p_230430_2_, int p_230430_3_, float p_230430_4_) { renderBackground(matrixStack); if (this.firstRender) { this.firstRender = false; this.canvasData.initImage(); if (this.texture == null) { this.texture = new DynamicTexture(this.canvasData.textureWidth(), this.canvasData.textureHeight(), true); this.dynamicTextureResource = this.textureManager.register("artpad/dyn", this.texture); updateTexture(this.canvasData, this.texture); } } RenderSystem.setShader(GameRenderer::getPositionTexShader); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); RenderSystem.setShaderTexture(0, CANVAS_UI); int xStart = (this.width - 256) / 2; int yStart = (this.height - 216) / 2; m_93228_(matrixStack, xStart, yStart, 0, 0, 256, 216); int r = CanvasData.getRValue(this.colorRgbLeft); int g = CanvasData.getGValue(this.colorRgbLeft); int b = CanvasData.getBValue(this.colorRgbLeft); float fR = r / 255.0f; float fG = g / 255.0f; float fB = b / 255.0f; RenderSystem.setShaderColor(fR, fG, fB, 1.0f); m_93228_(matrixStack, xStart + 39, yStart + 135, 39, 135, 9, 9); int r2 = CanvasData.getRValue(this.colorRgbRight); int g2 = CanvasData.getGValue(this.colorRgbRight); int b2 = CanvasData.getBValue(this.colorRgbRight); float fR2 = r2 / 255.0f; float fG2 = g2 / 255.0f; float fB2 = b2 / 255.0f; RenderSystem.setShaderColor(fR2, fG2, fB2, 1.0f); m_93228_(matrixStack, xStart + 52, yStart + 135, 52, 135, 9, 9); if (this.dynamicTextureResource != null) { int canvasWidth = canvasAspectedWidth(); int canvasHeight = canvasAspectedHeight(); if (canvasWidth != canvasHeight) { GuiComponent.fill(matrixStack, xStart + 94, yStart + 25, xStart + 94 + 128, yStart + 25 + 128, -16777216); } RenderSystem.setShaderTexture(0, this.dynamicTextureResource); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); GuiComponent.blit(matrixStack, xStart + 94, yStart + 25, 0.0f, 0.0f, canvasWidth, canvasHeight, canvasWidth, canvasHeight); } drawCenteredStringNoShadow(matrixStack, this.minecraft.font, this.title, xStart + 128, yStart + 2, 0); for (ImageButton imageButton : children()) { if (imageButton instanceof AbstractWidget) { ImageButton imageButton2 = (AbstractWidget) imageButton; if (imageButton2.isHoveredOrFocused() && !imageButton2.isFocused()) { String text = ""; if (imageButton2 == pencil) { text = "Pencil (P)"; } else if (imageButton2 == paintbrush) { text = "Paintbrush (B)"; } else if (imageButton2 == line) { text = "Line (L)"; } else if (imageButton2 == bucket) { text = "Bucket (F)"; } else if (imageButton2 == colorPicker) { text = "Color Picker (C)"; } else if (imageButton2 == undo) { text = "Undo (Ctrl+Z)"; } else if (imageButton2 == cancel) { text = "Cancel"; } else if (imageButton2 == accept) { text = "Accept"; } if (!text.isEmpty()) { renderTooltip(matrixStack, new TextComponent(text), ((AbstractWidget) imageButton2).x, ((AbstractWidget) imageButton2).y); } } } } Boolean extendedColorPicker = (Boolean) ModernLifeConfig.CLIENT.extendedEaselColorPicker.get(); if (extendedColorPicker != null && extendedColorPicker.booleanValue()) { RenderSystem.setShaderTexture(0, COLOR_PICKER_UI); int COLOR_PICKER_WIDTH = colorPickerWidth(); int COLOR_PICKER_HEIGHT = colorPickerHeight(); int xStartColorPicker = xStartColorPicker(); int yStartColorPicker = yStartColorPicker(); GuiComponent.blit(matrixStack, xStartColorPicker, yStartColorPicker, 0.0f, 0.0f, COLOR_PICKER_WIDTH, COLOR_PICKER_HEIGHT, COLOR_PICKER_WIDTH, COLOR_PICKER_HEIGHT); String rgbText = "R" + r + " G" + g + " B" + b; drawCenteredStringNoShadow(matrixStack, this.minecraft.font, new TextComponent(rgbText), xStart + 128, (int) (yStart + 205.2d), 0); if (this.f6H >= 0.0d) { double sText = this.f7S * 100.0d; double vText = this.f8V * 100.0d; String hsvText = String.format("H%.1f S%.1f V%.0f", Double.valueOf(this.f6H), Double.valueOf(sText), Double.valueOf(vText)); drawCenteredStringNoShadow(matrixStack, this.minecraft.font, new TextComponent(hsvText), xStart + 128, (int) (yStart + 194.4d), 0); drawCenteredStringNoShadow(matrixStack, this.minecraft.font, new TextComponent("(scroll wheel adjusts V)"), xStart + 128, (int) (yStart + 183.6d), 0); } } super.render(matrixStack, p_230430_2_, p_230430_3_, p_230430_4_); } public int xStartColorPicker() { return ((this.width - 256) / 2) + 5; } public int yStartColorPicker() { return ((this.height - 216) / 2) + 147; } public float getAspectRatio() { return this.canvasData.textureWidth() / this.canvasData.textureHeight(); } public int canvasAspectedWidth() { if (this.canvasData.textureWidth() < this.canvasData.textureHeight()) { return (int) (128.0f * getAspectRatio()); } return 128; } public int canvasAspectedHeight() { if (this.canvasData.textureHeight() < this.canvasData.textureWidth()) { return (int) (128.0f * (1.0f / getAspectRatio())); } return 128; } public int colorPickerWidth() { return 60; } public int colorPickerHeight() { return 60; } }