@startuml skinparam packageStyle rectangle ' ============================ ' PACKAGE mimage (MODEL - BLEU) ' ============================ package mimage { class Pixel #aliceblue { - r : int - g : int - b : int + Pixel(r, g, b) + getR() + getG() + getB() + setR(r) + setG(g) + setB(b) } class RGBImage #aliceblue { - width : int - height : int - pixels : Pixel[*] + RGBImage(width, height) + getWidth() + getHeight() + getPixel(x, y) + setPixel(x, y, p) } } RGBImage *-- Pixel : contient ' ============================ ' PACKAGE mhuffman (MODEL - BLEU) ' ============================ package mhuffman { class FrequencyTable #aliceblue { - freqR : int[*] - freqG : int[*] - freqB : int[*] + computeFromImage(img) + getRed() + getGreen() + getBlue() } class HuffmanNode #aliceblue { + value : int + frequency : int + left : HuffmanNode + right : HuffmanNode + isLeaf() } class HuffmanTree #aliceblue { - root : HuffmanNode + generateCodes() } class CanonicalCode #aliceblue { - codeLengths : Map - canonicalCodes : Map + getCode(value) + getLength(value) } } FrequencyTable ..> RGBImage : analyse HuffmanTree *-- HuffmanNode CanonicalCode ..> HuffmanTree : dérive ' ============================ ' PACKAGE util (MODEL - BLEU) ' ============================ package util { class BitInputStream #aliceblue { - fluxEntree - octetCourant : int - positionBit : int - finDeFlux : boolean + BitInputStream(fluxEntree) + readBit() : int + readBits(nombreBits) : int + closeFlux() } class BitOutputStream #aliceblue { - fluxSortie - octetEnConstruction : int - positionBit : int - fluxFerme : boolean + BitOutputStream(fluxSortie) + writeBit(bit) + writeBits(valeur, nombreBits) + flush() + fermerFlux() } class ByteUtils #aliceblue { <> + toInt(high, low) : int + toBytes(value) : byte[] } class FileUtils #aliceblue { <> + isPIFFile(f) : boolean + readBinaryFile(path) } } ' ============================ ' PACKAGE mpif (MODEL - BLEU) — Sprint 2 ' ============================ package mpif { class PIFWriter #aliceblue { + writeHeader(out, width, height) + writeTables(out, red, green, blue) + encodePixels(out, img, red, green, blue) + writeToFile(path, img, red, green, blue) } ' (optionnel) PIFImage si tu souhaite la représenter class PIFImage #aliceblue { - width : int - height : int - lenR : int[*] - lenG : int[*] - lenB : int[*] - pixelData } } PIFWriter ..> RGBImage PIFWriter ..> CanonicalCode PIFWriter ..> BitOutputStream ' ============================ ' PACKAGE vconverter (VIEW - VERT) ' ============================ package vconverter { class ConverterWindow #palegreen { + setImagePreview(img) + setFrequencyTable() + setHuffmanTable() + setCanonicalTable() } class PreviewPanel #palegreen { - image + setImage(img) } class FrequencyTablePanel #palegreen { + updateFrequencies() } class CodeTablePanel #palegreen { + updateCodes() } ConverterWindow *-- PreviewPanel ConverterWindow *-- FrequencyTablePanel ConverterWindow *-- CodeTablePanel } ' ============================ ' CONTROLLER (ORANGE) ' ============================ class ConverterController #ffddaa { + loadImage(path) + computeFrequencies() + computeHuffman() + computeCanonical() + saveAsPIF(path) } ConverterController ..> RGBImage ConverterController ..> FrequencyTable ConverterController ..> HuffmanTree ConverterController ..> CanonicalCode ConverterController ..> PIFWriter : écrit le .pif @enduml