From fc08e98f7ae9f4f430feb9ca0bbe241fefc81a84 Mon Sep 17 00:00:00 2001 From: Thxios Date: Thu, 12 Mar 2020 14:03:02 +0900 Subject: [PATCH] . Signed-off-by: Thxios --- .idea/.gitignore | 4 +- .idea/PixelEditor.iml | 6 +- .idea/misc.xml | 2 +- img.py | 4 +- makeBar.py | 9 ++ newDa/ColorSection.png | Bin 0 -> 26402 bytes newDa/alpha.png | Bin 0 -> 158 bytes src/Brush.py | 7 +- src/HWwindow.py | 2 +- src/{Section.py => Section/CanvasSection.py} | 158 +++---------------- src/Section/ColorSection.py | 89 +++++++++++ src/Section/FrameSection.py | 6 + src/Section/PaletteSection.py | 7 + src/Section/Section.py | 13 ++ src/Section/_Section.py | 62 ++++++++ src/TestSection.py | 20 ++- src/Window.py | 7 +- src/data/hue4.png | Bin 0 -> 22737 bytes src/utility.py | 5 + 19 files changed, 253 insertions(+), 148 deletions(-) create mode 100644 makeBar.py create mode 100644 newDa/ColorSection.png create mode 100644 newDa/alpha.png rename src/{Section.py => Section/CanvasSection.py} (55%) create mode 100644 src/Section/ColorSection.py create mode 100644 src/Section/FrameSection.py create mode 100644 src/Section/PaletteSection.py create mode 100644 src/Section/Section.py create mode 100644 src/Section/_Section.py create mode 100644 src/data/hue4.png diff --git a/.idea/.gitignore b/.idea/.gitignore index 5c98b42..46310d5 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -1,2 +1,4 @@ # Default ignored files -/workspace.xml \ No newline at end of file +/workspace.xml +/Venv/ +/.idea/ \ No newline at end of file diff --git a/.idea/PixelEditor.iml b/.idea/PixelEditor.iml index 9710855..a23138d 100644 --- a/.idea/PixelEditor.iml +++ b/.idea/PixelEditor.iml @@ -1,8 +1,10 @@ - - + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 110ffc2..4df28b3 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/img.py b/img.py index c5b429a..72aabd5 100644 --- a/img.py +++ b/img.py @@ -9,5 +9,5 @@ if pixel[x, y] == (0, 0, 0, 255): pixel[x, y] = (0, 0, 0, 0) -img.thumbnail((201, 201)) -img.save('newDa/hue3.png') +img.thumbnail((201 + 6, 201 + 6)) +img.save('newDa/hue4.png') diff --git a/makeBar.py b/makeBar.py new file mode 100644 index 0000000..6f35fbc --- /dev/null +++ b/makeBar.py @@ -0,0 +1,9 @@ +from PIL import Image + +img = Image.new('RGBA', (200, 20), (0, 0, 0, 0)) +pixel = img.load() +w, h = img.size +for x in range(w): + for y in range(h): + pixel[x, y] = (0, 0, 0, round((w - x - 1) / (w - 1) * 255)) +img.save('newDa/value.png') diff --git a/newDa/ColorSection.png b/newDa/ColorSection.png new file mode 100644 index 0000000000000000000000000000000000000000..50ec7ce46af0a06fb2333d4bf1d8cb652167ef74 GIT binary patch literal 26402 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 literal 0 HcmV?d00001 diff --git a/src/Brush.py b/src/Brush.py index 7c95d7a..87a73dd 100644 --- a/src/Brush.py +++ b/src/Brush.py @@ -15,7 +15,12 @@ def OnMouseUp(self, clickedPixel, layer: Layer): pass def SetCurrentColor(self, color): - self.currentColor = color + if len(color) == 3: + _r, _g, _b = color + _a = 255 + else: + _r, _g, _b, _a = color + self.currentColor = (_r, _g, _b, _a) class _PencilBrush(_Brush): diff --git a/src/HWwindow.py b/src/HWwindow.py index 80db145..3b23256 100644 --- a/src/HWwindow.py +++ b/src/HWwindow.py @@ -1,6 +1,6 @@ import pygame as pg from pygame.locals import * -from src.Section import CanvasSection, ColorSection +from src.Section.Section import CanvasSection, ColorSection from src.Brush import Brush from OpenGL.GL import * from OpenGL.GLU import * diff --git a/src/Section.py b/src/Section/CanvasSection.py similarity index 55% rename from src/Section.py rename to src/Section/CanvasSection.py index 887e227..0feaf50 100644 --- a/src/Section.py +++ b/src/Section/CanvasSection.py @@ -1,73 +1,8 @@ import pygame as pg -from src.Sprite import Sprite +from src.Section._Section import Section from src.Brush import Brush -from math import ceil, sin, cos, atan2, radians, degrees -from src import utility - -_tileSize = 32 -_gray1 = pg.Surface((_tileSize, _tileSize), pg.SRCALPHA, 32) -_gray2 = pg.Surface((_tileSize, _tileSize), pg.SRCALPHA, 32) -_gray1.fill((127, 127, 127, 255)) -_gray2.fill((192, 192, 192, 255)) - - -class Section: - x: int - y: int - w: int - h: int - centerX: int - centerY: int - bgColor: (int, int, int) - rect: pg.Rect - surface: pg.Surface - _hasChange: bool - - _outlineColor = (255, 255, 255) - term = 5 - - def Setup(self, x, y, w, h): - self.x = x + self.term - self.y = y + self.term - self.w = w - self.term * 2 - self.h = h - self.term * 2 - self.centerX = self.w // 2 - self.centerY = self.h // 2 - self.rect = pg.Rect(self.x, self.y, self.w, self.h) - self.surface = pg.Surface((self.w, self.h), pg.SRCALPHA, 32) - self._hasChange = True - - def SetBackgroundColor(self, color): - self.bgColor = color - - def OnMouseDown(self, button, x, y): - pass - - def OnMouseDrag(self, button, x, y, _x, _y): - pass - - def OnMouseUp(self, button, x, y): - pass - - def Changed(self): - self._hasChange = True - - def Draw(self, screen): - if self._hasChange: - self.Update() - screen.blit(self.surface, (self.x, self.y)) - pg.display.update(pg.draw.rect(screen, self._outlineColor, self.rect, 3)) - self._hasChange = False - - def IsClicked(self, mousePos) -> bool: - return self.rect.collidepoint(*mousePos) - - def LocalPosition(self, position) -> (int, int): - _x, _y = position - return _x - self.x, _y - self.y - - def Update(self): - self.surface.fill(self.bgColor) +from src.Sprite import Sprite +from math import ceil class CanvasSection(Section): @@ -85,6 +20,12 @@ class CanvasSection(Section): bgColor = (60, 63, 65) canvasOutlineWidth = 2 + tileSize = 32 + _gray1 = pg.Surface((tileSize, tileSize), pg.SRCALPHA, 32) + _gray2 = pg.Surface((tileSize, tileSize), pg.SRCALPHA, 32) + _gray1.fill((127, 127, 127, 255)) + _gray2.fill((192, 192, 192, 255)) + def SetupCanvas(self, w, h): self.sprite = Sprite.Empty(w, h) self.canvasWidth = w @@ -94,12 +35,12 @@ def SetupCanvas(self, w, h): self.canvasSurface = self.sprite.GetSurface() self.backgroundOriginal = pg.Surface((self.canvasWidth, self.canvasHeight), pg.SRCALPHA, 32) - for _x in range(ceil(self.canvasWidth / _tileSize)): - for _y in range(ceil(self.canvasHeight / _tileSize)): + for _x in range(ceil(self.canvasWidth / self.tileSize)): + for _y in range(ceil(self.canvasHeight / self.tileSize)): if (_x + _y) % 2: - self.backgroundOriginal.blit(_gray1, (_x * _tileSize, _y * _tileSize)) + self.backgroundOriginal.blit(self._gray1, (_x * self.tileSize, _y * self.tileSize)) else: - self.backgroundOriginal.blit(_gray2, (_x * _tileSize, _y * _tileSize)) + self.backgroundOriginal.blit(self._gray2, (_x * self.tileSize, _y * self.tileSize)) self.background = pg.transform.scale(self.backgroundOriginal, self.canvas.size) def SetCanvasPosition(self, x, y): @@ -118,7 +59,8 @@ def Magnify(self, mag, pivot): if self.canvas.collidepoint(*pivot): p_x, p_y = pivot else: - p_x, p_y = self.canvas.center + p_x = max(min(pivot[0], self.canvas.x + self.canvas.w), self.canvas.x) + p_y = max(min(pivot[1], self.canvas.y + self.canvas.h), self.canvas.y) dx = (self.canvas.x - p_x) / self.magnification dy = (self.canvas.y - p_y) / self.magnification self.magnification += mag @@ -178,6 +120,7 @@ def PositionToPixel(self, x, y) -> (int, int, bool): return _pixelX, _pixelY, _valid def OnMouseDown(self, button, x, y): + x, y = self.LocalPosition((x, y)) if button == 1: pass # _localX, _localY = self.LocalPosition((x, y)) @@ -186,14 +129,16 @@ def OnMouseDown(self, button, x, y): # Brush.OnMouseDown((_pixelX, _pixelY)) # self.Changed() elif button == 4: - self.Magnify(1, self.LocalPosition((x, y))) + self.Magnify(1, (x, y)) elif button == 5: - self.Magnify(-1, self.LocalPosition((x, y))) + self.Magnify(-1, (x, y)) def OnMouseDrag(self, button, x, y, _x, _y): + x, y = self.LocalPosition((x, y)) + _x, _y = self.LocalPosition((_x, _y)) if button == 1: - _pixelX, _pixelY, _valid = self.PositionToPixel(*self.LocalPosition((x, y))) - _prePixelX, _prePixelY, _preValid = self.PositionToPixel(*self.LocalPosition((_x, _y))) + _pixelX, _pixelY, _valid = self.PositionToPixel(x, y) + _prePixelX, _prePixelY, _preValid = self.PositionToPixel(_x, _y) if _valid and _preValid: if abs(_prePixelX - _pixelX) > 1 or abs(_prePixelY - _pixelY) > 1: Brush.DrawLine(_prePixelX, _prePixelY, _pixelX, _pixelY) @@ -203,62 +148,3 @@ def OnMouseDrag(self, button, x, y, _x, _y): elif button == 2: self.MoveCanvas(x - _x, y - _y) - -class PaletteSection(Section): - bgColor = (43, 43, 43) - - -class FrameSection(Section): - bgColor = (32, 32, 32) - - - -R, G, B = 0, 1, 2 -H, S, V = 0, 1, 2 - -class ColorSection(Section): - colorCenterX: int - colorCenterY: int - - bgColor = (43, 43, 43) - colorWheelImage = pg.image.load('data/hue.png') - radius = colorWheelImage.get_width() // 2 - upperTerm = 15 - colorRGB = (190, 49, 83) - colorHSV = utility.RGB2HSV(colorRGB) - print(colorRGB, colorHSV) - dotImage = pg.image.load('data/dot.png') - dotRadius = dotImage.get_width() // 2 - - # ----- for test ----- - wheelCenterX = 125 - wheelCenterY = 120 - - def Update(self): - self.surface.fill(self.bgColor) - self.surface.blit(self.colorWheelImage, (self.centerX - self.radius, self.upperTerm)) - self.DrawColor() - - def SetColor(self, color: (int, int, int)): - if len(color) == 4: - _r, _g, _b, _ = color - else: - _r, _g, _b = color - self.colorRGB = (_r, _g, _b) - self.colorHSV = utility.RGB2HSV(self.colorRGB) - self.Changed() - - def DrawColor(self): - _theta = radians(90 - self.colorHSV[H]) - _x = round(cos(_theta) * self.radius * self.colorHSV[S] / 100) - _y = round(sin(_theta) * self.radius * self.colorHSV[S] / 100) - print(_theta, _x, _y) - self.surface.blit(self.colorWheelImage, (self.centerX - self.radius, self.upperTerm)) - self.surface.blit(self.dotImage, - (self.wheelCenterX + _x - self.dotRadius, self.wheelCenterY + _y - self.dotRadius)) - -CanvasSection = CanvasSection() -PaletteSection = PaletteSection() -FrameSection = FrameSection() -ColorSection = ColorSection() -Empty = Section() diff --git a/src/Section/ColorSection.py b/src/Section/ColorSection.py new file mode 100644 index 0000000..07cf6c9 --- /dev/null +++ b/src/Section/ColorSection.py @@ -0,0 +1,89 @@ +import pygame as pg +from src.Section._Section import Section +from src.Brush import Brush +from src import utility +from math import sin, cos, atan2, degrees, radians, sqrt + + +R, G, B = 0, 1, 2 +H, S, V = 0, 1, 2 + +class ColorSection(Section): + colorCenterX: int + colorCenterY: int + + bgColor = (43, 43, 43) + colorWheelImage = pg.image.load('data/hue4.png') + # radius = colorWheelImage.get_width() // 2 + radius = 100 + upperTerm = 15 + colorRGB = (0, 255, 0) + colorHSV = utility.RGB2HSV(colorRGB) + print(colorRGB, colorHSV) + dotImage = pg.image.load('data/dot.png') + dotRadius = dotImage.get_width() // 2 + radiusTerm = colorWheelImage.get_width() // 2 - radius + print(radius, radiusTerm, colorWheelImage.get_width()) + + colorChange = False + + # ----- for test ----- + wheelCenterX = 120 + wheelCenterY = 120 + + def Update(self): + self.surface.fill(self.bgColor) + self.DrawColor() + + def SetColorRGB(self, color: (int, int, int)): + if len(color) == 4: + _r, _g, _b, _ = color + else: + _r, _g, _b = color + self.colorRGB = (_r, _g, _b) + self.colorHSV = utility.RGB2HSV(self.colorRGB) + self.Changed() + Brush.pencil.SetCurrentColor(self.colorRGB) + + def SetColorHSV(self, color: (float, float, float)): + self.colorHSV = color + self.colorRGB = utility.HSV2RGB(color) + self.Changed() + Brush.pencil.SetCurrentColor(self.colorRGB) + + def DrawColor(self): + _theta = radians(90 - self.colorHSV[H]) + _x = round(cos(_theta) * self.radius * self.colorHSV[S] / 100) + _y = -round(sin(_theta) * self.radius * self.colorHSV[S] / 100) + # print(_x, _y) + self.surface.blit(self.colorWheelImage, + (self.wheelCenterX - self.radius - self.radiusTerm, + self.wheelCenterY - self.radius - self.radiusTerm)) + self.surface.blit(self.dotImage, + (self.wheelCenterX + _x - self.dotRadius, + self.wheelCenterY + _y - self.dotRadius)) + + def Position2HSV(self, x, y) -> (float, float, float): + _theta = atan2(self.wheelCenterY - y, x - self.wheelCenterX) + _h = 90 - degrees(_theta) + _s = min(self.DistToOrigin(x, y), 100) + _v = self.colorHSV[V] + return _h, _s, _v + + def DistToOrigin(self, x, y) -> float: + return sqrt((x - self.wheelCenterX) ** 2 + (y - self.wheelCenterY) ** 2) + + def OnMouseDown(self, button, x, y): + x, y = self.LocalPosition((x, y)) + if self.DistToOrigin(x, y) < self.radius + self.radiusTerm: + self.colorChange = True + + def OnMouseDrag(self, button, x, y, _x, _y): + x, y = self.LocalPosition((x, y)) + if self.colorChange: + self.SetColorHSV(self.Position2HSV(x, y)) + + def OnMouseUp(self, button, x, y): + self.colorChange = False + + diff --git a/src/Section/FrameSection.py b/src/Section/FrameSection.py new file mode 100644 index 0000000..cf1cfb7 --- /dev/null +++ b/src/Section/FrameSection.py @@ -0,0 +1,6 @@ +import pygame as pg +from src.Section._Section import Section + + +class FrameSection(Section): + bgColor = (32, 32, 32) diff --git a/src/Section/PaletteSection.py b/src/Section/PaletteSection.py new file mode 100644 index 0000000..d595868 --- /dev/null +++ b/src/Section/PaletteSection.py @@ -0,0 +1,7 @@ +import pygame as pg +from src.Section._Section import Section + + +class PaletteSection(Section): + bgColor = (43, 43, 43) + diff --git a/src/Section/Section.py b/src/Section/Section.py new file mode 100644 index 0000000..a151ed6 --- /dev/null +++ b/src/Section/Section.py @@ -0,0 +1,13 @@ + +from src.Section.CanvasSection import CanvasSection +from src.Section.PaletteSection import PaletteSection +from src.Section.FrameSection import FrameSection +from src.Section.ColorSection import ColorSection +from src.Section._Section import Section + + +CanvasSection = CanvasSection() +PaletteSection = PaletteSection() +FrameSection = FrameSection() +ColorSection = ColorSection() +Empty = Section() diff --git a/src/Section/_Section.py b/src/Section/_Section.py new file mode 100644 index 0000000..f6fd9e3 --- /dev/null +++ b/src/Section/_Section.py @@ -0,0 +1,62 @@ +import pygame as pg + + +class Section: + x: int + y: int + w: int + h: int + centerX: int + centerY: int + bgColor: (int, int, int) + rect: pg.Rect + surface: pg.Surface + _hasChange: bool + + _outlineColor = (255, 255, 255) + term = 5 + + def Setup(self, x, y, w, h): + self.x = x + self.term + self.y = y + self.term + self.w = w - self.term * 2 + self.h = h - self.term * 2 + self.centerX = self.w // 2 + self.centerY = self.h // 2 + self.rect = pg.Rect(self.x, self.y, self.w, self.h) + self.surface = pg.Surface((self.w, self.h), pg.SRCALPHA, 32) + self._hasChange = True + + def SetBackgroundColor(self, color): + self.bgColor = color + + def OnMouseDown(self, button, x, y): + pass + + def OnMouseDrag(self, button, x, y, _x, _y): + pass + + def OnMouseUp(self, button, x, y): + pass + + def Changed(self): + self._hasChange = True + + def Draw(self, screen): + if self._hasChange: + self.Update() + screen.blit(self.surface, (self.x, self.y)) + pg.display.update(pg.draw.rect(screen, self._outlineColor, self.rect, 3)) + self._hasChange = False + + def IsClicked(self, mousePos) -> bool: + return self.rect.collidepoint(*mousePos) + + def LocalPosition(self, position) -> (int, int): + _x, _y = position + return _x - self.x, _y - self.y + + def Update(self): + self.surface.fill(self.bgColor) + + diff --git a/src/TestSection.py b/src/TestSection.py index 220aabc..b73411c 100644 --- a/src/TestSection.py +++ b/src/TestSection.py @@ -1,5 +1,5 @@ import pygame as pg -from src.Section import ColorSection +from src.Section.Section import ColorSection section = ColorSection @@ -10,14 +10,32 @@ screen = pg.display.set_mode((w, h)) mouseX, mouseY = 0, 0 +preX, preY = 0, 0 + +mouse = [0, 0, 0, 0] while 1: + preX, preY = mouseX, mouseY mouseX, mouseY = pg.mouse.get_pos() for e in pg.event.get(): if e.type == pg.QUIT: pg.quit() quit() + elif e.type == pg.MOUSEBUTTONDOWN: section.OnMouseDown(e.button, mouseX, mouseY) + if e.button < 3: + mouse[e.button] = 1 + preX, preY = mouseX, mouseY + + elif e.type == pg.MOUSEBUTTONUP: + section.OnMouseUp(e.button, mouseX, mouseY) + if e.button < 3: + mouse[e.button] = 0 + + for i in range(1, len(mouse)): + if mouse[i]: + section.OnMouseDrag(i, mouseX, mouseY, preX, preY) + section.Draw(screen) diff --git a/src/Window.py b/src/Window.py index c9ff390..409a32a 100644 --- a/src/Window.py +++ b/src/Window.py @@ -1,6 +1,6 @@ import pygame as pg from pygame.locals import * -from src.Section import CanvasSection, PaletteSection, FrameSection, ColorSection, Empty +from src.Section.Section import CanvasSection, PaletteSection, FrameSection, ColorSection, Empty from src.Brush import Brush @@ -14,6 +14,7 @@ class MainWindow: fps = 126 originX, originY = 250, h - 200 + _diff = 200 Brush.SetBrush('Pencil') # ----- for test ----- @@ -22,9 +23,9 @@ class MainWindow: CanvasSection.Setup(originX, 0, w - originX, originY) CanvasSection.SetupCanvas(64, 64) - PaletteSection.Setup(0, 0, originX, originY - 200) + PaletteSection.Setup(0, 0, originX, originY - _diff) FrameSection.Setup(originX, originY, w - originX, h - originY) - ColorSection.Setup(0, originY - 200, originX, h - originY + 200) + ColorSection.Setup(0, originY - _diff, originX, h - originY + _diff) # ----- for test ----- # sprite = Canvas.Empty(20, 15, (0, 0, 0, 255)) diff --git a/src/data/hue4.png b/src/data/hue4.png new file mode 100644 index 0000000000000000000000000000000000000000..1d73ae9d987dffd41a95606d51d7ef0eaca19a82 GIT binary patch literal 22737 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 int: if len(color) == 4: _r, _g, _b, _a = color