mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-12 05:36:59 -04:00
Implemented ContourMask (mask for text fields)
git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@251 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 290 B After Width: | Height: | Size: 386 B |
+5
-3
@@ -155,9 +155,11 @@ class ContourMask {
|
|||||||
~ContourMask();
|
~ContourMask();
|
||||||
|
|
||||||
/// Load a contour mask
|
/// Load a contour mask
|
||||||
void load(const String& filename);
|
void load(const Image& image);
|
||||||
/// Unload the mask
|
/// Unload the mask
|
||||||
void unload();
|
void unload();
|
||||||
|
/// Is a mask loaded?
|
||||||
|
inline bool ok() const { return width > 0 && height > 0; }
|
||||||
|
|
||||||
/// Returns the start of a row, when the mask were stretched to size
|
/// Returns the start of a row, when the mask were stretched to size
|
||||||
double rowLeft (double y, RealSize size) const;
|
double rowLeft (double y, RealSize size) const;
|
||||||
@@ -165,8 +167,8 @@ class ContourMask {
|
|||||||
double rowRight(double y, RealSize size) const;
|
double rowRight(double y, RealSize size) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
UInt width, height;
|
int width, height;
|
||||||
UInt *lefts, *rights;
|
int *lefts, *rights;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- : Color utility functions
|
// ----------------------------------------------------------------------------- : Color utility functions
|
||||||
|
|||||||
@@ -49,3 +49,53 @@ bool AlphaMask::isTransparent(int x, int y) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- : ContourMask
|
// ----------------------------------------------------------------------------- : ContourMask
|
||||||
|
|
||||||
|
ContourMask::ContourMask()
|
||||||
|
: width(0), height(0), lefts(nullptr), rights(nullptr)
|
||||||
|
{}
|
||||||
|
ContourMask::~ContourMask() {
|
||||||
|
unload();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContourMask::load(const Image& image) {
|
||||||
|
unload();
|
||||||
|
width = image.GetWidth();
|
||||||
|
height = image.GetHeight();
|
||||||
|
lefts = new int[height];
|
||||||
|
rights = new int[height];
|
||||||
|
// for each row: determine left and rightmost white pixel
|
||||||
|
Byte* data = image.GetData();
|
||||||
|
for (int y = 0 ; y < height ; ++y) {
|
||||||
|
lefts[y] = width; rights[y] = width;
|
||||||
|
for (int x = 0 ; x < width ; ++x) {
|
||||||
|
int v = data[0] + data[1] + data[2];
|
||||||
|
if (v > 50) { // white enough
|
||||||
|
rights[y] = x;
|
||||||
|
if (x < lefts[y]) lefts[y] = x;
|
||||||
|
}
|
||||||
|
data += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContourMask::unload() {
|
||||||
|
delete lefts;
|
||||||
|
delete rights;
|
||||||
|
lefts = rights = nullptr;
|
||||||
|
width = height = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
double ContourMask::rowLeft (double y, RealSize size) const {
|
||||||
|
if (!ok() || y < 0 || y >= size.height) {
|
||||||
|
// no mask, or outside it
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return lefts[(int)(y * size.height / height)] * size.width / width;
|
||||||
|
}
|
||||||
|
double ContourMask::rowRight(double y, RealSize size) const {
|
||||||
|
if (!ok() || y < 0 || y >= size.height) {
|
||||||
|
// no mask, or outside it
|
||||||
|
return size.width;
|
||||||
|
}
|
||||||
|
return rights[(int)(y * size.height / height)] * size.width / width;
|
||||||
|
}
|
||||||
|
|||||||
@@ -468,6 +468,11 @@ bool TextViewer::prepareLinesScale(RotatedDC& dc, const vector<CharInfo>& chars,
|
|||||||
line.separator_after = false;
|
line.separator_after = false;
|
||||||
// reset line_size
|
// reset line_size
|
||||||
line_size = RealSize(lineLeft(dc, style, line.top), 0);
|
line_size = RealSize(lineLeft(dc, style, line.top), 0);
|
||||||
|
while (line.top < style.height && line_size.width + 1 >= style.width - style.padding_right) {
|
||||||
|
// nothing fits on this line, move down one pixel
|
||||||
|
line.top += 1;
|
||||||
|
line_size = RealSize(lineLeft(dc, style, line.top), 0);
|
||||||
|
}
|
||||||
line.positions.push_back(line_size.width); // start position
|
line.positions.push_back(line_size.width); // start position
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -487,17 +492,12 @@ bool TextViewer::prepareLinesScale(RotatedDC& dc, const vector<CharInfo>& chars,
|
|||||||
}
|
}
|
||||||
|
|
||||||
double TextViewer::lineLeft(RotatedDC& dc, const TextStyle& style, double y) {
|
double TextViewer::lineLeft(RotatedDC& dc, const TextStyle& style, double y) {
|
||||||
return 0 + style.padding_left;
|
return style.mask.rowLeft(y, dc.getInternalSize()) + style.padding_left;
|
||||||
// return style.mask.rowLeft(y, dc.getInternalSize()) + style.padding_left;
|
|
||||||
}
|
}
|
||||||
double TextViewer::lineRight(RotatedDC& dc, const TextStyle& style, double y) {
|
double TextViewer::lineRight(RotatedDC& dc, const TextStyle& style, double y) {
|
||||||
return style.width - style.padding_right;
|
return style.mask.rowRight(y, dc.getInternalSize()) - style.padding_right;
|
||||||
// return style.mask.rowRight(y, dc.getInternalSize()) - style.padding_right;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ContourMask::ContourMask() {} // MOVEME //@@
|
|
||||||
ContourMask::~ContourMask() {}
|
|
||||||
|
|
||||||
void TextViewer::alignLines(RotatedDC& dc, const vector<CharInfo>& chars, const TextStyle& style) {
|
void TextViewer::alignLines(RotatedDC& dc, const vector<CharInfo>& chars, const TextStyle& style) {
|
||||||
if (style.alignment == ALIGN_TOP_LEFT) return;
|
if (style.alignment == ALIGN_TOP_LEFT) return;
|
||||||
// Find height of the text, don't count the last lines if they are empty
|
// Find height of the text, don't count the last lines if they are empty
|
||||||
|
|||||||
@@ -8,10 +8,19 @@
|
|||||||
|
|
||||||
#include <render/value/text.hpp>
|
#include <render/value/text.hpp>
|
||||||
#include <render/card/viewer.hpp>
|
#include <render/card/viewer.hpp>
|
||||||
|
#include <data/stylesheet.hpp>
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- : TextValueViewer
|
// ----------------------------------------------------------------------------- : TextValueViewer
|
||||||
|
|
||||||
void TextValueViewer::draw(RotatedDC& dc) {
|
void TextValueViewer::draw(RotatedDC& dc) {
|
||||||
|
if (!style().mask_filename.empty() && !style().mask.ok()) {
|
||||||
|
// load contour mask
|
||||||
|
Image image;
|
||||||
|
InputStreamP image_file = viewer.stylesheet->openIn(style().mask_filename);
|
||||||
|
if (image.LoadFile(*image_file)) {
|
||||||
|
style().mask.load(image);
|
||||||
|
}
|
||||||
|
}
|
||||||
drawFieldBorder(dc);
|
drawFieldBorder(dc);
|
||||||
v.prepare(dc, value().value(), style(), viewer.getContext());
|
v.prepare(dc, value().value(), style(), viewer.getContext());
|
||||||
v.draw(dc, style(), (DrawWhat)(
|
v.draw(dc, style(), (DrawWhat)(
|
||||||
|
|||||||
Reference in New Issue
Block a user