mirror of
https://github.com/aseprite/aseprite.git
synced 2025-02-11 09:40:42 +00:00
Merge branch 'main' into beta
This commit is contained in:
commit
83857ea600
@ -32,12 +32,12 @@
|
|||||||
<value id="FULLNEDGES" value="4" />
|
<value id="FULLNEDGES" value="4" />
|
||||||
</enum>
|
</enum>
|
||||||
<enum id="BgType">
|
<enum id="BgType">
|
||||||
<value id="CHECKED_16x16" value="0" />
|
<value id="CHECKERED_16x16" value="0" />
|
||||||
<value id="CHECKED_8x8" value="1" />
|
<value id="CHECKERED_8x8" value="1" />
|
||||||
<value id="CHECKED_4x4" value="2" />
|
<value id="CHECKERED_4x4" value="2" />
|
||||||
<value id="CHECKED_2x2" value="3" />
|
<value id="CHECKERED_2x2" value="3" />
|
||||||
<value id="CHECKED_1x1" value="4" />
|
<value id="CHECKERED_1x1" value="4" />
|
||||||
<value id="CHECKED_CUSTOM" value="5" />
|
<value id="CHECKERED_CUSTOM" value="5" />
|
||||||
</enum>
|
</enum>
|
||||||
<enum id="StopAtGrid">
|
<enum id="StopAtGrid">
|
||||||
<value id="NEVER" value="0" />
|
<value id="NEVER" value="0" />
|
||||||
@ -479,7 +479,7 @@
|
|||||||
<option id="auto_opacity" type="bool" default="true" />
|
<option id="auto_opacity" type="bool" default="true" />
|
||||||
</section>
|
</section>
|
||||||
<section id="bg" canforce="true">
|
<section id="bg" canforce="true">
|
||||||
<option id="type" type="BgType" default="BgType::CHECKED_16x16" />
|
<option id="type" type="BgType" default="BgType::CHECKERED_16x16" />
|
||||||
<option id="size" type="gfx::Size" default="gfx::Size(16, 16)" />
|
<option id="size" type="gfx::Size" default="gfx::Size(16, 16)" />
|
||||||
<option id="zoom" type="bool" default="true" />
|
<option id="zoom" type="bool" default="true" />
|
||||||
<option id="color1" type="app::Color" default="app::Color::fromRgb(128, 128, 128)" />
|
<option id="color1" type="app::Color" default="app::Color::fromRgb(128, 128, 128)" />
|
||||||
|
@ -1321,7 +1321,7 @@ brush_preview_fullnedges = Full Preview and Edges
|
|||||||
cursor_color_type = Crosshair && Brush Edges Color:
|
cursor_color_type = Crosshair && Brush Edges Color:
|
||||||
cursor_neg_bw = Negative Black and White
|
cursor_neg_bw = Negative Black and White
|
||||||
cursor_specific_color = Specific Color
|
cursor_specific_color = Specific Color
|
||||||
bg_checked = Checked Background
|
bg_checkered = Checkered Background
|
||||||
bg_size = Size:
|
bg_size = Size:
|
||||||
bg_apply_zoom = Apply Zoom
|
bg_apply_zoom = Apply Zoom
|
||||||
bg_colors = Colors:
|
bg_colors = Colors:
|
||||||
|
@ -317,20 +317,20 @@
|
|||||||
<vbox id="section_bg">
|
<vbox id="section_bg">
|
||||||
<combobox id="bg_scope" />
|
<combobox id="bg_scope" />
|
||||||
|
|
||||||
<separator text="@.bg_checked" horizontal="true" />
|
<separator text="@.bg_checkered" horizontal="true" />
|
||||||
<grid columns="2">
|
<grid columns="2">
|
||||||
<label text="@.bg_size" />
|
<label text="@.bg_size" />
|
||||||
<hbox>
|
<hbox>
|
||||||
<combobox id="checked_bg_size" />
|
<combobox id="checkered_bg_size" />
|
||||||
<expr id="checked_bg_custom_w" />
|
<expr id="checkered_bg_custom_w" />
|
||||||
<expr id="checked_bg_custom_h" />
|
<expr id="checkered_bg_custom_h" />
|
||||||
<check text="@.bg_apply_zoom" id="checked_bg_zoom" />
|
<check text="@.bg_apply_zoom" id="checkered_bg_zoom" />
|
||||||
</hbox>
|
</hbox>
|
||||||
|
|
||||||
<label text="@.bg_colors" />
|
<label text="@.bg_colors" />
|
||||||
<hbox>
|
<hbox>
|
||||||
<colorpicker id="checked_bg_color1" rgba="true" />
|
<colorpicker id="checkered_bg_color1" rgba="true" />
|
||||||
<colorpicker id="checked_bg_color2" rgba="true" />
|
<colorpicker id="checkered_bg_color2" rgba="true" />
|
||||||
</hbox>
|
</hbox>
|
||||||
</grid>
|
</grid>
|
||||||
|
|
||||||
|
2
laf
2
laf
@ -1 +1 @@
|
|||||||
Subproject commit a1982c4cea9f69742b9b8a03a4b97ce6964ad5d3
|
Subproject commit 858acb25f0fc645e52ff64d5a00378d2fdb81202
|
@ -88,7 +88,7 @@ void FlattenLayers::onExecute()
|
|||||||
|
|
||||||
render::Render render;
|
render::Render render;
|
||||||
render.setNewBlend(m_newBlendMethod);
|
render.setNewBlend(m_newBlendMethod);
|
||||||
render.setBgType(render::BgType::NONE);
|
render.setBgOptions(render::BgOptions::MakeNone());
|
||||||
|
|
||||||
{
|
{
|
||||||
// Show only the layers to be flattened so other layers are hidden
|
// Show only the layers to be flattened so other layers are hidden
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// Aseprite
|
// Aseprite
|
||||||
// Copyright (C) 2018-2021 Igara Studio S.A.
|
// Copyright (C) 2018-2022 Igara Studio S.A.
|
||||||
// Copyright (C) 2001-2018 David Capello
|
// Copyright (C) 2001-2018 David Capello
|
||||||
//
|
//
|
||||||
// This program is distributed under the terms of
|
// This program is distributed under the terms of
|
||||||
@ -154,7 +154,7 @@ protected:
|
|||||||
else if (keyMsg->scancode() == kKeyMinusPad ||
|
else if (keyMsg->scancode() == kKeyMinusPad ||
|
||||||
keyMsg->unicodeChar() == '-') {
|
keyMsg->unicodeChar() == '-') {
|
||||||
if (m_index_bg_color >= 0) {
|
if (m_index_bg_color >= 0) {
|
||||||
--m_index_bg_color; // can be -1 which is the checked background
|
--m_index_bg_color; // can be -1 which is the checkered background
|
||||||
|
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
@ -205,9 +205,10 @@ protected:
|
|||||||
render.setProjection(m_proj);
|
render.setProjection(m_proj);
|
||||||
if (m_index_bg_color == -1) {
|
if (m_index_bg_color == -1) {
|
||||||
render.setupBackground(m_doc, m_doublebuf->pixelFormat());
|
render.setupBackground(m_doc, m_doublebuf->pixelFormat());
|
||||||
render.renderCheckedBackground(m_doublebuf.get(),
|
render.renderCheckeredBackground(
|
||||||
|
m_doublebuf.get(),
|
||||||
gfx::Clip(0, 0, -m_pos.x, -m_pos.y,
|
gfx::Clip(0, 0, -m_pos.x, -m_pos.y,
|
||||||
m_doublebuf->width(), m_doublebuf->height()));
|
m_doublebuf->width(), m_doublebuf->height()));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
doc::clear_image(m_doublebuf.get(), m_pal->getEntry(m_index_bg_color));
|
doc::clear_image(m_doublebuf.get(), m_pal->getEntry(m_index_bg_color));
|
||||||
|
@ -351,7 +351,7 @@ void NewLayerCommand::onExecute(Context* context)
|
|||||||
Sprite* pasteSpr = pasteDoc->sprite();
|
Sprite* pasteSpr = pasteDoc->sprite();
|
||||||
render::Render render;
|
render::Render render;
|
||||||
render.setNewBlend(true);
|
render.setNewBlend(true);
|
||||||
render.setBgType(render::BgType::NONE);
|
render.setBgOptions(render::BgOptions::MakeNone());
|
||||||
|
|
||||||
// Add more frames at the end
|
// Add more frames at the end
|
||||||
if (writer.frame()+pasteSpr->lastFrame() > sprite->lastFrame())
|
if (writer.frame()+pasteSpr->lastFrame() > sprite->lastFrame())
|
||||||
|
@ -539,17 +539,17 @@ public:
|
|||||||
slideZoom()->setVisible(false);
|
slideZoom()->setVisible(false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Checked background size
|
// Checkered background size
|
||||||
static_assert(int(app::gen::BgType::CHECKED_16x16) == 0, "");
|
static_assert(int(app::gen::BgType::CHECKERED_16x16) == 0, "");
|
||||||
static_assert(int(app::gen::BgType::CHECKED_1x1) == 4, "");
|
static_assert(int(app::gen::BgType::CHECKERED_1x1) == 4, "");
|
||||||
static_assert(int(app::gen::BgType::CHECKED_CUSTOM) == 5, "");
|
static_assert(int(app::gen::BgType::CHECKERED_CUSTOM) == 5, "");
|
||||||
checkedBgSize()->addItem("16x16");
|
checkeredBgSize()->addItem("16x16");
|
||||||
checkedBgSize()->addItem("8x8");
|
checkeredBgSize()->addItem("8x8");
|
||||||
checkedBgSize()->addItem("4x4");
|
checkeredBgSize()->addItem("4x4");
|
||||||
checkedBgSize()->addItem("2x2");
|
checkeredBgSize()->addItem("2x2");
|
||||||
checkedBgSize()->addItem("1x1");
|
checkeredBgSize()->addItem("1x1");
|
||||||
checkedBgSize()->addItem("Custom");
|
checkeredBgSize()->addItem("Custom");
|
||||||
checkedBgSize()->Change.connect([this]{ onCheckedBgSizeChange(); });
|
checkeredBgSize()->Change.connect([this]{ onCheckeredBgSizeChange(); });
|
||||||
|
|
||||||
// Reset buttons
|
// Reset buttons
|
||||||
resetBg()->Click.connect([this]{ onResetBg(); });
|
resetBg()->Click.connect([this]{ onResetBg(); });
|
||||||
@ -761,15 +761,15 @@ public:
|
|||||||
m_curPref->pixelGrid.opacity(pixelGridOpacity()->getValue());
|
m_curPref->pixelGrid.opacity(pixelGridOpacity()->getValue());
|
||||||
m_curPref->pixelGrid.autoOpacity(pixelGridAutoOpacity()->isSelected());
|
m_curPref->pixelGrid.autoOpacity(pixelGridAutoOpacity()->isSelected());
|
||||||
|
|
||||||
m_curPref->bg.type(app::gen::BgType(checkedBgSize()->getSelectedItemIndex()));
|
m_curPref->bg.type(app::gen::BgType(checkeredBgSize()->getSelectedItemIndex()));
|
||||||
if (m_curPref->bg.type() == app::gen::BgType::CHECKED_CUSTOM) {
|
if (m_curPref->bg.type() == app::gen::BgType::CHECKERED_CUSTOM) {
|
||||||
m_curPref->bg.size(gfx::Size(
|
m_curPref->bg.size(gfx::Size(
|
||||||
checkedBgCustomW()->textInt(),
|
checkeredBgCustomW()->textInt(),
|
||||||
checkedBgCustomH()->textInt()));
|
checkeredBgCustomH()->textInt()));
|
||||||
}
|
}
|
||||||
m_curPref->bg.zoom(checkedBgZoom()->isSelected());
|
m_curPref->bg.zoom(checkeredBgZoom()->isSelected());
|
||||||
m_curPref->bg.color1(checkedBgColor1()->getColor());
|
m_curPref->bg.color1(checkeredBgColor1()->getColor());
|
||||||
m_curPref->bg.color2(checkedBgColor2()->getColor());
|
m_curPref->bg.color2(checkeredBgColor2()->getColor());
|
||||||
|
|
||||||
// Alerts preferences
|
// Alerts preferences
|
||||||
m_pref.openFile.openSequence(gen::SequenceDecision(openSequence()->getSelectedItemIndex()));
|
m_pref.openFile.openSequence(gen::SequenceDecision(openSequence()->getSelectedItemIndex()));
|
||||||
@ -1001,7 +1001,6 @@ private:
|
|||||||
if (!item)
|
if (!item)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
panel()->showChild(findChild(item->getValue().c_str()));
|
|
||||||
m_curSection = sectionListbox()->getSelectedIndex();
|
m_curSection = sectionListbox()->getSelectedIndex();
|
||||||
|
|
||||||
// General section
|
// General section
|
||||||
@ -1019,6 +1018,8 @@ private:
|
|||||||
// Load extension
|
// Load extension
|
||||||
else if (item->getValue() == kSectionExtensionsId)
|
else if (item->getValue() == kSectionExtensionsId)
|
||||||
loadExtensions();
|
loadExtensions();
|
||||||
|
|
||||||
|
panel()->showChild(findChild(item->getValue().c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void onClearRecentFiles() {
|
void onClearRecentFiles() {
|
||||||
@ -1132,24 +1133,24 @@ private:
|
|||||||
case 1: m_curPref = &m_docPref; break;
|
case 1: m_curPref = &m_docPref; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
checkedBgSize()->setSelectedItemIndex(int(m_curPref->bg.type()));
|
checkeredBgSize()->setSelectedItemIndex(int(m_curPref->bg.type()));
|
||||||
checkedBgZoom()->setSelected(m_curPref->bg.zoom());
|
checkeredBgZoom()->setSelected(m_curPref->bg.zoom());
|
||||||
checkedBgColor1()->setColor(m_curPref->bg.color1());
|
checkeredBgColor1()->setColor(m_curPref->bg.color1());
|
||||||
checkedBgColor2()->setColor(m_curPref->bg.color2());
|
checkeredBgColor2()->setColor(m_curPref->bg.color2());
|
||||||
|
|
||||||
onCheckedBgSizeChange();
|
onCheckeredBgSizeChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
void onCheckedBgSizeChange() {
|
void onCheckeredBgSizeChange() {
|
||||||
if (checkedBgSize()->getSelectedItemIndex() == int(app::gen::BgType::CHECKED_CUSTOM)) {
|
if (checkeredBgSize()->getSelectedItemIndex() == int(app::gen::BgType::CHECKERED_CUSTOM)) {
|
||||||
checkedBgCustomW()->setTextf("%d", m_curPref->bg.size().w);
|
checkeredBgCustomW()->setTextf("%d", m_curPref->bg.size().w);
|
||||||
checkedBgCustomH()->setTextf("%d", m_curPref->bg.size().h);
|
checkeredBgCustomH()->setTextf("%d", m_curPref->bg.size().h);
|
||||||
checkedBgCustomW()->setVisible(true);
|
checkeredBgCustomW()->setVisible(true);
|
||||||
checkedBgCustomH()->setVisible(true);
|
checkeredBgCustomH()->setVisible(true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
checkedBgCustomW()->setVisible(false);
|
checkeredBgCustomW()->setVisible(false);
|
||||||
checkedBgCustomH()->setVisible(false);
|
checkeredBgCustomH()->setVisible(false);
|
||||||
}
|
}
|
||||||
sectionBg()->layout();
|
sectionBg()->layout();
|
||||||
}
|
}
|
||||||
@ -1183,19 +1184,19 @@ private:
|
|||||||
|
|
||||||
// Reset global preferences (use default values specified in pref.xml)
|
// Reset global preferences (use default values specified in pref.xml)
|
||||||
if (m_curPref == &m_globPref) {
|
if (m_curPref == &m_globPref) {
|
||||||
checkedBgSize()->setSelectedItemIndex(int(pref.bg.type.defaultValue()));
|
checkeredBgSize()->setSelectedItemIndex(int(pref.bg.type.defaultValue()));
|
||||||
checkedBgCustomW()->setVisible(false);
|
checkeredBgCustomW()->setVisible(false);
|
||||||
checkedBgCustomH()->setVisible(false);
|
checkeredBgCustomH()->setVisible(false);
|
||||||
checkedBgZoom()->setSelected(pref.bg.zoom.defaultValue());
|
checkeredBgZoom()->setSelected(pref.bg.zoom.defaultValue());
|
||||||
checkedBgColor1()->setColor(pref.bg.color1.defaultValue());
|
checkeredBgColor1()->setColor(pref.bg.color1.defaultValue());
|
||||||
checkedBgColor2()->setColor(pref.bg.color2.defaultValue());
|
checkeredBgColor2()->setColor(pref.bg.color2.defaultValue());
|
||||||
}
|
}
|
||||||
// Reset document preferences with global settings
|
// Reset document preferences with global settings
|
||||||
else {
|
else {
|
||||||
checkedBgSize()->setSelectedItemIndex(int(pref.bg.type()));
|
checkeredBgSize()->setSelectedItemIndex(int(pref.bg.type()));
|
||||||
checkedBgZoom()->setSelected(pref.bg.zoom());
|
checkeredBgZoom()->setSelected(pref.bg.zoom());
|
||||||
checkedBgColor1()->setColor(pref.bg.color1());
|
checkeredBgColor1()->setColor(pref.bg.color1());
|
||||||
checkedBgColor2()->setColor(pref.bg.color2());
|
checkeredBgColor2()->setColor(pref.bg.color2());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,8 +146,7 @@ public:
|
|||||||
|
|
||||||
render::Render render;
|
render::Render render;
|
||||||
render.setNewBlend(m_newBlend);
|
render.setNewBlend(m_newBlend);
|
||||||
render.setBgType(render::BgType::NONE);
|
render.setBgOptions(render::BgOptions::MakeNone());
|
||||||
|
|
||||||
render.renderSprite(
|
render.renderSprite(
|
||||||
(needResize ? m_tmpUnscaledRender.get(): dst),
|
(needResize ? m_tmpUnscaledRender.get(): dst),
|
||||||
m_sprite, frame);
|
m_sprite, frame);
|
||||||
|
@ -43,11 +43,11 @@ using namespace gfx;
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
void draw_checked_grid(ui::Graphics* g,
|
void draw_checkered_grid(ui::Graphics* g,
|
||||||
const gfx::Rect& rc,
|
const gfx::Rect& rc,
|
||||||
const gfx::Size& tile,
|
const gfx::Size& tile,
|
||||||
const gfx::Color c1,
|
const gfx::Color c1,
|
||||||
const gfx::Color c2)
|
const gfx::Color c2)
|
||||||
{
|
{
|
||||||
if (tile.w < 1 || tile.h < 1)
|
if (tile.w < 1 || tile.h < 1)
|
||||||
return;
|
return;
|
||||||
@ -93,19 +93,19 @@ gfx::Color grid_color2()
|
|||||||
return gfx::rgba(192, 192, 192);
|
return gfx::rgba(192, 192, 192);
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_checked_grid(ui::Graphics* g,
|
void draw_checkered_grid(ui::Graphics* g,
|
||||||
const gfx::Rect& rc,
|
const gfx::Rect& rc,
|
||||||
const gfx::Size& tile)
|
const gfx::Size& tile)
|
||||||
{
|
{
|
||||||
draw_checked_grid(g, rc, tile, grid_color1(), grid_color2());
|
draw_checkered_grid(g, rc, tile, grid_color1(), grid_color2());
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_checked_grid(ui::Graphics* g,
|
void draw_checkered_grid(ui::Graphics* g,
|
||||||
const gfx::Rect& rc,
|
const gfx::Rect& rc,
|
||||||
const gfx::Size& tile,
|
const gfx::Size& tile,
|
||||||
DocumentPreferences& docPref)
|
DocumentPreferences& docPref)
|
||||||
{
|
{
|
||||||
draw_checked_grid(g, rc, tile, grid_color1(), grid_color2());
|
draw_checkered_grid(g, rc, tile, grid_color1(), grid_color2());
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_color(ui::Graphics* g,
|
void draw_color(ui::Graphics* g,
|
||||||
@ -124,9 +124,9 @@ void draw_color(ui::Graphics* g,
|
|||||||
|
|
||||||
if (alpha < 255) {
|
if (alpha < 255) {
|
||||||
if (rc.w == rc.h)
|
if (rc.w == rc.h)
|
||||||
draw_checked_grid(g, rc, gfx::Size(rc.w/2, rc.h/2));
|
draw_checkered_grid(g, rc, gfx::Size(rc.w/2, rc.h/2));
|
||||||
else
|
else
|
||||||
draw_checked_grid(g, rc, gfx::Size(rc.w/4, rc.h/2));
|
draw_checkered_grid(g, rc, gfx::Size(rc.w/4, rc.h/2));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (alpha > 0) {
|
if (alpha > 0) {
|
||||||
@ -206,7 +206,7 @@ void draw_tile(ui::Graphics* g,
|
|||||||
if (rc.w < 1 || rc.h < 1)
|
if (rc.w < 1 || rc.h < 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
draw_checked_grid(g, rc, gfx::Size(rc.w/2, rc.h/2));
|
draw_checkered_grid(g, rc, gfx::Size(rc.w/2, rc.h/2));
|
||||||
|
|
||||||
if (tile == doc::notile)
|
if (tile == doc::notile)
|
||||||
return;
|
return;
|
||||||
|
@ -31,14 +31,14 @@ namespace app {
|
|||||||
gfx::Color grid_color1();
|
gfx::Color grid_color1();
|
||||||
gfx::Color grid_color2();
|
gfx::Color grid_color2();
|
||||||
|
|
||||||
void draw_checked_grid(ui::Graphics* g,
|
void draw_checkered_grid(ui::Graphics* g,
|
||||||
const gfx::Rect& rc,
|
const gfx::Rect& rc,
|
||||||
const gfx::Size& tile);
|
const gfx::Size& tile);
|
||||||
|
|
||||||
void draw_checked_grid(ui::Graphics* g,
|
void draw_checkered_grid(ui::Graphics* g,
|
||||||
const gfx::Rect& rc,
|
const gfx::Rect& rc,
|
||||||
const gfx::Size& tile,
|
const gfx::Size& tile,
|
||||||
DocumentPreferences& docPref);
|
DocumentPreferences& docPref);
|
||||||
|
|
||||||
void draw_color(ui::Graphics* g,
|
void draw_color(ui::Graphics* g,
|
||||||
const gfx::Rect& rc,
|
const gfx::Rect& rc,
|
||||||
|
@ -136,7 +136,7 @@ private:
|
|||||||
render::Projection proj(sprite->pixelRatio(),
|
render::Projection proj(sprite->pixelRatio(),
|
||||||
render::Zoom(thumb_w, w));
|
render::Zoom(thumb_w, w));
|
||||||
render::Render render;
|
render::Render render;
|
||||||
render.setBgType(render::BgType::TRANSPARENT);
|
render.setBgOptions(render::BgOptions::MakeTransparent());
|
||||||
render.setProjection(proj);
|
render.setProjection(proj);
|
||||||
render.renderSprite(
|
render.renderSprite(
|
||||||
thumbnailImage.get(), sprite, frame_t(0),
|
thumbnailImage.get(), sprite, frame_t(0),
|
||||||
|
@ -726,7 +726,7 @@ void Editor::drawOneSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& sprite
|
|||||||
|
|
||||||
m_renderEngine->removeExtraImage();
|
m_renderEngine->removeExtraImage();
|
||||||
|
|
||||||
// If the checked background is visible in this sprite, we save
|
// If the checkered background is visible in this sprite, we save
|
||||||
// all settings of the background for this document.
|
// all settings of the background for this document.
|
||||||
if (!m_sprite->isOpaque())
|
if (!m_sprite->isOpaque())
|
||||||
m_docPref.bg.forceSection();
|
m_docPref.bg.forceSection();
|
||||||
@ -1035,15 +1035,15 @@ void Editor::drawMask(Graphics* g)
|
|||||||
auto& segs = m_document->maskBoundaries();
|
auto& segs = m_document->maskBoundaries();
|
||||||
segs.createPathIfNeeeded();
|
segs.createPathIfNeeeded();
|
||||||
|
|
||||||
CheckedDrawMode checked(g, m_antsOffset,
|
CheckeredDrawMode checkered(g, m_antsOffset,
|
||||||
gfx::rgba(0, 0, 0, 255),
|
gfx::rgba(0, 0, 0, 255),
|
||||||
gfx::rgba(255, 255, 255, 255));
|
gfx::rgba(255, 255, 255, 255));
|
||||||
os::Paint paint;
|
os::Paint paint;
|
||||||
paint.style(os::Paint::Stroke);
|
paint.style(os::Paint::Stroke);
|
||||||
paint.color(gfx::rgba(0, 0, 0));
|
paint.color(gfx::rgba(0, 0, 0));
|
||||||
|
|
||||||
// We translate the path instead of applying a matrix to the
|
// We translate the path instead of applying a matrix to the
|
||||||
// ui::Graphics so the "checked" pattern is not scaled too.
|
// ui::Graphics so the "checkered" pattern is not scaled too.
|
||||||
gfx::Path path;
|
gfx::Path path;
|
||||||
segs.path().transform(m_proj.scaleMatrix(), &path);
|
segs.path().transform(m_proj.scaleMatrix(), &path);
|
||||||
path.offset(pt.x, pt.y);
|
path.offset(pt.x, pt.y);
|
||||||
@ -1335,7 +1335,7 @@ void Editor::drawCelHGuide(ui::Graphics* g,
|
|||||||
|
|
||||||
// Vertical guide to touch the horizontal line
|
// Vertical guide to touch the horizontal line
|
||||||
{
|
{
|
||||||
CheckedDrawMode checked(g, 0, color, gfx::ColorNone);
|
CheckeredDrawMode checkered(g, 0, color, gfx::ColorNone);
|
||||||
|
|
||||||
if (scrY < scrCmpBounds.y)
|
if (scrY < scrCmpBounds.y)
|
||||||
g->drawVLine(color, dottedX, scrCelBounds.y, scrCmpBounds.y - scrCelBounds.y);
|
g->drawVLine(color, dottedX, scrCelBounds.y, scrCmpBounds.y - scrCelBounds.y);
|
||||||
@ -1361,7 +1361,7 @@ void Editor::drawCelVGuide(ui::Graphics* g,
|
|||||||
|
|
||||||
// Horizontal guide to touch the vertical line
|
// Horizontal guide to touch the vertical line
|
||||||
{
|
{
|
||||||
CheckedDrawMode checked(g, 0, color, gfx::ColorNone);
|
CheckeredDrawMode checkered(g, 0, color, gfx::ColorNone);
|
||||||
|
|
||||||
if (scrX < scrCmpBounds.x)
|
if (scrX < scrCmpBounds.x)
|
||||||
g->drawHLine(color, scrCelBounds.x, dottedY, scrCmpBounds.x - scrCelBounds.x);
|
g->drawHLine(color, scrCelBounds.x, dottedY, scrCmpBounds.x - scrCelBounds.x);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// Aseprite
|
// Aseprite
|
||||||
// Copyright (C) 2019-2020 Igara Studio S.A.
|
// Copyright (C) 2019-2022 Igara Studio S.A.
|
||||||
// Copyright (C) 2018 David Capello
|
// Copyright (C) 2018 David Capello
|
||||||
//
|
//
|
||||||
// This program is distributed under the terms of
|
// This program is distributed under the terms of
|
||||||
@ -57,28 +57,28 @@ void EditorRender::setupBackground(Doc* doc, doc::PixelFormat pixelFormat)
|
|||||||
|
|
||||||
gfx::Size tile;
|
gfx::Size tile;
|
||||||
switch (docPref.bg.type()) {
|
switch (docPref.bg.type()) {
|
||||||
case app::gen::BgType::CHECKED_16x16:
|
case app::gen::BgType::CHECKERED_16x16:
|
||||||
bgType = render::BgType::CHECKED;
|
bgType = render::BgType::CHECKERED;
|
||||||
tile = gfx::Size(16, 16);
|
tile = gfx::Size(16, 16);
|
||||||
break;
|
break;
|
||||||
case app::gen::BgType::CHECKED_8x8:
|
case app::gen::BgType::CHECKERED_8x8:
|
||||||
bgType = render::BgType::CHECKED;
|
bgType = render::BgType::CHECKERED;
|
||||||
tile = gfx::Size(8, 8);
|
tile = gfx::Size(8, 8);
|
||||||
break;
|
break;
|
||||||
case app::gen::BgType::CHECKED_4x4:
|
case app::gen::BgType::CHECKERED_4x4:
|
||||||
bgType = render::BgType::CHECKED;
|
bgType = render::BgType::CHECKERED;
|
||||||
tile = gfx::Size(4, 4);
|
tile = gfx::Size(4, 4);
|
||||||
break;
|
break;
|
||||||
case app::gen::BgType::CHECKED_2x2:
|
case app::gen::BgType::CHECKERED_2x2:
|
||||||
bgType = render::BgType::CHECKED;
|
bgType = render::BgType::CHECKERED;
|
||||||
tile = gfx::Size(2, 2);
|
tile = gfx::Size(2, 2);
|
||||||
break;
|
break;
|
||||||
case app::gen::BgType::CHECKED_1x1:
|
case app::gen::BgType::CHECKERED_1x1:
|
||||||
bgType = render::BgType::CHECKED;
|
bgType = render::BgType::CHECKERED;
|
||||||
tile = gfx::Size(1, 1);
|
tile = gfx::Size(1, 1);
|
||||||
break;
|
break;
|
||||||
case app::gen::BgType::CHECKED_CUSTOM:
|
case app::gen::BgType::CHECKERED_CUSTOM:
|
||||||
bgType = render::BgType::CHECKED;
|
bgType = render::BgType::CHECKERED;
|
||||||
tile = docPref.bg.size();
|
tile = docPref.bg.size();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -86,16 +86,18 @@ void EditorRender::setupBackground(Doc* doc, doc::PixelFormat pixelFormat)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_render->setBgType(bgType);
|
render::BgOptions bg;
|
||||||
m_render->setBgZoom(docPref.bg.zoom());
|
bg.type = bgType;
|
||||||
m_render->setBgColor1(color_utils::color_for_image_without_alpha(docPref.bg.color1(), pixelFormat));
|
bg.zoom = docPref.bg.zoom();
|
||||||
m_render->setBgColor2(color_utils::color_for_image_without_alpha(docPref.bg.color2(), pixelFormat));
|
bg.color1 = color_utils::color_for_image_without_alpha(docPref.bg.color1(), pixelFormat);
|
||||||
m_render->setBgCheckedSize(tile);
|
bg.color2 = color_utils::color_for_image_without_alpha(docPref.bg.color2(), pixelFormat);
|
||||||
|
bg.stripeSize = tile;
|
||||||
|
m_render->setBgOptions(bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorRender::setTransparentBackground()
|
void EditorRender::setTransparentBackground()
|
||||||
{
|
{
|
||||||
m_render->setBgType(render::BgType::TRANSPARENT);
|
m_render->setBgOptions(render::BgOptions::MakeTransparent());
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorRender::setSelectedLayer(const doc::Layer* layer)
|
void EditorRender::setSelectedLayer(const doc::Layer* layer)
|
||||||
@ -163,11 +165,11 @@ void EditorRender::renderSprite(
|
|||||||
m_render->renderSprite(dstImage, sprite, frame, area);
|
m_render->renderSprite(dstImage, sprite, frame, area);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorRender::renderCheckedBackground(
|
void EditorRender::renderCheckeredBackground(
|
||||||
doc::Image* image,
|
doc::Image* image,
|
||||||
const gfx::Clip& area)
|
const gfx::Clip& area)
|
||||||
{
|
{
|
||||||
m_render->renderCheckedBackground(image, area);
|
m_render->renderCheckeredBackground(image, area);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorRender::renderImage(
|
void EditorRender::renderImage(
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// Aseprite
|
// Aseprite
|
||||||
// Copyright (C) 2019-2020 Igara Studio S.A.
|
// Copyright (C) 2019-2022 Igara Studio S.A.
|
||||||
// Copyright (C) 2018 David Capello
|
// Copyright (C) 2018 David Capello
|
||||||
//
|
//
|
||||||
// This program is distributed under the terms of
|
// This program is distributed under the terms of
|
||||||
@ -81,7 +81,7 @@ namespace app {
|
|||||||
const doc::Sprite* sprite,
|
const doc::Sprite* sprite,
|
||||||
doc::frame_t frame,
|
doc::frame_t frame,
|
||||||
const gfx::ClipF& area);
|
const gfx::ClipF& area);
|
||||||
void renderCheckedBackground(
|
void renderCheckeredBackground(
|
||||||
doc::Image* image,
|
doc::Image* image,
|
||||||
const gfx::Clip& area);
|
const gfx::Clip& area);
|
||||||
void renderImage(
|
void renderImage(
|
||||||
|
@ -974,9 +974,9 @@ void PaletteView::onPaint(ui::PaintEvent& ev)
|
|||||||
|
|
||||||
IntersectClip clip(g, clipR);
|
IntersectClip clip(g, clipR);
|
||||||
if (clip) {
|
if (clip) {
|
||||||
CheckedDrawMode checked(g, getMarchingAntsOffset(),
|
CheckeredDrawMode checkered(g, getMarchingAntsOffset(),
|
||||||
gfx::rgba(0, 0, 0, 255),
|
gfx::rgba(0, 0, 0, 255),
|
||||||
gfx::rgba(255, 255, 255, 255));
|
gfx::rgba(255, 255, 255, 255));
|
||||||
g->drawRect(gfx::rgba(0, 0, 0), box);
|
g->drawRect(gfx::rgba(0, 0, 0), box);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2069,9 +2069,9 @@ void Timeline::drawClipboardRange(ui::Graphics* g)
|
|||||||
|
|
||||||
IntersectClip clip(g, getRangeClipBounds(clipboard_range));
|
IntersectClip clip(g, getRangeClipBounds(clipboard_range));
|
||||||
if (clip) {
|
if (clip) {
|
||||||
CheckedDrawMode checked(g, m_offset_count,
|
CheckeredDrawMode checkered(g, m_offset_count,
|
||||||
gfx::rgba(0, 0, 0, 255),
|
gfx::rgba(0, 0, 0, 255),
|
||||||
gfx::rgba(255, 255, 255, 255));
|
gfx::rgba(255, 255, 255, 255));
|
||||||
g->drawRect(gfx::rgba(0, 0, 0),
|
g->drawRect(gfx::rgba(0, 0, 0),
|
||||||
getRangeBounds(clipboard_range));
|
getRangeBounds(clipboard_range));
|
||||||
}
|
}
|
||||||
@ -2374,7 +2374,7 @@ void Timeline::drawCel(ui::Graphics* g, layer_t layerIndex, frame_t frame, Cel*
|
|||||||
if (!thumb_bounds.isEmpty()) {
|
if (!thumb_bounds.isEmpty()) {
|
||||||
if (os::SurfaceRef surface = thumb::get_cel_thumbnail(cel, thumb_bounds.size())) {
|
if (os::SurfaceRef surface = thumb::get_cel_thumbnail(cel, thumb_bounds.size())) {
|
||||||
const int t = std::clamp(thumb_bounds.w/8, 4, 16);
|
const int t = std::clamp(thumb_bounds.w/8, 4, 16);
|
||||||
draw_checked_grid(g, thumb_bounds, gfx::Size(t, t), docPref());
|
draw_checkered_grid(g, thumb_bounds, gfx::Size(t, t), docPref());
|
||||||
|
|
||||||
g->drawRgbaSurface(surface.get(),
|
g->drawRgbaSurface(surface.get(),
|
||||||
thumb_bounds.center().x-surface->width()/2,
|
thumb_bounds.center().x-surface->width()/2,
|
||||||
@ -2462,7 +2462,7 @@ void Timeline::drawCelOverlay(ui::Graphics* g)
|
|||||||
gfx::Rect rc = m_sprite->bounds().fitIn(
|
gfx::Rect rc = m_sprite->bounds().fitIn(
|
||||||
gfx::Rect(m_thumbnailsOverlayBounds).shrink(1));
|
gfx::Rect(m_thumbnailsOverlayBounds).shrink(1));
|
||||||
if (os::SurfaceRef surface = thumb::get_cel_thumbnail(cel, rc.size())) {
|
if (os::SurfaceRef surface = thumb::get_cel_thumbnail(cel, rc.size())) {
|
||||||
draw_checked_grid(g, rc, gfx::Size(8, 8)*ui::guiscale(), docPref());
|
draw_checkered_grid(g, rc, gfx::Size(8, 8)*ui::guiscale(), docPref());
|
||||||
|
|
||||||
g->drawRgbaSurface(surface.get(),
|
g->drawRgbaSurface(surface.get(),
|
||||||
rc.center().x-surface->width()/2,
|
rc.center().x-surface->width()/2,
|
||||||
|
@ -26,7 +26,7 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef testing::Types<RgbTraits, GrayscaleTraits, IndexedTraits, BitmapTraits> ImageAllTraits;
|
typedef testing::Types<RgbTraits, GrayscaleTraits, IndexedTraits, BitmapTraits> ImageAllTraits;
|
||||||
TYPED_TEST_CASE(ImageAllTypes, ImageAllTraits);
|
TYPED_TEST_SUITE(ImageAllTypes, ImageAllTraits);
|
||||||
|
|
||||||
TYPED_TEST(ImageAllTypes, PutGetAndIterators)
|
TYPED_TEST(ImageAllTypes, PutGetAndIterators)
|
||||||
{
|
{
|
||||||
|
33
src/render/bg_options.h
Normal file
33
src/render/bg_options.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
// Aseprite Render Library
|
||||||
|
// Copyright (c) 2022 Igara Studio S.A.
|
||||||
|
//
|
||||||
|
// This file is released under the terms of the MIT license.
|
||||||
|
// Read LICENSE.txt for more information.
|
||||||
|
|
||||||
|
#ifndef RENDER_BG_OPTIONS_H_INCLUDED
|
||||||
|
#define RENDER_BG_OPTIONS_H_INCLUDED
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "doc/color.h"
|
||||||
|
#include "doc/frame.h"
|
||||||
|
#include "gfx/size.h"
|
||||||
|
#include "render/bg_type.h"
|
||||||
|
|
||||||
|
namespace render {
|
||||||
|
|
||||||
|
struct BgOptions {
|
||||||
|
BgType type = BgType::TRANSPARENT;
|
||||||
|
bool zoom = false;
|
||||||
|
doc::color_t color1 = 0;
|
||||||
|
doc::color_t color2 = 0;
|
||||||
|
gfx::Size stripeSize{16, 16};
|
||||||
|
|
||||||
|
BgOptions(BgType type = BgType::TRANSPARENT) : type(type) { }
|
||||||
|
|
||||||
|
static BgOptions MakeNone() { return BgOptions(BgType::NONE); }
|
||||||
|
static BgOptions MakeTransparent() { return BgOptions(BgType::TRANSPARENT); }
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace render
|
||||||
|
|
||||||
|
#endif
|
@ -1,4 +1,5 @@
|
|||||||
// Aseprite Render Library
|
// Aseprite Render Library
|
||||||
|
// Copyright (c) 2022 Igara Studio S.A.
|
||||||
// Copyright (c) 2018 David Capello
|
// Copyright (c) 2018 David Capello
|
||||||
//
|
//
|
||||||
// This file is released under the terms of the MIT license.
|
// This file is released under the terms of the MIT license.
|
||||||
@ -13,7 +14,7 @@ namespace render {
|
|||||||
enum class BgType {
|
enum class BgType {
|
||||||
NONE,
|
NONE,
|
||||||
TRANSPARENT,
|
TRANSPARENT,
|
||||||
CHECKED,
|
CHECKERED,
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace render
|
} // namespace render
|
||||||
|
@ -547,8 +547,6 @@ Render::Render()
|
|||||||
, m_extraCel(nullptr)
|
, m_extraCel(nullptr)
|
||||||
, m_extraImage(nullptr)
|
, m_extraImage(nullptr)
|
||||||
, m_newBlendMethod(true)
|
, m_newBlendMethod(true)
|
||||||
, m_bgType(BgType::TRANSPARENT)
|
|
||||||
, m_bgCheckedSize(16, 16)
|
|
||||||
, m_globalOpacity(255)
|
, m_globalOpacity(255)
|
||||||
, m_selectedLayerForOpacity(nullptr)
|
, m_selectedLayerForOpacity(nullptr)
|
||||||
, m_selectedLayer(nullptr)
|
, m_selectedLayer(nullptr)
|
||||||
@ -583,29 +581,9 @@ void Render::setProjection(const Projection& projection)
|
|||||||
m_proj = projection;
|
m_proj = projection;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Render::setBgType(BgType type)
|
void Render::setBgOptions(const BgOptions& bg)
|
||||||
{
|
{
|
||||||
m_bgType = type;
|
m_bg = bg;
|
||||||
}
|
|
||||||
|
|
||||||
void Render::setBgZoom(bool state)
|
|
||||||
{
|
|
||||||
m_bgZoom = state;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Render::setBgColor1(color_t color)
|
|
||||||
{
|
|
||||||
m_bgColor1 = color;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Render::setBgColor2(color_t color)
|
|
||||||
{
|
|
||||||
m_bgColor2 = color;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Render::setBgCheckedSize(const gfx::Size& size)
|
|
||||||
{
|
|
||||||
m_bgCheckedSize = size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Render::setSelectedLayer(const Layer* layer)
|
void Render::setSelectedLayer(const Layer* layer)
|
||||||
@ -740,15 +718,15 @@ void Render::renderSprite(
|
|||||||
// New Blending Method:
|
// New Blending Method:
|
||||||
if (m_newBlendMethod) {
|
if (m_newBlendMethod) {
|
||||||
// Clear dstImage with the bg_color (if the background is not a
|
// Clear dstImage with the bg_color (if the background is not a
|
||||||
// special background pattern like the checked background, this is
|
// special background pattern like the checkered background, this
|
||||||
// enough as a base color).
|
// is enough as a base color).
|
||||||
fill_rect(dstImage, area.dstBounds(), bg_color);
|
fill_rect(dstImage, area.dstBounds(), bg_color);
|
||||||
|
|
||||||
// Draw the Background layer - Onion skin behind the sprite - Transparent Layers
|
// Draw the Background layer - Onion skin behind the sprite - Transparent Layers
|
||||||
renderSpriteLayers(dstImage, area, frame, compositeImage);
|
renderSpriteLayers(dstImage, area, frame, compositeImage);
|
||||||
|
|
||||||
// In case that we need a special background (e.g. like the
|
// In case that we need a special background (e.g. like the
|
||||||
// checked pattern), we can draw the background in a temporal
|
// checkered pattern), we can draw the background in a temporal
|
||||||
// image and then merge this temporal image with the dstImage.
|
// image and then merge this temporal image with the dstImage.
|
||||||
if (!isSolidBackground(bgLayer, bg_color)) {
|
if (!isSolidBackground(bgLayer, bg_color)) {
|
||||||
if (!m_tmpBuf)
|
if (!m_tmpBuf)
|
||||||
@ -829,9 +807,9 @@ void Render::renderBackground(Image* image,
|
|||||||
fill_rect(image, area.dstBounds(), bg_color);
|
fill_rect(image, area.dstBounds(), bg_color);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
switch (m_bgType) {
|
switch (m_bg.type) {
|
||||||
case BgType::CHECKED:
|
case BgType::CHECKERED:
|
||||||
renderCheckedBackground(image, area);
|
renderCheckeredBackground(image, area);
|
||||||
if (bgLayer && bgLayer->isVisible() &&
|
if (bgLayer && bgLayer->isVisible() &&
|
||||||
// TODO Review this: bg_color can be an index (not an rgba())
|
// TODO Review this: bg_color can be an index (not an rgba())
|
||||||
// when sprite and dstImage are indexed
|
// when sprite and dstImage are indexed
|
||||||
@ -857,7 +835,7 @@ bool Render::isSolidBackground(
|
|||||||
const color_t bg_color) const
|
const color_t bg_color) const
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
((m_bgType != BgType::CHECKED) ||
|
((m_bg.type != BgType::CHECKERED) ||
|
||||||
(bgLayer && bgLayer->isVisible() &&
|
(bgLayer && bgLayer->isVisible() &&
|
||||||
// TODO Review this: bg_color can be an index (not an rgba())
|
// TODO Review this: bg_color can be an index (not an rgba())
|
||||||
// when sprite and dstImage are indexed
|
// when sprite and dstImage are indexed
|
||||||
@ -926,15 +904,15 @@ void Render::renderOnionskin(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Render::renderCheckedBackground(
|
void Render::renderCheckeredBackground(
|
||||||
Image* image,
|
Image* image,
|
||||||
const gfx::Clip& area)
|
const gfx::Clip& area)
|
||||||
{
|
{
|
||||||
int x, y, u, v;
|
int x, y, u, v;
|
||||||
int tile_w = m_bgCheckedSize.w;
|
int tile_w = m_bg.stripeSize.w;
|
||||||
int tile_h = m_bgCheckedSize.h;
|
int tile_h = m_bg.stripeSize.h;
|
||||||
|
|
||||||
if (m_bgZoom) {
|
if (m_bg.zoom) {
|
||||||
tile_w = m_proj.zoom().apply(tile_w);
|
tile_w = m_proj.zoom().apply(tile_w);
|
||||||
tile_h = m_proj.zoom().apply(tile_h);
|
tile_h = m_proj.zoom().apply(tile_h);
|
||||||
}
|
}
|
||||||
@ -956,16 +934,16 @@ void Render::renderCheckedBackground(
|
|||||||
// Fix background color (make them opaque)
|
// Fix background color (make them opaque)
|
||||||
switch (image->pixelFormat()) {
|
switch (image->pixelFormat()) {
|
||||||
case IMAGE_RGB:
|
case IMAGE_RGB:
|
||||||
m_bgColor1 |= doc::rgba_a_mask;
|
m_bg.color1 |= doc::rgba_a_mask;
|
||||||
m_bgColor2 |= doc::rgba_a_mask;
|
m_bg.color2 |= doc::rgba_a_mask;
|
||||||
break;
|
break;
|
||||||
case IMAGE_GRAYSCALE:
|
case IMAGE_GRAYSCALE:
|
||||||
m_bgColor1 |= doc::graya_a_mask;
|
m_bg.color1 |= doc::graya_a_mask;
|
||||||
m_bgColor2 |= doc::graya_a_mask;
|
m_bg.color2 |= doc::graya_a_mask;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw checked background (tile by tile)
|
// Draw checkered background (tile by tile)
|
||||||
int u_start = u;
|
int u_start = u;
|
||||||
for (y=y_start-tile_h; y<image->height()+tile_h; y+=tile_h) {
|
for (y=y_start-tile_h; y<image->height()+tile_h; y+=tile_h) {
|
||||||
for (x=x_start-tile_w; x<image->width()+tile_w; x+=tile_w) {
|
for (x=x_start-tile_w; x<image->width()+tile_w; x+=tile_w) {
|
||||||
@ -973,7 +951,7 @@ void Render::renderCheckedBackground(
|
|||||||
if (!fillRc.isEmpty())
|
if (!fillRc.isEmpty())
|
||||||
fill_rect(
|
fill_rect(
|
||||||
image, fillRc.x, fillRc.y, fillRc.x+fillRc.w-1, fillRc.y+fillRc.h-1,
|
image, fillRc.x, fillRc.y, fillRc.x+fillRc.w-1, fillRc.y+fillRc.h-1,
|
||||||
(((u+v))&1)? m_bgColor2: m_bgColor1);
|
(((u+v))&1)? m_bg.color2: m_bg.color1);
|
||||||
++u;
|
++u;
|
||||||
}
|
}
|
||||||
u = u_start;
|
u = u_start;
|
||||||
@ -1376,10 +1354,10 @@ CompositeImageFunc Render::getImageComposition(
|
|||||||
// image n-times (where n is the zoom scale).
|
// image n-times (where n is the zoom scale).
|
||||||
double intpart;
|
double intpart;
|
||||||
const bool finegrain =
|
const bool finegrain =
|
||||||
(!m_bgZoom && (m_bgCheckedSize.w < m_proj.applyX(1) ||
|
(!m_bg.zoom && (m_bg.stripeSize.w < m_proj.applyX(1) ||
|
||||||
m_bgCheckedSize.h < m_proj.applyY(1) ||
|
m_bg.stripeSize.h < m_proj.applyY(1) ||
|
||||||
std::modf(double(m_bgCheckedSize.w) / m_proj.applyX(1.0), &intpart) != 0.0 ||
|
std::modf(double(m_bg.stripeSize.w) / m_proj.applyX(1.0), &intpart) != 0.0 ||
|
||||||
std::modf(double(m_bgCheckedSize.h) / m_proj.applyY(1.0), &intpart) != 0.0)) ||
|
std::modf(double(m_bg.stripeSize.h) / m_proj.applyY(1.0), &intpart) != 0.0)) ||
|
||||||
(layer &&
|
(layer &&
|
||||||
layer->isGroup() &&
|
layer->isGroup() &&
|
||||||
has_visible_reference_layers(static_cast<const LayerGroup*>(layer)));
|
has_visible_reference_layers(static_cast<const LayerGroup*>(layer)));
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// Aseprite Render Library
|
// Aseprite Render Library
|
||||||
// Copyright (c) 2019-2020 Igara Studio S.A.
|
// Copyright (c) 2019-2022 Igara Studio S.A.
|
||||||
// Copyright (c) 2001-2018 David Capello
|
// Copyright (c) 2001-2018 David Capello
|
||||||
//
|
//
|
||||||
// This file is released under the terms of the MIT license.
|
// This file is released under the terms of the MIT license.
|
||||||
@ -18,7 +18,7 @@
|
|||||||
#include "gfx/clip.h"
|
#include "gfx/clip.h"
|
||||||
#include "gfx/point.h"
|
#include "gfx/point.h"
|
||||||
#include "gfx/size.h"
|
#include "gfx/size.h"
|
||||||
#include "render/bg_type.h"
|
#include "render/bg_options.h"
|
||||||
#include "render/extra_type.h"
|
#include "render/extra_type.h"
|
||||||
#include "render/onionskin_options.h"
|
#include "render/onionskin_options.h"
|
||||||
#include "render/projection.h"
|
#include "render/projection.h"
|
||||||
@ -57,17 +57,8 @@ namespace render {
|
|||||||
void setRefLayersVisiblity(const bool visible);
|
void setRefLayersVisiblity(const bool visible);
|
||||||
void setNonactiveLayersOpacity(const int opacity);
|
void setNonactiveLayersOpacity(const int opacity);
|
||||||
void setNewBlend(const bool newBlend);
|
void setNewBlend(const bool newBlend);
|
||||||
|
|
||||||
// Viewport configuration
|
|
||||||
void setProjection(const Projection& projection);
|
void setProjection(const Projection& projection);
|
||||||
|
void setBgOptions(const BgOptions& bg);
|
||||||
// Background configuration
|
|
||||||
void setBgType(BgType type);
|
|
||||||
void setBgZoom(bool state);
|
|
||||||
void setBgColor1(color_t color);
|
|
||||||
void setBgColor2(color_t color);
|
|
||||||
void setBgCheckedSize(const gfx::Size& size);
|
|
||||||
|
|
||||||
void setSelectedLayer(const Layer* layer);
|
void setSelectedLayer(const Layer* layer);
|
||||||
|
|
||||||
// Sets the preview image. This preview image is an alternative
|
// Sets the preview image. This preview image is an alternative
|
||||||
@ -119,7 +110,7 @@ namespace render {
|
|||||||
const gfx::ClipF& area);
|
const gfx::ClipF& area);
|
||||||
|
|
||||||
// Extra functions
|
// Extra functions
|
||||||
void renderCheckedBackground(
|
void renderCheckeredBackground(
|
||||||
Image* image,
|
Image* image,
|
||||||
const gfx::Clip& area);
|
const gfx::Clip& area);
|
||||||
|
|
||||||
@ -218,11 +209,7 @@ namespace render {
|
|||||||
const Image* m_extraImage;
|
const Image* m_extraImage;
|
||||||
BlendMode m_extraBlendMode;
|
BlendMode m_extraBlendMode;
|
||||||
bool m_newBlendMethod;
|
bool m_newBlendMethod;
|
||||||
BgType m_bgType;
|
BgOptions m_bg;
|
||||||
bool m_bgZoom;
|
|
||||||
color_t m_bgColor1;
|
|
||||||
color_t m_bgColor2;
|
|
||||||
gfx::Size m_bgCheckedSize;
|
|
||||||
int m_globalOpacity;
|
int m_globalOpacity;
|
||||||
const Layer* m_selectedLayerForOpacity;
|
const Layer* m_selectedLayerForOpacity;
|
||||||
const Layer* m_selectedLayer;
|
const Layer* m_selectedLayer;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// Aseprite Document Library
|
// Aseprite Document Library
|
||||||
// Copyright (c) 2019 Igara Studio S.A.
|
// Copyright (c) 2019-2022 Igara Studio S.A.
|
||||||
//
|
//
|
||||||
// This file is released under the terms of the MIT license.
|
// This file is released under the terms of the MIT license.
|
||||||
// Read LICENSE.txt for more information.
|
// Read LICENSE.txt for more information.
|
||||||
@ -58,11 +58,13 @@ static void Bm_Render(benchmark::State& state)
|
|||||||
clear_image(dst.get(), 0);
|
clear_image(dst.get(), 0);
|
||||||
|
|
||||||
Render render;
|
Render render;
|
||||||
render.setBgType(BgType::CHECKED);
|
BgOptions bg;
|
||||||
render.setBgZoom(true);
|
bg.type = BgType::CHECKERED;
|
||||||
render.setBgColor1(rgba(100, 100, 100, 255));
|
bg.zoom = true;
|
||||||
render.setBgColor2(rgba(200, 200, 200, 255));
|
bg.color1 = rgba(100, 100, 100, 255);
|
||||||
render.setBgCheckedSize(gfx::Size(16, 16));
|
bg.color2 = rgba(200, 200, 200, 255);
|
||||||
|
bg.stripeSize = gfx::Size(16, 16);
|
||||||
|
render.setBgOptions(bg);
|
||||||
render.renderSprite(
|
render.renderSprite(
|
||||||
dst.get(), spr, frame_t(0),
|
dst.get(), spr, frame_t(0),
|
||||||
gfx::Clip(0, 0, 0, 0, w, h));
|
gfx::Clip(0, 0, 0, 0, w, h));
|
||||||
|
@ -32,7 +32,7 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef testing::Types<RgbTraits, GrayscaleTraits, IndexedTraits> ImageAllTraits;
|
typedef testing::Types<RgbTraits, GrayscaleTraits, IndexedTraits> ImageAllTraits;
|
||||||
TYPED_TEST_CASE(RenderAllModes, ImageAllTraits);
|
TYPED_TEST_SUITE(RenderAllModes, ImageAllTraits);
|
||||||
|
|
||||||
// a b
|
// a b
|
||||||
// c d
|
// c d
|
||||||
@ -131,7 +131,7 @@ TEST(Render, DefaultBackgroundModeWithNonzeroTransparentIndex)
|
|||||||
EXPECT_2X2_PIXELS(dst.get(), 0, 0, 0, c1); // RGB transparent
|
EXPECT_2X2_PIXELS(dst.get(), 0, 0, 0, c1); // RGB transparent
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(Render, CheckedBackground)
|
TEST(Render, CheckeredBackground)
|
||||||
{
|
{
|
||||||
std::shared_ptr<Document> doc = std::make_shared<Document>();
|
std::shared_ptr<Document> doc = std::make_shared<Document>();
|
||||||
doc->sprites().add(Sprite::MakeStdSprite(ImageSpec(ColorMode::INDEXED, 4, 4)));
|
doc->sprites().add(Sprite::MakeStdSprite(ImageSpec(ColorMode::INDEXED, 4, 4)));
|
||||||
@ -140,12 +140,14 @@ TEST(Render, CheckedBackground)
|
|||||||
clear_image(dst.get(), 0);
|
clear_image(dst.get(), 0);
|
||||||
|
|
||||||
Render render;
|
Render render;
|
||||||
render.setBgType(BgType::CHECKED);
|
BgOptions bg;
|
||||||
render.setBgZoom(true);
|
bg.type = BgType::CHECKERED;
|
||||||
render.setBgColor1(1);
|
bg.zoom = true;
|
||||||
render.setBgColor2(2);
|
bg.color1 = 1;
|
||||||
|
bg.color2 = 2;
|
||||||
|
|
||||||
render.setBgCheckedSize(gfx::Size(1, 1));
|
bg.stripeSize = gfx::Size(1, 1);
|
||||||
|
render.setBgOptions(bg);
|
||||||
render.renderSprite(dst.get(), doc->sprite(), frame_t(0));
|
render.renderSprite(dst.get(), doc->sprite(), frame_t(0));
|
||||||
EXPECT_4X4_PIXELS(dst.get(),
|
EXPECT_4X4_PIXELS(dst.get(),
|
||||||
1, 2, 1, 2,
|
1, 2, 1, 2,
|
||||||
@ -153,7 +155,8 @@ TEST(Render, CheckedBackground)
|
|||||||
1, 2, 1, 2,
|
1, 2, 1, 2,
|
||||||
2, 1, 2, 1);
|
2, 1, 2, 1);
|
||||||
|
|
||||||
render.setBgCheckedSize(gfx::Size(2, 2));
|
bg.stripeSize = gfx::Size(2, 2);
|
||||||
|
render.setBgOptions(bg);
|
||||||
render.renderSprite(dst.get(), doc->sprite(), frame_t(0));
|
render.renderSprite(dst.get(), doc->sprite(), frame_t(0));
|
||||||
EXPECT_4X4_PIXELS(dst.get(),
|
EXPECT_4X4_PIXELS(dst.get(),
|
||||||
1, 1, 2, 2,
|
1, 1, 2, 2,
|
||||||
@ -161,7 +164,8 @@ TEST(Render, CheckedBackground)
|
|||||||
2, 2, 1, 1,
|
2, 2, 1, 1,
|
||||||
2, 2, 1, 1);
|
2, 2, 1, 1);
|
||||||
|
|
||||||
render.setBgCheckedSize(gfx::Size(3, 3));
|
bg.stripeSize = gfx::Size(3, 3);
|
||||||
|
render.setBgOptions(bg);
|
||||||
render.renderSprite(dst.get(), doc->sprite(), frame_t(0));
|
render.renderSprite(dst.get(), doc->sprite(), frame_t(0));
|
||||||
EXPECT_4X4_PIXELS(dst.get(),
|
EXPECT_4X4_PIXELS(dst.get(),
|
||||||
1, 1, 1, 2,
|
1, 1, 1, 2,
|
||||||
@ -169,8 +173,9 @@ TEST(Render, CheckedBackground)
|
|||||||
1, 1, 1, 2,
|
1, 1, 1, 2,
|
||||||
2, 2, 2, 1);
|
2, 2, 2, 1);
|
||||||
|
|
||||||
|
bg.stripeSize = gfx::Size(1, 1);
|
||||||
render.setProjection(Projection(PixelRatio(1, 1), Zoom(2, 1)));
|
render.setProjection(Projection(PixelRatio(1, 1), Zoom(2, 1)));
|
||||||
render.setBgCheckedSize(gfx::Size(1, 1));
|
render.setBgOptions(bg);
|
||||||
render.renderSprite(dst.get(), doc->sprite(), frame_t(0));
|
render.renderSprite(dst.get(), doc->sprite(), frame_t(0));
|
||||||
EXPECT_4X4_PIXELS(dst.get(),
|
EXPECT_4X4_PIXELS(dst.get(),
|
||||||
1, 1, 2, 2,
|
1, 1, 2, 2,
|
||||||
@ -195,11 +200,13 @@ TEST(Render, ZoomAndDstBounds)
|
|||||||
clear_image(dst.get(), 0);
|
clear_image(dst.get(), 0);
|
||||||
|
|
||||||
Render render;
|
Render render;
|
||||||
render.setBgType(BgType::CHECKED);
|
BgOptions bg;
|
||||||
render.setBgZoom(true);
|
bg.type = BgType::CHECKERED;
|
||||||
render.setBgColor1(1);
|
bg.zoom = true;
|
||||||
render.setBgColor2(2);
|
bg.color1 = 1;
|
||||||
render.setBgCheckedSize(gfx::Size(1, 1));
|
bg.color2 = 2;
|
||||||
|
bg.stripeSize = gfx::Size(1, 1);
|
||||||
|
render.setBgOptions(bg);
|
||||||
|
|
||||||
render.renderSprite(
|
render.renderSprite(
|
||||||
dst.get(), doc->sprite(), frame_t(0),
|
dst.get(), doc->sprite(), frame_t(0),
|
||||||
@ -228,11 +235,13 @@ TEST(Render, BugWithMultiplesOf3ZoomFactors)
|
|||||||
clear_image(dst.get(), 0);
|
clear_image(dst.get(), 0);
|
||||||
|
|
||||||
Render render;
|
Render render;
|
||||||
render.setBgType(BgType::CHECKED);
|
BgOptions bg;
|
||||||
render.setBgZoom(false);
|
bg.type = BgType::CHECKERED;
|
||||||
render.setBgColor1(rgba(128, 128, 128, 255));
|
bg.zoom = false;
|
||||||
render.setBgColor2(rgba(64, 64, 64, 255));
|
bg.color1 = rgba(128, 128, 128, 255);
|
||||||
render.setBgCheckedSize(gfx::Size(2, 2));
|
bg.color2 = rgba(64, 64, 64, 255);
|
||||||
|
bg.stripeSize = gfx::Size(2, 2);
|
||||||
|
render.setBgOptions(bg);
|
||||||
render.setProjection(Projection(PixelRatio(1, 1), Zoom(zoom, 1)));
|
render.setProjection(Projection(PixelRatio(1, 1), Zoom(zoom, 1)));
|
||||||
render.renderSprite(
|
render.renderSprite(
|
||||||
dst.get(), doc->sprite(), frame_t(0),
|
dst.get(), doc->sprite(), frame_t(0),
|
||||||
|
@ -127,8 +127,8 @@ void Graphics::setDrawMode(DrawMode mode, int param,
|
|||||||
case DrawMode::Xor:
|
case DrawMode::Xor:
|
||||||
m_surface->setDrawMode(os::DrawMode::Xor);
|
m_surface->setDrawMode(os::DrawMode::Xor);
|
||||||
break;
|
break;
|
||||||
case DrawMode::Checked:
|
case DrawMode::Checkered:
|
||||||
m_surface->setDrawMode(os::DrawMode::Checked, param, a, b);
|
m_surface->setDrawMode(os::DrawMode::Checkered, param, a, b);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ namespace ui {
|
|||||||
enum class DrawMode {
|
enum class DrawMode {
|
||||||
Solid,
|
Solid,
|
||||||
Xor,
|
Xor,
|
||||||
Checked,
|
Checkered,
|
||||||
};
|
};
|
||||||
|
|
||||||
Graphics(Display* display, const os::SurfaceRef& surface, int dx, int dy);
|
Graphics(Display* display, const os::SurfaceRef& surface, int dx, int dy);
|
||||||
@ -195,22 +195,22 @@ namespace ui {
|
|||||||
DISABLE_COPYING(IntersectClip);
|
DISABLE_COPYING(IntersectClip);
|
||||||
};
|
};
|
||||||
|
|
||||||
class CheckedDrawMode {
|
class CheckeredDrawMode {
|
||||||
public:
|
public:
|
||||||
CheckedDrawMode(Graphics* g, int param,
|
CheckeredDrawMode(Graphics* g, int param,
|
||||||
const gfx::Color a,
|
const gfx::Color a,
|
||||||
const gfx::Color b) : m_graphics(g) {
|
const gfx::Color b) : m_graphics(g) {
|
||||||
m_graphics->setDrawMode(Graphics::DrawMode::Checked, param, a, b);
|
m_graphics->setDrawMode(Graphics::DrawMode::Checkered, param, a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
~CheckedDrawMode() {
|
~CheckeredDrawMode() {
|
||||||
m_graphics->setDrawMode(Graphics::DrawMode::Solid);
|
m_graphics->setDrawMode(Graphics::DrawMode::Solid);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Graphics* m_graphics;
|
Graphics* m_graphics;
|
||||||
|
|
||||||
DISABLE_COPYING(CheckedDrawMode);
|
DISABLE_COPYING(CheckeredDrawMode);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::shared_ptr<Graphics> GraphicsPtr;
|
typedef std::shared_ptr<Graphics> GraphicsPtr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user